From 19b3e54cacbc0b395aeb8d585ea4c02486b3c7f3 Mon Sep 17 00:00:00 2001 From: 3004Kristina Date: Sun, 17 Jan 2021 17:01:50 +0300 Subject: [PATCH] new design --- css/layout.css | 2 + css/layout.css.map | 1 + gulpfile.js | 38 + .../mainpage/static/new-design/css/layout.css | 44 + .../static/new-design/css/layout.css.map | 1 + .../static/new-design/css/layout.scss | 4299 ++++ .../static/new-design/img/PythonRu.png | Bin 0 -> 1054 bytes .../static/new-design/img/PythonRu_white.png | Bin 0 -> 1110 bytes .../mainpage/static/new-design/img/avatar.png | Bin 0 -> 2682 bytes .../mainpage/static/new-design/img/best.png | Bin 0 -> 3763 bytes .../mainpage/static/new-design/img/bonus.jpg | Bin 0 -> 6693 bytes .../mainpage/static/new-design/img/decor.png | Bin 0 -> 32654 bytes .../static/new-design/img/drylabs.png | Bin 0 -> 2271 bytes .../static/new-design/img/emaillove.png | Bin 0 -> 3056 bytes .../mainpage/static/new-design/img/event.png | Bin 0 -> 63895 bytes .../static/new-design/img/event_logo.png | Bin 0 -> 1097 bytes .../mainpage/static/new-design/img/evrone.png | Bin 0 -> 2468 bytes .../static/new-design/img/itcanfly.png | Bin 0 -> 2829 bytes .../mainpage/static/new-design/img/left.png | Bin 0 -> 269 bytes .../static/new-design/img/moscow_python.png | Bin 0 -> 16057 bytes .../mainpage/static/new-design/img/open.png | Bin 0 -> 2074 bytes .../mainpage/static/new-design/img/python.png | Bin 0 -> 485 bytes .../static/new-design/img/python2.png | Bin 0 -> 1398 bytes .../static/new-design/img/python_week.png | Bin 0 -> 9347 bytes .../mainpage/static/new-design/img/right.png | Bin 0 -> 268 bytes .../mainpage/static/new-design/img/search.png | Bin 0 -> 466 bytes .../static/new-design/img/single_post.png | Bin 0 -> 323798 bytes .../new-design/img/single_post_bonus.png | Bin 0 -> 530 bytes .../new-design/img/single_post_image.png | Bin 0 -> 1542 bytes .../mainpage/static/new-design/img/social.png | Bin 0 -> 2824 bytes .../static/new-design/img/speech-bubble.png | Bin 0 -> 2107 bytes .../mainpage/static/new-design/js/script.js | 95 + .../mainpage/templates/new-design/blog.html | 183 + .../mainpage/templates/new-design/events.html | 268 + .../templates/new-design/include/footer.html | 37 + .../templates/new-design/include/header.html | 171 + .../mainpage/templates/new-design/index.html | 324 + .../templates/new-design/single_post.html | 405 + landing_page/mainpage/urls.py | 11 +- landing_page/mainpage/views.py | 7 + landing_page/mainpage/views_new_design.py | 37 + media/feedbacks/cats4.jpg | Bin 0 -> 197119 bytes media/feedbacks/cats5.jpg | Bin 0 -> 134871 bytes media/projects/cats4.jpg | Bin 0 -> 197119 bytes media/stories/cats1.jpg | Bin 0 -> 153939 bytes node_modules/.bin/acorn | 1 + node_modules/.bin/atob | 1 + node_modules/.bin/color-support | 1 + node_modules/.bin/gulp | 1 + node_modules/.bin/in-install | 1 + node_modules/.bin/in-publish | 1 + node_modules/.bin/mkdirp | 1 + node_modules/.bin/node-gyp | 1 + node_modules/.bin/node-sass | 1 + node_modules/.bin/nopt | 1 + node_modules/.bin/not-in-install | 1 + node_modules/.bin/not-in-publish | 1 + node_modules/.bin/rimraf | 1 + node_modules/.bin/sassgraph | 1 + node_modules/.bin/semver | 1 + node_modules/.bin/sshpk-conv | 1 + node_modules/.bin/sshpk-sign | 1 + node_modules/.bin/sshpk-verify | 1 + node_modules/.bin/strip-indent | 1 + node_modules/.bin/uuid | 1 + node_modules/.bin/which | 1 + node_modules/.yarn-integrity | 622 + .../@gulp-sourcemaps/identity-map/LICENSE | 21 + .../@gulp-sourcemaps/identity-map/README.md | 40 + .../@gulp-sourcemaps/identity-map/index.js | 35 + .../identity-map/node_modules/.bin/acorn | 1 + .../node_modules/through2/LICENSE.md | 9 + .../node_modules/through2/README.md | 134 + .../node_modules/through2/package.json | 33 + .../node_modules/through2/through2.js | 96 + .../identity-map/package.json | 52 + .../@gulp-sourcemaps/map-sources/LICENSE | 21 + .../@gulp-sourcemaps/map-sources/README.md | 52 + .../@gulp-sourcemaps/map-sources/index.js | 30 + .../node_modules/through2/LICENSE.md | 9 + .../node_modules/through2/README.md | 134 + .../node_modules/through2/package.json | 33 + .../node_modules/through2/through2.js | 96 + .../@gulp-sourcemaps/map-sources/package.json | 47 + node_modules/@types/jquery/JQuery.d.ts | 13022 ++++++++++++ node_modules/@types/jquery/JQueryStatic.d.ts | 13521 ++++++++++++ node_modules/@types/jquery/LICENSE | 21 + node_modules/@types/jquery/README.md | 16 + .../@types/jquery/dist/jquery.slim.d.ts | 3 + node_modules/@types/jquery/index.d.ts | 35 + node_modules/@types/jquery/legacy.d.ts | 200 + node_modules/@types/jquery/misc.d.ts | 6648 ++++++ node_modules/@types/jquery/package.json | 136 + node_modules/@types/sizzle/LICENSE | 21 + node_modules/@types/sizzle/README.md | 16 + node_modules/@types/sizzle/index.d.ts | 92 + node_modules/@types/sizzle/package.json | 22 + node_modules/abbrev/LICENSE | 46 + node_modules/abbrev/README.md | 23 + node_modules/abbrev/abbrev.js | 61 + node_modules/abbrev/package.json | 21 + node_modules/acorn/AUTHORS | 79 + node_modules/acorn/CHANGELOG.md | 508 + node_modules/acorn/LICENSE | 19 + node_modules/acorn/README.md | 467 + .../acorn/acorn-loose/dist/acorn-loose.js | 1372 ++ .../acorn/acorn-loose/dist/acorn-loose.js.map | 1 + .../acorn/acorn-loose/dist/acorn-loose.mjs | 1363 ++ .../acorn-loose/dist/acorn-loose.mjs.map | 1 + node_modules/acorn/acorn-walk/dist/walk.js | 461 + .../acorn/acorn-walk/dist/walk.js.map | 1 + node_modules/acorn/acorn-walk/dist/walk.mjs | 441 + .../acorn/acorn-walk/dist/walk.mjs.map | 1 + node_modules/acorn/acorn/dist/acorn.js | 4992 +++++ node_modules/acorn/acorn/dist/acorn.js.map | 1 + node_modules/acorn/acorn/dist/acorn.mjs | 4961 +++++ node_modules/acorn/acorn/dist/acorn.mjs.map | 1 + node_modules/acorn/acorn/dist/bin.js | 64 + node_modules/acorn/dist/.keep | 0 node_modules/acorn/dist/acorn.es.js | 5316 +++++ node_modules/acorn/dist/acorn.js | 5347 +++++ node_modules/acorn/dist/acorn_loose.es.js | 1424 ++ node_modules/acorn/dist/acorn_loose.js | 1434 ++ node_modules/acorn/dist/walk.es.js | 423 + node_modules/acorn/dist/walk.js | 443 + node_modules/acorn/package.json | 60 + node_modules/ajv/.tonic_example.js | 20 + node_modules/ajv/LICENSE | 22 + node_modules/ajv/README.md | 1497 ++ node_modules/ajv/dist/ajv.bundle.js | 7189 +++++++ node_modules/ajv/dist/ajv.min.js | 3 + node_modules/ajv/dist/ajv.min.js.map | 1 + node_modules/ajv/package.json | 106 + node_modules/ajv/scripts/.eslintrc.yml | 3 + node_modules/ajv/scripts/bundle.js | 61 + node_modules/ajv/scripts/compile-dots.js | 73 + node_modules/ajv/scripts/info | 10 + node_modules/ajv/scripts/prepare-tests | 12 + .../ajv/scripts/publish-built-version | 32 + node_modules/ajv/scripts/travis-gh-pages | 23 + node_modules/amdefine/LICENSE | 58 + node_modules/amdefine/README.md | 171 + node_modules/amdefine/amdefine.js | 301 + node_modules/amdefine/intercept.js | 36 + node_modules/amdefine/package.json | 16 + node_modules/ansi-colors/LICENSE | 21 + node_modules/ansi-colors/README.md | 105 + node_modules/ansi-colors/index.js | 456 + node_modules/ansi-colors/package.json | 138 + node_modules/ansi-colors/types/index.d.ts | 31 + node_modules/ansi-gray/LICENSE | 21 + node_modules/ansi-gray/index.js | 14 + node_modules/ansi-gray/package.json | 55 + node_modules/ansi-gray/readme.md | 74 + node_modules/ansi-regex/index.js | 4 + node_modules/ansi-regex/license | 21 + node_modules/ansi-regex/package.json | 64 + node_modules/ansi-regex/readme.md | 39 + node_modules/ansi-styles/index.js | 165 + node_modules/ansi-styles/license | 9 + node_modules/ansi-styles/package.json | 56 + node_modules/ansi-styles/readme.md | 147 + node_modules/ansi-wrap/LICENSE | 21 + node_modules/ansi-wrap/README.md | 89 + node_modules/ansi-wrap/index.js | 5 + node_modules/ansi-wrap/package.json | 34 + node_modules/anymatch/LICENSE | 15 + node_modules/anymatch/README.md | 99 + node_modules/anymatch/index.js | 67 + node_modules/anymatch/package.json | 47 + node_modules/append-buffer/LICENSE | 21 + node_modules/append-buffer/README.md | 95 + node_modules/append-buffer/index.js | 41 + node_modules/append-buffer/package.json | 53 + node_modules/aproba/LICENSE | 14 + node_modules/aproba/README.md | 94 + node_modules/aproba/index.js | 105 + node_modules/aproba/package.json | 34 + node_modules/archy/.travis.yml | 4 + node_modules/archy/LICENSE | 18 + node_modules/archy/examples/beep.js | 24 + node_modules/archy/examples/multi_line.js | 25 + node_modules/archy/index.js | 35 + node_modules/archy/package.json | 40 + node_modules/archy/readme.markdown | 88 + node_modules/archy/test/beep.js | 40 + node_modules/archy/test/multi_line.js | 45 + node_modules/archy/test/non_unicode.js | 40 + node_modules/are-we-there-yet/CHANGES.md | 37 + node_modules/are-we-there-yet/LICENSE | 5 + node_modules/are-we-there-yet/README.md | 195 + node_modules/are-we-there-yet/index.js | 4 + node_modules/are-we-there-yet/package.json | 35 + node_modules/are-we-there-yet/tracker-base.js | 11 + .../are-we-there-yet/tracker-group.js | 107 + .../are-we-there-yet/tracker-stream.js | 36 + node_modules/are-we-there-yet/tracker.js | 30 + node_modules/arr-diff/LICENSE | 21 + node_modules/arr-diff/README.md | 130 + node_modules/arr-diff/index.js | 47 + node_modules/arr-diff/package.json | 69 + node_modules/arr-filter/LICENSE | 21 + node_modules/arr-filter/README.md | 72 + node_modules/arr-filter/index.js | 33 + node_modules/arr-filter/package.json | 61 + node_modules/arr-flatten/LICENSE | 21 + node_modules/arr-flatten/README.md | 86 + node_modules/arr-flatten/index.js | 22 + node_modules/arr-flatten/package.json | 76 + node_modules/arr-map/LICENSE | 21 + node_modules/arr-map/README.md | 78 + node_modules/arr-map/index.js | 23 + node_modules/arr-map/package.json | 62 + node_modules/arr-union/LICENSE | 21 + node_modules/arr-union/README.md | 99 + node_modules/arr-union/index.js | 29 + node_modules/arr-union/package.json | 76 + node_modules/array-each/LICENSE | 21 + node_modules/array-each/README.md | 84 + node_modules/array-each/index.js | 46 + node_modules/array-each/package.json | 50 + node_modules/array-find-index/index.js | 25 + node_modules/array-find-index/license | 21 + node_modules/array-find-index/package.json | 35 + node_modules/array-find-index/readme.md | 30 + node_modules/array-initial/.jshintrc | 17 + node_modules/array-initial/.npmignore | 59 + node_modules/array-initial/.travis.yml | 14 + node_modules/array-initial/LICENSE-MIT | 24 + node_modules/array-initial/README.md | 39 + node_modules/array-initial/index.js | 21 + .../node_modules/is-number/LICENSE | 21 + .../node_modules/is-number/README.md | 135 + .../node_modules/is-number/index.js | 21 + .../node_modules/is-number/package.json | 76 + node_modules/array-initial/package.json | 46 + node_modules/array-last/LICENSE | 21 + node_modules/array-last/README.md | 94 + node_modules/array-last/index.js | 30 + .../array-last/node_modules/is-number/LICENSE | 21 + .../node_modules/is-number/README.md | 135 + .../node_modules/is-number/index.js | 21 + .../node_modules/is-number/package.json | 76 + node_modules/array-last/package.json | 76 + node_modules/array-slice/LICENSE | 21 + node_modules/array-slice/README.md | 82 + node_modules/array-slice/index.js | 33 + node_modules/array-slice/package.json | 54 + node_modules/array-sort/LICENSE | 21 + node_modules/array-sort/README.md | 203 + node_modules/array-sort/index.js | 105 + .../array-sort/node_modules/kind-of/LICENSE | 21 + .../array-sort/node_modules/kind-of/README.md | 342 + .../array-sort/node_modules/kind-of/index.js | 147 + .../node_modules/kind-of/package.json | 91 + node_modules/array-sort/package.json | 94 + node_modules/array-unique/LICENSE | 21 + node_modules/array-unique/README.md | 77 + node_modules/array-unique/index.js | 43 + node_modules/array-unique/package.json | 62 + node_modules/asn1/LICENSE | 19 + node_modules/asn1/README.md | 50 + node_modules/asn1/package.json | 31 + node_modules/assert-plus/AUTHORS | 6 + node_modules/assert-plus/CHANGES.md | 14 + node_modules/assert-plus/README.md | 162 + node_modules/assert-plus/assert.js | 211 + node_modules/assert-plus/package.json | 23 + node_modules/assign-symbols/LICENSE | 21 + node_modules/assign-symbols/README.md | 73 + node_modules/assign-symbols/index.js | 40 + node_modules/assign-symbols/package.json | 40 + node_modules/async-done/LICENSE | 21 + node_modules/async-done/README.md | 121 + node_modules/async-done/index.d.ts | 101 + node_modules/async-done/index.js | 88 + node_modules/async-done/package.json | 65 + node_modules/async-each/README.md | 52 + node_modules/async-each/index.js | 38 + node_modules/async-each/package.json | 20 + node_modules/async-foreach/LICENSE-MIT | 22 + node_modules/async-foreach/README.md | 195 + node_modules/async-foreach/dist/ba-foreach.js | 58 + .../async-foreach/dist/ba-foreach.min.js | 4 + node_modules/async-foreach/grunt.js | 48 + node_modules/async-foreach/package.json | 25 + .../async-foreach/test/foreach_test.js | 200 + node_modules/async-settle/LICENSE | 21 + node_modules/async-settle/README.md | 96 + node_modules/async-settle/index.js | 21 + node_modules/async-settle/package.json | 47 + node_modules/asynckit/LICENSE | 21 + node_modules/asynckit/README.md | 233 + node_modules/asynckit/bench.js | 76 + node_modules/asynckit/index.js | 6 + node_modules/asynckit/package.json | 63 + node_modules/asynckit/parallel.js | 43 + node_modules/asynckit/serial.js | 17 + node_modules/asynckit/serialOrdered.js | 75 + node_modules/asynckit/stream.js | 21 + node_modules/atob/LICENSE | 230 + node_modules/atob/LICENSE.DOCS | 319 + node_modules/atob/README.md | 49 + node_modules/atob/bower.json | 24 + node_modules/atob/browser-atob.js | 44 + node_modules/atob/node-atob.js | 7 + node_modules/atob/package.json | 24 + node_modules/atob/test.js | 18 + node_modules/aws-sign2/LICENSE | 55 + node_modules/aws-sign2/README.md | 4 + node_modules/aws-sign2/index.js | 212 + node_modules/aws-sign2/package.json | 17 + node_modules/aws4/.github/FUNDING.yml | 3 + node_modules/aws4/.travis.yml | 9 + node_modules/aws4/LICENSE | 19 + node_modules/aws4/README.md | 183 + node_modules/aws4/aws4.js | 373 + node_modules/aws4/lru.js | 96 + node_modules/aws4/package.json | 17 + node_modules/bach/LICENSE | 21 + node_modules/bach/README.md | 252 + node_modules/bach/index.js | 8 + node_modules/bach/package.json | 78 + node_modules/balanced-match/.npmignore | 5 + node_modules/balanced-match/LICENSE.md | 21 + node_modules/balanced-match/README.md | 91 + node_modules/balanced-match/index.js | 59 + node_modules/balanced-match/package.json | 49 + node_modules/base/LICENSE | 21 + node_modules/base/README.md | 491 + node_modules/base/index.js | 435 + .../base/node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 95 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 62 + node_modules/base/package.json | 111 + node_modules/bcrypt-pbkdf/CONTRIBUTING.md | 13 + node_modules/bcrypt-pbkdf/LICENSE | 66 + node_modules/bcrypt-pbkdf/README.md | 45 + node_modules/bcrypt-pbkdf/index.js | 556 + node_modules/bcrypt-pbkdf/package.json | 15 + .../binary-extensions/binary-extensions.json | 252 + node_modules/binary-extensions/license | 9 + node_modules/binary-extensions/package.json | 36 + node_modules/binary-extensions/readme.md | 33 + node_modules/block-stream/LICENCE | 25 + node_modules/block-stream/LICENSE | 15 + node_modules/block-stream/README.md | 14 + node_modules/block-stream/block-stream.js | 209 + node_modules/block-stream/package.json | 27 + node_modules/brace-expansion/LICENSE | 21 + node_modules/brace-expansion/README.md | 129 + node_modules/brace-expansion/index.js | 201 + node_modules/brace-expansion/package.json | 47 + node_modules/braces/LICENSE | 21 + node_modules/braces/README.md | 640 + node_modules/braces/index.js | 318 + node_modules/braces/package.json | 108 + node_modules/buffer-equal/.travis.yml | 4 + node_modules/buffer-equal/LICENSE | 18 + node_modules/buffer-equal/README.markdown | 62 + node_modules/buffer-equal/example/eq.js | 14 + node_modules/buffer-equal/index.js | 14 + node_modules/buffer-equal/package.json | 33 + node_modules/buffer-equal/test/eq.js | 35 + node_modules/buffer-from/LICENSE | 21 + node_modules/buffer-from/index.js | 69 + node_modules/buffer-from/package.json | 19 + node_modules/buffer-from/readme.md | 69 + node_modules/cache-base/LICENSE | 21 + node_modules/cache-base/README.md | 291 + node_modules/cache-base/index.js | 261 + node_modules/cache-base/package.json | 82 + node_modules/call-bind/.eslintignore | 1 + node_modules/call-bind/.eslintrc | 17 + node_modules/call-bind/.github/FUNDING.yml | 12 + node_modules/call-bind/.nycrc | 13 + node_modules/call-bind/CHANGELOG.md | 36 + node_modules/call-bind/LICENSE | 21 + node_modules/call-bind/README.md | 2 + node_modules/call-bind/callBound.js | 15 + node_modules/call-bind/index.js | 46 + node_modules/call-bind/package.json | 80 + node_modules/call-bind/test/callBound.js | 55 + node_modules/call-bind/test/index.js | 66 + node_modules/camelcase-keys/index.js | 12 + node_modules/camelcase-keys/license | 21 + .../node_modules/camelcase/index.js | 56 + .../node_modules/camelcase/license | 21 + .../node_modules/camelcase/package.json | 39 + .../node_modules/camelcase/readme.md | 57 + node_modules/camelcase-keys/package.json | 52 + node_modules/camelcase-keys/readme.md | 54 + node_modules/camelcase/index.js | 56 + node_modules/camelcase/license | 21 + node_modules/camelcase/package.json | 39 + node_modules/camelcase/readme.md | 57 + node_modules/caseless/LICENSE | 28 + node_modules/caseless/README.md | 45 + node_modules/caseless/index.js | 67 + node_modules/caseless/package.json | 27 + node_modules/caseless/test.js | 67 + node_modules/chalk/index.js | 228 + node_modules/chalk/index.js.flow | 93 + node_modules/chalk/license | 9 + node_modules/chalk/package.json | 71 + node_modules/chalk/readme.md | 314 + node_modules/chalk/templates.js | 128 + node_modules/chalk/types/index.d.ts | 97 + node_modules/chokidar/CHANGELOG.md | 317 + node_modules/chokidar/README.md | 294 + node_modules/chokidar/index.js | 747 + .../chokidar/node_modules/is-glob/LICENSE | 21 + .../chokidar/node_modules/is-glob/README.md | 206 + .../chokidar/node_modules/is-glob/index.js | 48 + .../node_modules/is-glob/package.json | 81 + .../node_modules/normalize-path/LICENSE | 21 + .../node_modules/normalize-path/README.md | 127 + .../node_modules/normalize-path/index.js | 35 + .../node_modules/normalize-path/package.json | 77 + node_modules/chokidar/package.json | 63 + node_modules/chokidar/types/index.d.ts | 191 + node_modules/class-utils/LICENSE | 21 + node_modules/class-utils/README.md | 300 + node_modules/class-utils/index.js | 370 + node_modules/class-utils/package.json | 90 + node_modules/cliui/CHANGELOG.md | 15 + node_modules/cliui/LICENSE.txt | 14 + node_modules/cliui/README.md | 110 + node_modules/cliui/index.js | 316 + node_modules/cliui/package.json | 64 + node_modules/clone-buffer/LICENSE | 21 + node_modules/clone-buffer/README.md | 47 + node_modules/clone-buffer/index.js | 28 + node_modules/clone-buffer/package.json | 43 + node_modules/clone-stats/LICENSE.md | 21 + node_modules/clone-stats/README.md | 17 + node_modules/clone-stats/index.js | 13 + node_modules/clone-stats/package.json | 31 + node_modules/clone-stats/test.js | 36 + node_modules/clone/.npmignore | 4 + node_modules/clone/LICENSE | 18 + node_modules/clone/README.md | 194 + node_modules/clone/clone.iml | 10 + node_modules/clone/clone.js | 257 + node_modules/clone/package.json | 56 + node_modules/cloneable-readable/.travis.yml | 13 + node_modules/cloneable-readable/LICENSE | 21 + node_modules/cloneable-readable/README.md | 54 + node_modules/cloneable-readable/example.js | 14 + node_modules/cloneable-readable/index.js | 153 + node_modules/cloneable-readable/package.json | 39 + node_modules/cloneable-readable/test.js | 702 + node_modules/code-point-at/index.js | 32 + node_modules/code-point-at/license | 21 + node_modules/code-point-at/package.json | 38 + node_modules/code-point-at/readme.md | 32 + node_modules/collection-map/LICENSE | 21 + node_modules/collection-map/README.md | 133 + node_modules/collection-map/index.js | 25 + node_modules/collection-map/package.json | 56 + node_modules/collection-visit/LICENSE | 21 + node_modules/collection-visit/README.md | 89 + node_modules/collection-visit/index.js | 30 + node_modules/collection-visit/package.json | 76 + node_modules/color-convert/CHANGELOG.md | 54 + node_modules/color-convert/LICENSE | 21 + node_modules/color-convert/README.md | 68 + node_modules/color-convert/conversions.js | 868 + node_modules/color-convert/index.js | 78 + node_modules/color-convert/package.json | 46 + node_modules/color-convert/route.js | 97 + node_modules/color-name/.eslintrc.json | 43 + node_modules/color-name/.npmignore | 107 + node_modules/color-name/LICENSE | 8 + node_modules/color-name/README.md | 11 + node_modules/color-name/index.js | 152 + node_modules/color-name/package.json | 25 + node_modules/color-name/test.js | 7 + node_modules/color-support/LICENSE | 15 + node_modules/color-support/README.md | 129 + node_modules/color-support/bin.js | 3 + node_modules/color-support/browser.js | 14 + node_modules/color-support/index.js | 134 + node_modules/color-support/package.json | 36 + node_modules/combined-stream/License | 19 + node_modules/combined-stream/Readme.md | 138 + node_modules/combined-stream/package.json | 25 + node_modules/combined-stream/yarn.lock | 17 + node_modules/component-emitter/History.md | 75 + node_modules/component-emitter/LICENSE | 24 + node_modules/component-emitter/Readme.md | 74 + node_modules/component-emitter/index.js | 175 + node_modules/component-emitter/package.json | 27 + node_modules/concat-map/.travis.yml | 4 + node_modules/concat-map/LICENSE | 18 + node_modules/concat-map/README.markdown | 62 + node_modules/concat-map/example/map.js | 6 + node_modules/concat-map/index.js | 13 + node_modules/concat-map/package.json | 43 + node_modules/concat-map/test/map.js | 39 + node_modules/concat-stream/LICENSE | 24 + node_modules/concat-stream/index.js | 144 + node_modules/concat-stream/package.json | 55 + node_modules/concat-stream/readme.md | 102 + node_modules/console-control-strings/LICENSE | 13 + .../console-control-strings/README.md | 145 + .../console-control-strings/README.md~ | 140 + node_modules/console-control-strings/index.js | 125 + .../console-control-strings/package.json | 27 + node_modules/convert-source-map/LICENSE | 23 + node_modules/convert-source-map/README.md | 125 + node_modules/convert-source-map/index.js | 136 + .../node_modules/safe-buffer/LICENSE | 21 + .../node_modules/safe-buffer/README.md | 584 + .../node_modules/safe-buffer/index.d.ts | 187 + .../node_modules/safe-buffer/index.js | 62 + .../node_modules/safe-buffer/package.json | 37 + node_modules/convert-source-map/package.json | 44 + node_modules/copy-descriptor/LICENSE | 21 + node_modules/copy-descriptor/index.js | 81 + node_modules/copy-descriptor/package.json | 56 + node_modules/copy-props/LICENSE | 21 + node_modules/copy-props/README.md | 227 + node_modules/copy-props/index.js | 226 + node_modules/copy-props/package.json | 50 + node_modules/core-util-is/LICENSE | 19 + node_modules/core-util-is/README.md | 3 + node_modules/core-util-is/float.patch | 604 + node_modules/core-util-is/package.json | 32 + node_modules/core-util-is/test.js | 68 + node_modules/cross-spawn/.editorconfig | 15 + node_modules/cross-spawn/.eslintrc | 7 + node_modules/cross-spawn/.npmignore | 3 + node_modules/cross-spawn/.travis.yml | 6 + node_modules/cross-spawn/LICENSE | 19 + node_modules/cross-spawn/README.md | 64 + node_modules/cross-spawn/appveyor.yml | 29 + node_modules/cross-spawn/index.js | 59 + .../cross-spawn/node_modules/.bin/which | 1 + node_modules/cross-spawn/package.json | 47 + node_modules/css-tree/CHANGELOG.md | 584 + node_modules/css-tree/LICENSE | 19 + node_modules/css-tree/README.md | 130 + node_modules/css-tree/data/index.js | 103 + node_modules/css-tree/data/patch.json | 717 + node_modules/css-tree/dist/csstree.js | 12606 ++++++++++++ node_modules/css-tree/dist/csstree.min.js | 1 + node_modules/css-tree/package.json | 60 + node_modules/css/History.md | 75 + node_modules/css/LICENSE | 9 + node_modules/css/Readme.md | 314 + node_modules/css/index.js | 2 + node_modules/css/package.json | 39 + node_modules/csso/CHANGELOG.md | 421 + node_modules/csso/LICENSE | 20 + node_modules/csso/README.md | 372 + node_modules/csso/dist/csso.js | 3322 +++ node_modules/csso/dist/csso.min.js | 1 + node_modules/csso/package.json | 65 + node_modules/currently-unhandled/browser.js | 27 + node_modules/currently-unhandled/core.js | 33 + node_modules/currently-unhandled/index.js | 12 + node_modules/currently-unhandled/license | 21 + node_modules/currently-unhandled/package.json | 71 + node_modules/currently-unhandled/readme.md | 44 + node_modules/d/.editorconfig | 15 + node_modules/d/.github/FUNDING.yml | 1 + node_modules/d/CHANGELOG.md | 9 + node_modules/d/CHANGES | 17 + node_modules/d/LICENSE | 15 + node_modules/d/README.md | 134 + node_modules/d/auto-bind.js | 33 + node_modules/d/index.js | 62 + node_modules/d/lazy.js | 115 + node_modules/d/package.json | 72 + node_modules/d/test/auto-bind.js | 11 + node_modules/d/test/index.js | 209 + node_modules/d/test/lazy.js | 97 + node_modules/dashdash/CHANGES.md | 364 + node_modules/dashdash/LICENSE.txt | 24 + node_modules/dashdash/README.md | 574 + .../dashdash/etc/dashdash.bash_completion.in | 389 + node_modules/dashdash/package.json | 26 + node_modules/debug-fabulous/LICENSE | 21 + node_modules/debug-fabulous/README.md | 50 + node_modules/debug-fabulous/index.js | 2 + .../node_modules/debug/CHANGELOG.md | 395 + .../debug-fabulous/node_modules/debug/LICENSE | 19 + .../node_modules/debug/README.md | 437 + .../debug-fabulous/node_modules/debug/node.js | 1 + .../node_modules/debug/package.json | 51 + .../node_modules/debug/src/browser.js | 180 + .../node_modules/debug/src/common.js | 249 + .../node_modules/debug/src/index.js | 12 + .../node_modules/debug/src/node.js | 177 + .../debug-fabulous/node_modules/ms/index.js | 162 + .../debug-fabulous/node_modules/ms/license.md | 21 + .../node_modules/ms/package.json | 38 + .../debug-fabulous/node_modules/ms/readme.md | 59 + node_modules/debug-fabulous/package.json | 35 + .../debug-fabulous/src/debugFabFactory.js | 18 + node_modules/debug-fabulous/src/formatArgs.js | 24 + node_modules/debug-fabulous/src/lazy-eval.js | 46 + node_modules/debug-fabulous/src/spawn.js | 32 + node_modules/debug-fabulous/yarn-error.log | 1056 + node_modules/debug-fabulous/yarn.lock | 984 + node_modules/debug/.coveralls.yml | 1 + node_modules/debug/.eslintrc | 11 + node_modules/debug/.npmignore | 9 + node_modules/debug/.travis.yml | 14 + node_modules/debug/CHANGELOG.md | 362 + node_modules/debug/LICENSE | 19 + node_modules/debug/Makefile | 50 + node_modules/debug/README.md | 312 + node_modules/debug/component.json | 19 + node_modules/debug/karma.conf.js | 70 + node_modules/debug/node.js | 1 + node_modules/debug/package.json | 49 + node_modules/debug/src/browser.js | 185 + node_modules/debug/src/debug.js | 202 + node_modules/debug/src/index.js | 10 + node_modules/debug/src/inspector-log.js | 15 + node_modules/debug/src/node.js | 248 + node_modules/decamelize/index.js | 13 + node_modules/decamelize/license | 21 + node_modules/decamelize/package.json | 38 + node_modules/decamelize/readme.md | 48 + node_modules/decode-uri-component/index.js | 94 + node_modules/decode-uri-component/license | 21 + .../decode-uri-component/package.json | 37 + node_modules/decode-uri-component/readme.md | 70 + node_modules/default-compare/LICENSE | 21 + node_modules/default-compare/README.md | 116 + node_modules/default-compare/index.js | 44 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 342 + .../node_modules/kind-of/index.js | 147 + .../node_modules/kind-of/package.json | 91 + node_modules/default-compare/package.json | 46 + node_modules/default-resolution/LICENSE | 21 + node_modules/default-resolution/README.md | 70 + node_modules/default-resolution/index.js | 17 + .../default-resolution/node-version.js | 10 + node_modules/default-resolution/package.json | 43 + node_modules/define-properties/.editorconfig | 13 + node_modules/define-properties/.eslintrc | 12 + node_modules/define-properties/.jscs.json | 175 + node_modules/define-properties/.travis.yml | 233 + node_modules/define-properties/CHANGELOG.md | 44 + node_modules/define-properties/LICENSE | 21 + node_modules/define-properties/README.md | 86 + node_modules/define-properties/index.js | 58 + node_modules/define-properties/package.json | 65 + node_modules/define-properties/test/index.js | 125 + node_modules/define-property/LICENSE | 21 + node_modules/define-property/README.md | 77 + node_modules/define-property/index.js | 31 + .../is-accessor-descriptor/LICENSE | 21 + .../is-accessor-descriptor/README.md | 123 + .../is-accessor-descriptor/index.js | 69 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 261 + .../node_modules/kind-of/index.js | 116 + .../node_modules/kind-of/package.json | 90 + .../is-accessor-descriptor/package.json | 61 + .../node_modules/is-data-descriptor/LICENSE | 21 + .../node_modules/is-data-descriptor/README.md | 128 + .../node_modules/is-data-descriptor/index.js | 55 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 261 + .../node_modules/kind-of/index.js | 116 + .../node_modules/kind-of/package.json | 90 + .../is-data-descriptor/package.json | 60 + .../node_modules/is-descriptor/LICENSE | 21 + .../node_modules/is-descriptor/README.md | 193 + .../node_modules/is-descriptor/index.js | 22 + .../node_modules/is-descriptor/package.json | 75 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 342 + .../node_modules/kind-of/index.js | 147 + .../node_modules/kind-of/package.json | 91 + node_modules/define-property/package.json | 51 + node_modules/delayed-stream/.npmignore | 1 + node_modules/delayed-stream/License | 19 + node_modules/delayed-stream/Makefile | 7 + node_modules/delayed-stream/Readme.md | 141 + node_modules/delayed-stream/package.json | 27 + node_modules/delegates/.npmignore | 1 + node_modules/delegates/History.md | 22 + node_modules/delegates/License | 20 + node_modules/delegates/Makefile | 8 + node_modules/delegates/Readme.md | 94 + node_modules/delegates/index.js | 121 + node_modules/delegates/package.json | 13 + node_modules/delegates/test/index.js | 94 + node_modules/detect-file/LICENSE | 21 + node_modules/detect-file/README.md | 99 + node_modules/detect-file/index.js | 109 + node_modules/detect-file/package.json | 60 + node_modules/detect-newline/index.js | 24 + node_modules/detect-newline/license | 21 + node_modules/detect-newline/package.json | 37 + node_modules/detect-newline/readme.md | 42 + node_modules/duplexify/.travis.yml | 6 + node_modules/duplexify/LICENSE | 21 + node_modules/duplexify/README.md | 97 + node_modules/duplexify/example.js | 21 + node_modules/duplexify/index.js | 234 + node_modules/duplexify/package.json | 39 + node_modules/duplexify/test.js | 295 + node_modules/each-props/LICENSE | 21 + node_modules/each-props/README.md | 125 + node_modules/each-props/index.js | 57 + node_modules/each-props/package.json | 50 + node_modules/ecc-jsbn/LICENSE | 21 + node_modules/ecc-jsbn/README.md | 8 + node_modules/ecc-jsbn/index.js | 58 + node_modules/ecc-jsbn/package.json | 40 + node_modules/ecc-jsbn/test.js | 14 + node_modules/emoji-regex/LICENSE-MIT.txt | 20 + node_modules/emoji-regex/README.md | 73 + node_modules/emoji-regex/es2015/index.js | 6 + node_modules/emoji-regex/es2015/text.js | 6 + node_modules/emoji-regex/index.d.ts | 5 + node_modules/emoji-regex/index.js | 6 + node_modules/emoji-regex/package.json | 51 + node_modules/emoji-regex/text.js | 6 + node_modules/end-of-stream/LICENSE | 21 + node_modules/end-of-stream/README.md | 54 + node_modules/end-of-stream/index.js | 94 + node_modules/end-of-stream/package.json | 37 + node_modules/error-ex/LICENSE | 21 + node_modules/error-ex/README.md | 144 + node_modules/error-ex/index.js | 141 + node_modules/error-ex/package.json | 46 + node_modules/es5-ext/.editorconfig | 16 + node_modules/es5-ext/.github/FUNDING.yml | 1 + node_modules/es5-ext/CHANGELOG.md | 325 + node_modules/es5-ext/CHANGES | 650 + node_modules/es5-ext/LICENSE | 15 + node_modules/es5-ext/README.md | 1039 + .../es5-ext/array/#/@@iterator/implement.js | 10 + .../es5-ext/array/#/@@iterator/index.js | 5 + .../array/#/@@iterator/is-implemented.js | 16 + .../es5-ext/array/#/@@iterator/shim.js | 3 + .../es5-ext/array/#/_compare-by-length.js | 7 + node_modules/es5-ext/array/#/binary-search.js | 27 + node_modules/es5-ext/array/#/clear.js | 12 + node_modules/es5-ext/array/#/compact.js | 11 + .../es5-ext/array/#/concat/implement.js | 10 + node_modules/es5-ext/array/#/concat/index.js | 3 + .../es5-ext/array/#/concat/is-implemented.js | 5 + node_modules/es5-ext/array/#/concat/shim.js | 44 + node_modules/es5-ext/array/#/contains.js | 7 + .../es5-ext/array/#/copy-within/implement.js | 10 + .../es5-ext/array/#/copy-within/index.js | 3 + .../array/#/copy-within/is-implemented.js | 7 + .../es5-ext/array/#/copy-within/shim.js | 45 + node_modules/es5-ext/array/#/diff.js | 11 + node_modules/es5-ext/array/#/e-index-of.js | 28 + .../es5-ext/array/#/e-last-index-of.js | 31 + .../es5-ext/array/#/entries/implement.js | 10 + node_modules/es5-ext/array/#/entries/index.js | 3 + .../es5-ext/array/#/entries/is-implemented.js | 15 + node_modules/es5-ext/array/#/entries/shim.js | 4 + node_modules/es5-ext/array/#/exclusion.js | 25 + .../es5-ext/array/#/fill/implement.js | 10 + node_modules/es5-ext/array/#/fill/index.js | 3 + .../es5-ext/array/#/fill/is-implemented.js | 7 + node_modules/es5-ext/array/#/fill/shim.js | 25 + .../es5-ext/array/#/filter/implement.js | 10 + node_modules/es5-ext/array/#/filter/index.js | 3 + .../es5-ext/array/#/filter/is-implemented.js | 6 + node_modules/es5-ext/array/#/filter/shim.js | 23 + .../es5-ext/array/#/find-index/implement.js | 10 + .../es5-ext/array/#/find-index/index.js | 3 + .../array/#/find-index/is-implemented.js | 9 + .../es5-ext/array/#/find-index/shim.js | 26 + .../es5-ext/array/#/find/implement.js | 10 + node_modules/es5-ext/array/#/find/index.js | 3 + .../es5-ext/array/#/find/is-implemented.js | 9 + node_modules/es5-ext/array/#/find/shim.js | 9 + node_modules/es5-ext/array/#/first-index.js | 15 + node_modules/es5-ext/array/#/first.js | 9 + node_modules/es5-ext/array/#/flatten.js | 40 + .../es5-ext/array/#/for-each-right.js | 19 + node_modules/es5-ext/array/#/group.js | 28 + node_modules/es5-ext/array/#/index.js | 41 + node_modules/es5-ext/array/#/indexes-of.js | 12 + node_modules/es5-ext/array/#/intersection.js | 19 + node_modules/es5-ext/array/#/is-copy.js | 21 + node_modules/es5-ext/array/#/is-empty.js | 6 + node_modules/es5-ext/array/#/is-uniq.js | 9 + .../es5-ext/array/#/keys/implement.js | 10 + node_modules/es5-ext/array/#/keys/index.js | 3 + .../es5-ext/array/#/keys/is-implemented.js | 14 + node_modules/es5-ext/array/#/keys/shim.js | 4 + node_modules/es5-ext/array/#/last-index.js | 15 + node_modules/es5-ext/array/#/last.js | 9 + node_modules/es5-ext/array/#/map/implement.js | 10 + node_modules/es5-ext/array/#/map/index.js | 3 + .../es5-ext/array/#/map/is-implemented.js | 6 + node_modules/es5-ext/array/#/map/shim.js | 22 + node_modules/es5-ext/array/#/remove.js | 17 + node_modules/es5-ext/array/#/separate.js | 10 + .../es5-ext/array/#/slice/implement.js | 10 + node_modules/es5-ext/array/#/slice/index.js | 3 + .../es5-ext/array/#/slice/is-implemented.js | 5 + node_modules/es5-ext/array/#/slice/shim.js | 36 + node_modules/es5-ext/array/#/some-right.js | 21 + .../es5-ext/array/#/splice/implement.js | 10 + node_modules/es5-ext/array/#/splice/index.js | 3 + .../es5-ext/array/#/splice/is-implemented.js | 5 + node_modules/es5-ext/array/#/splice/shim.js | 15 + node_modules/es5-ext/array/#/uniq.js | 9 + .../es5-ext/array/#/values/implement.js | 10 + node_modules/es5-ext/array/#/values/index.js | 3 + .../es5-ext/array/#/values/is-implemented.js | 14 + node_modules/es5-ext/array/#/values/shim.js | 4 + node_modules/es5-ext/array/_is-extensible.js | 14 + .../es5-ext/array/_sub-array-dummy-safe.js | 22 + .../es5-ext/array/_sub-array-dummy.js | 15 + node_modules/es5-ext/array/from/implement.js | 10 + node_modules/es5-ext/array/from/index.js | 3 + .../es5-ext/array/from/is-implemented.js | 9 + node_modules/es5-ext/array/from/shim.js | 119 + node_modules/es5-ext/array/generate.js | 18 + node_modules/es5-ext/array/index.js | 11 + node_modules/es5-ext/array/is-plain-array.js | 11 + node_modules/es5-ext/array/of/implement.js | 10 + node_modules/es5-ext/array/of/index.js | 3 + .../es5-ext/array/of/is-implemented.js | 8 + node_modules/es5-ext/array/of/shim.js | 19 + node_modules/es5-ext/array/to-array.js | 6 + node_modules/es5-ext/array/valid-array.js | 8 + node_modules/es5-ext/boolean/index.js | 3 + node_modules/es5-ext/boolean/is-boolean.js | 10 + node_modules/es5-ext/date/#/copy.js | 5 + node_modules/es5-ext/date/#/days-in-month.js | 17 + node_modules/es5-ext/date/#/floor-day.js | 8 + node_modules/es5-ext/date/#/floor-month.js | 8 + node_modules/es5-ext/date/#/floor-year.js | 8 + node_modules/es5-ext/date/#/format.js | 20 + node_modules/es5-ext/date/#/index.js | 10 + .../es5-ext/date/ensure-time-value.js | 10 + node_modules/es5-ext/date/index.js | 9 + node_modules/es5-ext/date/is-date.js | 10 + node_modules/es5-ext/date/is-time-value.js | 9 + node_modules/es5-ext/date/valid-date.js | 8 + node_modules/es5-ext/error/#/index.js | 3 + node_modules/es5-ext/error/#/throw.js | 5 + node_modules/es5-ext/error/custom.js | 20 + node_modules/es5-ext/error/index.js | 8 + node_modules/es5-ext/error/is-error.js | 7 + node_modules/es5-ext/error/valid-error.js | 8 + node_modules/es5-ext/function/#/compose.js | 20 + node_modules/es5-ext/function/#/copy.js | 22 + node_modules/es5-ext/function/#/curry.js | 25 + node_modules/es5-ext/function/#/index.js | 13 + node_modules/es5-ext/function/#/lock.js | 10 + .../es5-ext/function/#/microtask-delay.js | 12 + node_modules/es5-ext/function/#/not.js | 11 + node_modules/es5-ext/function/#/partial.js | 14 + node_modules/es5-ext/function/#/spread.js | 9 + .../es5-ext/function/#/to-string-tokens.js | 17 + .../es5-ext/function/_define-length.js | 54 + node_modules/es5-ext/function/constant.js | 5 + node_modules/es5-ext/function/identity.js | 3 + node_modules/es5-ext/function/index.js | 15 + node_modules/es5-ext/function/invoke.js | 14 + node_modules/es5-ext/function/is-arguments.js | 6 + node_modules/es5-ext/function/is-function.js | 8 + node_modules/es5-ext/function/noop.js | 4 + node_modules/es5-ext/function/pluck.js | 7 + .../es5-ext/function/valid-function.js | 8 + node_modules/es5-ext/global.js | 35 + node_modules/es5-ext/index.js | 22 + node_modules/es5-ext/iterable/for-each.js | 11 + node_modules/es5-ext/iterable/index.js | 8 + node_modules/es5-ext/iterable/is.js | 11 + .../es5-ext/iterable/validate-object.js | 9 + node_modules/es5-ext/iterable/validate.js | 8 + node_modules/es5-ext/json/index.js | 3 + node_modules/es5-ext/json/safe-stringify.js | 37 + node_modules/es5-ext/math/_decimal-adjust.js | 29 + node_modules/es5-ext/math/_pack-ieee754.js | 88 + node_modules/es5-ext/math/_unpack-ieee754.js | 33 + node_modules/es5-ext/math/acosh/implement.js | 10 + node_modules/es5-ext/math/acosh/index.js | 3 + .../es5-ext/math/acosh/is-implemented.js | 7 + node_modules/es5-ext/math/acosh/shim.js | 12 + node_modules/es5-ext/math/asinh/implement.js | 10 + node_modules/es5-ext/math/asinh/index.js | 3 + .../es5-ext/math/asinh/is-implemented.js | 7 + node_modules/es5-ext/math/asinh/shim.js | 15 + node_modules/es5-ext/math/atanh/implement.js | 10 + node_modules/es5-ext/math/atanh/index.js | 3 + .../es5-ext/math/atanh/is-implemented.js | 7 + node_modules/es5-ext/math/atanh/shim.js | 14 + node_modules/es5-ext/math/cbrt/implement.js | 10 + node_modules/es5-ext/math/cbrt/index.js | 3 + .../es5-ext/math/cbrt/is-implemented.js | 7 + node_modules/es5-ext/math/cbrt/shim.js | 12 + node_modules/es5-ext/math/ceil-10.js | 3 + node_modules/es5-ext/math/clz32/implement.js | 10 + node_modules/es5-ext/math/clz32/index.js | 3 + .../es5-ext/math/clz32/is-implemented.js | 7 + node_modules/es5-ext/math/clz32/shim.js | 7 + node_modules/es5-ext/math/cosh/implement.js | 10 + node_modules/es5-ext/math/cosh/index.js | 3 + .../es5-ext/math/cosh/is-implemented.js | 7 + node_modules/es5-ext/math/cosh/shim.js | 11 + node_modules/es5-ext/math/expm1/implement.js | 10 + node_modules/es5-ext/math/expm1/index.js | 3 + .../es5-ext/math/expm1/is-implemented.js | 7 + node_modules/es5-ext/math/expm1/shim.js | 16 + node_modules/es5-ext/math/floor-10.js | 3 + node_modules/es5-ext/math/fround/implement.js | 10 + node_modules/es5-ext/math/fround/index.js | 3 + .../es5-ext/math/fround/is-implemented.js | 7 + node_modules/es5-ext/math/fround/shim.js | 33 + node_modules/es5-ext/math/hypot/implement.js | 10 + node_modules/es5-ext/math/hypot/index.js | 3 + .../es5-ext/math/hypot/is-implemented.js | 7 + node_modules/es5-ext/math/hypot/shim.js | 37 + node_modules/es5-ext/math/imul/implement.js | 10 + node_modules/es5-ext/math/imul/index.js | 3 + .../es5-ext/math/imul/is-implemented.js | 7 + node_modules/es5-ext/math/imul/shim.js | 17 + node_modules/es5-ext/math/index.js | 24 + node_modules/es5-ext/math/log10/implement.js | 10 + node_modules/es5-ext/math/log10/index.js | 3 + .../es5-ext/math/log10/is-implemented.js | 7 + node_modules/es5-ext/math/log10/shim.js | 14 + node_modules/es5-ext/math/log1p/implement.js | 10 + node_modules/es5-ext/math/log1p/index.js | 3 + .../es5-ext/math/log1p/is-implemented.js | 7 + node_modules/es5-ext/math/log1p/shim.js | 17 + node_modules/es5-ext/math/log2/implement.js | 10 + node_modules/es5-ext/math/log2/index.js | 3 + .../es5-ext/math/log2/is-implemented.js | 7 + node_modules/es5-ext/math/log2/shim.js | 14 + node_modules/es5-ext/math/round-10.js | 3 + node_modules/es5-ext/math/sign/implement.js | 10 + node_modules/es5-ext/math/sign/index.js | 3 + .../es5-ext/math/sign/is-implemented.js | 7 + node_modules/es5-ext/math/sign/shim.js | 7 + node_modules/es5-ext/math/sinh/implement.js | 10 + node_modules/es5-ext/math/sinh/index.js | 3 + .../es5-ext/math/sinh/is-implemented.js | 7 + node_modules/es5-ext/math/sinh/shim.js | 18 + node_modules/es5-ext/math/tanh/implement.js | 10 + node_modules/es5-ext/math/tanh/index.js | 3 + .../es5-ext/math/tanh/is-implemented.js | 7 + node_modules/es5-ext/math/tanh/shim.js | 17 + node_modules/es5-ext/math/trunc/implement.js | 10 + node_modules/es5-ext/math/trunc/index.js | 3 + .../es5-ext/math/trunc/is-implemented.js | 7 + node_modules/es5-ext/math/trunc/shim.js | 13 + .../es5-ext/node_modules/next-tick/.lint | 14 + .../es5-ext/node_modules/next-tick/.npmignore | 4 + .../node_modules/next-tick/.travis.yml | 16 + .../es5-ext/node_modules/next-tick/CHANGES | 24 + .../es5-ext/node_modules/next-tick/LICENSE | 21 + .../es5-ext/node_modules/next-tick/README.md | 24 + .../es5-ext/node_modules/next-tick/index.js | 71 + .../node_modules/next-tick/package.json | 27 + .../node_modules/next-tick/test/index.js | 22 + node_modules/es5-ext/number/#/index.js | 3 + node_modules/es5-ext/number/#/pad.js | 16 + .../es5-ext/number/epsilon/implement.js | 10 + node_modules/es5-ext/number/epsilon/index.js | 3 + .../es5-ext/number/epsilon/is-implemented.js | 3 + node_modules/es5-ext/number/index.js | 17 + .../es5-ext/number/is-finite/implement.js | 10 + .../es5-ext/number/is-finite/index.js | 3 + .../number/is-finite/is-implemented.js | 7 + node_modules/es5-ext/number/is-finite/shim.js | 3 + .../es5-ext/number/is-integer/implement.js | 10 + .../es5-ext/number/is-integer/index.js | 3 + .../number/is-integer/is-implemented.js | 7 + .../es5-ext/number/is-integer/shim.js | 8 + .../es5-ext/number/is-nan/implement.js | 10 + node_modules/es5-ext/number/is-nan/index.js | 3 + .../es5-ext/number/is-nan/is-implemented.js | 7 + node_modules/es5-ext/number/is-nan/shim.js | 6 + node_modules/es5-ext/number/is-natural.js | 5 + node_modules/es5-ext/number/is-number.js | 10 + .../number/is-safe-integer/implement.js | 10 + .../es5-ext/number/is-safe-integer/index.js | 3 + .../number/is-safe-integer/is-implemented.js | 7 + .../es5-ext/number/is-safe-integer/shim.js | 10 + .../number/max-safe-integer/implement.js | 10 + .../es5-ext/number/max-safe-integer/index.js | 3 + .../number/max-safe-integer/is-implemented.js | 3 + .../number/min-safe-integer/implement.js | 10 + .../es5-ext/number/min-safe-integer/index.js | 3 + .../number/min-safe-integer/is-implemented.js | 3 + node_modules/es5-ext/number/to-integer.js | 12 + node_modules/es5-ext/number/to-pos-integer.js | 6 + node_modules/es5-ext/number/to-uint32.js | 6 + node_modules/es5-ext/object/_iterate.js | 30 + node_modules/es5-ext/object/assign-deep.js | 34 + .../es5-ext/object/assign/implement.js | 10 + node_modules/es5-ext/object/assign/index.js | 3 + .../es5-ext/object/assign/is-implemented.js | 9 + node_modules/es5-ext/object/assign/shim.js | 23 + node_modules/es5-ext/object/clear.js | 16 + node_modules/es5-ext/object/compact.js | 8 + node_modules/es5-ext/object/compare.js | 39 + node_modules/es5-ext/object/copy-deep.js | 35 + node_modules/es5-ext/object/copy.js | 19 + node_modules/es5-ext/object/count.js | 5 + node_modules/es5-ext/object/create.js | 43 + node_modules/es5-ext/object/ensure-array.js | 9 + .../es5-ext/object/ensure-finite-number.js | 9 + node_modules/es5-ext/object/ensure-integer.js | 9 + .../object/ensure-natural-number-value.js | 10 + .../es5-ext/object/ensure-natural-number.js | 10 + .../es5-ext/object/ensure-plain-function.js | 11 + .../es5-ext/object/ensure-plain-object.js | 9 + node_modules/es5-ext/object/ensure-promise.js | 9 + .../es5-ext/object/ensure-thenable.js | 9 + .../es5-ext/object/entries/implement.js | 10 + node_modules/es5-ext/object/entries/index.js | 3 + .../es5-ext/object/entries/is-implemented.js | 6 + node_modules/es5-ext/object/entries/shim.js | 14 + node_modules/es5-ext/object/eq.js | 7 + node_modules/es5-ext/object/every.js | 3 + node_modules/es5-ext/object/filter.js | 14 + node_modules/es5-ext/object/find-key.js | 3 + node_modules/es5-ext/object/find.js | 10 + node_modules/es5-ext/object/first-key.js | 13 + node_modules/es5-ext/object/flatten.js | 16 + node_modules/es5-ext/object/for-each.js | 3 + .../es5-ext/object/get-property-names.js | 17 + node_modules/es5-ext/object/index.js | 70 + node_modules/es5-ext/object/is-array-like.js | 17 + node_modules/es5-ext/object/is-callable.js | 5 + node_modules/es5-ext/object/is-copy-deep.js | 59 + node_modules/es5-ext/object/is-copy.js | 23 + node_modules/es5-ext/object/is-empty.js | 14 + .../es5-ext/object/is-finite-number.js | 5 + node_modules/es5-ext/object/is-integer.js | 10 + .../es5-ext/object/is-natural-number-value.js | 9 + .../es5-ext/object/is-natural-number.js | 5 + .../es5-ext/object/is-number-value.js | 9 + node_modules/es5-ext/object/is-object.js | 7 + .../es5-ext/object/is-plain-function.js | 11 + .../es5-ext/object/is-plain-object.js | 20 + node_modules/es5-ext/object/is-promise.js | 4 + node_modules/es5-ext/object/is-thenable.js | 6 + node_modules/es5-ext/object/is-value.js | 5 + node_modules/es5-ext/object/is.js | 10 + node_modules/es5-ext/object/key-of.js | 17 + node_modules/es5-ext/object/keys/implement.js | 10 + node_modules/es5-ext/object/keys/index.js | 3 + .../es5-ext/object/keys/is-implemented.js | 10 + node_modules/es5-ext/object/keys/shim.js | 7 + node_modules/es5-ext/object/map-keys.js | 18 + node_modules/es5-ext/object/map.js | 14 + .../es5-ext/object/mixin-prototypes.js | 25 + node_modules/es5-ext/object/mixin.js | 26 + .../es5-ext/object/normalize-options.js | 20 + node_modules/es5-ext/object/primitive-set.js | 10 + node_modules/es5-ext/object/safe-traverse.js | 16 + node_modules/es5-ext/object/serialize.js | 41 + .../object/set-prototype-of/implement.js | 12 + .../es5-ext/object/set-prototype-of/index.js | 3 + .../object/set-prototype-of/is-implemented.js | 9 + .../es5-ext/object/set-prototype-of/shim.js | 81 + node_modules/es5-ext/object/some.js | 3 + node_modules/es5-ext/object/to-array.js | 21 + node_modules/es5-ext/object/unserialize.js | 8 + node_modules/es5-ext/object/valid-callable.js | 6 + node_modules/es5-ext/object/valid-object.js | 8 + node_modules/es5-ext/object/valid-value.js | 8 + .../object/validate-array-like-object.js | 9 + .../es5-ext/object/validate-array-like.js | 8 + .../object/validate-stringifiable-value.js | 6 + .../es5-ext/object/validate-stringifiable.js | 12 + node_modules/es5-ext/optional-chaining.js | 12 + node_modules/es5-ext/package.json | 94 + node_modules/es5-ext/promise/#/as-callback.js | 15 + .../es5-ext/promise/#/finally/implement.js | 10 + .../es5-ext/promise/#/finally/index.js | 3 + .../promise/#/finally/is-implemented.js | 7 + .../es5-ext/promise/#/finally/shim.js | 24 + node_modules/es5-ext/promise/#/index.js | 3 + node_modules/es5-ext/promise/.eslintrc.json | 1 + node_modules/es5-ext/promise/index.js | 3 + node_modules/es5-ext/promise/lazy.js | 35 + node_modules/es5-ext/reg-exp/#/index.js | 10 + node_modules/es5-ext/reg-exp/#/is-sticky.js | 6 + node_modules/es5-ext/reg-exp/#/is-unicode.js | 6 + .../es5-ext/reg-exp/#/match/implement.js | 10 + node_modules/es5-ext/reg-exp/#/match/index.js | 3 + .../es5-ext/reg-exp/#/match/is-implemented.js | 8 + node_modules/es5-ext/reg-exp/#/match/shim.js | 8 + .../es5-ext/reg-exp/#/replace/implement.js | 10 + .../es5-ext/reg-exp/#/replace/index.js | 3 + .../reg-exp/#/replace/is-implemented.js | 8 + .../es5-ext/reg-exp/#/replace/shim.js | 8 + .../es5-ext/reg-exp/#/search/implement.js | 10 + .../es5-ext/reg-exp/#/search/index.js | 3 + .../reg-exp/#/search/is-implemented.js | 8 + node_modules/es5-ext/reg-exp/#/search/shim.js | 8 + .../es5-ext/reg-exp/#/split/implement.js | 10 + node_modules/es5-ext/reg-exp/#/split/index.js | 3 + .../es5-ext/reg-exp/#/split/is-implemented.js | 8 + node_modules/es5-ext/reg-exp/#/split/shim.js | 8 + .../es5-ext/reg-exp/#/sticky/implement.js | 11 + .../reg-exp/#/sticky/is-implemented.js | 10 + .../es5-ext/reg-exp/#/unicode/implement.js | 11 + .../reg-exp/#/unicode/is-implemented.js | 10 + node_modules/es5-ext/reg-exp/escape.js | 9 + node_modules/es5-ext/reg-exp/index.js | 8 + node_modules/es5-ext/reg-exp/is-reg-exp.js | 7 + node_modules/es5-ext/reg-exp/valid-reg-exp.js | 8 + node_modules/es5-ext/safe-to-string.js | 12 + .../es5-ext/string/#/@@iterator/implement.js | 10 + .../es5-ext/string/#/@@iterator/index.js | 5 + .../string/#/@@iterator/is-implemented.js | 16 + .../es5-ext/string/#/@@iterator/shim.js | 6 + node_modules/es5-ext/string/#/at.js | 35 + .../es5-ext/string/#/camel-to-hyphen.js | 9 + node_modules/es5-ext/string/#/capitalize.js | 8 + .../string/#/case-insensitive-compare.js | 7 + .../string/#/code-point-at/implement.js | 10 + .../es5-ext/string/#/code-point-at/index.js | 3 + .../string/#/code-point-at/is-implemented.js | 8 + .../es5-ext/string/#/code-point-at/shim.js | 26 + .../es5-ext/string/#/contains/implement.js | 10 + .../es5-ext/string/#/contains/index.js | 3 + .../string/#/contains/is-implemented.js | 8 + .../es5-ext/string/#/contains/shim.js | 7 + node_modules/es5-ext/string/#/count.js | 15 + .../es5-ext/string/#/ends-with/implement.js | 10 + .../es5-ext/string/#/ends-with/index.js | 3 + .../string/#/ends-with/is-implemented.js | 8 + .../es5-ext/string/#/ends-with/shim.js | 18 + .../es5-ext/string/#/hyphen-to-camel.js | 6 + node_modules/es5-ext/string/#/indent.js | 12 + node_modules/es5-ext/string/#/index.js | 23 + node_modules/es5-ext/string/#/last.js | 8 + .../es5-ext/string/#/normalize/_data.js | 6988 +++++++ .../es5-ext/string/#/normalize/implement.js | 10 + .../es5-ext/string/#/normalize/index.js | 3 + .../string/#/normalize/is-implemented.js | 8 + .../es5-ext/string/#/normalize/shim.js | 309 + node_modules/es5-ext/string/#/pad.js | 16 + .../es5-ext/string/#/plain-replace-all.js | 16 + .../es5-ext/string/#/plain-replace.js | 9 + .../es5-ext/string/#/repeat/implement.js | 10 + node_modules/es5-ext/string/#/repeat/index.js | 3 + .../es5-ext/string/#/repeat/is-implemented.js | 8 + node_modules/es5-ext/string/#/repeat/shim.js | 24 + .../es5-ext/string/#/starts-with/implement.js | 10 + .../es5-ext/string/#/starts-with/index.js | 3 + .../string/#/starts-with/is-implemented.js | 8 + .../es5-ext/string/#/starts-with/shim.js | 12 + node_modules/es5-ext/string/#/uncapitalize.js | 8 + node_modules/es5-ext/string/format-method.js | 27 + .../string/from-code-point/implement.js | 10 + .../es5-ext/string/from-code-point/index.js | 3 + .../string/from-code-point/is-implemented.js | 7 + .../es5-ext/string/from-code-point/shim.js | 37 + node_modules/es5-ext/string/index.js | 11 + node_modules/es5-ext/string/is-string.js | 13 + node_modules/es5-ext/string/random-uniq.js | 11 + node_modules/es5-ext/string/random.js | 38 + node_modules/es5-ext/string/raw/implement.js | 10 + node_modules/es5-ext/string/raw/index.js | 3 + .../es5-ext/string/raw/is-implemented.js | 9 + node_modules/es5-ext/string/raw/shim.js | 14 + node_modules/es5-ext/test/.eslintrc.json | 12 + node_modules/es5-ext/test/__tad.js | 3 + .../test/array/#/@@iterator/implement.js | 5 + .../es5-ext/test/array/#/@@iterator/index.js | 3 + .../test/array/#/@@iterator/is-implemented.js | 3 + .../es5-ext/test/array/#/@@iterator/shim.js | 9 + .../test/array/#/_compare-by-length.js | 7 + .../es5-ext/test/array/#/binary-search.js | 15 + node_modules/es5-ext/test/array/#/clear.js | 7 + node_modules/es5-ext/test/array/#/compact.js | 15 + .../es5-ext/test/array/#/concat/implement.js | 5 + .../es5-ext/test/array/#/concat/index.js | 3 + .../test/array/#/concat/is-implemented.js | 3 + .../es5-ext/test/array/#/concat/shim.js | 29 + node_modules/es5-ext/test/array/#/contains.js | 21 + .../test/array/#/copy-within/implement.js | 5 + .../es5-ext/test/array/#/copy-within/index.js | 3 + .../array/#/copy-within/is-implemented.js | 3 + .../es5-ext/test/array/#/copy-within/shim.js | 29 + node_modules/es5-ext/test/array/#/diff.js | 13 + .../es5-ext/test/array/#/e-index-of.js | 13 + .../es5-ext/test/array/#/e-last-index-of.js | 12 + .../es5-ext/test/array/#/entries/implement.js | 5 + .../es5-ext/test/array/#/entries/index.js | 3 + .../test/array/#/entries/is-implemented.js | 3 + .../es5-ext/test/array/#/entries/shim.js | 9 + .../es5-ext/test/array/#/exclusion.js | 15 + .../es5-ext/test/array/#/fill/implement.js | 5 + .../es5-ext/test/array/#/fill/index.js | 3 + .../test/array/#/fill/is-implemented.js | 3 + .../es5-ext/test/array/#/fill/shim.js | 15 + .../es5-ext/test/array/#/filter/implement.js | 5 + .../es5-ext/test/array/#/filter/index.js | 3 + .../test/array/#/filter/is-implemented.js | 3 + .../es5-ext/test/array/#/filter/shim.js | 17 + .../test/array/#/find-index/implement.js | 5 + .../es5-ext/test/array/#/find-index/index.js | 3 + .../test/array/#/find-index/is-implemented.js | 3 + .../es5-ext/test/array/#/find-index/shim.js | 23 + .../es5-ext/test/array/#/find/implement.js | 5 + .../es5-ext/test/array/#/find/index.js | 3 + .../test/array/#/find/is-implemented.js | 3 + .../es5-ext/test/array/#/find/shim.js | 23 + .../es5-ext/test/array/#/first-index.js | 17 + node_modules/es5-ext/test/array/#/first.js | 11 + node_modules/es5-ext/test/array/#/flatten.js | 12 + .../es5-ext/test/array/#/for-each-right.js | 39 + node_modules/es5-ext/test/array/#/group.js | 30 + .../es5-ext/test/array/#/indexes-of.js | 12 + .../es5-ext/test/array/#/intersection.js | 25 + node_modules/es5-ext/test/array/#/is-copy.js | 12 + node_modules/es5-ext/test/array/#/is-empty.js | 8 + node_modules/es5-ext/test/array/#/is-uniq.js | 11 + .../es5-ext/test/array/#/keys/implement.js | 5 + .../es5-ext/test/array/#/keys/index.js | 3 + .../test/array/#/keys/is-implemented.js | 3 + .../es5-ext/test/array/#/keys/shim.js | 9 + .../es5-ext/test/array/#/last-index.js | 17 + node_modules/es5-ext/test/array/#/last.js | 13 + .../es5-ext/test/array/#/map/implement.js | 5 + .../es5-ext/test/array/#/map/index.js | 3 + .../test/array/#/map/is-implemented.js | 3 + node_modules/es5-ext/test/array/#/map/shim.js | 17 + node_modules/es5-ext/test/array/#/remove.js | 14 + node_modules/es5-ext/test/array/#/separate.js | 15 + .../es5-ext/test/array/#/slice/implement.js | 5 + .../es5-ext/test/array/#/slice/index.js | 3 + .../test/array/#/slice/is-implemented.js | 3 + .../es5-ext/test/array/#/slice/shim.js | 17 + .../es5-ext/test/array/#/some-right.js | 54 + .../es5-ext/test/array/#/splice/implement.js | 5 + .../es5-ext/test/array/#/splice/index.js | 3 + .../test/array/#/splice/is-implemented.js | 3 + .../es5-ext/test/array/#/splice/shim.js | 19 + node_modules/es5-ext/test/array/#/uniq.js | 12 + .../es5-ext/test/array/#/values/implement.js | 5 + .../es5-ext/test/array/#/values/index.js | 3 + .../test/array/#/values/is-implemented.js | 3 + .../es5-ext/test/array/#/values/shim.js | 9 + node_modules/es5-ext/test/array/__scopes.js | 9 + .../es5-ext/test/array/_is-extensible.js | 3 + .../test/array/_sub-array-dummy-safe.js | 5 + .../es5-ext/test/array/_sub-array-dummy.js | 5 + .../es5-ext/test/array/from/implement.js | 5 + node_modules/es5-ext/test/array/from/index.js | 3 + .../es5-ext/test/array/from/is-implemented.js | 3 + node_modules/es5-ext/test/array/from/shim.js | 64 + node_modules/es5-ext/test/array/generate.js | 10 + .../es5-ext/test/array/is-plain-array.js | 18 + .../es5-ext/test/array/of/implement.js | 5 + node_modules/es5-ext/test/array/of/index.js | 3 + .../es5-ext/test/array/of/is-implemented.js | 3 + node_modules/es5-ext/test/array/of/shim.js | 81 + node_modules/es5-ext/test/array/to-array.js | 11 + .../es5-ext/test/array/valid-array.js | 20 + .../es5-ext/test/boolean/is-boolean.js | 12 + node_modules/es5-ext/test/date/#/copy.js | 10 + .../es5-ext/test/date/#/days-in-month.js | 17 + node_modules/es5-ext/test/date/#/floor-day.js | 5 + .../es5-ext/test/date/#/floor-month.js | 5 + .../es5-ext/test/date/#/floor-year.js | 5 + node_modules/es5-ext/test/date/#/format.js | 6 + .../es5-ext/test/date/ensure-time-value.js | 8 + node_modules/es5-ext/test/date/is-date.js | 10 + .../es5-ext/test/date/is-time-value.js | 15 + node_modules/es5-ext/test/date/valid-date.js | 10 + node_modules/es5-ext/test/error/#/throw.js | 7 + node_modules/es5-ext/test/error/custom.js | 12 + node_modules/es5-ext/test/error/is-error.js | 15 + .../es5-ext/test/error/valid-error.js | 7 + .../es5-ext/test/function/#/compose.js | 10 + node_modules/es5-ext/test/function/#/copy.js | 20 + node_modules/es5-ext/test/function/#/curry.js | 17 + node_modules/es5-ext/test/function/#/lock.js | 5 + .../test/function/#/microtask-delay.js | 22 + node_modules/es5-ext/test/function/#/not.js | 11 + .../es5-ext/test/function/#/partial.js | 6 + .../es5-ext/test/function/#/spread.js | 5 + .../test/function/#/to-string-tokens.js | 26 + .../es5-ext/test/function/_define-length.js | 10 + .../es5-ext/test/function/constant.js | 5 + .../es5-ext/test/function/identity.js | 5 + node_modules/es5-ext/test/function/invoke.js | 6 + .../es5-ext/test/function/is-arguments.js | 11 + .../es5-ext/test/function/is-function.js | 14 + node_modules/es5-ext/test/function/noop.js | 3 + node_modules/es5-ext/test/function/pluck.js | 5 + .../es5-ext/test/function/valid-function.js | 14 + node_modules/es5-ext/test/global.js | 7 + .../es5-ext/test/iterable/for-each.js | 62 + node_modules/es5-ext/test/iterable/is.js | 20 + .../es5-ext/test/iterable/validate-object.js | 26 + .../es5-ext/test/iterable/validate.js | 26 + .../es5-ext/test/json/safe-stringify.js | 21 + .../es5-ext/test/math/_decimal-adjust.js | 6 + .../es5-ext/test/math/_pack-ieee754.js | 3 + .../es5-ext/test/math/_unpack-ieee754.js | 3 + .../es5-ext/test/math/acosh/implement.js | 5 + node_modules/es5-ext/test/math/acosh/index.js | 3 + .../es5-ext/test/math/acosh/is-implemented.js | 3 + node_modules/es5-ext/test/math/acosh/shim.js | 11 + .../es5-ext/test/math/asinh/implement.js | 5 + node_modules/es5-ext/test/math/asinh/index.js | 3 + .../es5-ext/test/math/asinh/is-implemented.js | 3 + node_modules/es5-ext/test/math/asinh/shim.js | 10 + .../es5-ext/test/math/atanh/implement.js | 5 + node_modules/es5-ext/test/math/atanh/index.js | 3 + .../es5-ext/test/math/atanh/is-implemented.js | 3 + node_modules/es5-ext/test/math/atanh/shim.js | 11 + .../es5-ext/test/math/cbrt/implement.js | 5 + node_modules/es5-ext/test/math/cbrt/index.js | 3 + .../es5-ext/test/math/cbrt/is-implemented.js | 3 + node_modules/es5-ext/test/math/cbrt/shim.js | 11 + node_modules/es5-ext/test/math/ceil-10.js | 8 + .../es5-ext/test/math/clz32/implement.js | 5 + node_modules/es5-ext/test/math/clz32/index.js | 3 + .../es5-ext/test/math/clz32/is-implemented.js | 3 + node_modules/es5-ext/test/math/clz32/shim.js | 12 + .../es5-ext/test/math/cosh/implement.js | 5 + node_modules/es5-ext/test/math/cosh/index.js | 3 + .../es5-ext/test/math/cosh/is-implemented.js | 3 + node_modules/es5-ext/test/math/cosh/shim.js | 13 + .../es5-ext/test/math/expm1/implement.js | 5 + node_modules/es5-ext/test/math/expm1/index.js | 3 + .../es5-ext/test/math/expm1/is-implemented.js | 3 + node_modules/es5-ext/test/math/expm1/shim.js | 9 + node_modules/es5-ext/test/math/floor-10.js | 8 + .../es5-ext/test/math/fround/implement.js | 5 + .../es5-ext/test/math/fround/index.js | 3 + .../test/math/fround/is-implemented.js | 3 + node_modules/es5-ext/test/math/fround/shim.js | 9 + .../es5-ext/test/math/hypot/implement.js | 5 + node_modules/es5-ext/test/math/hypot/index.js | 3 + .../es5-ext/test/math/hypot/is-implemented.js | 3 + node_modules/es5-ext/test/math/hypot/shim.js | 11 + .../es5-ext/test/math/imul/implement.js | 5 + node_modules/es5-ext/test/math/imul/index.js | 3 + .../es5-ext/test/math/imul/is-implemented.js | 3 + node_modules/es5-ext/test/math/imul/shim.js | 9 + .../es5-ext/test/math/log10/implement.js | 5 + node_modules/es5-ext/test/math/log10/index.js | 3 + .../es5-ext/test/math/log10/is-implemented.js | 3 + node_modules/es5-ext/test/math/log10/shim.js | 10 + .../es5-ext/test/math/log1p/implement.js | 5 + node_modules/es5-ext/test/math/log1p/index.js | 3 + .../es5-ext/test/math/log1p/is-implemented.js | 3 + node_modules/es5-ext/test/math/log1p/shim.js | 10 + .../es5-ext/test/math/log2/implement.js | 5 + node_modules/es5-ext/test/math/log2/index.js | 3 + .../es5-ext/test/math/log2/is-implemented.js | 3 + node_modules/es5-ext/test/math/log2/shim.js | 10 + node_modules/es5-ext/test/math/round-10.js | 14 + .../es5-ext/test/math/sign/implement.js | 5 + node_modules/es5-ext/test/math/sign/index.js | 3 + .../es5-ext/test/math/sign/is-implemented.js | 3 + node_modules/es5-ext/test/math/sign/shim.js | 11 + .../es5-ext/test/math/sinh/implement.js | 5 + node_modules/es5-ext/test/math/sinh/index.js | 3 + .../es5-ext/test/math/sinh/is-implemented.js | 3 + node_modules/es5-ext/test/math/sinh/shim.js | 13 + .../es5-ext/test/math/tanh/implement.js | 5 + node_modules/es5-ext/test/math/tanh/index.js | 3 + .../es5-ext/test/math/tanh/is-implemented.js | 3 + node_modules/es5-ext/test/math/tanh/shim.js | 11 + .../es5-ext/test/math/trunc/implement.js | 5 + node_modules/es5-ext/test/math/trunc/index.js | 3 + .../es5-ext/test/math/trunc/is-implemented.js | 3 + node_modules/es5-ext/test/math/trunc/shim.js | 16 + node_modules/es5-ext/test/number/#/pad.js | 7 + .../es5-ext/test/number/epsilon/implement.js | 5 + .../es5-ext/test/number/epsilon/index.js | 3 + .../test/number/epsilon/is-implemented.js | 3 + .../test/number/is-finite/implement.js | 5 + .../es5-ext/test/number/is-finite/index.js | 3 + .../test/number/is-finite/is-implemented.js | 3 + .../es5-ext/test/number/is-finite/shim.js | 8 + .../test/number/is-integer/implement.js | 5 + .../es5-ext/test/number/is-integer/index.js | 3 + .../test/number/is-integer/is-implemented.js | 3 + .../es5-ext/test/number/is-integer/shim.js | 9 + .../es5-ext/test/number/is-nan/implement.js | 5 + .../es5-ext/test/number/is-nan/index.js | 3 + .../test/number/is-nan/is-implemented.js | 3 + .../es5-ext/test/number/is-nan/shim.js | 7 + .../es5-ext/test/number/is-natural.js | 10 + node_modules/es5-ext/test/number/is-number.js | 13 + .../test/number/is-safe-integer/implement.js | 5 + .../test/number/is-safe-integer/index.js | 3 + .../number/is-safe-integer/is-implemented.js | 3 + .../test/number/is-safe-integer/shim.js | 11 + .../test/number/max-safe-integer/implement.js | 5 + .../test/number/max-safe-integer/index.js | 3 + .../number/max-safe-integer/is-implemented.js | 3 + .../test/number/min-safe-integer/implement.js | 5 + .../test/number/min-safe-integer/index.js | 3 + .../number/min-safe-integer/is-implemented.js | 3 + .../es5-ext/test/number/to-integer.js | 10 + .../es5-ext/test/number/to-pos-integer.js | 10 + node_modules/es5-ext/test/number/to-uint32.js | 8 + node_modules/es5-ext/test/object/_iterate.js | 36 + .../es5-ext/test/object/assign-deep.js | 27 + .../es5-ext/test/object/assign/implement.js | 5 + .../es5-ext/test/object/assign/index.js | 3 + .../test/object/assign/is-implemented.js | 3 + .../es5-ext/test/object/assign/shim.js | 10 + node_modules/es5-ext/test/object/clear.js | 13 + node_modules/es5-ext/test/object/compact.js | 12 + node_modules/es5-ext/test/object/compare.js | 13 + node_modules/es5-ext/test/object/copy-deep.js | 35 + node_modules/es5-ext/test/object/copy.js | 30 + node_modules/es5-ext/test/object/count.js | 14 + node_modules/es5-ext/test/object/create.js | 22 + .../es5-ext/test/object/ensure-array.js | 23 + .../test/object/ensure-finite-number.js | 18 + .../es5-ext/test/object/ensure-integer.js | 12 + .../object/ensure-natural-number-value.js | 12 + .../test/object/ensure-natural-number.js | 12 + .../test/object/ensure-plain-function.js | 8 + .../test/object/ensure-plain-object.js | 16 + .../es5-ext/test/object/ensure-promise.js | 20 + .../es5-ext/test/object/ensure-thenable.js | 9 + .../es5-ext/test/object/entries/implement.js | 5 + .../es5-ext/test/object/entries/index.js | 3 + .../test/object/entries/is-implemented.js | 3 + .../es5-ext/test/object/entries/shim.js | 8 + node_modules/es5-ext/test/object/eq.js | 12 + node_modules/es5-ext/test/object/every.js | 16 + node_modules/es5-ext/test/object/filter.js | 8 + node_modules/es5-ext/test/object/find-key.js | 24 + node_modules/es5-ext/test/object/find.js | 24 + node_modules/es5-ext/test/object/first-key.js | 13 + node_modules/es5-ext/test/object/flatten.js | 5 + node_modules/es5-ext/test/object/for-each.js | 7 + .../es5-ext/test/object/get-property-names.js | 17 + .../es5-ext/test/object/is-array-like.js | 14 + .../es5-ext/test/object/is-callable.js | 8 + .../es5-ext/test/object/is-copy-deep.js | 42 + node_modules/es5-ext/test/object/is-copy.js | 15 + node_modules/es5-ext/test/object/is-empty.js | 6 + .../es5-ext/test/object/is-finite-number.js | 18 + .../es5-ext/test/object/is-integer.js | 12 + .../test/object/is-natural-number-value.js | 12 + .../es5-ext/test/object/is-natural-number.js | 12 + .../es5-ext/test/object/is-number-value.js | 18 + node_modules/es5-ext/test/object/is-object.js | 13 + .../es5-ext/test/object/is-plain-function.js | 39 + .../es5-ext/test/object/is-plain-object.js | 23 + .../es5-ext/test/object/is-promise.js | 17 + .../es5-ext/test/object/is-thenable.js | 17 + node_modules/es5-ext/test/object/is-value.js | 14 + node_modules/es5-ext/test/object/is.js | 12 + node_modules/es5-ext/test/object/key-of.js | 11 + .../es5-ext/test/object/keys/implement.js | 5 + .../es5-ext/test/object/keys/index.js | 3 + .../test/object/keys/is-implemented.js | 3 + node_modules/es5-ext/test/object/keys/shim.js | 8 + node_modules/es5-ext/test/object/map-keys.js | 9 + node_modules/es5-ext/test/object/map.js | 12 + .../es5-ext/test/object/mixin-prototypes.js | 68 + node_modules/es5-ext/test/object/mixin.js | 70 + .../es5-ext/test/object/normalize-options.js | 55 + .../es5-ext/test/object/primitive-set.js | 14 + .../es5-ext/test/object/safe-traverse.js | 15 + node_modules/es5-ext/test/object/serialize.js | 43 + .../test/object/set-prototype-of/implement.js | 6 + .../test/object/set-prototype-of/index.js | 22 + .../object/set-prototype-of/is-implemented.js | 3 + .../test/object/set-prototype-of/shim.js | 22 + node_modules/es5-ext/test/object/some.js | 24 + node_modules/es5-ext/test/object/to-array.js | 18 + .../es5-ext/test/object/unserialize.js | 39 + .../es5-ext/test/object/valid-callable.js | 7 + .../es5-ext/test/object/valid-object.js | 15 + .../es5-ext/test/object/valid-value.js | 15 + .../test/object/validate-array-like-object.js | 21 + .../test/object/validate-array-like.js | 21 + .../object/validate-stringifiable-value.js | 16 + .../test/object/validate-stringifiable.js | 16 + .../es5-ext/test/optional-chaining.js | 17 + .../es5-ext/test/promise/#/as-callback.js | 25 + .../test/promise/#/finally/implement.js | 7 + .../es5-ext/test/promise/#/finally/index.js | 3 + .../test/promise/#/finally/is-implemented.js | 3 + .../es5-ext/test/promise/#/finally/shim.js | 75 + .../es5-ext/test/promise/.eslintrc.json | 1 + node_modules/es5-ext/test/promise/lazy.js | 46 + node_modules/es5-ext/test/reg-exp/#/index.js | 15 + .../es5-ext/test/reg-exp/#/is-sticky.js | 13 + .../es5-ext/test/reg-exp/#/is-unicode.js | 13 + .../es5-ext/test/reg-exp/#/match/implement.js | 5 + .../es5-ext/test/reg-exp/#/match/index.js | 3 + .../test/reg-exp/#/match/is-implemented.js | 3 + .../es5-ext/test/reg-exp/#/match/shim.js | 6 + .../test/reg-exp/#/replace/implement.js | 5 + .../es5-ext/test/reg-exp/#/replace/index.js | 3 + .../test/reg-exp/#/replace/is-implemented.js | 3 + .../es5-ext/test/reg-exp/#/replace/shim.js | 3 + .../test/reg-exp/#/search/implement.js | 5 + .../es5-ext/test/reg-exp/#/search/index.js | 3 + .../test/reg-exp/#/search/is-implemented.js | 3 + .../es5-ext/test/reg-exp/#/search/shim.js | 3 + .../es5-ext/test/reg-exp/#/split/implement.js | 5 + .../es5-ext/test/reg-exp/#/split/index.js | 3 + .../test/reg-exp/#/split/is-implemented.js | 3 + .../es5-ext/test/reg-exp/#/split/shim.js | 3 + .../test/reg-exp/#/sticky/implement.js | 5 + .../test/reg-exp/#/sticky/is-implemented.js | 3 + .../test/reg-exp/#/unicode/implement.js | 5 + .../test/reg-exp/#/unicode/is-implemented.js | 3 + node_modules/es5-ext/test/reg-exp/escape.js | 6 + .../es5-ext/test/reg-exp/is-reg-exp.js | 12 + .../es5-ext/test/reg-exp/valid-reg-exp.js | 15 + node_modules/es5-ext/test/safe-to-string.js | 12 + .../test/string/#/@@iterator/implement.js | 5 + .../es5-ext/test/string/#/@@iterator/index.js | 3 + .../string/#/@@iterator/is-implemented.js | 3 + .../es5-ext/test/string/#/@@iterator/shim.js | 9 + node_modules/es5-ext/test/string/#/at.js | 97 + .../es5-ext/test/string/#/camel-to-hyphen.js | 7 + .../es5-ext/test/string/#/capitalize.js | 9 + .../test/string/#/case-insensitive-compare.js | 7 + .../test/string/#/code-point-at/implement.js | 5 + .../test/string/#/code-point-at/index.js | 3 + .../string/#/code-point-at/is-implemented.js | 3 + .../test/string/#/code-point-at/shim.js | 83 + .../test/string/#/contains/implement.js | 5 + .../es5-ext/test/string/#/contains/index.js | 3 + .../test/string/#/contains/is-implemented.js | 3 + .../es5-ext/test/string/#/contains/shim.js | 14 + node_modules/es5-ext/test/string/#/count.js | 12 + .../test/string/#/ends-with/implement.js | 5 + .../es5-ext/test/string/#/ends-with/index.js | 3 + .../test/string/#/ends-with/is-implemented.js | 3 + .../es5-ext/test/string/#/ends-with/shim.js | 16 + .../es5-ext/test/string/#/hyphen-to-camel.js | 7 + node_modules/es5-ext/test/string/#/indent.js | 8 + node_modules/es5-ext/test/string/#/last.js | 6 + .../es5-ext/test/string/#/normalize/_data.js | 3 + .../test/string/#/normalize/implement.js | 5 + .../es5-ext/test/string/#/normalize/index.js | 3 + .../test/string/#/normalize/is-implemented.js | 3 + .../es5-ext/test/string/#/normalize/shim.js | 13 + node_modules/es5-ext/test/string/#/pad.js | 24 + .../test/string/#/plain-replace-all.js | 10 + .../es5-ext/test/string/#/plain-replace.js | 7 + .../es5-ext/test/string/#/repeat/implement.js | 5 + .../es5-ext/test/string/#/repeat/index.js | 3 + .../test/string/#/repeat/is-implemented.js | 3 + .../es5-ext/test/string/#/repeat/shim.js | 12 + .../test/string/#/starts-with/implement.js | 5 + .../test/string/#/starts-with/index.js | 3 + .../string/#/starts-with/is-implemented.js | 3 + .../es5-ext/test/string/#/starts-with/shim.js | 14 + .../es5-ext/test/string/#/uncapitalize.js | 10 + .../es5-ext/test/string/format-method.js | 6 + .../test/string/from-code-point/implement.js | 5 + .../test/string/from-code-point/index.js | 3 + .../string/from-code-point/is-implemented.js | 3 + .../test/string/from-code-point/shim.js | 47 + node_modules/es5-ext/test/string/is-string.js | 11 + .../es5-ext/test/string/random-uniq.js | 14 + node_modules/es5-ext/test/string/random.js | 13 + .../es5-ext/test/string/raw/implement.js | 5 + node_modules/es5-ext/test/string/raw/index.js | 3 + .../es5-ext/test/string/raw/is-implemented.js | 3 + node_modules/es5-ext/test/string/raw/shim.js | 14 + .../test/to-short-string-representation.js | 16 + .../es5-ext/to-short-string-representation.js | 16 + node_modules/es6-iterator/#/chain.js | 40 + node_modules/es6-iterator/.editorconfig | 14 + node_modules/es6-iterator/.npmignore | 12 + node_modules/es6-iterator/CHANGELOG.md | 27 + node_modules/es6-iterator/CHANGES | 42 + node_modules/es6-iterator/LICENSE | 21 + node_modules/es6-iterator/README.md | 148 + node_modules/es6-iterator/appveyor.yml | 26 + node_modules/es6-iterator/array.js | 32 + node_modules/es6-iterator/for-of.js | 47 + node_modules/es6-iterator/get.js | 15 + node_modules/es6-iterator/index.js | 106 + node_modules/es6-iterator/is-iterable.js | 16 + node_modules/es6-iterator/package.json | 41 + node_modules/es6-iterator/string.js | 39 + node_modules/es6-iterator/test/#/chain.js | 23 + node_modules/es6-iterator/test/.eslintrc.json | 5 + node_modules/es6-iterator/test/array.js | 67 + node_modules/es6-iterator/test/for-of.js | 42 + node_modules/es6-iterator/test/get.js | 27 + node_modules/es6-iterator/test/index.js | 99 + node_modules/es6-iterator/test/is-iterable.js | 23 + node_modules/es6-iterator/test/string.js | 23 + .../es6-iterator/test/valid-iterable.js | 28 + node_modules/es6-iterator/valid-iterable.js | 8 + node_modules/es6-symbol/.editorconfig | 16 + node_modules/es6-symbol/.github/FUNDING.yml | 1 + node_modules/es6-symbol/.testignore | 1 + node_modules/es6-symbol/CHANGELOG.md | 16 + node_modules/es6-symbol/CHANGES | 61 + node_modules/es6-symbol/LICENSE | 15 + node_modules/es6-symbol/README.md | 104 + node_modules/es6-symbol/implement.js | 10 + node_modules/es6-symbol/index.js | 5 + node_modules/es6-symbol/is-implemented.js | 20 + .../es6-symbol/is-native-implemented.js | 7 + node_modules/es6-symbol/is-symbol.js | 9 + node_modules/es6-symbol/package.json | 103 + node_modules/es6-symbol/polyfill.js | 87 + node_modules/es6-symbol/test/implement.js | 3 + node_modules/es6-symbol/test/index.js | 11 + .../es6-symbol/test/is-implemented.js | 14 + .../es6-symbol/test/is-native-implemented.js | 3 + node_modules/es6-symbol/test/is-symbol.js | 16 + node_modules/es6-symbol/test/polyfill.js | 32 + .../es6-symbol/test/validate-symbol.js | 19 + node_modules/es6-symbol/validate-symbol.js | 8 + node_modules/es6-weak-map/.editorconfig | 14 + node_modules/es6-weak-map/CHANGELOG.md | 5 + node_modules/es6-weak-map/CHANGES | 45 + node_modules/es6-weak-map/LICENSE | 15 + node_modules/es6-weak-map/README.md | 78 + node_modules/es6-weak-map/implement.js | 11 + node_modules/es6-weak-map/index.js | 3 + node_modules/es6-weak-map/is-implemented.js | 21 + .../es6-weak-map/is-native-implemented.js | 8 + node_modules/es6-weak-map/is-weak-map.js | 13 + node_modules/es6-weak-map/package.json | 44 + node_modules/es6-weak-map/polyfill.js | 65 + node_modules/es6-weak-map/test/implement.js | 5 + node_modules/es6-weak-map/test/index.js | 7 + .../es6-weak-map/test/is-implemented.js | 15 + .../test/is-native-implemented.js | 5 + node_modules/es6-weak-map/test/is-weak-map.js | 16 + node_modules/es6-weak-map/test/polyfill.js | 23 + .../es6-weak-map/test/valid-weak-map.js | 32 + node_modules/es6-weak-map/valid-weak-map.js | 8 + node_modules/escape-string-regexp/index.js | 11 + node_modules/escape-string-regexp/license | 21 + .../escape-string-regexp/package.json | 41 + node_modules/escape-string-regexp/readme.md | 27 + node_modules/event-emitter/.lint | 15 + node_modules/event-emitter/.npmignore | 3 + node_modules/event-emitter/.testignore | 1 + node_modules/event-emitter/.travis.yml | 16 + node_modules/event-emitter/CHANGES | 73 + node_modules/event-emitter/LICENSE | 19 + node_modules/event-emitter/README.md | 98 + node_modules/event-emitter/all-off.js | 19 + .../event-emitter/benchmark/many-on.js | 83 + .../event-emitter/benchmark/single-on.js | 73 + node_modules/event-emitter/emit-error.js | 13 + node_modules/event-emitter/has-listeners.js | 16 + node_modules/event-emitter/index.js | 132 + node_modules/event-emitter/package.json | 34 + node_modules/event-emitter/pipe.js | 42 + node_modules/event-emitter/test/all-off.js | 48 + node_modules/event-emitter/test/emit-error.js | 14 + .../event-emitter/test/has-listeners.js | 42 + node_modules/event-emitter/test/index.js | 107 + node_modules/event-emitter/test/pipe.js | 53 + node_modules/event-emitter/test/unify.js | 123 + node_modules/event-emitter/unify.js | 50 + node_modules/expand-brackets/LICENSE | 21 + node_modules/expand-brackets/README.md | 302 + node_modules/expand-brackets/changelog.md | 35 + node_modules/expand-brackets/index.js | 211 + node_modules/expand-brackets/package.json | 85 + node_modules/expand-tilde/LICENSE | 21 + node_modules/expand-tilde/README.md | 80 + node_modules/expand-tilde/index.js | 22 + node_modules/expand-tilde/package.json | 67 + node_modules/ext/.editorconfig | 16 + node_modules/ext/CHANGELOG.md | 64 + node_modules/ext/LICENSE | 15 + node_modules/ext/README.md | 33 + node_modules/ext/docs/function/identity.md | 9 + node_modules/ext/docs/global-this.md | 9 + node_modules/ext/docs/math/ceil-10.md | 10 + node_modules/ext/docs/math/floor-10.md | 10 + node_modules/ext/docs/math/round-10.md | 10 + node_modules/ext/docs/object/entries.md | 11 + node_modules/ext/docs/string/random.md | 31 + node_modules/ext/docs/string_/includes.md | 10 + node_modules/ext/docs/thenable_/finally.md | 9 + node_modules/ext/function/identity.js | 3 + .../ext/global-this/implementation.js | 31 + node_modules/ext/global-this/index.js | 3 + .../ext/global-this/is-implemented.js | 7 + node_modules/ext/math/ceil-10.js | 3 + node_modules/ext/math/floor-10.js | 3 + node_modules/ext/math/round-10.js | 3 + .../ext/node_modules/type/.editorconfig | 16 + .../ext/node_modules/type/CHANGELOG.md | 118 + node_modules/ext/node_modules/type/LICENSE | 15 + node_modules/ext/node_modules/type/README.md | 157 + .../node_modules/type/array-length/coerce.js | 10 + .../node_modules/type/array-length/ensure.js | 15 + .../node_modules/type/array-like/ensure.js | 14 + .../ext/node_modules/type/array-like/is.js | 21 + .../ext/node_modules/type/array/ensure.js | 12 + .../ext/node_modules/type/array/is.js | 27 + .../ext/node_modules/type/date/ensure.js | 12 + node_modules/ext/node_modules/type/date/is.js | 26 + .../node_modules/type/docs/array-length.md | 27 + .../ext/node_modules/type/docs/array-like.md | 33 + .../ext/node_modules/type/docs/array.md | 26 + .../ext/node_modules/type/docs/date.md | 28 + .../ext/node_modules/type/docs/ensure.md | 40 + .../ext/node_modules/type/docs/error.md | 26 + .../ext/node_modules/type/docs/finite.md | 27 + .../ext/node_modules/type/docs/function.md | 28 + .../ext/node_modules/type/docs/integer.md | 27 + .../ext/node_modules/type/docs/iterable.md | 65 + .../node_modules/type/docs/natural-number.md | 27 + .../ext/node_modules/type/docs/number.md | 33 + .../ext/node_modules/type/docs/object.md | 28 + .../node_modules/type/docs/plain-function.md | 28 + .../node_modules/type/docs/plain-object.md | 69 + .../ext/node_modules/type/docs/promise.md | 27 + .../ext/node_modules/type/docs/prototype.md | 15 + .../ext/node_modules/type/docs/reg-exp.md | 26 + .../node_modules/type/docs/safe-integer.md | 27 + .../ext/node_modules/type/docs/string.md | 32 + .../ext/node_modules/type/docs/thenable.md | 27 + .../ext/node_modules/type/docs/time-value.md | 27 + .../ext/node_modules/type/docs/value.md | 27 + node_modules/ext/node_modules/type/ensure.js | 51 + .../ext/node_modules/type/error/ensure.js | 12 + .../ext/node_modules/type/error/is.js | 45 + .../ext/node_modules/type/finite/coerce.js | 8 + .../ext/node_modules/type/finite/ensure.js | 15 + .../ext/node_modules/type/function/ensure.js | 14 + .../ext/node_modules/type/function/is.js | 19 + .../ext/node_modules/type/integer/coerce.js | 11 + .../ext/node_modules/type/integer/ensure.js | 15 + .../ext/node_modules/type/iterable/ensure.js | 49 + .../ext/node_modules/type/iterable/is.js | 32 + .../type/natural-number/coerce.js | 10 + .../type/natural-number/ensure.js | 21 + .../ext/node_modules/type/number/coerce.js | 14 + .../ext/node_modules/type/number/ensure.js | 13 + .../ext/node_modules/type/object/ensure.js | 12 + .../ext/node_modules/type/object/is.js | 11 + .../ext/node_modules/type/package.json | 96 + .../type/plain-function/ensure.js | 14 + .../node_modules/type/plain-function/is.js | 11 + .../node_modules/type/plain-object/ensure.js | 67 + .../ext/node_modules/type/plain-object/is.js | 28 + .../ext/node_modules/type/promise/ensure.js | 12 + .../ext/node_modules/type/promise/is.js | 27 + .../ext/node_modules/type/prototype/is.js | 13 + .../ext/node_modules/type/reg-exp/ensure.js | 14 + .../ext/node_modules/type/reg-exp/is.js | 37 + .../node_modules/type/safe-integer/coerce.js | 13 + .../node_modules/type/safe-integer/ensure.js | 15 + .../ext/node_modules/type/string/coerce.js | 23 + .../ext/node_modules/type/string/ensure.js | 13 + .../test/_lib/arrow-function-if-supported.js | 4 + .../type/test/_lib/class-if-supported.js | 4 + .../type/test/array-length/coerce.js | 47 + .../type/test/array-length/ensure.js | 28 + .../type/test/array-like/ensure.js | 33 + .../node_modules/type/test/array-like/is.js | 47 + .../node_modules/type/test/array/ensure.js | 29 + .../ext/node_modules/type/test/array/is.js | 41 + .../ext/node_modules/type/test/date/ensure.js | 29 + .../ext/node_modules/type/test/date/is.js | 46 + .../ext/node_modules/type/test/ensure.js | 69 + .../node_modules/type/test/error/ensure.js | 29 + .../ext/node_modules/type/test/error/is.js | 50 + .../node_modules/type/test/finite/coerce.js | 40 + .../node_modules/type/test/finite/ensure.js | 26 + .../node_modules/type/test/function/ensure.js | 29 + .../ext/node_modules/type/test/function/is.js | 46 + .../node_modules/type/test/integer/coerce.js | 49 + .../node_modules/type/test/integer/ensure.js | 26 + .../node_modules/type/test/iterable/ensure.js | 51 + .../ext/node_modules/type/test/iterable/is.js | 57 + .../type/test/natural-number/coerce.js | 47 + .../type/test/natural-number/ensure.js | 37 + .../node_modules/type/test/number/coerce.js | 40 + .../node_modules/type/test/number/ensure.js | 26 + .../node_modules/type/test/object/ensure.js | 29 + .../ext/node_modules/type/test/object/is.js | 30 + .../type/test/plain-function/ensure.js | 29 + .../type/test/plain-function/is.js | 56 + .../type/test/plain-object/ensure.js | 55 + .../node_modules/type/test/plain-object/is.js | 47 + .../node_modules/type/test/promise/ensure.js | 29 + .../ext/node_modules/type/test/promise/is.js | 39 + .../node_modules/type/test/prototype/is.js | 39 + .../node_modules/type/test/reg-exp/ensure.js | 29 + .../ext/node_modules/type/test/reg-exp/is.js | 47 + .../type/test/safe-integer/coerce.js | 49 + .../type/test/safe-integer/ensure.js | 28 + .../node_modules/type/test/string/coerce.js | 36 + .../node_modules/type/test/string/ensure.js | 26 + .../node_modules/type/test/thenable/ensure.js | 29 + .../ext/node_modules/type/test/thenable/is.js | 44 + .../type/test/time-value/coerce.js | 47 + .../type/test/time-value/ensure.js | 26 + .../node_modules/type/test/value/ensure.js | 29 + .../ext/node_modules/type/test/value/is.js | 29 + .../ext/node_modules/type/thenable/ensure.js | 14 + .../ext/node_modules/type/thenable/is.js | 9 + .../node_modules/type/time-value/coerce.js | 12 + .../node_modules/type/time-value/ensure.js | 15 + .../ext/node_modules/type/value/ensure.js | 12 + .../ext/node_modules/type/value/is.js | 6 + node_modules/ext/object/entries/implement.js | 10 + .../ext/object/entries/implementation.js | 15 + node_modules/ext/object/entries/index.js | 3 + .../ext/object/entries/is-implemented.js | 6 + node_modules/ext/package.json | 120 + node_modules/ext/string/random.js | 50 + .../ext/string_/includes/implementation.js | 7 + node_modules/ext/string_/includes/index.js | 5 + .../ext/string_/includes/is-implemented.js | 8 + node_modules/ext/test/function/identity.js | 14 + .../ext/test/global-this/implementation.js | 13 + node_modules/ext/test/global-this/index.js | 10 + .../ext/test/global-this/is-implemented.js | 8 + node_modules/ext/test/math/ceil-10.js | 13 + node_modules/ext/test/math/floor-10.js | 13 + node_modules/ext/test/math/round-10.js | 19 + .../ext/test/object/entries/_tests.js | 15 + .../ext/test/object/entries/implementation.js | 6 + node_modules/ext/test/object/entries/index.js | 6 + .../ext/test/object/entries/is-implemented.js | 8 + node_modules/ext/test/string/random.js | 36 + .../ext/test/string_/includes/_tests.js | 40 + .../test/string_/includes/implementation.js | 5 + .../ext/test/string_/includes/index.js | 5 + .../test/string_/includes/is-implemented.js | 8 + node_modules/ext/test/thenable_/finally.js | 89 + node_modules/ext/thenable_/finally.js | 24 + node_modules/extend-shallow/LICENSE | 21 + node_modules/extend-shallow/README.md | 61 + node_modules/extend-shallow/index.js | 33 + node_modules/extend-shallow/package.json | 56 + node_modules/extend/.editorconfig | 20 + node_modules/extend/.eslintrc | 17 + node_modules/extend/.jscs.json | 175 + node_modules/extend/.travis.yml | 230 + node_modules/extend/CHANGELOG.md | 83 + node_modules/extend/LICENSE | 23 + node_modules/extend/README.md | 81 + node_modules/extend/component.json | 32 + node_modules/extend/index.js | 117 + node_modules/extend/package.json | 42 + node_modules/extglob/LICENSE | 21 + node_modules/extglob/README.md | 362 + node_modules/extglob/changelog.md | 25 + node_modules/extglob/index.js | 331 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 95 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 62 + node_modules/extglob/package.json | 108 + node_modules/extsprintf/.gitmodules | 0 node_modules/extsprintf/.npmignore | 2 + node_modules/extsprintf/LICENSE | 19 + node_modules/extsprintf/Makefile | 24 + node_modules/extsprintf/Makefile.targ | 285 + node_modules/extsprintf/README.md | 46 + node_modules/extsprintf/jsl.node.conf | 137 + node_modules/extsprintf/package.json | 14 + node_modules/fancy-log/LICENSE | 22 + node_modules/fancy-log/README.md | 71 + node_modules/fancy-log/index.js | 92 + .../fancy-log/node_modules/.bin/color-support | 1 + node_modules/fancy-log/package.json | 49 + node_modules/fast-deep-equal/LICENSE | 21 + node_modules/fast-deep-equal/README.md | 96 + node_modules/fast-deep-equal/es6/index.d.ts | 2 + node_modules/fast-deep-equal/es6/index.js | 72 + node_modules/fast-deep-equal/es6/react.d.ts | 2 + node_modules/fast-deep-equal/es6/react.js | 79 + node_modules/fast-deep-equal/index.d.ts | 4 + node_modules/fast-deep-equal/index.js | 46 + node_modules/fast-deep-equal/package.json | 61 + node_modules/fast-deep-equal/react.d.ts | 2 + node_modules/fast-deep-equal/react.js | 53 + .../fast-json-stable-stringify/.eslintrc.yml | 26 + .../.github/FUNDING.yml | 1 + .../fast-json-stable-stringify/.travis.yml | 8 + .../fast-json-stable-stringify/LICENSE | 21 + .../fast-json-stable-stringify/README.md | 131 + .../benchmark/index.js | 31 + .../benchmark/test.json | 137 + .../example/key_cmp.js | 7 + .../example/nested.js | 3 + .../fast-json-stable-stringify/example/str.js | 3 + .../example/value_cmp.js | 7 + .../fast-json-stable-stringify/index.d.ts | 4 + .../fast-json-stable-stringify/index.js | 59 + .../fast-json-stable-stringify/package.json | 52 + .../fast-json-stable-stringify/test/cmp.js | 13 + .../fast-json-stable-stringify/test/nested.js | 44 + .../fast-json-stable-stringify/test/str.js | 46 + .../test/to-json.js | 22 + node_modules/fast-levenshtein/LICENSE.md | 25 + node_modules/fast-levenshtein/README.md | 120 + node_modules/fast-levenshtein/levenshtein.js | 211 + node_modules/fast-levenshtein/package.json | 37 + node_modules/fill-range/LICENSE | 21 + node_modules/fill-range/README.md | 250 + node_modules/fill-range/index.js | 208 + node_modules/fill-range/package.json | 82 + node_modules/find-up/index.js | 53 + node_modules/find-up/license | 21 + node_modules/find-up/package.json | 51 + node_modules/find-up/readme.md | 72 + node_modules/findup-sync/README.md | 69 + node_modules/findup-sync/index.js | 85 + node_modules/findup-sync/package.json | 44 + node_modules/fined/LICENSE | 21 + node_modules/fined/README.md | 81 + node_modules/fined/index.js | 174 + node_modules/fined/package.json | 47 + node_modules/flagged-respawn/LICENSE | 21 + node_modules/flagged-respawn/README.md | 111 + node_modules/flagged-respawn/index.js | 52 + node_modules/flagged-respawn/package.json | 47 + node_modules/flush-write-stream/.travis.yml | 6 + node_modules/flush-write-stream/LICENSE | 21 + node_modules/flush-write-stream/README.md | 59 + node_modules/flush-write-stream/example.js | 22 + node_modules/flush-write-stream/index.js | 54 + node_modules/flush-write-stream/package.json | 26 + node_modules/flush-write-stream/test.js | 85 + node_modules/for-in/LICENSE | 21 + node_modules/for-in/README.md | 85 + node_modules/for-in/index.js | 16 + node_modules/for-in/package.json | 68 + node_modules/for-own/LICENSE | 21 + node_modules/for-own/README.md | 85 + node_modules/for-own/index.js | 19 + node_modules/for-own/package.json | 70 + node_modules/forever-agent/LICENSE | 55 + node_modules/forever-agent/README.md | 4 + node_modules/forever-agent/index.js | 138 + node_modules/forever-agent/package.json | 17 + node_modules/form-data/License | 19 + node_modules/form-data/README.md | 234 + node_modules/form-data/README.md.bak | 234 + node_modules/form-data/package.json | 65 + node_modules/form-data/yarn.lock | 2662 +++ node_modules/fragment-cache/LICENSE | 21 + node_modules/fragment-cache/README.md | 156 + node_modules/fragment-cache/index.js | 128 + node_modules/fragment-cache/package.json | 60 + node_modules/fs-mkdirp-stream/LICENSE | 21 + node_modules/fs-mkdirp-stream/README.md | 65 + node_modules/fs-mkdirp-stream/index.js | 50 + node_modules/fs-mkdirp-stream/mkdirp.js | 71 + .../node_modules/through2/LICENSE.md | 9 + .../node_modules/through2/README.md | 134 + .../node_modules/through2/package.json | 33 + .../node_modules/through2/through2.js | 96 + node_modules/fs-mkdirp-stream/package.json | 52 + node_modules/fs.realpath/LICENSE | 43 + node_modules/fs.realpath/README.md | 33 + node_modules/fs.realpath/index.js | 66 + node_modules/fs.realpath/old.js | 303 + node_modules/fs.realpath/package.json | 26 + node_modules/fstream/.travis.yml | 9 + node_modules/fstream/LICENSE | 15 + node_modules/fstream/README.md | 76 + node_modules/fstream/examples/filter-pipe.js | 134 + node_modules/fstream/examples/pipe.js | 118 + node_modules/fstream/examples/reader.js | 68 + .../fstream/examples/symlink-write.js | 27 + node_modules/fstream/fstream.js | 35 + node_modules/fstream/node_modules/.bin/mkdirp | 1 + node_modules/fstream/node_modules/.bin/rimraf | 1 + node_modules/fstream/package.json | 28 + node_modules/function-bind/.editorconfig | 20 + node_modules/function-bind/.eslintrc | 15 + node_modules/function-bind/.jscs.json | 176 + node_modules/function-bind/.npmignore | 22 + node_modules/function-bind/.travis.yml | 168 + node_modules/function-bind/LICENSE | 20 + node_modules/function-bind/README.md | 48 + node_modules/function-bind/implementation.js | 52 + node_modules/function-bind/index.js | 5 + node_modules/function-bind/package.json | 63 + node_modules/function-bind/test/.eslintrc | 9 + node_modules/function-bind/test/index.js | 252 + node_modules/gauge/CHANGELOG.md | 160 + node_modules/gauge/LICENSE | 13 + node_modules/gauge/README.md | 399 + node_modules/gauge/base-theme.js | 14 + node_modules/gauge/error.js | 24 + node_modules/gauge/has-color.js | 12 + node_modules/gauge/index.js | 233 + node_modules/gauge/package.json | 63 + node_modules/gauge/plumbing.js | 48 + node_modules/gauge/process.js | 3 + node_modules/gauge/progress-bar.js | 35 + node_modules/gauge/render-template.js | 181 + node_modules/gauge/set-immediate.js | 7 + node_modules/gauge/set-interval.js | 3 + node_modules/gauge/spin.js | 5 + node_modules/gauge/template-item.js | 73 + node_modules/gauge/theme-set.js | 115 + node_modules/gauge/themes.js | 54 + node_modules/gauge/wide-truncate.js | 25 + node_modules/gaze/LICENSE-MIT | 22 + node_modules/gaze/README.md | 196 + node_modules/gaze/package.json | 54 + node_modules/get-caller-file/LICENSE.md | 6 + node_modules/get-caller-file/README.md | 4 + node_modules/get-caller-file/index.js | 20 + node_modules/get-caller-file/package.json | 31 + node_modules/get-intrinsic/.eslintignore | 1 + node_modules/get-intrinsic/.eslintrc | 36 + .../get-intrinsic/.github/FUNDING.yml | 12 + node_modules/get-intrinsic/.github/rebase.yml | 15 + .../.github/require-allow-edits.yml | 12 + node_modules/get-intrinsic/.nycrc | 14 + node_modules/get-intrinsic/.travis.yml | 10 + node_modules/get-intrinsic/CHANGELOG.md | 689 + node_modules/get-intrinsic/LICENSE | 21 + node_modules/get-intrinsic/README.md | 2 + node_modules/get-intrinsic/index.js | 313 + node_modules/get-intrinsic/package.json | 74 + .../get-intrinsic/test/GetIntrinsic.js | 231 + node_modules/get-stdin/index.js | 49 + node_modules/get-stdin/package.json | 35 + node_modules/get-stdin/readme.md | 44 + node_modules/get-value/LICENSE | 21 + node_modules/get-value/index.js | 50 + node_modules/get-value/package.json | 79 + node_modules/getpass/.npmignore | 8 + node_modules/getpass/.travis.yml | 9 + node_modules/getpass/LICENSE | 18 + node_modules/getpass/README.md | 32 + node_modules/getpass/package.json | 18 + node_modules/glob-parent/LICENSE | 15 + node_modules/glob-parent/README.md | 109 + node_modules/glob-parent/index.js | 24 + node_modules/glob-parent/package.json | 42 + node_modules/glob-stream/LICENSE | 21 + node_modules/glob-stream/README.md | 146 + node_modules/glob-stream/index.js | 94 + node_modules/glob-stream/package.json | 59 + node_modules/glob-stream/readable.js | 117 + node_modules/glob-watcher/LICENSE | 21 + node_modules/glob-watcher/README.md | 137 + node_modules/glob-watcher/index.js | 149 + .../node_modules/normalize-path/LICENSE | 21 + .../node_modules/normalize-path/README.md | 127 + .../node_modules/normalize-path/index.js | 35 + .../node_modules/normalize-path/package.json | 77 + node_modules/glob-watcher/package.json | 52 + node_modules/glob/LICENSE | 21 + node_modules/glob/README.md | 375 + node_modules/glob/changelog.md | 67 + node_modules/glob/common.js | 240 + node_modules/glob/glob.js | 790 + node_modules/glob/package.json | 46 + node_modules/glob/sync.js | 486 + node_modules/global-modules/LICENSE | 21 + node_modules/global-modules/README.md | 75 + node_modules/global-modules/index.js | 31 + node_modules/global-modules/package.json | 72 + node_modules/global-prefix/LICENSE | 21 + node_modules/global-prefix/README.md | 78 + node_modules/global-prefix/index.js | 96 + .../global-prefix/node_modules/.bin/which | 1 + node_modules/global-prefix/package.json | 75 + node_modules/globule/LICENSE | 22 + node_modules/globule/README.md | 131 + node_modules/globule/package.json | 50 + node_modules/glogg/LICENSE | 22 + node_modules/glogg/README.md | 114 + node_modules/glogg/index.js | 34 + node_modules/glogg/package.json | 44 + node_modules/graceful-fs/LICENSE | 15 + node_modules/graceful-fs/README.md | 133 + node_modules/graceful-fs/clone.js | 19 + node_modules/graceful-fs/graceful-fs.js | 354 + node_modules/graceful-fs/legacy-streams.js | 118 + node_modules/graceful-fs/package.json | 50 + node_modules/graceful-fs/polyfills.js | 342 + node_modules/gulp-cli/LICENSE | 21 + node_modules/gulp-cli/README.md | 240 + node_modules/gulp-cli/completion/README.md | 20 + node_modules/gulp-cli/completion/bash | 27 + node_modules/gulp-cli/completion/fish | 10 + node_modules/gulp-cli/completion/powershell | 61 + node_modules/gulp-cli/completion/zsh | 25 + node_modules/gulp-cli/gulp.1 | 83 + node_modules/gulp-cli/index.js | 212 + .../gulp-cli/node_modules/.bin/color-support | 1 + node_modules/gulp-cli/package.json | 77 + node_modules/gulp-csso/CHANGELOG.md | 110 + node_modules/gulp-csso/LICENSE-MIT | 22 + node_modules/gulp-csso/README.md | 106 + node_modules/gulp-csso/index.js | 53 + node_modules/gulp-csso/package.json | 39 + node_modules/gulp-sass/.editorconfig | 21 + node_modules/gulp-sass/.eslintrc | 12 + node_modules/gulp-sass/.travis.yml | 8 + node_modules/gulp-sass/CHANGELOG.md | 105 + node_modules/gulp-sass/CONTRIBUTING.md | 63 + node_modules/gulp-sass/LICENSE | 20 + node_modules/gulp-sass/README.md | 154 + node_modules/gulp-sass/appveyor.yml | 25 + node_modules/gulp-sass/index.js | 168 + .../gulp-sass/node_modules/.bin/node-sass | 1 + .../node_modules/ansi-regex/index.js | 10 + .../gulp-sass/node_modules/ansi-regex/license | 9 + .../node_modules/ansi-regex/package.json | 53 + .../node_modules/ansi-regex/readme.md | 46 + .../node_modules/strip-ansi/index.js | 4 + .../gulp-sass/node_modules/strip-ansi/license | 9 + .../node_modules/strip-ansi/package.json | 52 + .../node_modules/strip-ansi/readme.md | 39 + .../node_modules/through2/LICENSE.md | 9 + .../gulp-sass/node_modules/through2/README.md | 134 + .../node_modules/through2/package.json | 33 + .../node_modules/through2/through2.js | 96 + node_modules/gulp-sass/package.json | 51 + node_modules/gulp-sourcemaps/LICENSE.md | 15 + node_modules/gulp-sourcemaps/README.md | 407 + node_modules/gulp-sourcemaps/index.js | 8 + .../gulp-sourcemaps/node_modules/.bin/acorn | 1 + .../node_modules/through2/LICENSE.md | 9 + .../node_modules/through2/README.md | 134 + .../node_modules/through2/package.json | 33 + .../node_modules/through2/through2.js | 96 + node_modules/gulp-sourcemaps/package.json | 65 + node_modules/gulp-sourcemaps/src/debug.js | 1 + .../src/init/index.internals.js | 128 + .../gulp-sourcemaps/src/init/index.js | 141 + node_modules/gulp-sourcemaps/src/utils.js | 76 + .../src/write/index.internals.js | 179 + .../gulp-sourcemaps/src/write/index.js | 70 + node_modules/gulp/CHANGELOG.md | 269 + node_modules/gulp/LICENSE | 21 + node_modules/gulp/README.md | 284 + node_modules/gulp/index.js | 55 + node_modules/gulp/node_modules/.bin/gulp | 1 + node_modules/gulp/package.json | 60 + node_modules/gulplog/CHANGELOG.md | 10 + node_modules/gulplog/LICENSE | 22 + node_modules/gulplog/README.md | 79 + node_modules/gulplog/index.js | 7 + node_modules/gulplog/package.json | 34 + node_modules/har-schema/LICENSE | 13 + node_modules/har-schema/README.md | 49 + node_modules/har-schema/package.json | 54 + node_modules/har-validator/LICENSE | 9 + node_modules/har-validator/README.md | 43 + node_modules/har-validator/package.json | 43 + node_modules/has-ansi/index.js | 4 + node_modules/has-ansi/license | 21 + node_modules/has-ansi/package.json | 55 + node_modules/has-ansi/readme.md | 36 + node_modules/has-flag/index.js | 8 + node_modules/has-flag/license | 9 + node_modules/has-flag/package.json | 44 + node_modules/has-flag/readme.md | 70 + node_modules/has-symbols/.eslintrc | 11 + node_modules/has-symbols/.github/FUNDING.yml | 12 + .../has-symbols/.github/workflows/rebase.yml | 15 + node_modules/has-symbols/.travis.yml | 12 + node_modules/has-symbols/CHANGELOG.md | 34 + node_modules/has-symbols/LICENSE | 21 + node_modules/has-symbols/README.md | 45 + node_modules/has-symbols/index.js | 13 + node_modules/has-symbols/package.json | 89 + node_modules/has-symbols/shams.js | 42 + node_modules/has-symbols/test/index.js | 22 + .../has-symbols/test/shams/core-js.js | 28 + .../test/shams/get-own-property-symbols.js | 28 + node_modules/has-symbols/test/tests.js | 54 + node_modules/has-unicode/LICENSE | 14 + node_modules/has-unicode/README.md | 43 + node_modules/has-unicode/index.js | 16 + node_modules/has-unicode/package.json | 30 + node_modules/has-value/LICENSE | 21 + node_modules/has-value/README.md | 149 + node_modules/has-value/index.js | 16 + node_modules/has-value/package.json | 83 + node_modules/has-values/LICENSE | 21 + node_modules/has-values/README.md | 129 + node_modules/has-values/index.js | 60 + .../has-values/node_modules/kind-of/LICENSE | 21 + .../has-values/node_modules/kind-of/README.md | 267 + .../has-values/node_modules/kind-of/index.js | 119 + .../node_modules/kind-of/package.json | 90 + node_modules/has-values/package.json | 82 + node_modules/has/LICENSE-MIT | 22 + node_modules/has/README.md | 18 + node_modules/has/package.json | 48 + node_modules/has/src/index.js | 5 + node_modules/has/test/index.js | 10 + node_modules/homedir-polyfill/LICENSE | 21 + node_modules/homedir-polyfill/README.md | 96 + node_modules/homedir-polyfill/index.js | 9 + node_modules/homedir-polyfill/package.json | 62 + node_modules/homedir-polyfill/polyfill.js | 81 + node_modules/hosted-git-info/CHANGELOG.md | 141 + node_modules/hosted-git-info/LICENSE | 13 + node_modules/hosted-git-info/README.md | 133 + node_modules/hosted-git-info/git-host-info.js | 79 + node_modules/hosted-git-info/git-host.js | 156 + node_modules/hosted-git-info/index.js | 148 + node_modules/hosted-git-info/package.json | 40 + node_modules/http-signature/.dir-locals.el | 6 + node_modules/http-signature/.npmignore | 7 + node_modules/http-signature/CHANGES.md | 46 + node_modules/http-signature/LICENSE | 18 + node_modules/http-signature/README.md | 79 + node_modules/http-signature/http_signing.md | 363 + .../node_modules/.bin/sshpk-conv | 1 + .../node_modules/.bin/sshpk-sign | 1 + .../node_modules/.bin/sshpk-verify | 1 + node_modules/http-signature/package.json | 39 + node_modules/in-publish/LICENSE | 14 + node_modules/in-publish/README.md | 52 + node_modules/in-publish/in-install.js | 4 + node_modules/in-publish/in-publish.js | 4 + node_modules/in-publish/index.js | 32 + node_modules/in-publish/not-in-install.js | 4 + node_modules/in-publish/not-in-publish.js | 4 + node_modules/in-publish/package.json | 22 + node_modules/in-publish/test/package.json | 10 + node_modules/indent-string/index.js | 20 + node_modules/indent-string/license | 21 + node_modules/indent-string/package.json | 36 + node_modules/indent-string/readme.md | 58 + node_modules/inflight/LICENSE | 15 + node_modules/inflight/README.md | 37 + node_modules/inflight/inflight.js | 54 + node_modules/inflight/package.json | 29 + node_modules/inherits/LICENSE | 16 + node_modules/inherits/README.md | 42 + node_modules/inherits/inherits.js | 9 + node_modules/inherits/inherits_browser.js | 27 + node_modules/inherits/package.json | 29 + node_modules/ini/LICENSE | 15 + node_modules/ini/README.md | 102 + node_modules/ini/ini.js | 206 + node_modules/ini/package.json | 33 + node_modules/interpret/CHANGELOG | 115 + node_modules/interpret/LICENSE | 22 + node_modules/interpret/README.md | 187 + node_modules/interpret/index.js | 168 + node_modules/interpret/mjs-stub.js | 1 + node_modules/interpret/package.json | 75 + node_modules/invert-kv/index.js | 15 + node_modules/invert-kv/package.json | 33 + node_modules/invert-kv/readme.md | 25 + node_modules/is-absolute/LICENSE | 22 + node_modules/is-absolute/README.md | 114 + node_modules/is-absolute/index.js | 47 + node_modules/is-absolute/package.json | 91 + node_modules/is-accessor-descriptor/LICENSE | 21 + node_modules/is-accessor-descriptor/README.md | 144 + node_modules/is-accessor-descriptor/index.js | 69 + .../node_modules/kind-of/CHANGELOG.md | 160 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 367 + .../node_modules/kind-of/index.js | 129 + .../node_modules/kind-of/package.json | 88 + .../is-accessor-descriptor/package.json | 73 + node_modules/is-arrayish/.editorconfig | 18 + node_modules/is-arrayish/.istanbul.yml | 4 + node_modules/is-arrayish/.npmignore | 5 + node_modules/is-arrayish/.travis.yml | 17 + node_modules/is-arrayish/LICENSE | 21 + node_modules/is-arrayish/README.md | 16 + node_modules/is-arrayish/index.js | 10 + node_modules/is-arrayish/package.json | 34 + node_modules/is-binary-path/index.js | 12 + node_modules/is-binary-path/license | 21 + node_modules/is-binary-path/package.json | 39 + node_modules/is-binary-path/readme.md | 34 + node_modules/is-buffer/LICENSE | 21 + node_modules/is-buffer/README.md | 53 + node_modules/is-buffer/index.js | 21 + node_modules/is-buffer/package.json | 51 + node_modules/is-buffer/test/basic.js | 24 + node_modules/is-core-module/.eslintignore | 1 + node_modules/is-core-module/.eslintrc | 18 + .../is-core-module/.github/FUNDING.yml | 12 + .../.github/workflows/node-4+.yml | 54 + .../.github/workflows/node-iojs.yml | 58 + .../.github/workflows/node-pretest.yml | 26 + .../.github/workflows/node-zero.yml | 58 + .../.github/workflows/rebase.yml | 15 + .../.github/workflows/require-allow-edits.yml | 14 + node_modules/is-core-module/.nycrc | 13 + node_modules/is-core-module/CHANGELOG.md | 58 + node_modules/is-core-module/LICENSE | 20 + node_modules/is-core-module/README.md | 37 + node_modules/is-core-module/core.json | 83 + node_modules/is-core-module/index.js | 69 + node_modules/is-core-module/package.json | 66 + node_modules/is-core-module/test/index.js | 83 + node_modules/is-data-descriptor/LICENSE | 21 + node_modules/is-data-descriptor/README.md | 161 + node_modules/is-data-descriptor/index.js | 49 + .../node_modules/kind-of/CHANGELOG.md | 160 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 367 + .../node_modules/kind-of/index.js | 129 + .../node_modules/kind-of/package.json | 88 + node_modules/is-data-descriptor/package.json | 72 + node_modules/is-descriptor/LICENSE | 21 + node_modules/is-descriptor/README.md | 193 + node_modules/is-descriptor/index.js | 22 + .../node_modules/kind-of/CHANGELOG.md | 160 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 367 + .../node_modules/kind-of/index.js | 129 + .../node_modules/kind-of/package.json | 88 + node_modules/is-descriptor/package.json | 75 + node_modules/is-extendable/LICENSE | 21 + node_modules/is-extendable/README.md | 72 + node_modules/is-extendable/index.js | 13 + node_modules/is-extendable/package.json | 51 + node_modules/is-extglob/LICENSE | 21 + node_modules/is-extglob/README.md | 107 + node_modules/is-extglob/index.js | 20 + node_modules/is-extglob/package.json | 69 + node_modules/is-finite/index.js | 5 + node_modules/is-finite/license | 9 + node_modules/is-finite/package.json | 34 + node_modules/is-finite/readme.md | 33 + node_modules/is-fullwidth-code-point/index.js | 46 + node_modules/is-fullwidth-code-point/license | 21 + .../is-fullwidth-code-point/package.json | 45 + .../is-fullwidth-code-point/readme.md | 39 + node_modules/is-glob/LICENSE | 21 + node_modules/is-glob/README.md | 142 + node_modules/is-glob/index.js | 25 + node_modules/is-glob/package.json | 80 + node_modules/is-negated-glob/LICENSE | 21 + node_modules/is-negated-glob/README.md | 73 + node_modules/is-negated-glob/index.js | 15 + node_modules/is-negated-glob/package.json | 68 + node_modules/is-number/LICENSE | 21 + node_modules/is-number/README.md | 115 + node_modules/is-number/index.js | 22 + node_modules/is-number/package.json | 83 + node_modules/is-plain-object/LICENSE | 21 + node_modules/is-plain-object/README.md | 104 + node_modules/is-plain-object/index.d.ts | 5 + node_modules/is-plain-object/index.js | 37 + node_modules/is-plain-object/package.json | 79 + node_modules/is-promise/LICENSE | 19 + node_modules/is-promise/index.js | 6 + node_modules/is-promise/index.mjs | 3 + node_modules/is-promise/package.json | 23 + node_modules/is-promise/readme.md | 33 + node_modules/is-relative/LICENSE | 21 + node_modules/is-relative/README.md | 77 + node_modules/is-relative/index.js | 12 + node_modules/is-relative/package.json | 71 + node_modules/is-typedarray/LICENSE.md | 18 + node_modules/is-typedarray/README.md | 16 + node_modules/is-typedarray/index.js | 41 + node_modules/is-typedarray/package.json | 30 + node_modules/is-typedarray/test.js | 34 + node_modules/is-unc-path/LICENSE | 21 + node_modules/is-unc-path/README.md | 115 + node_modules/is-unc-path/index.js | 10 + node_modules/is-unc-path/package.json | 65 + node_modules/is-utf8/LICENSE | 9 + node_modules/is-utf8/README.md | 16 + node_modules/is-utf8/is-utf8.js | 76 + node_modules/is-utf8/package.json | 19 + node_modules/is-valid-glob/LICENSE | 21 + node_modules/is-valid-glob/README.md | 103 + node_modules/is-valid-glob/index.js | 21 + node_modules/is-valid-glob/package.json | 64 + node_modules/is-windows/LICENSE | 21 + node_modules/is-windows/README.md | 95 + node_modules/is-windows/index.js | 27 + node_modules/is-windows/package.json | 71 + node_modules/isarray/.npmignore | 1 + node_modules/isarray/.travis.yml | 4 + node_modules/isarray/Makefile | 6 + node_modules/isarray/README.md | 60 + node_modules/isarray/component.json | 19 + node_modules/isarray/index.js | 5 + node_modules/isarray/package.json | 45 + node_modules/isarray/test.js | 20 + node_modules/isexe/.npmignore | 2 + node_modules/isexe/LICENSE | 15 + node_modules/isexe/README.md | 51 + node_modules/isexe/index.js | 57 + node_modules/isexe/mode.js | 41 + node_modules/isexe/package.json | 31 + node_modules/isexe/test/basic.js | 221 + node_modules/isexe/windows.js | 42 + node_modules/isobject/LICENSE | 21 + node_modules/isobject/README.md | 122 + node_modules/isobject/index.d.ts | 5 + node_modules/isobject/index.js | 12 + node_modules/isobject/package.json | 74 + node_modules/isstream/.jshintrc | 59 + node_modules/isstream/.npmignore | 1 + node_modules/isstream/.travis.yml | 12 + node_modules/isstream/LICENSE.md | 11 + node_modules/isstream/README.md | 66 + node_modules/isstream/isstream.js | 27 + node_modules/isstream/package.json | 33 + node_modules/isstream/test.js | 168 + node_modules/js-base64/LICENSE.md | 27 + node_modules/js-base64/README.md | 123 + node_modules/js-base64/base64.js | 230 + node_modules/js-base64/base64.min.js | 1 + node_modules/js-base64/package.json | 35 + node_modules/jsbn/.npmignore | 2 + node_modules/jsbn/LICENSE | 40 + node_modules/jsbn/README.md | 175 + node_modules/jsbn/example.html | 12 + node_modules/jsbn/example.js | 3 + node_modules/jsbn/index.js | 1357 ++ node_modules/jsbn/package.json | 21 + .../json-schema-traverse/.eslintrc.yml | 27 + node_modules/json-schema-traverse/.travis.yml | 8 + node_modules/json-schema-traverse/LICENSE | 21 + node_modules/json-schema-traverse/README.md | 83 + node_modules/json-schema-traverse/index.js | 89 + .../json-schema-traverse/package.json | 43 + .../json-schema-traverse/spec/.eslintrc.yml | 6 + .../spec/fixtures/schema.js | 125 + .../json-schema-traverse/spec/index.spec.js | 171 + node_modules/json-schema/README.md | 5 + .../json-schema/draft-00/hyper-schema | 68 + node_modules/json-schema/draft-00/json-ref | 26 + node_modules/json-schema/draft-00/links | 33 + node_modules/json-schema/draft-00/schema | 155 + .../json-schema/draft-01/hyper-schema | 68 + node_modules/json-schema/draft-01/json-ref | 26 + node_modules/json-schema/draft-01/links | 33 + node_modules/json-schema/draft-01/schema | 155 + .../json-schema/draft-02/hyper-schema | 68 + node_modules/json-schema/draft-02/json-ref | 26 + node_modules/json-schema/draft-02/links | 35 + node_modules/json-schema/draft-02/schema | 166 + .../json-schema/draft-03/examples/address | 20 + .../json-schema/draft-03/examples/calendar | 53 + .../json-schema/draft-03/examples/card | 105 + .../json-schema/draft-03/examples/geo | 8 + .../json-schema/draft-03/examples/interfaces | 23 + .../json-schema/draft-03/hyper-schema | 60 + node_modules/json-schema/draft-03/json-ref | 26 + node_modules/json-schema/draft-03/links | 35 + node_modules/json-schema/draft-03/schema | 174 + .../json-schema/draft-04/hyper-schema | 60 + node_modules/json-schema/draft-04/links | 41 + node_modules/json-schema/draft-04/schema | 189 + .../json-schema/draft-zyp-json-schema-03.xml | 1120 + .../json-schema/draft-zyp-json-schema-04.xml | 1072 + node_modules/json-schema/package.json | 31 + node_modules/json-schema/test/tests.js | 95 + .../.npmignore | 1 + .../.travis.yml | 4 + .../LICENSE | 18 + .../example/key_cmp.js | 7 + .../example/nested.js | 3 + .../example/str.js | 3 + .../example/value_cmp.js | 7 + .../index.js | 82 + .../package.json | 43 + .../readme.markdown | 132 + .../test/cmp.js | 11 + .../test/nested.js | 42 + .../test/replacer.js | 74 + .../test/space.js | 59 + .../test/str.js | 32 + .../test/to-json.js | 20 + node_modules/json-stringify-safe/.npmignore | 1 + node_modules/json-stringify-safe/CHANGELOG.md | 14 + node_modules/json-stringify-safe/LICENSE | 15 + node_modules/json-stringify-safe/Makefile | 35 + node_modules/json-stringify-safe/README.md | 52 + node_modules/json-stringify-safe/package.json | 31 + node_modules/json-stringify-safe/stringify.js | 27 + .../json-stringify-safe/test/mocha.opts | 2 + .../test/stringify_test.js | 246 + node_modules/jsprim/CHANGES.md | 49 + node_modules/jsprim/CONTRIBUTING.md | 19 + node_modules/jsprim/LICENSE | 19 + node_modules/jsprim/README.md | 287 + node_modules/jsprim/package.json | 20 + node_modules/just-debounce/.eslintrc | 3 + node_modules/just-debounce/.npmignore | 25 + node_modules/just-debounce/LICENSE | 21 + node_modules/just-debounce/README.md | 53 + node_modules/just-debounce/index.js | 34 + node_modules/just-debounce/package.json | 29 + node_modules/just-debounce/test.js | 121 + node_modules/kind-of/LICENSE | 21 + node_modules/kind-of/README.md | 261 + node_modules/kind-of/index.js | 116 + node_modules/kind-of/package.json | 90 + node_modules/last-run/LICENSE | 21 + node_modules/last-run/README.md | 81 + node_modules/last-run/index.js | 58 + node_modules/last-run/package.json | 46 + node_modules/lazystream/.npmignore | 4 + node_modules/lazystream/.travis.yml | 9 + node_modules/lazystream/LICENSE-MIT | 23 + node_modules/lazystream/README.md | 110 + node_modules/lazystream/package.json | 41 + node_modules/lazystream/secret | 59 + node_modules/lazystream/test/data.md | 13 + node_modules/lazystream/test/fs_test.js | 69 + node_modules/lazystream/test/helper.js | 39 + node_modules/lazystream/test/pipe_test.js | 36 + node_modules/lazystream/test/readable_test.js | 90 + node_modules/lazystream/test/writable_test.js | 59 + node_modules/lcid/index.js | 22 + node_modules/lcid/lcid.json | 203 + node_modules/lcid/license | 21 + node_modules/lcid/package.json | 46 + node_modules/lcid/readme.md | 35 + node_modules/lead/LICENSE | 21 + node_modules/lead/README.md | 55 + node_modules/lead/index.js | 61 + node_modules/lead/package.json | 46 + node_modules/liftoff/CHANGELOG | 127 + node_modules/liftoff/LICENSE | 22 + node_modules/liftoff/README.md | 535 + node_modules/liftoff/index.js | 231 + .../liftoff/node_modules/findup-sync/LICENSE | 21 + .../node_modules/findup-sync/README.md | 57 + .../liftoff/node_modules/findup-sync/index.js | 87 + .../node_modules/findup-sync/package.json | 57 + .../liftoff/node_modules/is-glob/LICENSE | 21 + .../liftoff/node_modules/is-glob/README.md | 206 + .../liftoff/node_modules/is-glob/index.js | 48 + .../liftoff/node_modules/is-glob/package.json | 81 + node_modules/liftoff/package.json | 46 + node_modules/load-json-file/index.js | 21 + node_modules/load-json-file/license | 21 + node_modules/load-json-file/package.json | 46 + node_modules/load-json-file/readme.md | 45 + node_modules/locate-path/index.js | 24 + node_modules/locate-path/license | 9 + .../node_modules/path-exists/index.js | 17 + .../node_modules/path-exists/license | 21 + .../node_modules/path-exists/package.json | 40 + .../node_modules/path-exists/readme.md | 50 + node_modules/locate-path/package.json | 44 + node_modules/locate-path/readme.md | 99 + node_modules/lodash/LICENSE | 47 + node_modules/lodash/README.md | 39 + node_modules/lodash/_DataView.js | 7 + node_modules/lodash/_Hash.js | 32 + node_modules/lodash/_LazyWrapper.js | 28 + node_modules/lodash/_ListCache.js | 32 + node_modules/lodash/_LodashWrapper.js | 22 + node_modules/lodash/_Map.js | 7 + node_modules/lodash/_MapCache.js | 32 + node_modules/lodash/_Promise.js | 7 + node_modules/lodash/_Set.js | 7 + node_modules/lodash/_SetCache.js | 27 + node_modules/lodash/_Stack.js | 27 + node_modules/lodash/_Symbol.js | 6 + node_modules/lodash/_Uint8Array.js | 6 + node_modules/lodash/_WeakMap.js | 7 + node_modules/lodash/_apply.js | 21 + node_modules/lodash/_arrayAggregator.js | 22 + node_modules/lodash/_arrayEach.js | 22 + node_modules/lodash/_arrayEachRight.js | 21 + node_modules/lodash/_arrayEvery.js | 23 + node_modules/lodash/_arrayFilter.js | 25 + node_modules/lodash/_arrayIncludes.js | 17 + node_modules/lodash/_arrayIncludesWith.js | 22 + node_modules/lodash/_arrayLikeKeys.js | 49 + node_modules/lodash/_arrayMap.js | 21 + node_modules/lodash/_arrayPush.js | 20 + node_modules/lodash/_arrayReduce.js | 26 + node_modules/lodash/_arrayReduceRight.js | 24 + node_modules/lodash/_arraySample.js | 15 + node_modules/lodash/_arraySampleSize.js | 17 + node_modules/lodash/_arrayShuffle.js | 15 + node_modules/lodash/_arraySome.js | 23 + node_modules/lodash/_asciiSize.js | 12 + node_modules/lodash/_asciiToArray.js | 12 + node_modules/lodash/_asciiWords.js | 15 + node_modules/lodash/_assignMergeValue.js | 20 + node_modules/lodash/_assignValue.js | 28 + node_modules/lodash/_assocIndexOf.js | 21 + node_modules/lodash/_baseAggregator.js | 21 + node_modules/lodash/_baseAssign.js | 17 + node_modules/lodash/_baseAssignIn.js | 17 + node_modules/lodash/_baseAssignValue.js | 25 + node_modules/lodash/_baseAt.js | 23 + node_modules/lodash/_baseClamp.js | 22 + node_modules/lodash/_baseClone.js | 166 + node_modules/lodash/_baseConforms.js | 18 + node_modules/lodash/_baseConformsTo.js | 27 + node_modules/lodash/_baseCreate.js | 30 + node_modules/lodash/_baseDelay.js | 21 + node_modules/lodash/_baseDifference.js | 67 + node_modules/lodash/_baseEach.js | 14 + node_modules/lodash/_baseEachRight.js | 14 + node_modules/lodash/_baseEvery.js | 21 + node_modules/lodash/_baseExtremum.js | 32 + node_modules/lodash/_baseFill.js | 32 + node_modules/lodash/_baseFilter.js | 21 + node_modules/lodash/_baseFindIndex.js | 24 + node_modules/lodash/_baseFindKey.js | 23 + node_modules/lodash/_baseFlatten.js | 38 + node_modules/lodash/_baseFor.js | 16 + node_modules/lodash/_baseForOwn.js | 16 + node_modules/lodash/_baseForOwnRight.js | 16 + node_modules/lodash/_baseForRight.js | 15 + node_modules/lodash/_baseFunctions.js | 19 + node_modules/lodash/_baseGet.js | 24 + node_modules/lodash/_baseGetAllKeys.js | 20 + node_modules/lodash/_baseGetTag.js | 28 + node_modules/lodash/_baseGt.js | 14 + node_modules/lodash/_baseHas.js | 19 + node_modules/lodash/_baseHasIn.js | 13 + node_modules/lodash/_baseInRange.js | 18 + node_modules/lodash/_baseIndexOf.js | 20 + node_modules/lodash/_baseIndexOfWith.js | 23 + node_modules/lodash/_baseIntersection.js | 74 + node_modules/lodash/_baseInverter.js | 21 + node_modules/lodash/_baseInvoke.js | 24 + node_modules/lodash/_baseIsArguments.js | 18 + node_modules/lodash/_baseIsArrayBuffer.js | 17 + node_modules/lodash/_baseIsDate.js | 18 + node_modules/lodash/_baseIsEqual.js | 28 + node_modules/lodash/_baseIsEqualDeep.js | 83 + node_modules/lodash/_baseIsMap.js | 18 + node_modules/lodash/_baseIsMatch.js | 62 + node_modules/lodash/_baseIsNaN.js | 12 + node_modules/lodash/_baseIsNative.js | 47 + node_modules/lodash/_baseIsRegExp.js | 18 + node_modules/lodash/_baseIsSet.js | 18 + node_modules/lodash/_baseIsTypedArray.js | 60 + node_modules/lodash/_baseIteratee.js | 31 + node_modules/lodash/_baseKeys.js | 30 + node_modules/lodash/_baseKeysIn.js | 33 + node_modules/lodash/_baseLodash.js | 10 + node_modules/lodash/_baseLt.js | 14 + node_modules/lodash/_baseMap.js | 22 + node_modules/lodash/_baseMatches.js | 22 + node_modules/lodash/_baseMatchesProperty.js | 33 + node_modules/lodash/_baseMean.js | 20 + node_modules/lodash/_baseMerge.js | 42 + node_modules/lodash/_baseMergeDeep.js | 94 + node_modules/lodash/_baseNth.js | 20 + node_modules/lodash/_baseOrderBy.js | 49 + node_modules/lodash/_basePick.js | 19 + node_modules/lodash/_basePickBy.js | 30 + node_modules/lodash/_baseProperty.js | 14 + node_modules/lodash/_basePropertyDeep.js | 16 + node_modules/lodash/_basePropertyOf.js | 14 + node_modules/lodash/_basePullAll.js | 51 + node_modules/lodash/_basePullAt.js | 37 + node_modules/lodash/_baseRandom.js | 18 + node_modules/lodash/_baseRange.js | 28 + node_modules/lodash/_baseReduce.js | 23 + node_modules/lodash/_baseRepeat.js | 35 + node_modules/lodash/_baseRest.js | 17 + node_modules/lodash/_baseSample.js | 15 + node_modules/lodash/_baseSampleSize.js | 18 + node_modules/lodash/_baseSet.js | 51 + node_modules/lodash/_baseSetData.js | 17 + node_modules/lodash/_baseSetToString.js | 22 + node_modules/lodash/_baseShuffle.js | 15 + node_modules/lodash/_baseSlice.js | 31 + node_modules/lodash/_baseSome.js | 22 + node_modules/lodash/_baseSortBy.js | 21 + node_modules/lodash/_baseSortedIndex.js | 42 + node_modules/lodash/_baseSortedIndexBy.js | 67 + node_modules/lodash/_baseSortedUniq.js | 30 + node_modules/lodash/_baseSum.js | 24 + node_modules/lodash/_baseTimes.js | 20 + node_modules/lodash/_baseToNumber.js | 24 + node_modules/lodash/_baseToPairs.js | 18 + node_modules/lodash/_baseToString.js | 37 + node_modules/lodash/_baseUnary.js | 14 + node_modules/lodash/_baseUniq.js | 72 + node_modules/lodash/_baseUnset.js | 20 + node_modules/lodash/_baseUpdate.js | 18 + node_modules/lodash/_baseValues.js | 19 + node_modules/lodash/_baseWhile.js | 26 + node_modules/lodash/_baseWrapperValue.js | 25 + node_modules/lodash/_baseXor.js | 36 + node_modules/lodash/_baseZipObject.js | 23 + node_modules/lodash/_cacheHas.js | 13 + node_modules/lodash/_castArrayLikeObject.js | 14 + node_modules/lodash/_castFunction.js | 14 + node_modules/lodash/_castPath.js | 21 + node_modules/lodash/_castRest.js | 14 + node_modules/lodash/_castSlice.js | 18 + node_modules/lodash/_charsEndIndex.js | 19 + node_modules/lodash/_charsStartIndex.js | 20 + node_modules/lodash/_cloneArrayBuffer.js | 16 + node_modules/lodash/_cloneBuffer.js | 35 + node_modules/lodash/_cloneDataView.js | 16 + node_modules/lodash/_cloneRegExp.js | 17 + node_modules/lodash/_cloneSymbol.js | 18 + node_modules/lodash/_cloneTypedArray.js | 16 + node_modules/lodash/_compareAscending.js | 41 + node_modules/lodash/_compareMultiple.js | 44 + node_modules/lodash/_composeArgs.js | 39 + node_modules/lodash/_composeArgsRight.js | 41 + node_modules/lodash/_copyArray.js | 20 + node_modules/lodash/_copyObject.js | 40 + node_modules/lodash/_copySymbols.js | 16 + node_modules/lodash/_copySymbolsIn.js | 16 + node_modules/lodash/_coreJsData.js | 6 + node_modules/lodash/_countHolders.js | 21 + node_modules/lodash/_createAggregator.js | 23 + node_modules/lodash/_createAssigner.js | 37 + node_modules/lodash/_createBaseEach.js | 32 + node_modules/lodash/_createBaseFor.js | 25 + node_modules/lodash/_createBind.js | 28 + node_modules/lodash/_createCaseFirst.js | 33 + node_modules/lodash/_createCompounder.js | 24 + node_modules/lodash/_createCtor.js | 37 + node_modules/lodash/_createCurry.js | 46 + node_modules/lodash/_createFind.js | 25 + node_modules/lodash/_createFlow.js | 78 + node_modules/lodash/_createHybrid.js | 92 + node_modules/lodash/_createInverter.js | 17 + node_modules/lodash/_createMathOperation.js | 38 + node_modules/lodash/_createOver.js | 27 + node_modules/lodash/_createPadding.js | 33 + node_modules/lodash/_createPartial.js | 43 + node_modules/lodash/_createRange.js | 30 + node_modules/lodash/_createRecurry.js | 56 + .../lodash/_createRelationalOperation.js | 20 + node_modules/lodash/_createRound.js | 35 + node_modules/lodash/_createSet.js | 19 + node_modules/lodash/_createToPairs.js | 30 + node_modules/lodash/_createWrap.js | 106 + .../lodash/_customDefaultsAssignIn.js | 29 + node_modules/lodash/_customDefaultsMerge.js | 28 + node_modules/lodash/_customOmitClone.js | 16 + node_modules/lodash/_deburrLetter.js | 71 + node_modules/lodash/_defineProperty.js | 11 + node_modules/lodash/_equalArrays.js | 84 + node_modules/lodash/_equalByTag.js | 112 + node_modules/lodash/_equalObjects.js | 90 + node_modules/lodash/_escapeHtmlChar.js | 21 + node_modules/lodash/_escapeStringChar.js | 22 + node_modules/lodash/_flatRest.js | 16 + node_modules/lodash/_freeGlobal.js | 4 + node_modules/lodash/_getAllKeys.js | 16 + node_modules/lodash/_getAllKeysIn.js | 17 + node_modules/lodash/_getData.js | 15 + node_modules/lodash/_getFuncName.js | 31 + node_modules/lodash/_getHolder.js | 13 + node_modules/lodash/_getMapData.js | 18 + node_modules/lodash/_getMatchData.js | 24 + node_modules/lodash/_getNative.js | 17 + node_modules/lodash/_getPrototype.js | 6 + node_modules/lodash/_getRawTag.js | 46 + node_modules/lodash/_getSymbols.js | 30 + node_modules/lodash/_getSymbolsIn.js | 25 + node_modules/lodash/_getTag.js | 58 + node_modules/lodash/_getValue.js | 13 + node_modules/lodash/_getView.js | 33 + node_modules/lodash/_getWrapDetails.js | 17 + node_modules/lodash/_hasPath.js | 39 + node_modules/lodash/_hasUnicode.js | 26 + node_modules/lodash/_hasUnicodeWord.js | 15 + node_modules/lodash/_hashClear.js | 15 + node_modules/lodash/_hashDelete.js | 17 + node_modules/lodash/_hashGet.js | 30 + node_modules/lodash/_hashHas.js | 23 + node_modules/lodash/_hashSet.js | 23 + node_modules/lodash/_initCloneArray.js | 26 + node_modules/lodash/_initCloneByTag.js | 77 + node_modules/lodash/_initCloneObject.js | 18 + node_modules/lodash/_insertWrapDetails.js | 23 + node_modules/lodash/_isFlattenable.js | 20 + node_modules/lodash/_isIndex.js | 25 + node_modules/lodash/_isIterateeCall.js | 30 + node_modules/lodash/_isKey.js | 29 + node_modules/lodash/_isKeyable.js | 15 + node_modules/lodash/_isLaziable.js | 28 + node_modules/lodash/_isMaskable.js | 14 + node_modules/lodash/_isMasked.js | 20 + node_modules/lodash/_isPrototype.js | 18 + node_modules/lodash/_isStrictComparable.js | 15 + node_modules/lodash/_iteratorToArray.js | 18 + node_modules/lodash/_lazyClone.js | 23 + node_modules/lodash/_lazyReverse.js | 23 + node_modules/lodash/_lazyValue.js | 69 + node_modules/lodash/_listCacheClear.js | 13 + node_modules/lodash/_listCacheDelete.js | 35 + node_modules/lodash/_listCacheGet.js | 19 + node_modules/lodash/_listCacheHas.js | 16 + node_modules/lodash/_listCacheSet.js | 26 + node_modules/lodash/_mapCacheClear.js | 21 + node_modules/lodash/_mapCacheDelete.js | 18 + node_modules/lodash/_mapCacheGet.js | 16 + node_modules/lodash/_mapCacheHas.js | 16 + node_modules/lodash/_mapCacheSet.js | 22 + node_modules/lodash/_mapToArray.js | 18 + .../lodash/_matchesStrictComparable.js | 20 + node_modules/lodash/_memoizeCapped.js | 26 + node_modules/lodash/_mergeData.js | 90 + node_modules/lodash/_metaMap.js | 6 + node_modules/lodash/_nativeCreate.js | 6 + node_modules/lodash/_nativeKeys.js | 6 + node_modules/lodash/_nativeKeysIn.js | 20 + node_modules/lodash/_nodeUtil.js | 30 + node_modules/lodash/_objectToString.js | 22 + node_modules/lodash/_overArg.js | 15 + node_modules/lodash/_overRest.js | 36 + node_modules/lodash/_parent.js | 16 + node_modules/lodash/_reEscape.js | 4 + node_modules/lodash/_reEvaluate.js | 4 + node_modules/lodash/_reInterpolate.js | 4 + node_modules/lodash/_realNames.js | 4 + node_modules/lodash/_reorder.js | 29 + node_modules/lodash/_replaceHolders.js | 29 + node_modules/lodash/_root.js | 9 + node_modules/lodash/_safeGet.js | 21 + node_modules/lodash/_setCacheAdd.js | 19 + node_modules/lodash/_setCacheHas.js | 14 + node_modules/lodash/_setData.js | 20 + node_modules/lodash/_setToArray.js | 18 + node_modules/lodash/_setToPairs.js | 18 + node_modules/lodash/_setToString.js | 14 + node_modules/lodash/_setWrapToString.js | 21 + node_modules/lodash/_shortOut.js | 37 + node_modules/lodash/_shuffleSelf.js | 28 + node_modules/lodash/_stackClear.js | 15 + node_modules/lodash/_stackDelete.js | 18 + node_modules/lodash/_stackGet.js | 14 + node_modules/lodash/_stackHas.js | 14 + node_modules/lodash/_stackSet.js | 34 + node_modules/lodash/_strictIndexOf.js | 23 + node_modules/lodash/_strictLastIndexOf.js | 21 + node_modules/lodash/_stringSize.js | 18 + node_modules/lodash/_stringToArray.js | 18 + node_modules/lodash/_stringToPath.js | 27 + node_modules/lodash/_toKey.js | 21 + node_modules/lodash/_toSource.js | 26 + node_modules/lodash/_unescapeHtmlChar.js | 21 + node_modules/lodash/_unicodeSize.js | 44 + node_modules/lodash/_unicodeToArray.js | 40 + node_modules/lodash/_unicodeWords.js | 69 + node_modules/lodash/_updateWrapDetails.js | 46 + node_modules/lodash/_wrapperClone.js | 23 + node_modules/lodash/add.js | 22 + node_modules/lodash/after.js | 42 + node_modules/lodash/array.js | 67 + node_modules/lodash/ary.js | 29 + node_modules/lodash/assign.js | 58 + node_modules/lodash/assignIn.js | 40 + node_modules/lodash/assignInWith.js | 38 + node_modules/lodash/assignWith.js | 37 + node_modules/lodash/at.js | 23 + node_modules/lodash/attempt.js | 35 + node_modules/lodash/before.js | 40 + node_modules/lodash/bind.js | 57 + node_modules/lodash/bindAll.js | 41 + node_modules/lodash/bindKey.js | 68 + node_modules/lodash/camelCase.js | 29 + node_modules/lodash/capitalize.js | 23 + node_modules/lodash/castArray.js | 44 + node_modules/lodash/ceil.js | 26 + node_modules/lodash/chain.js | 38 + node_modules/lodash/chunk.js | 50 + node_modules/lodash/clamp.js | 39 + node_modules/lodash/clone.js | 36 + node_modules/lodash/cloneDeep.js | 29 + node_modules/lodash/cloneDeepWith.js | 40 + node_modules/lodash/cloneWith.js | 42 + node_modules/lodash/collection.js | 30 + node_modules/lodash/commit.js | 33 + node_modules/lodash/compact.js | 31 + node_modules/lodash/concat.js | 43 + node_modules/lodash/cond.js | 60 + node_modules/lodash/conforms.js | 35 + node_modules/lodash/conformsTo.js | 32 + node_modules/lodash/constant.js | 26 + node_modules/lodash/core.js | 3877 ++++ node_modules/lodash/core.min.js | 30 + node_modules/lodash/countBy.js | 40 + node_modules/lodash/create.js | 43 + node_modules/lodash/curry.js | 57 + node_modules/lodash/curryRight.js | 54 + node_modules/lodash/date.js | 3 + node_modules/lodash/debounce.js | 191 + node_modules/lodash/deburr.js | 45 + node_modules/lodash/defaultTo.js | 25 + node_modules/lodash/defaults.js | 64 + node_modules/lodash/defaultsDeep.js | 30 + node_modules/lodash/defer.js | 26 + node_modules/lodash/delay.js | 28 + node_modules/lodash/difference.js | 33 + node_modules/lodash/differenceBy.js | 44 + node_modules/lodash/differenceWith.js | 40 + node_modules/lodash/divide.js | 22 + node_modules/lodash/drop.js | 38 + node_modules/lodash/dropRight.js | 39 + node_modules/lodash/dropRightWhile.js | 45 + node_modules/lodash/dropWhile.js | 45 + node_modules/lodash/each.js | 1 + node_modules/lodash/eachRight.js | 1 + node_modules/lodash/endsWith.js | 43 + node_modules/lodash/entries.js | 1 + node_modules/lodash/entriesIn.js | 1 + node_modules/lodash/eq.js | 37 + node_modules/lodash/escape.js | 43 + node_modules/lodash/escapeRegExp.js | 32 + node_modules/lodash/every.js | 56 + node_modules/lodash/extend.js | 1 + node_modules/lodash/extendWith.js | 1 + node_modules/lodash/fill.js | 45 + node_modules/lodash/filter.js | 52 + node_modules/lodash/find.js | 42 + node_modules/lodash/findIndex.js | 55 + node_modules/lodash/findKey.js | 44 + node_modules/lodash/findLast.js | 25 + node_modules/lodash/findLastIndex.js | 59 + node_modules/lodash/findLastKey.js | 44 + node_modules/lodash/first.js | 1 + node_modules/lodash/flatMap.js | 29 + node_modules/lodash/flatMapDeep.js | 31 + node_modules/lodash/flatMapDepth.js | 31 + node_modules/lodash/flatten.js | 22 + node_modules/lodash/flattenDeep.js | 25 + node_modules/lodash/flattenDepth.js | 33 + node_modules/lodash/flip.js | 28 + node_modules/lodash/floor.js | 26 + node_modules/lodash/flow.js | 27 + node_modules/lodash/flowRight.js | 26 + node_modules/lodash/forEach.js | 41 + node_modules/lodash/forEachRight.js | 31 + node_modules/lodash/forIn.js | 39 + node_modules/lodash/forInRight.js | 37 + node_modules/lodash/forOwn.js | 36 + node_modules/lodash/forOwnRight.js | 34 + node_modules/lodash/fp.js | 2 + node_modules/lodash/fp/F.js | 1 + node_modules/lodash/fp/T.js | 1 + node_modules/lodash/fp/__.js | 1 + node_modules/lodash/fp/_baseConvert.js | 569 + node_modules/lodash/fp/_convertBrowser.js | 18 + node_modules/lodash/fp/_falseOptions.js | 7 + node_modules/lodash/fp/_mapping.js | 358 + node_modules/lodash/fp/_util.js | 16 + node_modules/lodash/fp/add.js | 5 + node_modules/lodash/fp/after.js | 5 + node_modules/lodash/fp/all.js | 1 + node_modules/lodash/fp/allPass.js | 1 + node_modules/lodash/fp/always.js | 1 + node_modules/lodash/fp/any.js | 1 + node_modules/lodash/fp/anyPass.js | 1 + node_modules/lodash/fp/apply.js | 1 + node_modules/lodash/fp/array.js | 2 + node_modules/lodash/fp/ary.js | 5 + node_modules/lodash/fp/assign.js | 5 + node_modules/lodash/fp/assignAll.js | 5 + node_modules/lodash/fp/assignAllWith.js | 5 + node_modules/lodash/fp/assignIn.js | 5 + node_modules/lodash/fp/assignInAll.js | 5 + node_modules/lodash/fp/assignInAllWith.js | 5 + node_modules/lodash/fp/assignInWith.js | 5 + node_modules/lodash/fp/assignWith.js | 5 + node_modules/lodash/fp/assoc.js | 1 + node_modules/lodash/fp/assocPath.js | 1 + node_modules/lodash/fp/at.js | 5 + node_modules/lodash/fp/attempt.js | 5 + node_modules/lodash/fp/before.js | 5 + node_modules/lodash/fp/bind.js | 5 + node_modules/lodash/fp/bindAll.js | 5 + node_modules/lodash/fp/bindKey.js | 5 + node_modules/lodash/fp/camelCase.js | 5 + node_modules/lodash/fp/capitalize.js | 5 + node_modules/lodash/fp/castArray.js | 5 + node_modules/lodash/fp/ceil.js | 5 + node_modules/lodash/fp/chain.js | 5 + node_modules/lodash/fp/chunk.js | 5 + node_modules/lodash/fp/clamp.js | 5 + node_modules/lodash/fp/clone.js | 5 + node_modules/lodash/fp/cloneDeep.js | 5 + node_modules/lodash/fp/cloneDeepWith.js | 5 + node_modules/lodash/fp/cloneWith.js | 5 + node_modules/lodash/fp/collection.js | 2 + node_modules/lodash/fp/commit.js | 5 + node_modules/lodash/fp/compact.js | 5 + node_modules/lodash/fp/complement.js | 1 + node_modules/lodash/fp/compose.js | 1 + node_modules/lodash/fp/concat.js | 5 + node_modules/lodash/fp/cond.js | 5 + node_modules/lodash/fp/conforms.js | 1 + node_modules/lodash/fp/conformsTo.js | 5 + node_modules/lodash/fp/constant.js | 5 + node_modules/lodash/fp/contains.js | 1 + node_modules/lodash/fp/convert.js | 18 + node_modules/lodash/fp/countBy.js | 5 + node_modules/lodash/fp/create.js | 5 + node_modules/lodash/fp/curry.js | 5 + node_modules/lodash/fp/curryN.js | 5 + node_modules/lodash/fp/curryRight.js | 5 + node_modules/lodash/fp/curryRightN.js | 5 + node_modules/lodash/fp/date.js | 2 + node_modules/lodash/fp/debounce.js | 5 + node_modules/lodash/fp/deburr.js | 5 + node_modules/lodash/fp/defaultTo.js | 5 + node_modules/lodash/fp/defaults.js | 5 + node_modules/lodash/fp/defaultsAll.js | 5 + node_modules/lodash/fp/defaultsDeep.js | 5 + node_modules/lodash/fp/defaultsDeepAll.js | 5 + node_modules/lodash/fp/defer.js | 5 + node_modules/lodash/fp/delay.js | 5 + node_modules/lodash/fp/difference.js | 5 + node_modules/lodash/fp/differenceBy.js | 5 + node_modules/lodash/fp/differenceWith.js | 5 + node_modules/lodash/fp/dissoc.js | 1 + node_modules/lodash/fp/dissocPath.js | 1 + node_modules/lodash/fp/divide.js | 5 + node_modules/lodash/fp/drop.js | 5 + node_modules/lodash/fp/dropLast.js | 1 + node_modules/lodash/fp/dropLastWhile.js | 1 + node_modules/lodash/fp/dropRight.js | 5 + node_modules/lodash/fp/dropRightWhile.js | 5 + node_modules/lodash/fp/dropWhile.js | 5 + node_modules/lodash/fp/each.js | 1 + node_modules/lodash/fp/eachRight.js | 1 + node_modules/lodash/fp/endsWith.js | 5 + node_modules/lodash/fp/entries.js | 1 + node_modules/lodash/fp/entriesIn.js | 1 + node_modules/lodash/fp/eq.js | 5 + node_modules/lodash/fp/equals.js | 1 + node_modules/lodash/fp/escape.js | 5 + node_modules/lodash/fp/escapeRegExp.js | 5 + node_modules/lodash/fp/every.js | 5 + node_modules/lodash/fp/extend.js | 1 + node_modules/lodash/fp/extendAll.js | 1 + node_modules/lodash/fp/extendAllWith.js | 1 + node_modules/lodash/fp/extendWith.js | 1 + node_modules/lodash/fp/fill.js | 5 + node_modules/lodash/fp/filter.js | 5 + node_modules/lodash/fp/find.js | 5 + node_modules/lodash/fp/findFrom.js | 5 + node_modules/lodash/fp/findIndex.js | 5 + node_modules/lodash/fp/findIndexFrom.js | 5 + node_modules/lodash/fp/findKey.js | 5 + node_modules/lodash/fp/findLast.js | 5 + node_modules/lodash/fp/findLastFrom.js | 5 + node_modules/lodash/fp/findLastIndex.js | 5 + node_modules/lodash/fp/findLastIndexFrom.js | 5 + node_modules/lodash/fp/findLastKey.js | 5 + node_modules/lodash/fp/first.js | 1 + node_modules/lodash/fp/flatMap.js | 5 + node_modules/lodash/fp/flatMapDeep.js | 5 + node_modules/lodash/fp/flatMapDepth.js | 5 + node_modules/lodash/fp/flatten.js | 5 + node_modules/lodash/fp/flattenDeep.js | 5 + node_modules/lodash/fp/flattenDepth.js | 5 + node_modules/lodash/fp/flip.js | 5 + node_modules/lodash/fp/floor.js | 5 + node_modules/lodash/fp/flow.js | 5 + node_modules/lodash/fp/flowRight.js | 5 + node_modules/lodash/fp/forEach.js | 5 + node_modules/lodash/fp/forEachRight.js | 5 + node_modules/lodash/fp/forIn.js | 5 + node_modules/lodash/fp/forInRight.js | 5 + node_modules/lodash/fp/forOwn.js | 5 + node_modules/lodash/fp/forOwnRight.js | 5 + node_modules/lodash/fp/fromPairs.js | 5 + node_modules/lodash/fp/function.js | 2 + node_modules/lodash/fp/functions.js | 5 + node_modules/lodash/fp/functionsIn.js | 5 + node_modules/lodash/fp/get.js | 5 + node_modules/lodash/fp/getOr.js | 5 + node_modules/lodash/fp/groupBy.js | 5 + node_modules/lodash/fp/gt.js | 5 + node_modules/lodash/fp/gte.js | 5 + node_modules/lodash/fp/has.js | 5 + node_modules/lodash/fp/hasIn.js | 5 + node_modules/lodash/fp/head.js | 5 + node_modules/lodash/fp/identical.js | 1 + node_modules/lodash/fp/identity.js | 5 + node_modules/lodash/fp/inRange.js | 5 + node_modules/lodash/fp/includes.js | 5 + node_modules/lodash/fp/includesFrom.js | 5 + node_modules/lodash/fp/indexBy.js | 1 + node_modules/lodash/fp/indexOf.js | 5 + node_modules/lodash/fp/indexOfFrom.js | 5 + node_modules/lodash/fp/init.js | 1 + node_modules/lodash/fp/initial.js | 5 + node_modules/lodash/fp/intersection.js | 5 + node_modules/lodash/fp/intersectionBy.js | 5 + node_modules/lodash/fp/intersectionWith.js | 5 + node_modules/lodash/fp/invert.js | 5 + node_modules/lodash/fp/invertBy.js | 5 + node_modules/lodash/fp/invertObj.js | 1 + node_modules/lodash/fp/invoke.js | 5 + node_modules/lodash/fp/invokeArgs.js | 5 + node_modules/lodash/fp/invokeArgsMap.js | 5 + node_modules/lodash/fp/invokeMap.js | 5 + node_modules/lodash/fp/isArguments.js | 5 + node_modules/lodash/fp/isArray.js | 5 + node_modules/lodash/fp/isArrayBuffer.js | 5 + node_modules/lodash/fp/isArrayLike.js | 5 + node_modules/lodash/fp/isArrayLikeObject.js | 5 + node_modules/lodash/fp/isBoolean.js | 5 + node_modules/lodash/fp/isBuffer.js | 5 + node_modules/lodash/fp/isDate.js | 5 + node_modules/lodash/fp/isElement.js | 5 + node_modules/lodash/fp/isEmpty.js | 5 + node_modules/lodash/fp/isEqual.js | 5 + node_modules/lodash/fp/isEqualWith.js | 5 + node_modules/lodash/fp/isError.js | 5 + node_modules/lodash/fp/isFinite.js | 5 + node_modules/lodash/fp/isFunction.js | 5 + node_modules/lodash/fp/isInteger.js | 5 + node_modules/lodash/fp/isLength.js | 5 + node_modules/lodash/fp/isMap.js | 5 + node_modules/lodash/fp/isMatch.js | 5 + node_modules/lodash/fp/isMatchWith.js | 5 + node_modules/lodash/fp/isNaN.js | 5 + node_modules/lodash/fp/isNative.js | 5 + node_modules/lodash/fp/isNil.js | 5 + node_modules/lodash/fp/isNull.js | 5 + node_modules/lodash/fp/isNumber.js | 5 + node_modules/lodash/fp/isObject.js | 5 + node_modules/lodash/fp/isObjectLike.js | 5 + node_modules/lodash/fp/isPlainObject.js | 5 + node_modules/lodash/fp/isRegExp.js | 5 + node_modules/lodash/fp/isSafeInteger.js | 5 + node_modules/lodash/fp/isSet.js | 5 + node_modules/lodash/fp/isString.js | 5 + node_modules/lodash/fp/isSymbol.js | 5 + node_modules/lodash/fp/isTypedArray.js | 5 + node_modules/lodash/fp/isUndefined.js | 5 + node_modules/lodash/fp/isWeakMap.js | 5 + node_modules/lodash/fp/isWeakSet.js | 5 + node_modules/lodash/fp/iteratee.js | 5 + node_modules/lodash/fp/join.js | 5 + node_modules/lodash/fp/juxt.js | 1 + node_modules/lodash/fp/kebabCase.js | 5 + node_modules/lodash/fp/keyBy.js | 5 + node_modules/lodash/fp/keys.js | 5 + node_modules/lodash/fp/keysIn.js | 5 + node_modules/lodash/fp/lang.js | 2 + node_modules/lodash/fp/last.js | 5 + node_modules/lodash/fp/lastIndexOf.js | 5 + node_modules/lodash/fp/lastIndexOfFrom.js | 5 + node_modules/lodash/fp/lowerCase.js | 5 + node_modules/lodash/fp/lowerFirst.js | 5 + node_modules/lodash/fp/lt.js | 5 + node_modules/lodash/fp/lte.js | 5 + node_modules/lodash/fp/map.js | 5 + node_modules/lodash/fp/mapKeys.js | 5 + node_modules/lodash/fp/mapValues.js | 5 + node_modules/lodash/fp/matches.js | 1 + node_modules/lodash/fp/matchesProperty.js | 5 + node_modules/lodash/fp/math.js | 2 + node_modules/lodash/fp/max.js | 5 + node_modules/lodash/fp/maxBy.js | 5 + node_modules/lodash/fp/mean.js | 5 + node_modules/lodash/fp/meanBy.js | 5 + node_modules/lodash/fp/memoize.js | 5 + node_modules/lodash/fp/merge.js | 5 + node_modules/lodash/fp/mergeAll.js | 5 + node_modules/lodash/fp/mergeAllWith.js | 5 + node_modules/lodash/fp/mergeWith.js | 5 + node_modules/lodash/fp/method.js | 5 + node_modules/lodash/fp/methodOf.js | 5 + node_modules/lodash/fp/min.js | 5 + node_modules/lodash/fp/minBy.js | 5 + node_modules/lodash/fp/mixin.js | 5 + node_modules/lodash/fp/multiply.js | 5 + node_modules/lodash/fp/nAry.js | 1 + node_modules/lodash/fp/negate.js | 5 + node_modules/lodash/fp/next.js | 5 + node_modules/lodash/fp/noop.js | 5 + node_modules/lodash/fp/now.js | 5 + node_modules/lodash/fp/nth.js | 5 + node_modules/lodash/fp/nthArg.js | 5 + node_modules/lodash/fp/number.js | 2 + node_modules/lodash/fp/object.js | 2 + node_modules/lodash/fp/omit.js | 5 + node_modules/lodash/fp/omitAll.js | 1 + node_modules/lodash/fp/omitBy.js | 5 + node_modules/lodash/fp/once.js | 5 + node_modules/lodash/fp/orderBy.js | 5 + node_modules/lodash/fp/over.js | 5 + node_modules/lodash/fp/overArgs.js | 5 + node_modules/lodash/fp/overEvery.js | 5 + node_modules/lodash/fp/overSome.js | 5 + node_modules/lodash/fp/pad.js | 5 + node_modules/lodash/fp/padChars.js | 5 + node_modules/lodash/fp/padCharsEnd.js | 5 + node_modules/lodash/fp/padCharsStart.js | 5 + node_modules/lodash/fp/padEnd.js | 5 + node_modules/lodash/fp/padStart.js | 5 + node_modules/lodash/fp/parseInt.js | 5 + node_modules/lodash/fp/partial.js | 5 + node_modules/lodash/fp/partialRight.js | 5 + node_modules/lodash/fp/partition.js | 5 + node_modules/lodash/fp/path.js | 1 + node_modules/lodash/fp/pathEq.js | 1 + node_modules/lodash/fp/pathOr.js | 1 + node_modules/lodash/fp/paths.js | 1 + node_modules/lodash/fp/pick.js | 5 + node_modules/lodash/fp/pickAll.js | 1 + node_modules/lodash/fp/pickBy.js | 5 + node_modules/lodash/fp/pipe.js | 1 + node_modules/lodash/fp/placeholder.js | 6 + node_modules/lodash/fp/plant.js | 5 + node_modules/lodash/fp/pluck.js | 1 + node_modules/lodash/fp/prop.js | 1 + node_modules/lodash/fp/propEq.js | 1 + node_modules/lodash/fp/propOr.js | 1 + node_modules/lodash/fp/property.js | 1 + node_modules/lodash/fp/propertyOf.js | 5 + node_modules/lodash/fp/props.js | 1 + node_modules/lodash/fp/pull.js | 5 + node_modules/lodash/fp/pullAll.js | 5 + node_modules/lodash/fp/pullAllBy.js | 5 + node_modules/lodash/fp/pullAllWith.js | 5 + node_modules/lodash/fp/pullAt.js | 5 + node_modules/lodash/fp/random.js | 5 + node_modules/lodash/fp/range.js | 5 + node_modules/lodash/fp/rangeRight.js | 5 + node_modules/lodash/fp/rangeStep.js | 5 + node_modules/lodash/fp/rangeStepRight.js | 5 + node_modules/lodash/fp/rearg.js | 5 + node_modules/lodash/fp/reduce.js | 5 + node_modules/lodash/fp/reduceRight.js | 5 + node_modules/lodash/fp/reject.js | 5 + node_modules/lodash/fp/remove.js | 5 + node_modules/lodash/fp/repeat.js | 5 + node_modules/lodash/fp/replace.js | 5 + node_modules/lodash/fp/rest.js | 5 + node_modules/lodash/fp/restFrom.js | 5 + node_modules/lodash/fp/result.js | 5 + node_modules/lodash/fp/reverse.js | 5 + node_modules/lodash/fp/round.js | 5 + node_modules/lodash/fp/sample.js | 5 + node_modules/lodash/fp/sampleSize.js | 5 + node_modules/lodash/fp/seq.js | 2 + node_modules/lodash/fp/set.js | 5 + node_modules/lodash/fp/setWith.js | 5 + node_modules/lodash/fp/shuffle.js | 5 + node_modules/lodash/fp/size.js | 5 + node_modules/lodash/fp/slice.js | 5 + node_modules/lodash/fp/snakeCase.js | 5 + node_modules/lodash/fp/some.js | 5 + node_modules/lodash/fp/sortBy.js | 5 + node_modules/lodash/fp/sortedIndex.js | 5 + node_modules/lodash/fp/sortedIndexBy.js | 5 + node_modules/lodash/fp/sortedIndexOf.js | 5 + node_modules/lodash/fp/sortedLastIndex.js | 5 + node_modules/lodash/fp/sortedLastIndexBy.js | 5 + node_modules/lodash/fp/sortedLastIndexOf.js | 5 + node_modules/lodash/fp/sortedUniq.js | 5 + node_modules/lodash/fp/sortedUniqBy.js | 5 + node_modules/lodash/fp/split.js | 5 + node_modules/lodash/fp/spread.js | 5 + node_modules/lodash/fp/spreadFrom.js | 5 + node_modules/lodash/fp/startCase.js | 5 + node_modules/lodash/fp/startsWith.js | 5 + node_modules/lodash/fp/string.js | 2 + node_modules/lodash/fp/stubArray.js | 5 + node_modules/lodash/fp/stubFalse.js | 5 + node_modules/lodash/fp/stubObject.js | 5 + node_modules/lodash/fp/stubString.js | 5 + node_modules/lodash/fp/stubTrue.js | 5 + node_modules/lodash/fp/subtract.js | 5 + node_modules/lodash/fp/sum.js | 5 + node_modules/lodash/fp/sumBy.js | 5 + node_modules/lodash/fp/symmetricDifference.js | 1 + .../lodash/fp/symmetricDifferenceBy.js | 1 + .../lodash/fp/symmetricDifferenceWith.js | 1 + node_modules/lodash/fp/tail.js | 5 + node_modules/lodash/fp/take.js | 5 + node_modules/lodash/fp/takeLast.js | 1 + node_modules/lodash/fp/takeLastWhile.js | 1 + node_modules/lodash/fp/takeRight.js | 5 + node_modules/lodash/fp/takeRightWhile.js | 5 + node_modules/lodash/fp/takeWhile.js | 5 + node_modules/lodash/fp/tap.js | 5 + node_modules/lodash/fp/template.js | 5 + node_modules/lodash/fp/templateSettings.js | 5 + node_modules/lodash/fp/throttle.js | 5 + node_modules/lodash/fp/thru.js | 5 + node_modules/lodash/fp/times.js | 5 + node_modules/lodash/fp/toArray.js | 5 + node_modules/lodash/fp/toFinite.js | 5 + node_modules/lodash/fp/toInteger.js | 5 + node_modules/lodash/fp/toIterator.js | 5 + node_modules/lodash/fp/toJSON.js | 5 + node_modules/lodash/fp/toLength.js | 5 + node_modules/lodash/fp/toLower.js | 5 + node_modules/lodash/fp/toNumber.js | 5 + node_modules/lodash/fp/toPairs.js | 5 + node_modules/lodash/fp/toPairsIn.js | 5 + node_modules/lodash/fp/toPath.js | 5 + node_modules/lodash/fp/toPlainObject.js | 5 + node_modules/lodash/fp/toSafeInteger.js | 5 + node_modules/lodash/fp/toString.js | 5 + node_modules/lodash/fp/toUpper.js | 5 + node_modules/lodash/fp/transform.js | 5 + node_modules/lodash/fp/trim.js | 5 + node_modules/lodash/fp/trimChars.js | 5 + node_modules/lodash/fp/trimCharsEnd.js | 5 + node_modules/lodash/fp/trimCharsStart.js | 5 + node_modules/lodash/fp/trimEnd.js | 5 + node_modules/lodash/fp/trimStart.js | 5 + node_modules/lodash/fp/truncate.js | 5 + node_modules/lodash/fp/unapply.js | 1 + node_modules/lodash/fp/unary.js | 5 + node_modules/lodash/fp/unescape.js | 5 + node_modules/lodash/fp/union.js | 5 + node_modules/lodash/fp/unionBy.js | 5 + node_modules/lodash/fp/unionWith.js | 5 + node_modules/lodash/fp/uniq.js | 5 + node_modules/lodash/fp/uniqBy.js | 5 + node_modules/lodash/fp/uniqWith.js | 5 + node_modules/lodash/fp/uniqueId.js | 5 + node_modules/lodash/fp/unnest.js | 1 + node_modules/lodash/fp/unset.js | 5 + node_modules/lodash/fp/unzip.js | 5 + node_modules/lodash/fp/unzipWith.js | 5 + node_modules/lodash/fp/update.js | 5 + node_modules/lodash/fp/updateWith.js | 5 + node_modules/lodash/fp/upperCase.js | 5 + node_modules/lodash/fp/upperFirst.js | 5 + node_modules/lodash/fp/useWith.js | 1 + node_modules/lodash/fp/util.js | 2 + node_modules/lodash/fp/value.js | 5 + node_modules/lodash/fp/valueOf.js | 5 + node_modules/lodash/fp/values.js | 5 + node_modules/lodash/fp/valuesIn.js | 5 + node_modules/lodash/fp/where.js | 1 + node_modules/lodash/fp/whereEq.js | 1 + node_modules/lodash/fp/without.js | 5 + node_modules/lodash/fp/words.js | 5 + node_modules/lodash/fp/wrap.js | 5 + node_modules/lodash/fp/wrapperAt.js | 5 + node_modules/lodash/fp/wrapperChain.js | 5 + node_modules/lodash/fp/wrapperLodash.js | 5 + node_modules/lodash/fp/wrapperReverse.js | 5 + node_modules/lodash/fp/wrapperValue.js | 5 + node_modules/lodash/fp/xor.js | 5 + node_modules/lodash/fp/xorBy.js | 5 + node_modules/lodash/fp/xorWith.js | 5 + node_modules/lodash/fp/zip.js | 5 + node_modules/lodash/fp/zipAll.js | 5 + node_modules/lodash/fp/zipObj.js | 1 + node_modules/lodash/fp/zipObject.js | 5 + node_modules/lodash/fp/zipObjectDeep.js | 5 + node_modules/lodash/fp/zipWith.js | 5 + node_modules/lodash/fromPairs.js | 28 + node_modules/lodash/function.js | 25 + node_modules/lodash/functions.js | 31 + node_modules/lodash/functionsIn.js | 31 + node_modules/lodash/get.js | 33 + node_modules/lodash/groupBy.js | 41 + node_modules/lodash/gt.js | 29 + node_modules/lodash/gte.js | 30 + node_modules/lodash/has.js | 35 + node_modules/lodash/hasIn.js | 34 + node_modules/lodash/head.js | 23 + node_modules/lodash/identity.js | 21 + node_modules/lodash/inRange.js | 55 + node_modules/lodash/includes.js | 53 + node_modules/lodash/index.js | 1 + node_modules/lodash/indexOf.js | 42 + node_modules/lodash/initial.js | 22 + node_modules/lodash/intersection.js | 30 + node_modules/lodash/intersectionBy.js | 45 + node_modules/lodash/intersectionWith.js | 41 + node_modules/lodash/invert.js | 42 + node_modules/lodash/invertBy.js | 56 + node_modules/lodash/invoke.js | 24 + node_modules/lodash/invokeMap.js | 41 + node_modules/lodash/isArguments.js | 36 + node_modules/lodash/isArray.js | 26 + node_modules/lodash/isArrayBuffer.js | 27 + node_modules/lodash/isArrayLike.js | 33 + node_modules/lodash/isArrayLikeObject.js | 33 + node_modules/lodash/isBoolean.js | 29 + node_modules/lodash/isBuffer.js | 38 + node_modules/lodash/isDate.js | 27 + node_modules/lodash/isElement.js | 25 + node_modules/lodash/isEmpty.js | 77 + node_modules/lodash/isEqual.js | 35 + node_modules/lodash/isEqualWith.js | 41 + node_modules/lodash/isError.js | 36 + node_modules/lodash/isFinite.js | 36 + node_modules/lodash/isFunction.js | 37 + node_modules/lodash/isInteger.js | 33 + node_modules/lodash/isLength.js | 35 + node_modules/lodash/isMap.js | 27 + node_modules/lodash/isMatch.js | 36 + node_modules/lodash/isMatchWith.js | 41 + node_modules/lodash/isNaN.js | 38 + node_modules/lodash/isNative.js | 40 + node_modules/lodash/isNil.js | 25 + node_modules/lodash/isNull.js | 22 + node_modules/lodash/isNumber.js | 38 + node_modules/lodash/isObject.js | 31 + node_modules/lodash/isObjectLike.js | 29 + node_modules/lodash/isPlainObject.js | 62 + node_modules/lodash/isRegExp.js | 27 + node_modules/lodash/isSafeInteger.js | 37 + node_modules/lodash/isSet.js | 27 + node_modules/lodash/isString.js | 30 + node_modules/lodash/isSymbol.js | 29 + node_modules/lodash/isTypedArray.js | 27 + node_modules/lodash/isUndefined.js | 22 + node_modules/lodash/isWeakMap.js | 28 + node_modules/lodash/isWeakSet.js | 28 + node_modules/lodash/iteratee.js | 53 + node_modules/lodash/join.js | 26 + node_modules/lodash/kebabCase.js | 28 + node_modules/lodash/keyBy.js | 36 + node_modules/lodash/keys.js | 37 + node_modules/lodash/keysIn.js | 32 + node_modules/lodash/lang.js | 58 + node_modules/lodash/last.js | 20 + node_modules/lodash/lastIndexOf.js | 46 + node_modules/lodash/lodash.js | 17161 ++++++++++++++++ node_modules/lodash/lodash.min.js | 139 + node_modules/lodash/lowerCase.js | 27 + node_modules/lodash/lowerFirst.js | 22 + node_modules/lodash/lt.js | 29 + node_modules/lodash/lte.js | 30 + node_modules/lodash/map.js | 53 + node_modules/lodash/mapKeys.js | 36 + node_modules/lodash/mapValues.js | 43 + node_modules/lodash/matches.js | 46 + node_modules/lodash/matchesProperty.js | 44 + node_modules/lodash/math.js | 17 + node_modules/lodash/max.js | 29 + node_modules/lodash/maxBy.js | 34 + node_modules/lodash/mean.js | 22 + node_modules/lodash/meanBy.js | 31 + node_modules/lodash/memoize.js | 73 + node_modules/lodash/merge.js | 39 + node_modules/lodash/mergeWith.js | 39 + node_modules/lodash/method.js | 34 + node_modules/lodash/methodOf.js | 33 + node_modules/lodash/min.js | 29 + node_modules/lodash/minBy.js | 34 + node_modules/lodash/mixin.js | 74 + node_modules/lodash/multiply.js | 22 + node_modules/lodash/negate.js | 40 + node_modules/lodash/next.js | 35 + node_modules/lodash/noop.js | 17 + node_modules/lodash/now.js | 23 + node_modules/lodash/nth.js | 29 + node_modules/lodash/nthArg.js | 32 + node_modules/lodash/number.js | 5 + node_modules/lodash/object.js | 49 + node_modules/lodash/omit.js | 57 + node_modules/lodash/omitBy.js | 29 + node_modules/lodash/once.js | 25 + node_modules/lodash/orderBy.js | 47 + node_modules/lodash/over.js | 24 + node_modules/lodash/overArgs.js | 61 + node_modules/lodash/overEvery.js | 34 + node_modules/lodash/overSome.js | 37 + node_modules/lodash/package.json | 17 + node_modules/lodash/pad.js | 49 + node_modules/lodash/padEnd.js | 39 + node_modules/lodash/padStart.js | 39 + node_modules/lodash/parseInt.js | 43 + node_modules/lodash/partial.js | 50 + node_modules/lodash/partialRight.js | 49 + node_modules/lodash/partition.js | 43 + node_modules/lodash/pick.js | 25 + node_modules/lodash/pickBy.js | 37 + node_modules/lodash/plant.js | 48 + node_modules/lodash/property.js | 32 + node_modules/lodash/propertyOf.js | 30 + node_modules/lodash/pull.js | 29 + node_modules/lodash/pullAll.js | 29 + node_modules/lodash/pullAllBy.js | 33 + node_modules/lodash/pullAllWith.js | 32 + node_modules/lodash/pullAt.js | 43 + node_modules/lodash/random.js | 82 + node_modules/lodash/range.js | 46 + node_modules/lodash/rangeRight.js | 41 + node_modules/lodash/rearg.js | 33 + node_modules/lodash/reduce.js | 51 + node_modules/lodash/reduceRight.js | 36 + node_modules/lodash/reject.js | 46 + node_modules/lodash/remove.js | 53 + node_modules/lodash/repeat.js | 37 + node_modules/lodash/replace.js | 29 + node_modules/lodash/rest.js | 40 + node_modules/lodash/result.js | 56 + node_modules/lodash/reverse.js | 34 + node_modules/lodash/round.js | 26 + node_modules/lodash/sample.js | 24 + node_modules/lodash/sampleSize.js | 37 + node_modules/lodash/seq.js | 16 + node_modules/lodash/set.js | 35 + node_modules/lodash/setWith.js | 32 + node_modules/lodash/shuffle.js | 25 + node_modules/lodash/size.js | 46 + node_modules/lodash/slice.js | 37 + node_modules/lodash/snakeCase.js | 28 + node_modules/lodash/some.js | 51 + node_modules/lodash/sortBy.js | 48 + node_modules/lodash/sortedIndex.js | 24 + node_modules/lodash/sortedIndexBy.js | 33 + node_modules/lodash/sortedIndexOf.js | 31 + node_modules/lodash/sortedLastIndex.js | 25 + node_modules/lodash/sortedLastIndexBy.js | 33 + node_modules/lodash/sortedLastIndexOf.js | 31 + node_modules/lodash/sortedUniq.js | 24 + node_modules/lodash/sortedUniqBy.js | 26 + node_modules/lodash/split.js | 52 + node_modules/lodash/spread.js | 63 + node_modules/lodash/startCase.js | 29 + node_modules/lodash/startsWith.js | 39 + node_modules/lodash/string.js | 33 + node_modules/lodash/stubArray.js | 23 + node_modules/lodash/stubFalse.js | 18 + node_modules/lodash/stubObject.js | 23 + node_modules/lodash/stubString.js | 18 + node_modules/lodash/stubTrue.js | 18 + node_modules/lodash/subtract.js | 22 + node_modules/lodash/sum.js | 24 + node_modules/lodash/sumBy.js | 33 + node_modules/lodash/tail.js | 22 + node_modules/lodash/take.js | 37 + node_modules/lodash/takeRight.js | 39 + node_modules/lodash/takeRightWhile.js | 45 + node_modules/lodash/takeWhile.js | 45 + node_modules/lodash/tap.js | 29 + node_modules/lodash/template.js | 251 + node_modules/lodash/templateSettings.js | 67 + node_modules/lodash/throttle.js | 69 + node_modules/lodash/thru.js | 28 + node_modules/lodash/times.js | 51 + node_modules/lodash/toArray.js | 58 + node_modules/lodash/toFinite.js | 42 + node_modules/lodash/toInteger.js | 36 + node_modules/lodash/toIterator.js | 23 + node_modules/lodash/toJSON.js | 1 + node_modules/lodash/toLength.js | 38 + node_modules/lodash/toLower.js | 28 + node_modules/lodash/toNumber.js | 66 + node_modules/lodash/toPairs.js | 30 + node_modules/lodash/toPairsIn.js | 30 + node_modules/lodash/toPath.js | 33 + node_modules/lodash/toPlainObject.js | 32 + node_modules/lodash/toSafeInteger.js | 37 + node_modules/lodash/toString.js | 28 + node_modules/lodash/toUpper.js | 28 + node_modules/lodash/transform.js | 65 + node_modules/lodash/trim.js | 49 + node_modules/lodash/trimEnd.js | 43 + node_modules/lodash/trimStart.js | 43 + node_modules/lodash/truncate.js | 111 + node_modules/lodash/unary.js | 22 + node_modules/lodash/unescape.js | 34 + node_modules/lodash/union.js | 26 + node_modules/lodash/unionBy.js | 39 + node_modules/lodash/unionWith.js | 34 + node_modules/lodash/uniq.js | 25 + node_modules/lodash/uniqBy.js | 31 + node_modules/lodash/uniqWith.js | 28 + node_modules/lodash/uniqueId.js | 28 + node_modules/lodash/unset.js | 34 + node_modules/lodash/unzip.js | 45 + node_modules/lodash/unzipWith.js | 39 + node_modules/lodash/update.js | 35 + node_modules/lodash/updateWith.js | 33 + node_modules/lodash/upperCase.js | 27 + node_modules/lodash/upperFirst.js | 22 + node_modules/lodash/util.js | 34 + node_modules/lodash/value.js | 1 + node_modules/lodash/valueOf.js | 1 + node_modules/lodash/values.js | 34 + node_modules/lodash/valuesIn.js | 32 + node_modules/lodash/without.js | 31 + node_modules/lodash/words.js | 35 + node_modules/lodash/wrap.js | 30 + node_modules/lodash/wrapperAt.js | 48 + node_modules/lodash/wrapperChain.js | 34 + node_modules/lodash/wrapperLodash.js | 147 + node_modules/lodash/wrapperReverse.js | 44 + node_modules/lodash/wrapperValue.js | 21 + node_modules/lodash/xor.js | 28 + node_modules/lodash/xorBy.js | 39 + node_modules/lodash/xorWith.js | 34 + node_modules/lodash/zip.js | 22 + node_modules/lodash/zipObject.js | 24 + node_modules/lodash/zipObjectDeep.js | 23 + node_modules/lodash/zipWith.js | 32 + node_modules/loud-rejection/api.js | 11 + node_modules/loud-rejection/index.js | 36 + node_modules/loud-rejection/license | 21 + node_modules/loud-rejection/package.json | 59 + node_modules/loud-rejection/readme.md | 68 + node_modules/loud-rejection/register.js | 2 + node_modules/lru-cache/LICENSE | 15 + node_modules/lru-cache/README.md | 158 + node_modules/lru-cache/index.js | 468 + node_modules/lru-cache/package.json | 36 + node_modules/lru-queue/.lint | 11 + node_modules/lru-queue/.npmignore | 4 + node_modules/lru-queue/.travis.yml | 9 + node_modules/lru-queue/CHANGES | 3 + node_modules/lru-queue/LICENCE | 19 + node_modules/lru-queue/README.md | 65 + node_modules/lru-queue/index.js | 48 + node_modules/lru-queue/package.json | 25 + node_modules/lru-queue/test/index.js | 29 + node_modules/make-iterator/LICENSE | 21 + node_modules/make-iterator/README.md | 102 + node_modules/make-iterator/index.js | 99 + .../node_modules/kind-of/CHANGELOG.md | 160 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 367 + .../node_modules/kind-of/index.js | 129 + .../node_modules/kind-of/package.json | 88 + node_modules/make-iterator/package.json | 68 + node_modules/map-cache/LICENSE | 21 + node_modules/map-cache/README.md | 145 + node_modules/map-cache/index.js | 100 + node_modules/map-cache/package.json | 59 + node_modules/map-obj/index.js | 13 + node_modules/map-obj/license | 21 + node_modules/map-obj/package.json | 36 + node_modules/map-obj/readme.md | 29 + node_modules/map-visit/LICENSE | 21 + node_modules/map-visit/README.md | 155 + node_modules/map-visit/index.js | 37 + node_modules/map-visit/package.json | 74 + node_modules/matchdep/.jshintrc | 15 + node_modules/matchdep/.npmignore | 2 + node_modules/matchdep/.travis.yml | 10 + node_modules/matchdep/LICENSE-MIT | 22 + node_modules/matchdep/README.md | 59 + node_modules/matchdep/package.json | 42 + node_modules/mdn-data/LICENSE | 116 + node_modules/mdn-data/README.md | 56 + node_modules/mdn-data/api/index.js | 3 + node_modules/mdn-data/api/inheritance.json | 2681 +++ .../mdn-data/api/inheritance.schema.json | 31 + node_modules/mdn-data/css/at-rules.json | 560 + .../mdn-data/css/at-rules.schema.json | 132 + node_modules/mdn-data/css/definitions.json | 77 + node_modules/mdn-data/css/index.js | 8 + node_modules/mdn-data/css/properties.json | 9163 +++++++++ .../mdn-data/css/properties.schema.json | 402 + node_modules/mdn-data/css/selectors.json | 927 + .../mdn-data/css/selectors.schema.json | 36 + node_modules/mdn-data/css/syntaxes.json | 761 + .../mdn-data/css/syntaxes.schema.json | 15 + node_modules/mdn-data/css/types.json | 265 + node_modules/mdn-data/css/types.schema.json | 32 + node_modules/mdn-data/css/units.json | 199 + node_modules/mdn-data/css/units.schema.json | 28 + node_modules/mdn-data/index.js | 5 + node_modules/mdn-data/l10n/css.json | 1567 ++ node_modules/mdn-data/l10n/index.js | 3 + node_modules/mdn-data/package.json | 39 + node_modules/memoizee/LICENSE | 15 + node_modules/memoizee/README.md | 503 + node_modules/memoizee/ext/async.js | 154 + node_modules/memoizee/ext/dispose.js | 33 + node_modules/memoizee/ext/max-age.js | 90 + node_modules/memoizee/ext/max.js | 27 + node_modules/memoizee/ext/promise.js | 147 + node_modules/memoizee/ext/ref-counter.js | 48 + node_modules/memoizee/index.js | 34 + node_modules/memoizee/methods-plain.js | 3 + node_modules/memoizee/methods.js | 3 + node_modules/memoizee/normalizers/get-1.js | 29 + .../memoizee/normalizers/get-fixed.js | 71 + .../normalizers/get-primitive-fixed.js | 16 + node_modules/memoizee/normalizers/get.js | 90 + .../memoizee/normalizers/primitive.js | 9 + node_modules/memoizee/package.json | 60 + node_modules/memoizee/plain.js | 37 + node_modules/memoizee/profile.js | 107 + node_modules/memoizee/weak-plain.js | 3 + node_modules/memoizee/weak.js | 3 + node_modules/meow/index.js | 82 + node_modules/meow/license | 21 + node_modules/meow/package.json | 58 + node_modules/meow/readme.md | 159 + node_modules/merge-stream/LICENSE | 21 + node_modules/merge-stream/README.md | 78 + node_modules/merge-stream/index.js | 41 + node_modules/merge-stream/package.json | 19 + node_modules/micromatch/CHANGELOG.md | 37 + node_modules/micromatch/LICENSE | 21 + node_modules/micromatch/README.md | 1150 ++ node_modules/micromatch/index.js | 877 + .../node_modules/define-property/CHANGELOG.md | 82 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 117 + .../node_modules/define-property/index.js | 38 + .../node_modules/define-property/package.json | 67 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 97 + .../node_modules/extend-shallow/index.js | 60 + .../node_modules/extend-shallow/package.json | 83 + .../node_modules/is-extendable/LICENSE | 21 + .../node_modules/is-extendable/README.md | 88 + .../node_modules/is-extendable/index.d.ts | 5 + .../node_modules/is-extendable/index.js | 14 + .../node_modules/is-extendable/package.json | 67 + .../node_modules/kind-of/CHANGELOG.md | 160 + .../micromatch/node_modules/kind-of/LICENSE | 21 + .../micromatch/node_modules/kind-of/README.md | 367 + .../micromatch/node_modules/kind-of/index.js | 129 + .../node_modules/kind-of/package.json | 88 + node_modules/micromatch/package.json | 147 + node_modules/mime-db/HISTORY.md | 458 + node_modules/mime-db/LICENSE | 22 + node_modules/mime-db/README.md | 102 + node_modules/mime-db/db.json | 8242 ++++++++ node_modules/mime-db/index.js | 11 + node_modules/mime-db/package.json | 59 + node_modules/mime-types/HISTORY.md | 346 + node_modules/mime-types/LICENSE | 23 + node_modules/mime-types/README.md | 123 + node_modules/mime-types/index.js | 188 + node_modules/mime-types/package.json | 44 + node_modules/minimatch/LICENSE | 15 + node_modules/minimatch/README.md | 209 + node_modules/minimatch/minimatch.js | 923 + node_modules/minimatch/package.json | 30 + node_modules/minimist/.travis.yml | 8 + node_modules/minimist/LICENSE | 18 + node_modules/minimist/example/parse.js | 2 + node_modules/minimist/index.js | 245 + node_modules/minimist/package.json | 45 + node_modules/minimist/readme.markdown | 95 + node_modules/minimist/test/all_bool.js | 32 + node_modules/minimist/test/bool.js | 178 + node_modules/minimist/test/dash.js | 31 + node_modules/minimist/test/default_bool.js | 35 + node_modules/minimist/test/dotted.js | 22 + node_modules/minimist/test/kv_short.js | 16 + node_modules/minimist/test/long.js | 31 + node_modules/minimist/test/num.js | 36 + node_modules/minimist/test/parse.js | 197 + node_modules/minimist/test/parse_modified.js | 9 + node_modules/minimist/test/proto.js | 44 + node_modules/minimist/test/short.js | 67 + node_modules/minimist/test/stop_early.js | 15 + node_modules/minimist/test/unknown.js | 102 + node_modules/minimist/test/whitespace.js | 8 + node_modules/mixin-deep/LICENSE | 21 + node_modules/mixin-deep/README.md | 80 + node_modules/mixin-deep/index.js | 64 + .../node_modules/is-extendable/LICENSE | 21 + .../node_modules/is-extendable/README.md | 88 + .../node_modules/is-extendable/index.d.ts | 5 + .../node_modules/is-extendable/index.js | 14 + .../node_modules/is-extendable/package.json | 67 + node_modules/mixin-deep/package.json | 65 + node_modules/mkdirp/LICENSE | 21 + node_modules/mkdirp/index.js | 99 + node_modules/mkdirp/package.json | 34 + node_modules/mkdirp/readme.markdown | 100 + node_modules/ms/index.js | 152 + node_modules/ms/license.md | 21 + node_modules/ms/package.json | 37 + node_modules/ms/readme.md | 51 + node_modules/mute-stdout/LICENSE | 22 + node_modules/mute-stdout/README.md | 55 + node_modules/mute-stdout/index.js | 19 + node_modules/mute-stdout/package.json | 40 + node_modules/nan/CHANGELOG.md | 537 + node_modules/nan/LICENSE.md | 13 + node_modules/nan/README.md | 455 + node_modules/nan/doc/asyncworker.md | 146 + node_modules/nan/doc/buffers.md | 54 + node_modules/nan/doc/callback.md | 76 + node_modules/nan/doc/converters.md | 41 + node_modules/nan/doc/errors.md | 226 + node_modules/nan/doc/json.md | 62 + node_modules/nan/doc/maybe_types.md | 583 + node_modules/nan/doc/methods.md | 664 + node_modules/nan/doc/new.md | 147 + node_modules/nan/doc/node_misc.md | 123 + node_modules/nan/doc/object_wrappers.md | 263 + node_modules/nan/doc/persistent.md | 296 + node_modules/nan/doc/scopes.md | 73 + node_modules/nan/doc/script.md | 38 + node_modules/nan/doc/string_bytes.md | 62 + node_modules/nan/doc/v8_internals.md | 199 + node_modules/nan/doc/v8_misc.md | 85 + node_modules/nan/include_dirs.js | 1 + node_modules/nan/nan.h | 2898 +++ node_modules/nan/nan_callbacks.h | 88 + node_modules/nan/nan_callbacks_12_inl.h | 514 + node_modules/nan/nan_callbacks_pre_12_inl.h | 520 + node_modules/nan/nan_converters.h | 72 + node_modules/nan/nan_converters_43_inl.h | 68 + node_modules/nan/nan_converters_pre_43_inl.h | 42 + .../nan/nan_define_own_property_helper.h | 29 + node_modules/nan/nan_implementation_12_inl.h | 430 + .../nan/nan_implementation_pre_12_inl.h | 263 + node_modules/nan/nan_json.h | 166 + node_modules/nan/nan_maybe_43_inl.h | 356 + node_modules/nan/nan_maybe_pre_43_inl.h | 268 + node_modules/nan/nan_new.h | 340 + node_modules/nan/nan_object_wrap.h | 156 + node_modules/nan/nan_persistent_12_inl.h | 132 + node_modules/nan/nan_persistent_pre_12_inl.h | 242 + node_modules/nan/nan_private.h | 73 + node_modules/nan/nan_string_bytes.h | 305 + node_modules/nan/nan_typedarray_contents.h | 96 + node_modules/nan/nan_weak.h | 437 + node_modules/nan/package.json | 37 + node_modules/nan/tools/1to2.js | 412 + node_modules/nan/tools/README.md | 14 + node_modules/nan/tools/package.json | 19 + node_modules/nanomatch/CHANGELOG.md | 57 + node_modules/nanomatch/LICENSE | 21 + node_modules/nanomatch/README.md | 1148 ++ node_modules/nanomatch/index.js | 838 + .../node_modules/define-property/CHANGELOG.md | 82 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 117 + .../node_modules/define-property/index.js | 38 + .../node_modules/define-property/package.json | 67 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 97 + .../node_modules/extend-shallow/index.js | 60 + .../node_modules/extend-shallow/package.json | 83 + .../node_modules/is-extendable/LICENSE | 21 + .../node_modules/is-extendable/README.md | 88 + .../node_modules/is-extendable/index.d.ts | 5 + .../node_modules/is-extendable/index.js | 14 + .../node_modules/is-extendable/package.json | 67 + .../node_modules/kind-of/CHANGELOG.md | 160 + .../nanomatch/node_modules/kind-of/LICENSE | 21 + .../nanomatch/node_modules/kind-of/README.md | 367 + .../nanomatch/node_modules/kind-of/index.js | 129 + .../node_modules/kind-of/package.json | 88 + node_modules/nanomatch/package.json | 134 + node_modules/next-tick/.editorconfig | 16 + node_modules/next-tick/.github/FUNDING.yml | 1 + node_modules/next-tick/.lint | 16 + node_modules/next-tick/CHANGELOG.md | 13 + node_modules/next-tick/CHANGES | 28 + node_modules/next-tick/LICENSE | 15 + node_modules/next-tick/README.md | 41 + node_modules/next-tick/index.js | 74 + node_modules/next-tick/package.json | 27 + node_modules/next-tick/test/index.js | 22 + .../node-gyp/.github/ISSUE_TEMPLATE.md | 26 + .../node-gyp/.github/PULL_REQUEST_TEMPLATE.md | 17 + node_modules/node-gyp/.jshintrc | 7 + node_modules/node-gyp/CHANGELOG.md | 227 + node_modules/node-gyp/CONTRIBUTING.md | 34 + node_modules/node-gyp/LICENSE | 24 + node_modules/node-gyp/README.md | 244 + node_modules/node-gyp/addon.gypi | 147 + node_modules/node-gyp/gyp/AUTHORS | 13 + node_modules/node-gyp/gyp/DEPS | 24 + node_modules/node-gyp/gyp/LICENSE | 27 + node_modules/node-gyp/gyp/OWNERS | 1 + node_modules/node-gyp/gyp/PRESUBMIT.py | 139 + node_modules/node-gyp/gyp/codereview.settings | 10 + .../node-gyp/gyp/data/win/large-pdb-shim.cc | 12 + node_modules/node-gyp/gyp/gyp | 8 + node_modules/node-gyp/gyp/gyp.bat | 5 + node_modules/node-gyp/gyp/gyp_main.py | 16 + .../node-gyp/gyp/pylib/gyp/MSVSNew.py | 340 + .../node-gyp/gyp/pylib/gyp/MSVSProject.py | 208 + .../node-gyp/gyp/pylib/gyp/MSVSSettings.py | 1096 + .../gyp/pylib/gyp/MSVSSettings_test.py | 1483 ++ .../node-gyp/gyp/pylib/gyp/MSVSToolFile.py | 58 + .../node-gyp/gyp/pylib/gyp/MSVSUserFile.py | 147 + .../node-gyp/gyp/pylib/gyp/MSVSUtil.py | 270 + .../node-gyp/gyp/pylib/gyp/MSVSVersion.py | 443 + .../node-gyp/gyp/pylib/gyp/__init__.py | 548 + node_modules/node-gyp/gyp/pylib/gyp/common.py | 612 + .../node-gyp/gyp/pylib/gyp/common_test.py | 72 + .../node-gyp/gyp/pylib/gyp/easy_xml.py | 162 + .../node-gyp/gyp/pylib/gyp/easy_xml_test.py | 103 + .../node-gyp/gyp/pylib/gyp/flock_tool.py | 54 + .../gyp/pylib/gyp/generator/__init__.py | 0 .../gyp/pylib/gyp/generator/analyzer.py | 741 + .../gyp/pylib/gyp/generator/android.py | 1095 + .../node-gyp/gyp/pylib/gyp/generator/cmake.py | 1221 ++ .../gyp/generator/dump_dependency_json.py | 99 + .../gyp/pylib/gyp/generator/eclipse.py | 425 + .../node-gyp/gyp/pylib/gyp/generator/gypd.py | 94 + .../node-gyp/gyp/pylib/gyp/generator/gypsh.py | 56 + .../node-gyp/gyp/pylib/gyp/generator/make.py | 2263 ++ .../node-gyp/gyp/pylib/gyp/generator/msvs.py | 3494 ++++ .../gyp/pylib/gyp/generator/msvs_test.py | 37 + .../node-gyp/gyp/pylib/gyp/generator/ninja.py | 2422 +++ .../gyp/pylib/gyp/generator/ninja_test.py | 47 + .../node-gyp/gyp/pylib/gyp/generator/xcode.py | 1300 ++ .../gyp/pylib/gyp/generator/xcode_test.py | 23 + node_modules/node-gyp/gyp/pylib/gyp/input.py | 2902 +++ .../node-gyp/gyp/pylib/gyp/input_test.py | 90 + .../node-gyp/gyp/pylib/gyp/mac_tool.py | 610 + .../node-gyp/gyp/pylib/gyp/msvs_emulation.py | 1087 + .../node-gyp/gyp/pylib/gyp/ninja_syntax.py | 160 + .../node-gyp/gyp/pylib/gyp/ordered_dict.py | 289 + .../node-gyp/gyp/pylib/gyp/simple_copy.py | 46 + .../node-gyp/gyp/pylib/gyp/win_tool.py | 314 + .../node-gyp/gyp/pylib/gyp/xcode_emulation.py | 1653 ++ .../node-gyp/gyp/pylib/gyp/xcode_ninja.py | 270 + .../node-gyp/gyp/pylib/gyp/xcodeproj_file.py | 2927 +++ .../node-gyp/gyp/pylib/gyp/xml_fix.py | 69 + node_modules/node-gyp/gyp/samples/samples | 81 + node_modules/node-gyp/gyp/samples/samples.bat | 5 + node_modules/node-gyp/gyp/setup.py | 19 + node_modules/node-gyp/gyp/tools/README | 15 + node_modules/node-gyp/gyp/tools/Xcode/README | 5 + .../tools/Xcode/Specifications/gyp.pbfilespec | 27 + .../tools/Xcode/Specifications/gyp.xclangspec | 226 + node_modules/node-gyp/gyp/tools/emacs/README | 12 + .../node-gyp/gyp/tools/emacs/gyp-tests.el | 63 + node_modules/node-gyp/gyp/tools/emacs/gyp.el | 275 + .../gyp/tools/emacs/run-unit-tests.sh | 7 + .../gyp/tools/emacs/testdata/media.gyp | 1105 + .../tools/emacs/testdata/media.gyp.fontified | 1107 + node_modules/node-gyp/gyp/tools/graphviz.py | 100 + node_modules/node-gyp/gyp/tools/pretty_gyp.py | 155 + node_modules/node-gyp/gyp/tools/pretty_sln.py | 169 + .../node-gyp/gyp/tools/pretty_vcproj.py | 329 + .../node-gyp/node_modules/.bin/mkdirp | 1 + node_modules/node-gyp/node_modules/.bin/nopt | 1 + .../node-gyp/node_modules/.bin/rimraf | 1 + .../node-gyp/node_modules/.bin/semver | 1 + node_modules/node-gyp/node_modules/.bin/which | 1 + node_modules/node-gyp/package.json | 50 + .../node-gyp/src/win_delay_load_hook.cc | 36 + node_modules/node-gyp/test/docker.sh | 164 + .../node-gyp/test/fixtures/ca-bundle.crt | 40 + node_modules/node-gyp/test/fixtures/ca.crt | 21 + .../node-gyp/test/fixtures/server.crt | 19 + .../node-gyp/test/fixtures/server.key | 28 + .../node-gyp/test/fixtures/test-charmap.py | 22 + .../node-gyp/test/process-exec-sync.js | 138 + node_modules/node-gyp/test/simple-proxy.js | 24 + node_modules/node-gyp/test/test-addon.js | 113 + .../node-gyp/test/test-configure-python.js | 74 + node_modules/node-gyp/test/test-download.js | 102 + .../test/test-find-accessible-sync.js | 86 + .../node-gyp/test/test-find-node-directory.js | 115 + .../node-gyp/test/test-find-python.js | 339 + node_modules/node-gyp/test/test-install.js | 37 + node_modules/node-gyp/test/test-options.js | 25 + .../node-gyp/test/test-process-release.js | 637 + .../gyp/generator/compile_commands_json.py | 115 + node_modules/node-sass/CHANGELOG.md | 256 + node_modules/node-sass/LICENSE | 20 + node_modules/node-sass/README.md | 631 + node_modules/node-sass/binding.gyp | 90 + .../node-sass/node_modules/.bin/in-install | 1 + .../node-sass/node_modules/.bin/in-publish | 1 + .../node-sass/node_modules/.bin/mkdirp | 1 + .../node-sass/node_modules/.bin/node-gyp | 1 + .../node_modules/.bin/not-in-install | 1 + .../node_modules/.bin/not-in-publish | 1 + .../node-sass/node_modules/.bin/sassgraph | 1 + .../node_modules/ansi-styles/index.js | 65 + .../node_modules/ansi-styles/license | 21 + .../node_modules/ansi-styles/package.json | 50 + .../node_modules/ansi-styles/readme.md | 86 + .../node-sass/node_modules/chalk/index.js | 116 + .../node-sass/node_modules/chalk/license | 21 + .../node-sass/node_modules/chalk/package.json | 70 + .../node-sass/node_modules/chalk/readme.md | 213 + .../node_modules/supports-color/index.js | 50 + .../node_modules/supports-color/license | 21 + .../node_modules/supports-color/package.json | 49 + .../node_modules/supports-color/readme.md | 36 + node_modules/node-sass/package.json | 87 + node_modules/node-sass/scripts/build.js | 155 + node_modules/node-sass/scripts/coverage.js | 85 + node_modules/node-sass/scripts/install.js | 157 + node_modules/node-sass/scripts/prepublish.js | 17 + .../node-sass/scripts/util/downloadoptions.js | 31 + node_modules/node-sass/scripts/util/proxy.js | 22 + .../node-sass/scripts/util/useragent.js | 13 + node_modules/node-sass/src/binding.cpp | 358 + node_modules/node-sass/src/callback_bridge.h | 228 + node_modules/node-sass/src/create_string.cpp | 21 + node_modules/node-sass/src/create_string.h | 8 + .../node-sass/src/custom_function_bridge.cpp | 27 + .../node-sass/src/custom_function_bridge.h | 18 + .../node-sass/src/custom_importer_bridge.cpp | 104 + .../node-sass/src/custom_importer_bridge.h | 22 + node_modules/node-sass/src/libsass.gyp | 114 + .../node-sass/src/libsass/.editorconfig | 15 + .../node-sass/src/libsass/.gitattributes | 2 + .../src/libsass/.github/CONTRIBUTING.md | 65 + .../src/libsass/.github/ISSUE_TEMPLATE.md | 54 + node_modules/node-sass/src/libsass/.gitignore | 85 + .../node-sass/src/libsass/.travis.yml | 64 + node_modules/node-sass/src/libsass/COPYING | 25 + .../node-sass/src/libsass/GNUmakefile.am | 74 + node_modules/node-sass/src/libsass/INSTALL | 1 + node_modules/node-sass/src/libsass/LICENSE | 25 + node_modules/node-sass/src/libsass/Makefile | 351 + .../node-sass/src/libsass/Makefile.conf | 55 + node_modules/node-sass/src/libsass/Readme.md | 104 + .../node-sass/src/libsass/SECURITY.md | 10 + .../node-sass/src/libsass/appveyor.yml | 91 + .../node-sass/src/libsass/configure.ac | 134 + .../src/libsass/contrib/libsass.spec | 66 + .../node-sass/src/libsass/contrib/plugin.cpp | 60 + .../node-sass/src/libsass/docs/README.md | 20 + .../src/libsass/docs/api-context-example.md | 45 + .../src/libsass/docs/api-context-internal.md | 163 + .../node-sass/src/libsass/docs/api-context.md | 295 + .../node-sass/src/libsass/docs/api-doc.md | 215 + .../src/libsass/docs/api-function-example.md | 67 + .../src/libsass/docs/api-function-internal.md | 8 + .../src/libsass/docs/api-function.md | 74 + .../src/libsass/docs/api-importer-example.md | 112 + .../src/libsass/docs/api-importer-internal.md | 20 + .../src/libsass/docs/api-importer.md | 86 + .../src/libsass/docs/api-value-example.md | 55 + .../src/libsass/docs/api-value-internal.md | 76 + .../node-sass/src/libsass/docs/api-value.md | 154 + .../src/libsass/docs/build-on-darwin.md | 27 + .../src/libsass/docs/build-on-gentoo.md | 55 + .../src/libsass/docs/build-on-windows.md | 139 + .../src/libsass/docs/build-shared-library.md | 35 + .../src/libsass/docs/build-with-autotools.md | 78 + .../src/libsass/docs/build-with-makefiles.md | 68 + .../src/libsass/docs/build-with-mingw.md | 107 + .../libsass/docs/build-with-visual-studio.md | 90 + .../node-sass/src/libsass/docs/build.md | 97 + .../src/libsass/docs/compatibility-plan.md | 48 + .../src/libsass/docs/contributing.md | 17 + .../libsass/docs/custom-functions-internal.md | 122 + .../src/libsass/docs/dev-ast-memory.md | 223 + .../src/libsass/docs/implementations.md | 65 + .../node-sass/src/libsass/docs/plugins.md | 47 + .../src/libsass/docs/setup-environment.md | 68 + .../src/libsass/docs/source-map-internals.md | 51 + .../node-sass/src/libsass/docs/trace.md | 26 + .../node-sass/src/libsass/docs/triage.md | 17 + .../node-sass/src/libsass/docs/unicode.md | 45 + node_modules/node-sass/src/libsass/extconf.rb | 6 + .../node-sass/src/libsass/include/sass.h | 15 + .../node-sass/src/libsass/include/sass/base.h | 89 + .../src/libsass/include/sass/context.h | 170 + .../src/libsass/include/sass/functions.h | 139 + .../src/libsass/include/sass/values.h | 145 + .../src/libsass/include/sass/version.h | 12 + .../src/libsass/include/sass/version.h.in | 12 + .../node-sass/src/libsass/include/sass2scss.h | 120 + .../node-sass/src/libsass/m4/.gitkeep | 0 .../libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 | 167 + .../node-sass/src/libsass/res/resource.rc | 35 + .../node-sass/src/libsass/script/bootstrap | 13 + .../node-sass/src/libsass/script/branding | 10 + .../src/libsass/script/ci-build-libsass | 134 + .../src/libsass/script/ci-build-plugin | 62 + .../src/libsass/script/ci-install-compiler | 6 + .../src/libsass/script/ci-install-deps | 20 + .../src/libsass/script/ci-report-coverage | 42 + .../node-sass/src/libsass/script/spec | 5 + .../node-sass/src/libsass/script/tap-driver | 652 + .../node-sass/src/libsass/script/tap-runner | 1 + .../src/libsass/script/test-leaks.pl | 103 + .../node-sass/src/libsass/src/GNUmakefile.am | 54 + .../node-sass/src/libsass/src/ast.cpp | 2226 ++ .../node-sass/src/libsass/src/ast.hpp | 3049 +++ .../src/libsass/src/ast_def_macros.hpp | 80 + .../src/libsass/src/ast_fwd_decl.cpp | 29 + .../src/libsass/src/ast_fwd_decl.hpp | 463 + .../node-sass/src/libsass/src/b64/cencode.h | 32 + .../node-sass/src/libsass/src/b64/encode.h | 79 + .../node-sass/src/libsass/src/backtrace.cpp | 46 + .../node-sass/src/libsass/src/backtrace.hpp | 29 + .../node-sass/src/libsass/src/base64vlq.cpp | 44 + .../node-sass/src/libsass/src/base64vlq.hpp | 30 + .../node-sass/src/libsass/src/bind.cpp | 311 + .../node-sass/src/libsass/src/bind.hpp | 13 + .../node-sass/src/libsass/src/c99func.c | 54 + .../node-sass/src/libsass/src/cencode.c | 108 + .../src/libsass/src/check_nesting.cpp | 398 + .../src/libsass/src/check_nesting.hpp | 65 + .../node-sass/src/libsass/src/color_maps.cpp | 648 + .../node-sass/src/libsass/src/color_maps.hpp | 331 + .../node-sass/src/libsass/src/constants.cpp | 179 + .../node-sass/src/libsass/src/constants.hpp | 181 + .../node-sass/src/libsass/src/context.cpp | 880 + .../node-sass/src/libsass/src/context.hpp | 152 + .../node-sass/src/libsass/src/cssize.cpp | 606 + .../node-sass/src/libsass/src/cssize.hpp | 77 + .../node-sass/src/libsass/src/debug.hpp | 43 + .../node-sass/src/libsass/src/debugger.hpp | 801 + .../node-sass/src/libsass/src/emitter.cpp | 297 + .../node-sass/src/libsass/src/emitter.hpp | 99 + .../node-sass/src/libsass/src/environment.cpp | 246 + .../node-sass/src/libsass/src/environment.hpp | 113 + .../src/libsass/src/error_handling.cpp | 235 + .../src/libsass/src/error_handling.hpp | 216 + .../node-sass/src/libsass/src/eval.cpp | 1663 ++ .../node-sass/src/libsass/src/eval.hpp | 103 + .../node-sass/src/libsass/src/expand.cpp | 817 + .../node-sass/src/libsass/src/expand.hpp | 82 + .../node-sass/src/libsass/src/extend.cpp | 2130 ++ .../node-sass/src/libsass/src/extend.hpp | 86 + .../node-sass/src/libsass/src/file.cpp | 485 + .../node-sass/src/libsass/src/file.hpp | 133 + .../node-sass/src/libsass/src/functions.cpp | 2234 ++ .../node-sass/src/libsass/src/functions.hpp | 198 + .../node-sass/src/libsass/src/inspect.cpp | 1138 + .../node-sass/src/libsass/src/inspect.hpp | 103 + .../node-sass/src/libsass/src/json.cpp | 1436 ++ .../node-sass/src/libsass/src/json.hpp | 117 + .../src/libsass/src/kwd_arg_macros.hpp | 28 + .../node-sass/src/libsass/src/lexer.cpp | 181 + .../node-sass/src/libsass/src/lexer.hpp | 315 + .../node-sass/src/libsass/src/listize.cpp | 86 + .../node-sass/src/libsass/src/listize.hpp | 34 + .../node-sass/src/libsass/src/mapping.hpp | 18 + .../src/libsass/src/memory/SharedPtr.cpp | 114 + .../src/libsass/src/memory/SharedPtr.hpp | 206 + .../node-sass/src/libsass/src/node.cpp | 319 + .../node-sass/src/libsass/src/node.hpp | 118 + .../node-sass/src/libsass/src/operation.hpp | 173 + .../node-sass/src/libsass/src/operators.cpp | 267 + .../node-sass/src/libsass/src/operators.hpp | 30 + .../node-sass/src/libsass/src/output.cpp | 336 + .../node-sass/src/libsass/src/output.hpp | 54 + .../node-sass/src/libsass/src/parser.cpp | 3137 +++ .../node-sass/src/libsass/src/parser.hpp | 400 + .../node-sass/src/libsass/src/paths.hpp | 71 + .../node-sass/src/libsass/src/plugins.cpp | 184 + .../node-sass/src/libsass/src/plugins.hpp | 57 + .../node-sass/src/libsass/src/position.cpp | 181 + .../node-sass/src/libsass/src/position.hpp | 124 + .../node-sass/src/libsass/src/prelexer.cpp | 1774 ++ .../node-sass/src/libsass/src/prelexer.hpp | 484 + .../src/libsass/src/remove_placeholders.cpp | 84 + .../src/libsass/src/remove_placeholders.hpp | 35 + .../node-sass/src/libsass/src/sass.cpp | 151 + .../node-sass/src/libsass/src/sass.hpp | 139 + .../node-sass/src/libsass/src/sass2scss.cpp | 864 + .../src/libsass/src/sass_context.cpp | 769 + .../src/libsass/src/sass_context.hpp | 129 + .../src/libsass/src/sass_functions.cpp | 207 + .../src/libsass/src/sass_functions.hpp | 50 + .../node-sass/src/libsass/src/sass_util.cpp | 149 + .../node-sass/src/libsass/src/sass_util.hpp | 256 + .../node-sass/src/libsass/src/sass_values.cpp | 357 + .../node-sass/src/libsass/src/sass_values.hpp | 82 + .../node-sass/src/libsass/src/source_map.cpp | 195 + .../node-sass/src/libsass/src/source_map.hpp | 62 + .../node-sass/src/libsass/src/subset_map.cpp | 55 + .../node-sass/src/libsass/src/subset_map.hpp | 76 + .../src/libsass/src/support/libsass.pc.in | 11 + .../node-sass/src/libsass/src/to_c.cpp | 74 + .../node-sass/src/libsass/src/to_c.hpp | 39 + .../node-sass/src/libsass/src/to_value.cpp | 112 + .../node-sass/src/libsass/src/to_value.hpp | 50 + .../node-sass/src/libsass/src/units.cpp | 501 + .../node-sass/src/libsass/src/units.hpp | 109 + node_modules/node-sass/src/libsass/src/utf8.h | 34 + .../node-sass/src/libsass/src/utf8/checked.h | 334 + .../node-sass/src/libsass/src/utf8/core.h | 329 + .../src/libsass/src/utf8/unchecked.h | 235 + .../node-sass/src/libsass/src/utf8_string.cpp | 102 + .../node-sass/src/libsass/src/utf8_string.hpp | 37 + .../node-sass/src/libsass/src/util.cpp | 733 + .../node-sass/src/libsass/src/util.hpp | 56 + .../node-sass/src/libsass/src/values.cpp | 131 + .../node-sass/src/libsass/src/values.hpp | 12 + .../node-sass/src/libsass/test/test_node.cpp | 94 + .../node-sass/src/libsass/test/test_paths.cpp | 28 + .../libsass/test/test_selector_difference.cpp | 25 + .../src/libsass/test/test_specificity.cpp | 25 + .../src/libsass/test/test_subset_map.cpp | 472 + .../src/libsass/test/test_superselector.cpp | 69 + .../src/libsass/test/test_unification.cpp | 31 + node_modules/node-sass/src/libsass/version.sh | 10 + .../node-sass/src/libsass/win/libsass.sln | 39 + .../src/libsass/win/libsass.sln.DotSettings | 9 + .../node-sass/src/libsass/win/libsass.targets | 118 + .../node-sass/src/libsass/win/libsass.vcxproj | 188 + .../src/libsass/win/libsass.vcxproj.filters | 357 + .../node-sass/src/sass_context_wrapper.cpp | 67 + .../node-sass/src/sass_context_wrapper.h | 57 + .../node-sass/src/sass_types/boolean.cpp | 73 + .../node-sass/src/sass_types/boolean.h | 31 + .../node-sass/src/sass_types/color.cpp | 127 + node_modules/node-sass/src/sass_types/color.h | 34 + .../node-sass/src/sass_types/error.cpp | 24 + node_modules/node-sass/src/sass_types/error.h | 19 + .../node-sass/src/sass_types/factory.cpp | 72 + .../node-sass/src/sass_types/factory.h | 20 + .../node-sass/src/sass_types/list.cpp | 101 + node_modules/node-sass/src/sass_types/list.h | 25 + node_modules/node-sass/src/sass_types/map.cpp | 118 + node_modules/node-sass/src/sass_types/map.h | 25 + .../node-sass/src/sass_types/null.cpp | 57 + node_modules/node-sass/src/sass_types/null.h | 29 + .../node-sass/src/sass_types/number.cpp | 75 + .../node-sass/src/sass_types/number.h | 25 + .../src/sass_types/sass_value_wrapper.h | 101 + .../node-sass/src/sass_types/string.cpp | 48 + .../node-sass/src/sass_types/string.h | 22 + node_modules/node-sass/src/sass_types/value.h | 42 + node_modules/node-sass/test/.eslintrc | 5 + node_modules/node-sass/test/api.js | 2035 ++ node_modules/node-sass/test/binding.js | 129 + node_modules/node-sass/test/cli.js | 804 + .../node-sass/test/downloadoptions.js | 74 + node_modules/node-sass/test/errors.js | 53 + .../test/fixtures/compressed/expected.css | 1 + .../test/fixtures/compressed/index.scss | 16 + .../custom-functions/setter-expected.css | 3 + .../fixtures/custom-functions/setter.scss | 1 + .../string-conversion-expected.css | 2 + .../custom-functions/string-conversion.scss | 1 + .../fixtures/cwd-include-path/expected.css | 2 + .../fixtures/cwd-include-path/outside.scss | 3 + .../fixtures/cwd-include-path/root/index.scss | 1 + .../test/fixtures/depth-first/_common.scss | 6 + .../test/fixtures/depth-first/_struct.scss | 3 + .../test/fixtures/depth-first/_vars.scss | 5 + .../test/fixtures/depth-first/a.scss | 7 + .../test/fixtures/depth-first/a1.scss | 3 + .../test/fixtures/depth-first/b.scss | 5 + .../test/fixtures/depth-first/b1.scss | 3 + .../test/fixtures/depth-first/expected.css | 32 + .../test/fixtures/depth-first/index.scss | 8 + .../extras/my_custom_arrays_of_importers.js | 12 + .../extras/my_custom_functions_setter.js | 10 + .../my_custom_functions_string_conversion.js | 8 + .../extras/my_custom_importer_data.js | 5 + .../extras/my_custom_importer_data_cb.js | 5 + .../extras/my_custom_importer_error.js | 3 + .../extras/my_custom_importer_file.js | 7 + .../my_custom_importer_file_and_data.js | 6 + .../my_custom_importer_file_and_data_cb.js | 6 + .../extras/my_custom_importer_file_cb.js | 7 + .../test/fixtures/follow/foo/bar/index.scss | 16 + .../test/fixtures/include-files/bar.scss | 1 + .../chained-imports-with-custom-importer.scss | 1 + .../include-files/expected-importer.css | 5 + .../file-not-processed-by-loader.scss | 1 + .../file-processed-by-loader.scss | 3 + .../test/fixtures/include-files/foo.scss | 1 + .../test/fixtures/include-files/index.scss | 2 + .../test/fixtures/include-path/expected.css | 3 + .../include-path/functions/colorBlue.scss | 3 + .../test/fixtures/include-path/index.scss | 7 + .../test/fixtures/indent/expected.css | 2 + .../node-sass/test/fixtures/indent/index.sass | 3 + .../input-directory/sass/_skipped.scss | 16 + .../input-directory/sass/nested/three.scss | 16 + .../fixtures/input-directory/sass/one.scss | 16 + .../fixtures/input-directory/sass/two.scss | 16 + .../test/fixtures/invalid/index.scss | 3 + .../test/fixtures/output-directory/index.scss | 16 + .../test/fixtures/precision/expected.css | 2 + .../test/fixtures/precision/index.scss | 3 + .../fixtures/sass-path/expected-orange.css | 3 + .../test/fixtures/sass-path/expected-red.css | 3 + .../test/fixtures/sass-path/index.scss | 6 + .../fixtures/sass-path/orange/colors.scss | 1 + .../test/fixtures/sass-path/red/colors.scss | 1 + .../test/fixtures/simple/expected.css | 11 + .../node-sass/test/fixtures/simple/index.scss | 16 + .../fixtures/source-comments/expected.css | 15 + .../test/fixtures/source-comments/index.scss | 16 + .../fixtures/source-map-embed/expected.css | 13 + .../test/fixtures/source-map-embed/index.scss | 16 + .../test/fixtures/source-map/expected.css | 13 + .../test/fixtures/source-map/expected.map | 9 + .../test/fixtures/source-map/index.scss | 16 + .../test/fixtures/watcher/main/one.scss | 5 + .../fixtures/watcher/main/partials/_one.scss | 5 + .../watcher/main/partials/_three.scss | 3 + .../fixtures/watcher/main/partials/_two.scss | 5 + .../test/fixtures/watcher/main/three.scss | 3 + .../test/fixtures/watcher/main/two.scss | 3 + .../watcher/sibling/partials/_three.scss | 3 + .../test/fixtures/watcher/sibling/three.scss | 5 + .../test/fixtures/watching-dir-01/index.scss | 1 + .../test/fixtures/watching-dir-02/foo.scss | 1 + .../test/fixtures/watching-dir-02/index.scss | 1 + .../node-sass/test/fixtures/watching/bar.sass | 2 + .../test/fixtures/watching/index.sass | 1 + .../test/fixtures/watching/index.scss | 1 + .../test/fixtures/watching/white.scss | 1 + node_modules/node-sass/test/lowlevel.js | 243 + node_modules/node-sass/test/runtime.js | 185 + .../node-sass/test/scripts/util/proxy.js | 76 + node_modules/node-sass/test/spec.js | 192 + node_modules/node-sass/test/types.js | 643 + node_modules/node-sass/test/useragent.js | 15 + node_modules/node-sass/test/watcher.js | 503 + .../vendor/linux-x64-72/binding.node | Bin 0 -> 3474752 bytes node_modules/nopt/.npmignore | 1 + node_modules/nopt/.travis.yml | 9 + node_modules/nopt/LICENSE | 15 + node_modules/nopt/README.md | 211 + node_modules/nopt/examples/my-program.js | 30 + node_modules/nopt/package.json | 22 + node_modules/nopt/test/basic.js | 273 + node_modules/normalize-package-data/AUTHORS | 4 + node_modules/normalize-package-data/LICENSE | 30 + node_modules/normalize-package-data/README.md | 106 + .../node_modules/.bin/semver | 1 + .../node_modules/semver/CHANGELOG.md | 39 + .../node_modules/semver/LICENSE | 15 + .../node_modules/semver/README.md | 412 + .../node_modules/semver/package.json | 28 + .../node_modules/semver/range.bnf | 16 + .../node_modules/semver/semver.js | 1483 ++ .../normalize-package-data/package.json | 31 + node_modules/normalize-path/LICENSE | 21 + node_modules/normalize-path/README.md | 92 + node_modules/normalize-path/index.js | 19 + node_modules/normalize-path/package.json | 78 + node_modules/now-and-later/LICENSE | 21 + node_modules/now-and-later/README.md | 203 + node_modules/now-and-later/index.js | 6 + node_modules/now-and-later/package.json | 54 + node_modules/npmlog/CHANGELOG.md | 49 + node_modules/npmlog/LICENSE | 15 + node_modules/npmlog/README.md | 216 + node_modules/npmlog/log.js | 309 + node_modules/npmlog/package.json | 28 + node_modules/number-is-nan/index.js | 4 + node_modules/number-is-nan/license | 21 + node_modules/number-is-nan/package.json | 35 + node_modules/number-is-nan/readme.md | 28 + node_modules/oauth-sign/LICENSE | 55 + node_modules/oauth-sign/README.md | 11 + node_modules/oauth-sign/index.js | 146 + node_modules/oauth-sign/package.json | 23 + node_modules/object-assign/index.js | 90 + node_modules/object-assign/license | 21 + node_modules/object-assign/package.json | 42 + node_modules/object-assign/readme.md | 61 + node_modules/object-copy/LICENSE | 21 + node_modules/object-copy/index.js | 174 + node_modules/object-copy/package.json | 47 + node_modules/object-keys/.editorconfig | 13 + node_modules/object-keys/.eslintrc | 17 + node_modules/object-keys/.travis.yml | 277 + node_modules/object-keys/CHANGELOG.md | 232 + node_modules/object-keys/LICENSE | 21 + node_modules/object-keys/README.md | 76 + node_modules/object-keys/implementation.js | 122 + node_modules/object-keys/index.js | 32 + node_modules/object-keys/isArguments.js | 17 + node_modules/object-keys/package.json | 88 + node_modules/object-keys/test/index.js | 5 + node_modules/object-visit/LICENSE | 21 + node_modules/object-visit/README.md | 83 + node_modules/object-visit/index.js | 33 + node_modules/object-visit/package.json | 65 + node_modules/object.assign/.editorconfig | 20 + node_modules/object.assign/.eslintignore | 1 + node_modules/object.assign/.eslintrc | 26 + .../object.assign/.github/FUNDING.yml | 12 + .../.github/workflows/rebase.yml | 15 + .../.github/workflows/require-allow-edits.yml | 14 + node_modules/object.assign/.nycrc | 14 + node_modules/object.assign/CHANGELOG.md | 201 + node_modules/object.assign/LICENSE | 21 + node_modules/object.assign/README.md | 135 + node_modules/object.assign/auto.js | 3 + node_modules/object.assign/dist/browser.js | 865 + node_modules/object.assign/hasSymbols.js | 43 + node_modules/object.assign/implementation.js | 42 + node_modules/object.assign/index.js | 22 + node_modules/object.assign/package.json | 83 + node_modules/object.assign/polyfill.js | 55 + node_modules/object.assign/shim.js | 14 + node_modules/object.assign/test/index.js | 17 + node_modules/object.assign/test/native.js | 49 + node_modules/object.assign/test/ses-compat.js | 12 + node_modules/object.assign/test/shimmed.js | 52 + node_modules/object.assign/test/tests.js | 237 + node_modules/object.defaults/LICENSE | 21 + node_modules/object.defaults/README.md | 85 + node_modules/object.defaults/immutable.js | 20 + node_modules/object.defaults/index.js | 11 + node_modules/object.defaults/mutable.js | 35 + node_modules/object.defaults/package.json | 67 + node_modules/object.map/LICENSE | 24 + node_modules/object.map/README.md | 87 + node_modules/object.map/index.js | 22 + node_modules/object.map/package.json | 59 + node_modules/object.pick/LICENSE | 21 + node_modules/object.pick/README.md | 76 + node_modules/object.pick/index.js | 35 + node_modules/object.pick/package.json | 60 + node_modules/object.reduce/LICENSE | 21 + node_modules/object.reduce/README.md | 95 + node_modules/object.reduce/index.js | 31 + node_modules/object.reduce/package.json | 47 + node_modules/once/LICENSE | 15 + node_modules/once/README.md | 79 + node_modules/once/once.js | 42 + node_modules/once/package.json | 33 + node_modules/ordered-read-streams/LICENSE | 20 + node_modules/ordered-read-streams/README.md | 65 + node_modules/ordered-read-streams/index.js | 99 + .../ordered-read-streams/package.json | 26 + node_modules/os-homedir/index.js | 24 + node_modules/os-homedir/license | 21 + node_modules/os-homedir/package.json | 41 + node_modules/os-homedir/readme.md | 31 + node_modules/os-locale/index.js | 127 + node_modules/os-locale/license | 21 + node_modules/os-locale/package.json | 43 + node_modules/os-locale/readme.md | 47 + node_modules/os-tmpdir/index.js | 25 + node_modules/os-tmpdir/license | 21 + node_modules/os-tmpdir/package.json | 41 + node_modules/os-tmpdir/readme.md | 32 + node_modules/osenv/LICENSE | 15 + node_modules/osenv/README.md | 63 + node_modules/osenv/osenv.js | 72 + node_modules/osenv/package.json | 37 + node_modules/p-limit/index.d.ts | 38 + node_modules/p-limit/index.js | 57 + node_modules/p-limit/license | 9 + node_modules/p-limit/package.json | 52 + node_modules/p-limit/readme.md | 101 + node_modules/p-locate/index.js | 34 + node_modules/p-locate/license | 9 + node_modules/p-locate/package.json | 51 + node_modules/p-locate/readme.md | 88 + node_modules/p-try/index.d.ts | 39 + node_modules/p-try/index.js | 9 + node_modules/p-try/license | 9 + node_modules/p-try/package.json | 42 + node_modules/p-try/readme.md | 58 + node_modules/parse-filepath/LICENSE | 21 + node_modules/parse-filepath/README.md | 111 + node_modules/parse-filepath/index.js | 95 + node_modules/parse-filepath/package.json | 79 + node_modules/parse-json/index.js | 35 + node_modules/parse-json/license | 21 + node_modules/parse-json/package.json | 46 + node_modules/parse-json/readme.md | 83 + node_modules/parse-json/vendor/parse.js | 752 + node_modules/parse-json/vendor/unicode.js | 71 + node_modules/parse-node-version/LICENSE | 22 + node_modules/parse-node-version/README.md | 51 + node_modules/parse-node-version/index.js | 20 + node_modules/parse-node-version/package.json | 40 + node_modules/parse-passwd/LICENSE | 21 + node_modules/parse-passwd/README.md | 86 + node_modules/parse-passwd/index.js | 56 + node_modules/parse-passwd/package.json | 55 + node_modules/pascalcase/LICENSE | 21 + node_modules/pascalcase/README.md | 80 + node_modules/pascalcase/index.js | 21 + node_modules/pascalcase/package.json | 46 + node_modules/path-dirname/index.js | 143 + node_modules/path-dirname/license | 22 + node_modules/path-dirname/package.json | 29 + node_modules/path-dirname/readme.md | 53 + node_modules/path-exists/index.js | 24 + node_modules/path-exists/license | 21 + node_modules/path-exists/package.json | 40 + node_modules/path-exists/readme.md | 45 + node_modules/path-is-absolute/index.js | 20 + node_modules/path-is-absolute/license | 21 + node_modules/path-is-absolute/package.json | 43 + node_modules/path-is-absolute/readme.md | 59 + node_modules/path-parse/.travis.yml | 9 + node_modules/path-parse/LICENSE | 21 + node_modules/path-parse/README.md | 42 + node_modules/path-parse/index.js | 93 + node_modules/path-parse/package.json | 33 + node_modules/path-parse/test.js | 77 + node_modules/path-root-regex/LICENSE | 21 + node_modules/path-root-regex/README.md | 53 + node_modules/path-root-regex/index.js | 13 + node_modules/path-root-regex/package.json | 65 + node_modules/path-root/LICENSE | 21 + node_modules/path-root/README.md | 94 + node_modules/path-root/index.js | 21 + node_modules/path-root/package.json | 58 + node_modules/path-type/index.js | 29 + node_modules/path-type/license | 21 + node_modules/path-type/package.json | 52 + node_modules/path-type/readme.md | 42 + node_modules/performance-now/.npmignore | 1 + node_modules/performance-now/.tm_properties | 7 + node_modules/performance-now/.travis.yml | 6 + node_modules/performance-now/README.md | 30 + node_modules/performance-now/license.txt | 7 + node_modules/performance-now/package.json | 35 + node_modules/performance-now/src/index.d.ts | 8 + .../src/performance-now.coffee | 17 + node_modules/performance-now/test/mocha.opts | 3 + .../test/performance-now.coffee | 43 + .../performance-now/test/scripts.coffee | 27 + .../test/scripts/delayed-call.coffee | 11 + .../test/scripts/delayed-require.coffee | 12 + .../test/scripts/difference.coffee | 6 + .../test/scripts/initial-value.coffee | 10 + node_modules/pify/index.js | 68 + node_modules/pify/license | 21 + node_modules/pify/package.json | 48 + node_modules/pify/readme.md | 119 + node_modules/pinkie-promise/index.js | 3 + node_modules/pinkie-promise/license | 21 + node_modules/pinkie-promise/package.json | 35 + node_modules/pinkie-promise/readme.md | 28 + node_modules/pinkie/index.js | 292 + node_modules/pinkie/license | 21 + node_modules/pinkie/package.json | 36 + node_modules/pinkie/readme.md | 83 + node_modules/plugin-error/LICENSE | 21 + node_modules/plugin-error/README.md | 69 + node_modules/plugin-error/index.d.ts | 114 + node_modules/plugin-error/index.js | 190 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 97 + .../node_modules/extend-shallow/index.js | 60 + .../node_modules/extend-shallow/package.json | 83 + .../node_modules/is-extendable/LICENSE | 21 + .../node_modules/is-extendable/README.md | 88 + .../node_modules/is-extendable/index.d.ts | 5 + .../node_modules/is-extendable/index.js | 14 + .../node_modules/is-extendable/package.json | 67 + node_modules/plugin-error/package.json | 51 + node_modules/posix-character-classes/LICENSE | 21 + .../posix-character-classes/README.md | 103 + node_modules/posix-character-classes/index.js | 22 + .../posix-character-classes/package.json | 54 + node_modules/pretty-hrtime/.jshintignore | 1 + node_modules/pretty-hrtime/.npmignore | 10 + node_modules/pretty-hrtime/LICENSE | 20 + node_modules/pretty-hrtime/README.md | 57 + node_modules/pretty-hrtime/index.js | 80 + node_modules/pretty-hrtime/package.json | 25 + node_modules/process-nextick-args/index.js | 45 + node_modules/process-nextick-args/license.md | 19 + .../process-nextick-args/package.json | 25 + node_modules/process-nextick-args/readme.md | 18 + node_modules/pseudomap/LICENSE | 15 + node_modules/pseudomap/README.md | 60 + node_modules/pseudomap/map.js | 9 + node_modules/pseudomap/package.json | 25 + node_modules/pseudomap/pseudomap.js | 113 + node_modules/pseudomap/test/basic.js | 86 + node_modules/psl/LICENSE | 9 + node_modules/psl/README.md | 215 + node_modules/psl/browserstack-logo.svg | 90 + node_modules/psl/data/rules.json | 8834 ++++++++ node_modules/psl/dist/psl.js | 9645 +++++++++ node_modules/psl/dist/psl.min.js | 1 + node_modules/psl/index.js | 269 + node_modules/psl/package.json | 44 + node_modules/pump/.travis.yml | 5 + node_modules/pump/LICENSE | 21 + node_modules/pump/README.md | 56 + node_modules/pump/index.js | 82 + node_modules/pump/package.json | 24 + node_modules/pump/test-browser.js | 62 + node_modules/pump/test-node.js | 53 + node_modules/pumpify/.travis.yml | 8 + node_modules/pumpify/LICENSE | 21 + node_modules/pumpify/README.md | 56 + node_modules/pumpify/index.js | 60 + node_modules/pumpify/package.json | 37 + node_modules/pumpify/test.js | 235 + node_modules/punycode/LICENSE-MIT.txt | 20 + node_modules/punycode/README.md | 122 + node_modules/punycode/package.json | 58 + node_modules/punycode/punycode.es6.js | 441 + node_modules/punycode/punycode.js | 440 + node_modules/qs/.editorconfig | 30 + node_modules/qs/.eslintignore | 1 + node_modules/qs/.eslintrc | 19 + node_modules/qs/CHANGELOG.md | 226 + node_modules/qs/LICENSE | 28 + node_modules/qs/README.md | 475 + node_modules/qs/dist/qs.js | 638 + node_modules/qs/package.json | 52 + node_modules/qs/test/.eslintrc | 15 + node_modules/qs/test/index.js | 7 + node_modules/qs/test/parse.js | 574 + node_modules/qs/test/stringify.js | 597 + node_modules/qs/test/utils.js | 34 + node_modules/read-pkg-up/index.js | 31 + node_modules/read-pkg-up/license | 21 + node_modules/read-pkg-up/package.json | 59 + node_modules/read-pkg-up/readme.md | 79 + node_modules/read-pkg/index.js | 48 + node_modules/read-pkg/license | 21 + node_modules/read-pkg/package.json | 42 + node_modules/read-pkg/readme.md | 79 + node_modules/readable-stream/.travis.yml | 34 + node_modules/readable-stream/CONTRIBUTING.md | 38 + node_modules/readable-stream/GOVERNANCE.md | 136 + node_modules/readable-stream/LICENSE | 47 + node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + node_modules/readable-stream/duplex.js | 1 + .../node_modules/safe-buffer/LICENSE | 21 + .../node_modules/safe-buffer/README.md | 584 + .../node_modules/safe-buffer/index.d.ts | 187 + .../node_modules/safe-buffer/index.js | 62 + .../node_modules/safe-buffer/package.json | 37 + node_modules/readable-stream/package.json | 52 + node_modules/readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + node_modules/readable-stream/readable.js | 19 + node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + node_modules/readable-stream/writable.js | 8 + node_modules/readdirp/LICENSE | 20 + node_modules/readdirp/README.md | 204 + node_modules/readdirp/package.json | 50 + node_modules/readdirp/readdirp.js | 294 + node_modules/readdirp/stream-api.js | 98 + node_modules/rechoir/.npmignore | 1 + node_modules/rechoir/.travis.yml | 24 + node_modules/rechoir/CHANGELOG | 38 + node_modules/rechoir/LICENSE | 22 + node_modules/rechoir/README.md | 42 + node_modules/rechoir/index.js | 59 + node_modules/rechoir/package.json | 88 + node_modules/redent/index.js | 7 + node_modules/redent/license | 21 + .../redent/node_modules/.bin/strip-indent | 1 + node_modules/redent/package.json | 43 + node_modules/redent/readme.md | 48 + node_modules/regex-not/LICENSE | 21 + node_modules/regex-not/README.md | 133 + node_modules/regex-not/index.js | 72 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 97 + .../node_modules/extend-shallow/index.js | 60 + .../node_modules/extend-shallow/package.json | 83 + .../node_modules/is-extendable/LICENSE | 21 + .../node_modules/is-extendable/README.md | 88 + .../node_modules/is-extendable/index.d.ts | 5 + .../node_modules/is-extendable/index.js | 14 + .../node_modules/is-extendable/package.json | 67 + node_modules/regex-not/package.json | 63 + node_modules/remove-bom-buffer/LICENSE | 21 + node_modules/remove-bom-buffer/README.md | 65 + node_modules/remove-bom-buffer/index.js | 27 + node_modules/remove-bom-buffer/package.json | 67 + node_modules/remove-bom-stream/LICENSE | 21 + node_modules/remove-bom-stream/README.md | 51 + node_modules/remove-bom-stream/index.js | 51 + .../node_modules/through2/LICENSE.md | 9 + .../node_modules/through2/README.md | 134 + .../node_modules/through2/package.json | 33 + .../node_modules/through2/through2.js | 96 + node_modules/remove-bom-stream/package.json | 51 + .../remove-trailing-separator/history.md | 17 + .../remove-trailing-separator/index.js | 17 + .../remove-trailing-separator/license | 3 + .../remove-trailing-separator/package.json | 37 + .../remove-trailing-separator/readme.md | 51 + node_modules/repeat-element/LICENSE | 21 + node_modules/repeat-element/README.md | 99 + node_modules/repeat-element/index.js | 18 + node_modules/repeat-element/package.json | 49 + node_modules/repeat-string/LICENSE | 21 + node_modules/repeat-string/README.md | 136 + node_modules/repeat-string/index.js | 70 + node_modules/repeat-string/package.json | 77 + node_modules/repeating/index.js | 24 + node_modules/repeating/license | 21 + node_modules/repeating/package.json | 37 + node_modules/repeating/readme.md | 30 + node_modules/replace-ext/LICENSE | 21 + node_modules/replace-ext/README.md | 62 + node_modules/replace-ext/index.js | 33 + node_modules/replace-ext/package.json | 43 + node_modules/replace-homedir/LICENSE | 21 + node_modules/replace-homedir/README.md | 48 + node_modules/replace-homedir/index.js | 29 + node_modules/replace-homedir/package.json | 50 + node_modules/request/CHANGELOG.md | 717 + node_modules/request/LICENSE | 55 + node_modules/request/README.md | 1133 + node_modules/request/index.js | 155 + node_modules/request/node_modules/.bin/uuid | 1 + node_modules/request/package.json | 86 + node_modules/request/request.js | 1553 ++ node_modules/require-directory/.jshintrc | 67 + node_modules/require-directory/.npmignore | 1 + node_modules/require-directory/.travis.yml | 3 + node_modules/require-directory/LICENSE | 22 + .../require-directory/README.markdown | 184 + node_modules/require-directory/index.js | 86 + node_modules/require-directory/package.json | 40 + node_modules/require-main-filename/.npmignore | 3 + .../require-main-filename/.travis.yml | 8 + .../require-main-filename/LICENSE.txt | 14 + node_modules/require-main-filename/README.md | 26 + node_modules/require-main-filename/index.js | 18 + .../require-main-filename/package.json | 30 + node_modules/require-main-filename/test.js | 36 + node_modules/resolve-dir/LICENSE | 21 + node_modules/resolve-dir/README.md | 88 + node_modules/resolve-dir/index.js | 22 + node_modules/resolve-dir/package.json | 73 + node_modules/resolve-options/LICENSE | 21 + node_modules/resolve-options/README.md | 104 + node_modules/resolve-options/index.js | 111 + node_modules/resolve-options/package.json | 50 + node_modules/resolve-url/.jshintrc | 44 + node_modules/resolve-url/LICENSE | 21 + node_modules/resolve-url/bower.json | 15 + node_modules/resolve-url/changelog.md | 15 + node_modules/resolve-url/component.json | 15 + node_modules/resolve-url/package.json | 34 + node_modules/resolve-url/readme.md | 83 + node_modules/resolve-url/resolve-url.js | 47 + node_modules/resolve-url/test/resolve-url.js | 70 + node_modules/resolve/.editorconfig | 34 + node_modules/resolve/.eslintignore | 1 + node_modules/resolve/.eslintrc | 39 + .../resolve/.github/workflows/node-4+.yml | 54 + .../resolve/.github/workflows/node-iojs.yml | 55 + .../.github/workflows/node-pretest.yml | 27 + .../resolve/.github/workflows/node-zero.yml | 55 + .../resolve/.github/workflows/rebase.yml | 15 + .../.github/workflows/require-allow-edits.yml | 14 + node_modules/resolve/LICENSE | 21 + node_modules/resolve/appveyor.yml | 74 + node_modules/resolve/example/async.js | 5 + node_modules/resolve/example/sync.js | 3 + node_modules/resolve/index.js | 6 + node_modules/resolve/package.json | 51 + node_modules/resolve/readme.markdown | 250 + node_modules/resolve/test/.eslintrc | 5 + node_modules/resolve/test/core.js | 81 + node_modules/resolve/test/dotdot.js | 29 + node_modules/resolve/test/dotdot/abc/index.js | 2 + node_modules/resolve/test/dotdot/index.js | 1 + node_modules/resolve/test/faulty_basedir.js | 29 + node_modules/resolve/test/filter.js | 34 + node_modules/resolve/test/filter_sync.js | 33 + node_modules/resolve/test/mock.js | 239 + node_modules/resolve/test/mock_sync.js | 141 + node_modules/resolve/test/module_dir.js | 56 + .../test/module_dir/xmodules/aaa/index.js | 1 + .../test/module_dir/ymodules/aaa/index.js | 1 + .../test/module_dir/zmodules/bbb/main.js | 1 + .../test/module_dir/zmodules/bbb/package.json | 3 + .../resolve/test/node-modules-paths.js | 143 + node_modules/resolve/test/node_path.js | 70 + .../resolve/test/node_path/x/aaa/index.js | 1 + .../resolve/test/node_path/x/ccc/index.js | 1 + .../resolve/test/node_path/y/bbb/index.js | 1 + .../resolve/test/node_path/y/ccc/index.js | 1 + node_modules/resolve/test/nonstring.js | 9 + node_modules/resolve/test/pathfilter.js | 75 + .../resolve/test/pathfilter/deep_ref/main.js | 0 node_modules/resolve/test/precedence.js | 23 + node_modules/resolve/test/precedence/aaa.js | 1 + .../resolve/test/precedence/aaa/index.js | 1 + .../resolve/test/precedence/aaa/main.js | 1 + node_modules/resolve/test/precedence/bbb.js | 1 + .../resolve/test/precedence/bbb/main.js | 1 + node_modules/resolve/test/resolver.js | 450 + .../resolve/test/resolver/baz/doom.js | 0 .../resolve/test/resolver/baz/package.json | 4 + .../resolve/test/resolver/baz/quux.js | 1 + .../resolve/test/resolver/browser_field/a.js | 0 .../resolve/test/resolver/browser_field/b.js | 0 .../test/resolver/browser_field/package.json | 5 + node_modules/resolve/test/resolver/cup.coffee | 1 + .../resolve/test/resolver/dot_main/index.js | 1 + .../test/resolver/dot_main/package.json | 3 + .../test/resolver/dot_slash_main/index.js | 1 + .../test/resolver/dot_slash_main/package.json | 3 + node_modules/resolve/test/resolver/foo.js | 1 + .../test/resolver/incorrect_main/index.js | 2 + .../test/resolver/incorrect_main/package.json | 3 + .../test/resolver/invalid_main/package.json | 7 + node_modules/resolve/test/resolver/mug.coffee | 0 node_modules/resolve/test/resolver/mug.js | 0 .../test/resolver/multirepo/lerna.json | 6 + .../test/resolver/multirepo/package.json | 20 + .../multirepo/packages/package-a/index.js | 35 + .../multirepo/packages/package-a/package.json | 14 + .../multirepo/packages/package-b/index.js | 0 .../multirepo/packages/package-b/package.json | 14 + .../resolver/nested_symlinks/mylib/async.js | 26 + .../nested_symlinks/mylib/package.json | 15 + .../resolver/nested_symlinks/mylib/sync.js | 12 + .../resolve/test/resolver/other_path/root.js | 0 .../resolve/test/resolver/quux/foo/index.js | 1 + .../resolve/test/resolver/same_names/foo.js | 1 + .../test/resolver/same_names/foo/index.js | 1 + .../resolver/symlinked/_/node_modules/foo.js | 0 .../symlinked/_/symlink_target/.gitkeep | 0 .../test/resolver/symlinked/package/bar.js | 1 + .../resolver/symlinked/package/package.json | 3 + .../test/resolver/without_basedir/main.js | 5 + node_modules/resolve/test/resolver_sync.js | 358 + node_modules/resolve/test/shadowed_core.js | 54 + .../shadowed_core/node_modules/util/index.js | 0 node_modules/resolve/test/subdirs.js | 13 + node_modules/resolve/test/symlinks.js | 176 + node_modules/ret/LICENSE | 19 + node_modules/ret/README.md | 183 + node_modules/ret/package.json | 35 + node_modules/rimraf/LICENSE | 15 + node_modules/rimraf/README.md | 101 + node_modules/rimraf/bin.js | 50 + node_modules/rimraf/package.json | 29 + node_modules/rimraf/rimraf.js | 372 + node_modules/safe-buffer/LICENSE | 21 + node_modules/safe-buffer/README.md | 584 + node_modules/safe-buffer/index.d.ts | 187 + node_modules/safe-buffer/index.js | 65 + node_modules/safe-buffer/package.json | 51 + node_modules/safe-regex/.travis.yml | 4 + node_modules/safe-regex/LICENSE | 18 + node_modules/safe-regex/example/safe.js | 3 + node_modules/safe-regex/index.js | 43 + node_modules/safe-regex/package.json | 43 + node_modules/safe-regex/readme.markdown | 65 + node_modules/safe-regex/test/regex.js | 50 + node_modules/safer-buffer/LICENSE | 21 + node_modules/safer-buffer/Porting-Buffer.md | 268 + node_modules/safer-buffer/Readme.md | 156 + node_modules/safer-buffer/dangerous.js | 58 + node_modules/safer-buffer/package.json | 34 + node_modules/safer-buffer/safer.js | 77 + node_modules/safer-buffer/tests.js | 406 + node_modules/sass-graph/CHANGELOG.md | 127 + .../node_modules/ansi-regex/index.js | 14 + .../node_modules/ansi-regex/license | 9 + .../node_modules/ansi-regex/package.json | 53 + .../node_modules/ansi-regex/readme.md | 87 + .../node_modules/camelcase/index.d.ts | 63 + .../node_modules/camelcase/index.js | 76 + .../sass-graph/node_modules/camelcase/license | 9 + .../node_modules/camelcase/package.json | 43 + .../node_modules/camelcase/readme.md | 99 + .../node_modules/cliui/CHANGELOG.md | 65 + .../sass-graph/node_modules/cliui/LICENSE.txt | 14 + .../sass-graph/node_modules/cliui/README.md | 115 + .../sass-graph/node_modules/cliui/index.js | 324 + .../node_modules/cliui/package.json | 67 + .../sass-graph/node_modules/find-up/index.js | 46 + .../sass-graph/node_modules/find-up/license | 9 + .../node_modules/find-up/package.json | 50 + .../sass-graph/node_modules/find-up/readme.md | 87 + .../node_modules/get-caller-file/LICENSE.md | 6 + .../node_modules/get-caller-file/README.md | 41 + .../node_modules/get-caller-file/index.d.ts | 2 + .../node_modules/get-caller-file/index.js | 22 + .../node_modules/get-caller-file/index.js.map | 1 + .../node_modules/get-caller-file/package.json | 42 + .../require-main-filename/CHANGELOG.md | 26 + .../require-main-filename/LICENSE.txt | 14 + .../require-main-filename/README.md | 26 + .../require-main-filename/index.js | 18 + .../require-main-filename/package.json | 35 + .../node_modules/string-width/index.js | 39 + .../node_modules/string-width/license | 9 + .../node_modules/string-width/package.json | 56 + .../node_modules/string-width/readme.md | 45 + .../node_modules/strip-ansi/index.d.ts | 15 + .../node_modules/strip-ansi/index.js | 7 + .../node_modules/strip-ansi/license | 9 + .../node_modules/strip-ansi/package.json | 54 + .../node_modules/strip-ansi/readme.md | 61 + .../node_modules/which-module/CHANGELOG.md | 26 + .../node_modules/which-module/LICENSE | 13 + .../node_modules/which-module/README.md | 55 + .../node_modules/which-module/index.js | 9 + .../node_modules/which-module/package.json | 41 + .../node_modules/wrap-ansi/index.js | 188 + .../sass-graph/node_modules/wrap-ansi/license | 9 + .../node_modules/wrap-ansi/package.json | 61 + .../node_modules/wrap-ansi/readme.md | 108 + .../sass-graph/node_modules/y18n/CHANGELOG.md | 28 + .../sass-graph/node_modules/y18n/LICENSE | 13 + .../sass-graph/node_modules/y18n/README.md | 109 + .../sass-graph/node_modules/y18n/index.js | 188 + .../sass-graph/node_modules/y18n/package.json | 39 + .../node_modules/yargs-parser/CHANGELOG.md | 467 + .../node_modules/yargs-parser/LICENSE.txt | 14 + .../node_modules/yargs-parser/README.md | 396 + .../node_modules/yargs-parser/index.js | 916 + .../node_modules/yargs-parser/package.json | 47 + .../node_modules/yargs/CHANGELOG.md | 1335 ++ .../sass-graph/node_modules/yargs/LICENSE | 22 + .../sass-graph/node_modules/yargs/README.md | 122 + .../sass-graph/node_modules/yargs/index.js | 32 + .../node_modules/yargs/locales/be.json | 39 + .../node_modules/yargs/locales/de.json | 39 + .../node_modules/yargs/locales/en.json | 42 + .../node_modules/yargs/locales/es.json | 39 + .../node_modules/yargs/locales/fr.json | 37 + .../node_modules/yargs/locales/hi.json | 42 + .../node_modules/yargs/locales/hu.json | 39 + .../node_modules/yargs/locales/id.json | 43 + .../node_modules/yargs/locales/it.json | 39 + .../node_modules/yargs/locales/ja.json | 42 + .../node_modules/yargs/locales/ko.json | 42 + .../node_modules/yargs/locales/nb.json | 37 + .../node_modules/yargs/locales/nl.json | 42 + .../node_modules/yargs/locales/nn.json | 39 + .../node_modules/yargs/locales/pirate.json | 13 + .../node_modules/yargs/locales/pl.json | 42 + .../node_modules/yargs/locales/pt.json | 38 + .../node_modules/yargs/locales/pt_BR.json | 42 + .../node_modules/yargs/locales/ru.json | 39 + .../node_modules/yargs/locales/th.json | 39 + .../node_modules/yargs/locales/tr.json | 41 + .../node_modules/yargs/locales/zh_CN.json | 41 + .../node_modules/yargs/locales/zh_TW.json | 40 + .../node_modules/yargs/package.json | 78 + .../sass-graph/node_modules/yargs/yargs.js | 1215 ++ node_modules/sass-graph/package.json | 38 + node_modules/sass-graph/parse-imports.js | 64 + node_modules/sass-graph/readme.md | 123 + node_modules/sass-graph/sass-graph.js | 160 + node_modules/scss-tokenizer/LICENSE | 22 + node_modules/scss-tokenizer/README.md | 50 + node_modules/scss-tokenizer/index.js | 1 + .../node_modules/source-map/README.md | 510 + .../source-map/build/assert-shim.js | 56 + .../source-map/build/mini-require.js | 152 + .../source-map/build/prefix-source-map.jsm | 21 + .../source-map/build/prefix-utils.jsm | 18 + .../source-map/build/suffix-browser.js | 8 + .../source-map/build/suffix-source-map.jsm | 6 + .../source-map/build/suffix-utils.jsm | 21 + .../source-map/build/test-prefix.js | 8 + .../source-map/build/test-suffix.js | 3 + .../node_modules/source-map/package.json | 68 + node_modules/scss-tokenizer/package.json | 44 + .../semver-greatest-satisfied-range/LICENSE | 21 + .../semver-greatest-satisfied-range/README.md | 48 + .../semver-greatest-satisfied-range/index.js | 19 + .../package.json | 48 + node_modules/semver/LICENSE | 15 + node_modules/semver/README.md | 350 + node_modules/semver/package.json | 22 + node_modules/semver/range.bnf | 16 + node_modules/semver/semver.js | 1203 ++ node_modules/set-blocking/CHANGELOG.md | 26 + node_modules/set-blocking/LICENSE.txt | 14 + node_modules/set-blocking/README.md | 31 + node_modules/set-blocking/index.js | 7 + node_modules/set-blocking/package.json | 42 + node_modules/set-value/LICENSE | 21 + node_modules/set-value/README.md | 150 + node_modules/set-value/index.js | 55 + node_modules/set-value/package.json | 79 + node_modules/signal-exit/CHANGELOG.md | 35 + node_modules/signal-exit/LICENSE.txt | 16 + node_modules/signal-exit/README.md | 39 + node_modules/signal-exit/index.js | 163 + node_modules/signal-exit/package.json | 38 + node_modules/signal-exit/signals.js | 53 + node_modules/snapdragon-node/LICENSE | 21 + node_modules/snapdragon-node/README.md | 453 + node_modules/snapdragon-node/index.js | 492 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 95 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 62 + node_modules/snapdragon-node/package.json | 76 + node_modules/snapdragon-util/LICENSE | 21 + node_modules/snapdragon-util/README.md | 807 + node_modules/snapdragon-util/index.js | 1019 + node_modules/snapdragon-util/package.json | 65 + node_modules/snapdragon/LICENSE | 21 + node_modules/snapdragon/README.md | 321 + node_modules/snapdragon/index.js | 174 + .../node_modules/source-map/CHANGELOG.md | 301 + .../node_modules/source-map/LICENSE | 28 + .../node_modules/source-map/README.md | 729 + .../source-map/dist/source-map.debug.js | 3091 +++ .../source-map/dist/source-map.js | 3090 +++ .../source-map/dist/source-map.min.js | 2 + .../source-map/dist/source-map.min.js.map | 1 + .../node_modules/source-map/package.json | 72 + .../node_modules/source-map/source-map.js | 8 + node_modules/snapdragon/package.json | 79 + node_modules/source-map-resolve/LICENSE | 22 + node_modules/source-map-resolve/changelog.md | 108 + .../source-map-resolve/node_modules/.bin/atob | 1 + node_modules/source-map-resolve/package.json | 47 + node_modules/source-map-resolve/readme.md | 231 + .../source-map-resolve/source-map-resolve.js | 348 + node_modules/source-map-url/.jshintrc | 43 + node_modules/source-map-url/LICENSE | 21 + node_modules/source-map-url/bower.json | 20 + node_modules/source-map-url/changelog.md | 52 + node_modules/source-map-url/component.json | 18 + node_modules/source-map-url/package.json | 39 + node_modules/source-map-url/readme.md | 97 + node_modules/source-map-url/source-map-url.js | 57 + .../source-map-url/test/source-map-url.js | 402 + node_modules/source-map-url/x-package.json5 | 55 + node_modules/source-map/CHANGELOG.md | 301 + node_modules/source-map/LICENSE | 28 + node_modules/source-map/README.md | 742 + .../source-map/dist/source-map.debug.js | 3234 +++ node_modules/source-map/dist/source-map.js | 3233 +++ .../source-map/dist/source-map.min.js | 2 + .../source-map/dist/source-map.min.js.map | 1 + node_modules/source-map/package.json | 73 + node_modules/source-map/source-map.d.ts | 98 + node_modules/source-map/source-map.js | 8 + node_modules/sparkles/LICENSE | 22 + node_modules/sparkles/README.md | 62 + node_modules/sparkles/index.js | 45 + node_modules/sparkles/package.json | 42 + node_modules/spdx-correct/LICENSE | 202 + node_modules/spdx-correct/README.md | 14 + node_modules/spdx-correct/index.js | 364 + node_modules/spdx-correct/package.json | 39 + node_modules/spdx-exceptions/README.md | 36 + node_modules/spdx-exceptions/index.json | 40 + node_modules/spdx-exceptions/package.json | 17 + node_modules/spdx-expression-parse/AUTHORS | 4 + node_modules/spdx-expression-parse/LICENSE | 22 + node_modules/spdx-expression-parse/README.md | 91 + node_modules/spdx-expression-parse/index.js | 8 + .../spdx-expression-parse/package.json | 39 + node_modules/spdx-expression-parse/parse.js | 138 + node_modules/spdx-expression-parse/scan.js | 131 + node_modules/spdx-license-ids/README.md | 52 + node_modules/spdx-license-ids/deprecated.json | 26 + node_modules/spdx-license-ids/index.json | 420 + node_modules/spdx-license-ids/package.json | 40 + node_modules/split-string/LICENSE | 21 + node_modules/split-string/README.md | 321 + node_modules/split-string/index.js | 171 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 97 + .../node_modules/extend-shallow/index.js | 60 + .../node_modules/extend-shallow/package.json | 83 + .../node_modules/is-extendable/LICENSE | 21 + .../node_modules/is-extendable/README.md | 88 + .../node_modules/is-extendable/index.d.ts | 5 + .../node_modules/is-extendable/index.js | 14 + .../node_modules/is-extendable/package.json | 67 + node_modules/split-string/package.json | 65 + node_modules/sshpk/.npmignore | 9 + node_modules/sshpk/.travis.yml | 11 + node_modules/sshpk/LICENSE | 18 + node_modules/sshpk/README.md | 804 + node_modules/sshpk/man/man1/sshpk-conv.1 | 135 + node_modules/sshpk/man/man1/sshpk-sign.1 | 81 + node_modules/sshpk/man/man1/sshpk-verify.1 | 68 + node_modules/sshpk/package.json | 60 + node_modules/stack-trace/.npmignore | 1 + node_modules/stack-trace/License | 19 + node_modules/stack-trace/Makefile | 11 + node_modules/stack-trace/Readme.md | 98 + node_modules/stack-trace/package.json | 21 + node_modules/static-extend/LICENSE | 21 + node_modules/static-extend/index.js | 90 + node_modules/static-extend/package.json | 63 + node_modules/stdout-stream/.travis.yml | 6 + node_modules/stdout-stream/LICENSE | 20 + node_modules/stdout-stream/README.md | 45 + node_modules/stdout-stream/index.js | 53 + node_modules/stdout-stream/package.json | 16 + .../stdout-stream/test/fixtures/end.js | 8 + .../test/fixtures/hello-world.js | 4 + node_modules/stdout-stream/test/index.js | 33 + node_modules/stream-exhaust/README.md | 33 + node_modules/stream-exhaust/index.js | 34 + node_modules/stream-exhaust/package.json | 24 + node_modules/stream-exhaust/test.js | 209 + node_modules/stream-shift/.travis.yml | 6 + node_modules/stream-shift/LICENSE | 21 + node_modules/stream-shift/README.md | 25 + node_modules/stream-shift/index.js | 20 + node_modules/stream-shift/package.json | 25 + node_modules/stream-shift/test.js | 48 + node_modules/string-width/index.js | 37 + node_modules/string-width/license | 21 + .../is-fullwidth-code-point/index.js | 46 + .../is-fullwidth-code-point/license | 21 + .../is-fullwidth-code-point/package.json | 45 + .../is-fullwidth-code-point/readme.md | 39 + node_modules/string-width/package.json | 56 + node_modules/string-width/readme.md | 42 + node_modules/string_decoder/.travis.yml | 50 + node_modules/string_decoder/LICENSE | 48 + node_modules/string_decoder/README.md | 47 + .../node_modules/safe-buffer/LICENSE | 21 + .../node_modules/safe-buffer/README.md | 584 + .../node_modules/safe-buffer/index.d.ts | 187 + .../node_modules/safe-buffer/index.js | 62 + .../node_modules/safe-buffer/package.json | 37 + node_modules/string_decoder/package.json | 31 + node_modules/strip-ansi/index.js | 6 + node_modules/strip-ansi/license | 21 + node_modules/strip-ansi/package.json | 57 + node_modules/strip-ansi/readme.md | 33 + node_modules/strip-bom-string/LICENSE | 21 + node_modules/strip-bom-string/README.md | 66 + node_modules/strip-bom-string/index.js | 15 + node_modules/strip-bom-string/package.json | 60 + node_modules/strip-bom/index.js | 17 + node_modules/strip-bom/license | 21 + node_modules/strip-bom/package.json | 42 + node_modules/strip-bom/readme.md | 39 + node_modules/strip-indent/cli.js | 49 + node_modules/strip-indent/index.js | 16 + node_modules/strip-indent/license | 21 + node_modules/strip-indent/package.json | 46 + node_modules/strip-indent/readme.md | 61 + node_modules/supports-color/browser.js | 5 + node_modules/supports-color/index.js | 131 + node_modules/supports-color/license | 9 + node_modules/supports-color/package.json | 53 + node_modules/supports-color/readme.md | 66 + node_modules/sver-compat/.npmignore | 2 + node_modules/sver-compat/.travis.yml | 9 + node_modules/sver-compat/LICENSE | 10 + node_modules/sver-compat/README.md | 160 + node_modules/sver-compat/convert-range.js | 132 + node_modules/sver-compat/package.json | 30 + node_modules/sver-compat/sver.js | 400 + .../0471d9cf-687f-4ae8-84a5-ce7468becd03.json | 1 + .../12bca2bc-6a2b-4f45-abc7-8483922a524d.json | 1 + .../37d58de4-deea-4808-bb77-d27685bd1501.json | 1 + .../5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json | 1 + .../5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json | 1 + .../7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json | 1 + .../9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json | 1 + .../c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json | 1 + .../ea0194cb-f599-402f-8876-84fb8251e8db.json | 1 + .../eda6b7a3-5e15-440f-8619-e11a15a07f77.json | 1 + .../fb518800-240c-42ff-811f-79e92708d9db.json | 1 + .../fdecfc06-a944-4897-9530-e08f62883fc1.json | 1 + .../0471d9cf-687f-4ae8-84a5-ce7468becd03.json | 1 + .../12bca2bc-6a2b-4f45-abc7-8483922a524d.json | 1 + .../37d58de4-deea-4808-bb77-d27685bd1501.json | 1 + .../5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json | 1 + .../5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json | 1 + .../7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json | 1 + .../9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json | 1 + .../c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json | 1 + .../ea0194cb-f599-402f-8876-84fb8251e8db.json | 1 + .../eda6b7a3-5e15-440f-8619-e11a15a07f77.json | 1 + .../fb518800-240c-42ff-811f-79e92708d9db.json | 1 + .../fdecfc06-a944-4897-9530-e08f62883fc1.json | 1 + .../tar/.nyc_output/processinfo/index.json | 1 + node_modules/tar/.travis.yml | 4 + node_modules/tar/LICENSE | 12 + node_modules/tar/README.md | 50 + .../tar/coverage/lcov-report/base.css | 212 + .../tar/coverage/lcov-report/index.html | 106 + .../tar/coverage/lcov-report/prettify.css | 1 + .../tar/coverage/lcov-report/prettify.js | 1 + .../lcov-report/sort-arrow-sprite.png | Bin 0 -> 209 bytes .../tar/coverage/lcov-report/sorter.js | 158 + .../tar/coverage/lcov-report/tar/index.html | 93 + .../coverage/lcov-report/tar/index.js.html | 119 + node_modules/tar/coverage/lcov.info | 3690 ++++ node_modules/tar/examples/extracter.js | 19 + node_modules/tar/examples/packer.js | 24 + node_modules/tar/examples/reader.js | 36 + node_modules/tar/package.json | 26 + node_modules/tar/tar.js | 173 + node_modules/tar/test/00-setup-fixtures.js | 53 + .../tar/test/cb-never-called-1.0.1.tgz | Bin 0 -> 4096 bytes node_modules/tar/test/dir-normalization.js | 177 + node_modules/tar/test/dir-normalization.tar | Bin 0 -> 4608 bytes node_modules/tar/test/error-on-broken.js | 33 + node_modules/tar/test/extract-move.js | 132 + node_modules/tar/test/extract.js | 367 + node_modules/tar/test/fixtures.tgz | Bin 0 -> 19352 bytes node_modules/tar/test/header.js | 183 + .../tar/test/link-file-entry-collision.js | 39 + .../link-file-entry-collision/bad-link.hex | 25 + .../link-file-entry-collision/bad-link.tar | Bin 0 -> 3584 bytes node_modules/tar/test/pack-no-proprietary.js | 886 + node_modules/tar/test/pack.js | 952 + node_modules/tar/test/parse-discard.js | 29 + node_modules/tar/test/parse.js | 359 + node_modules/tar/test/zz-cleanup.js | 20 + node_modules/through2-filter/LICENSE | 9 + node_modules/through2-filter/README.md | 79 + node_modules/through2-filter/index.js | 50 + .../node_modules/through2/LICENSE.md | 9 + .../node_modules/through2/README.md | 134 + .../node_modules/through2/package.json | 33 + .../node_modules/through2/through2.js | 96 + node_modules/through2-filter/package.json | 48 + node_modules/through2/LICENSE.md | 9 + node_modules/through2/README.md | 140 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 106 + .../readable-stream/errors-browser.js | 127 + .../node_modules/readable-stream/errors.js | 116 + .../readable-stream/experimentalWarning.js | 17 + .../node_modules/readable-stream/package.json | 68 + .../readable-stream/readable-browser.js | 9 + .../node_modules/readable-stream/readable.js | 16 + .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../node_modules/string_decoder/package.json | 34 + node_modules/through2/package.json | 38 + node_modules/through2/through2.js | 83 + node_modules/time-stamp/LICENSE | 21 + node_modules/time-stamp/README.md | 132 + node_modules/time-stamp/index.js | 56 + node_modules/time-stamp/package.json | 77 + node_modules/timers-ext/.editorconfig | 14 + node_modules/timers-ext/CHANGELOG.md | 55 + node_modules/timers-ext/CHANGES | 26 + node_modules/timers-ext/LICENSE | 15 + node_modules/timers-ext/README.md | 69 + node_modules/timers-ext/delay.js | 21 + node_modules/timers-ext/max-timeout.js | 3 + node_modules/timers-ext/once.js | 42 + node_modules/timers-ext/package.json | 42 + .../timers-ext/promise/.eslintrc.json | 3 + node_modules/timers-ext/promise/sleep.js | 21 + node_modules/timers-ext/promise_/timeout.js | 43 + node_modules/timers-ext/test/.eslintrc.json | 6 + node_modules/timers-ext/test/delay.js | 27 + node_modules/timers-ext/test/max-timeout.js | 13 + node_modules/timers-ext/test/once.js | 42 + node_modules/timers-ext/test/promise/sleep.js | 34 + .../timers-ext/test/promise_/.eslintrc.json | 3 + .../timers-ext/test/promise_/timeout.js | 46 + node_modules/timers-ext/test/throttle.js | 41 + node_modules/timers-ext/test/valid-timeout.js | 10 + node_modules/timers-ext/throttle.js | 33 + node_modules/timers-ext/valid-timeout.js | 10 + node_modules/to-absolute-glob/LICENSE | 21 + node_modules/to-absolute-glob/index.js | 70 + node_modules/to-absolute-glob/package.json | 72 + node_modules/to-absolute-glob/readme.md | 155 + node_modules/to-object-path/LICENSE | 21 + node_modules/to-object-path/README.md | 71 + node_modules/to-object-path/index.js | 33 + node_modules/to-object-path/package.json | 48 + node_modules/to-regex-range/LICENSE | 21 + node_modules/to-regex-range/README.md | 281 + node_modules/to-regex-range/index.js | 294 + node_modules/to-regex-range/package.json | 86 + node_modules/to-regex/LICENSE | 21 + node_modules/to-regex/README.md | 205 + node_modules/to-regex/index.js | 155 + .../node_modules/define-property/CHANGELOG.md | 82 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 117 + .../node_modules/define-property/index.js | 38 + .../node_modules/define-property/package.json | 67 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 97 + .../node_modules/extend-shallow/index.js | 60 + .../node_modules/extend-shallow/package.json | 83 + .../node_modules/is-extendable/LICENSE | 21 + .../node_modules/is-extendable/README.md | 88 + .../node_modules/is-extendable/index.d.ts | 5 + .../node_modules/is-extendable/index.js | 14 + .../node_modules/is-extendable/package.json | 67 + node_modules/to-regex/package.json | 62 + node_modules/to-through/LICENSE | 21 + node_modules/to-through/README.md | 56 + node_modules/to-through/index.js | 60 + .../node_modules/through2/LICENSE.md | 9 + .../node_modules/through2/README.md | 134 + .../node_modules/through2/package.json | 33 + .../node_modules/through2/through2.js | 96 + node_modules/to-through/package.json | 46 + node_modules/tough-cookie/LICENSE | 12 + node_modules/tough-cookie/README.md | 527 + node_modules/tough-cookie/package.json | 78 + node_modules/trim-newlines/index.js | 13 + node_modules/trim-newlines/license | 21 + node_modules/trim-newlines/package.json | 42 + node_modules/trim-newlines/readme.md | 46 + node_modules/true-case-path/LICENSE | 201 + node_modules/true-case-path/README.md | 52 + node_modules/true-case-path/index.js | 32 + node_modules/true-case-path/package.json | 29 + node_modules/tunnel-agent/LICENSE | 55 + node_modules/tunnel-agent/README.md | 4 + node_modules/tunnel-agent/index.js | 244 + node_modules/tunnel-agent/package.json | 22 + node_modules/tweetnacl/.npmignore | 4 + node_modules/tweetnacl/AUTHORS.md | 28 + node_modules/tweetnacl/CHANGELOG.md | 221 + node_modules/tweetnacl/LICENSE | 24 + .../tweetnacl/PULL_REQUEST_TEMPLATE.md | 20 + node_modules/tweetnacl/README.md | 459 + node_modules/tweetnacl/nacl-fast.js | 2388 +++ node_modules/tweetnacl/nacl-fast.min.js | 2 + node_modules/tweetnacl/nacl.d.ts | 98 + node_modules/tweetnacl/nacl.js | 1175 ++ node_modules/tweetnacl/nacl.min.js | 1 + node_modules/tweetnacl/package.json | 58 + node_modules/type/.editorconfig | 16 + node_modules/type/CHANGELOG.md | 90 + node_modules/type/LICENSE | 15 + node_modules/type/README.md | 761 + node_modules/type/array-length/coerce.js | 10 + node_modules/type/array-length/ensure.js | 10 + node_modules/type/array-like/ensure.js | 9 + node_modules/type/array-like/is.js | 21 + node_modules/type/array/ensure.js | 9 + node_modules/type/array/is.js | 27 + node_modules/type/date/ensure.js | 9 + node_modules/type/date/is.js | 26 + node_modules/type/error/ensure.js | 9 + node_modules/type/error/is.js | 45 + node_modules/type/finite/coerce.js | 8 + node_modules/type/finite/ensure.js | 10 + node_modules/type/function/ensure.js | 9 + node_modules/type/function/is.js | 19 + node_modules/type/integer/coerce.js | 11 + node_modules/type/integer/ensure.js | 10 + node_modules/type/iterable/ensure.js | 29 + node_modules/type/iterable/is.js | 32 + node_modules/type/natural-number/coerce.js | 10 + node_modules/type/natural-number/ensure.js | 10 + node_modules/type/number/coerce.js | 14 + node_modules/type/number/ensure.js | 10 + node_modules/type/object/ensure.js | 9 + node_modules/type/object/is.js | 11 + node_modules/type/package.json | 96 + node_modules/type/plain-function/ensure.js | 9 + node_modules/type/plain-function/is.js | 11 + node_modules/type/plain-object/ensure.js | 9 + node_modules/type/plain-object/is.js | 28 + node_modules/type/promise/ensure.js | 9 + node_modules/type/promise/is.js | 27 + node_modules/type/prototype/is.js | 13 + node_modules/type/reg-exp/ensure.js | 9 + node_modules/type/reg-exp/is.js | 37 + node_modules/type/safe-integer/coerce.js | 13 + node_modules/type/safe-integer/ensure.js | 10 + node_modules/type/string/coerce.js | 23 + node_modules/type/string/ensure.js | 10 + .../test/_lib/arrow-function-if-supported.js | 4 + .../type/test/_lib/class-if-supported.js | 4 + node_modules/type/test/array-length/coerce.js | 47 + node_modules/type/test/array-length/ensure.js | 19 + node_modules/type/test/array-like/ensure.js | 24 + node_modules/type/test/array-like/is.js | 47 + node_modules/type/test/array/ensure.js | 20 + node_modules/type/test/array/is.js | 41 + node_modules/type/test/date/ensure.js | 20 + node_modules/type/test/date/is.js | 46 + node_modules/type/test/error/ensure.js | 20 + node_modules/type/test/error/is.js | 50 + node_modules/type/test/finite/coerce.js | 40 + node_modules/type/test/finite/ensure.js | 17 + node_modules/type/test/function/ensure.js | 20 + node_modules/type/test/function/is.js | 46 + node_modules/type/test/integer/coerce.js | 49 + node_modules/type/test/integer/ensure.js | 17 + node_modules/type/test/iterable/ensure.js | 42 + node_modules/type/test/iterable/is.js | 57 + .../type/test/natural-number/coerce.js | 47 + .../type/test/natural-number/ensure.js | 19 + node_modules/type/test/number/coerce.js | 40 + node_modules/type/test/number/ensure.js | 17 + node_modules/type/test/object/ensure.js | 20 + node_modules/type/test/object/is.js | 30 + .../type/test/plain-function/ensure.js | 20 + node_modules/type/test/plain-function/is.js | 56 + node_modules/type/test/plain-object/ensure.js | 20 + node_modules/type/test/plain-object/is.js | 47 + node_modules/type/test/promise/ensure.js | 20 + node_modules/type/test/promise/is.js | 39 + node_modules/type/test/prototype/is.js | 39 + node_modules/type/test/reg-exp/ensure.js | 20 + node_modules/type/test/reg-exp/is.js | 47 + node_modules/type/test/safe-integer/coerce.js | 49 + node_modules/type/test/safe-integer/ensure.js | 19 + node_modules/type/test/string/coerce.js | 36 + node_modules/type/test/string/ensure.js | 17 + node_modules/type/test/thenable/ensure.js | 20 + node_modules/type/test/thenable/is.js | 44 + node_modules/type/test/time-value/coerce.js | 47 + node_modules/type/test/time-value/ensure.js | 17 + node_modules/type/test/value/ensure.js | 20 + node_modules/type/test/value/is.js | 29 + node_modules/type/thenable/ensure.js | 9 + node_modules/type/thenable/is.js | 9 + node_modules/type/time-value/coerce.js | 12 + node_modules/type/time-value/ensure.js | 10 + node_modules/type/value/ensure.js | 9 + node_modules/type/value/is.js | 6 + node_modules/typedarray/.travis.yml | 4 + node_modules/typedarray/LICENSE | 35 + node_modules/typedarray/example/tarray.js | 4 + node_modules/typedarray/index.js | 630 + node_modules/typedarray/package.json | 55 + node_modules/typedarray/readme.markdown | 61 + .../typedarray/test/server/undef_globals.js | 19 + node_modules/typedarray/test/tarray.js | 10 + node_modules/unc-path-regex/LICENSE | 21 + node_modules/unc-path-regex/README.md | 88 + node_modules/unc-path-regex/index.js | 5 + node_modules/unc-path-regex/package.json | 56 + node_modules/undertaker-registry/LICENSE | 21 + node_modules/undertaker-registry/README.md | 210 + node_modules/undertaker-registry/index.js | 30 + node_modules/undertaker-registry/package.json | 42 + node_modules/undertaker/LICENSE | 21 + node_modules/undertaker/README.md | 324 + node_modules/undertaker/index.js | 47 + node_modules/undertaker/package.json | 61 + node_modules/union-value/LICENSE | 21 + node_modules/union-value/README.md | 73 + node_modules/union-value/index.js | 30 + node_modules/union-value/package.json | 70 + node_modules/unique-stream/LICENSE | 20 + node_modules/unique-stream/README.md | 134 + node_modules/unique-stream/index.js | 48 + node_modules/unique-stream/package.json | 32 + node_modules/unset-value/LICENSE | 21 + node_modules/unset-value/README.md | 131 + node_modules/unset-value/index.js | 32 + .../node_modules/has-value/LICENSE | 21 + .../node_modules/has-value/README.md | 130 + .../node_modules/has-value/index.js | 19 + .../has-value/node_modules/isobject/LICENSE | 21 + .../has-value/node_modules/isobject/README.md | 112 + .../has-value/node_modules/isobject/index.js | 14 + .../node_modules/isobject/package.json | 67 + .../node_modules/has-value/package.json | 81 + .../node_modules/has-values/LICENSE | 21 + .../node_modules/has-values/README.md | 114 + .../node_modules/has-values/index.js | 36 + .../node_modules/has-values/package.json | 75 + node_modules/unset-value/package.json | 71 + node_modules/upath/LICENSE | 22 + node_modules/upath/build/code/upath.js | 171 + node_modules/upath/package.json | 60 + node_modules/upath/readme.md | 342 + node_modules/upath/upath.d.ts | 239 + node_modules/uri-js/LICENSE | 11 + node_modules/uri-js/README.md | 203 + node_modules/uri-js/dist/es5/uri.all.d.ts | 59 + node_modules/uri-js/dist/es5/uri.all.js | 1443 ++ node_modules/uri-js/dist/es5/uri.all.js.map | 1 + node_modules/uri-js/dist/es5/uri.all.min.d.ts | 59 + node_modules/uri-js/dist/es5/uri.all.min.js | 3 + .../uri-js/dist/es5/uri.all.min.js.map | 1 + node_modules/uri-js/dist/esnext/index.d.ts | 1 + node_modules/uri-js/dist/esnext/index.js | 17 + node_modules/uri-js/dist/esnext/index.js.map | 1 + .../uri-js/dist/esnext/regexps-iri.d.ts | 3 + .../uri-js/dist/esnext/regexps-iri.js | 3 + .../uri-js/dist/esnext/regexps-iri.js.map | 1 + .../uri-js/dist/esnext/regexps-uri.d.ts | 4 + .../uri-js/dist/esnext/regexps-uri.js | 42 + .../uri-js/dist/esnext/regexps-uri.js.map | 1 + .../uri-js/dist/esnext/schemes/http.d.ts | 3 + .../uri-js/dist/esnext/schemes/http.js | 28 + .../uri-js/dist/esnext/schemes/http.js.map | 1 + .../uri-js/dist/esnext/schemes/https.d.ts | 3 + .../uri-js/dist/esnext/schemes/https.js | 9 + .../uri-js/dist/esnext/schemes/https.js.map | 1 + .../uri-js/dist/esnext/schemes/mailto.d.ts | 12 + .../uri-js/dist/esnext/schemes/mailto.js | 148 + .../uri-js/dist/esnext/schemes/mailto.js.map | 1 + .../uri-js/dist/esnext/schemes/urn-uuid.d.ts | 7 + .../uri-js/dist/esnext/schemes/urn-uuid.js | 23 + .../dist/esnext/schemes/urn-uuid.js.map | 1 + .../uri-js/dist/esnext/schemes/urn.d.ts | 10 + .../uri-js/dist/esnext/schemes/urn.js | 49 + .../uri-js/dist/esnext/schemes/urn.js.map | 1 + .../uri-js/dist/esnext/schemes/ws.d.ts | 7 + node_modules/uri-js/dist/esnext/schemes/ws.js | 41 + .../uri-js/dist/esnext/schemes/ws.js.map | 1 + .../uri-js/dist/esnext/schemes/wss.d.ts | 3 + .../uri-js/dist/esnext/schemes/wss.js | 9 + .../uri-js/dist/esnext/schemes/wss.js.map | 1 + node_modules/uri-js/dist/esnext/uri.d.ts | 59 + node_modules/uri-js/dist/esnext/uri.js | 480 + node_modules/uri-js/dist/esnext/uri.js.map | 1 + node_modules/uri-js/dist/esnext/util.d.ts | 6 + node_modules/uri-js/dist/esnext/util.js | 36 + node_modules/uri-js/dist/esnext/util.js.map | 1 + node_modules/uri-js/package.json | 77 + node_modules/uri-js/yarn.lock | 2558 +++ node_modules/urix/.jshintrc | 42 + node_modules/urix/LICENSE | 21 + node_modules/urix/index.js | 17 + node_modules/urix/package.json | 25 + node_modules/urix/readme.md | 46 + node_modules/urix/test/index.js | 43 + node_modules/use/LICENSE | 21 + node_modules/use/README.md | 90 + node_modules/use/index.js | 155 + node_modules/use/package.json | 66 + node_modules/util-deprecate/History.md | 16 + node_modules/util-deprecate/LICENSE | 24 + node_modules/util-deprecate/README.md | 53 + node_modules/util-deprecate/browser.js | 67 + node_modules/util-deprecate/node.js | 6 + node_modules/util-deprecate/package.json | 27 + node_modules/uuid/AUTHORS | 5 + node_modules/uuid/CHANGELOG.md | 119 + node_modules/uuid/LICENSE.md | 21 + node_modules/uuid/README.md | 276 + node_modules/uuid/index.js | 8 + node_modules/uuid/package.json | 49 + node_modules/uuid/v1.js | 109 + node_modules/uuid/v3.js | 4 + node_modules/uuid/v4.js | 29 + node_modules/uuid/v5.js | 3 + node_modules/v8flags/LICENSE | 21 + node_modules/v8flags/README.md | 64 + node_modules/v8flags/config-path.js | 38 + node_modules/v8flags/index.js | 186 + node_modules/v8flags/package.json | 48 + .../validate-npm-package-license/LICENSE | 202 + .../validate-npm-package-license/README.md | 113 + .../validate-npm-package-license/index.js | 86 + .../validate-npm-package-license/package.json | 28 + node_modules/value-or-function/LICENSE | 21 + node_modules/value-or-function/README.md | 132 + node_modules/value-or-function/index.js | 113 + node_modules/value-or-function/package.json | 43 + node_modules/verror/.npmignore | 9 + node_modules/verror/CHANGES.md | 28 + node_modules/verror/CONTRIBUTING.md | 19 + node_modules/verror/LICENSE | 19 + node_modules/verror/README.md | 528 + .../node_modules/extsprintf/.gitmodules | 3 + .../verror/node_modules/extsprintf/.npmignore | 2 + .../verror/node_modules/extsprintf/CHANGES.md | 10 + .../node_modules/extsprintf/CONTRIBUTING.md | 20 + .../verror/node_modules/extsprintf/LICENSE | 19 + .../verror/node_modules/extsprintf/Makefile | 30 + .../node_modules/extsprintf/Makefile.targ | 285 + .../verror/node_modules/extsprintf/README.md | 46 + .../node_modules/extsprintf/jsl.node.conf | 137 + .../node_modules/extsprintf/package.json | 14 + .../node_modules/extsprintf/test/tst.basic.js | 118 + .../extsprintf/test/tst.invalid.js | 78 + node_modules/verror/package.json | 22 + node_modules/vinyl-fs/LICENSE | 21 + node_modules/vinyl-fs/README.md | 341 + node_modules/vinyl-fs/index.js | 7 + .../vinyl-fs/node_modules/through2/LICENSE.md | 9 + .../vinyl-fs/node_modules/through2/README.md | 134 + .../node_modules/through2/package.json | 33 + .../node_modules/through2/through2.js | 96 + node_modules/vinyl-fs/package.json | 68 + node_modules/vinyl-sourcemap/LICENSE | 21 + node_modules/vinyl-sourcemap/README.md | 79 + node_modules/vinyl-sourcemap/index.js | 66 + node_modules/vinyl-sourcemap/package.json | 53 + node_modules/vinyl-sourcemaps-apply/.jshintrc | 4 + .../vinyl-sourcemaps-apply/.npmignore | 2 + node_modules/vinyl-sourcemaps-apply/README.md | 42 + node_modules/vinyl-sourcemaps-apply/index.js | 39 + .../node_modules/source-map/CHANGELOG.md | 301 + .../node_modules/source-map/LICENSE | 28 + .../node_modules/source-map/README.md | 729 + .../source-map/dist/source-map.debug.js | 3091 +++ .../source-map/dist/source-map.js | 3090 +++ .../source-map/dist/source-map.min.js | 2 + .../source-map/dist/source-map.min.js.map | 1 + .../node_modules/source-map/package.json | 72 + .../node_modules/source-map/source-map.js | 8 + .../vinyl-sourcemaps-apply/package.json | 22 + node_modules/vinyl/LICENSE | 21 + node_modules/vinyl/README.md | 452 + node_modules/vinyl/index.js | 338 + node_modules/vinyl/package.json | 54 + node_modules/which-module/CHANGELOG.md | 11 + node_modules/which-module/LICENSE | 13 + node_modules/which-module/README.md | 55 + node_modules/which-module/index.js | 9 + node_modules/which-module/package.json | 41 + node_modules/which/CHANGELOG.md | 152 + node_modules/which/LICENSE | 15 + node_modules/which/README.md | 51 + node_modules/which/package.json | 30 + node_modules/which/which.js | 135 + node_modules/wide-align/LICENSE | 14 + node_modules/wide-align/README.md | 47 + node_modules/wide-align/align.js | 65 + .../node_modules/ansi-regex/index.js | 10 + .../node_modules/ansi-regex/license | 9 + .../node_modules/ansi-regex/package.json | 53 + .../node_modules/ansi-regex/readme.md | 46 + .../node_modules/string-width/index.js | 36 + .../node_modules/string-width/license | 9 + .../node_modules/string-width/package.json | 55 + .../node_modules/string-width/readme.md | 42 + .../node_modules/strip-ansi/index.js | 4 + .../node_modules/strip-ansi/license | 9 + .../node_modules/strip-ansi/package.json | 52 + .../node_modules/strip-ansi/readme.md | 39 + node_modules/wide-align/package.json | 33 + node_modules/wrap-ansi/index.js | 168 + node_modules/wrap-ansi/license | 21 + node_modules/wrap-ansi/package.json | 68 + node_modules/wrap-ansi/readme.md | 73 + node_modules/wrappy/LICENSE | 15 + node_modules/wrappy/README.md | 36 + node_modules/wrappy/package.json | 29 + node_modules/wrappy/wrappy.js | 33 + node_modules/xtend/.jshintrc | 30 + node_modules/xtend/LICENSE | 20 + node_modules/xtend/README.md | 32 + node_modules/xtend/immutable.js | 19 + node_modules/xtend/mutable.js | 17 + node_modules/xtend/package.json | 55 + node_modules/xtend/test.js | 103 + node_modules/y18n/CHANGELOG.md | 6 + node_modules/y18n/LICENSE | 13 + node_modules/y18n/README.md | 91 + node_modules/y18n/index.js | 172 + node_modules/y18n/package.json | 37 + node_modules/yallist/LICENSE | 15 + node_modules/yallist/README.md | 204 + node_modules/yallist/iterator.js | 7 + node_modules/yallist/package.json | 29 + node_modules/yallist/yallist.js | 370 + node_modules/yargs-parser/CHANGELOG.md | 169 + node_modules/yargs-parser/LICENSE.txt | 14 + node_modules/yargs-parser/README.md | 257 + node_modules/yargs-parser/index.js | 753 + node_modules/yargs-parser/package.json | 44 + node_modules/yargs/CHANGELOG.md | 921 + node_modules/yargs/LICENSE | 22 + node_modules/yargs/README.md | 2017 ++ node_modules/yargs/completion.sh.hbs | 28 + node_modules/yargs/index.js | 31 + node_modules/yargs/locales/be.json | 39 + node_modules/yargs/locales/de.json | 39 + node_modules/yargs/locales/en.json | 40 + node_modules/yargs/locales/es.json | 39 + node_modules/yargs/locales/fr.json | 37 + node_modules/yargs/locales/hi.json | 39 + node_modules/yargs/locales/hu.json | 39 + node_modules/yargs/locales/id.json | 40 + node_modules/yargs/locales/it.json | 39 + node_modules/yargs/locales/ja.json | 39 + node_modules/yargs/locales/ko.json | 39 + node_modules/yargs/locales/nb.json | 37 + node_modules/yargs/locales/nl.json | 39 + node_modules/yargs/locales/pirate.json | 12 + node_modules/yargs/locales/pl.json | 39 + node_modules/yargs/locales/pt.json | 38 + node_modules/yargs/locales/pt_BR.json | 40 + node_modules/yargs/locales/ru.json | 39 + node_modules/yargs/locales/th.json | 39 + node_modules/yargs/locales/tr.json | 39 + node_modules/yargs/locales/zh_CN.json | 37 + node_modules/yargs/locales/zh_TW.json | 40 + node_modules/yargs/package.json | 80 + node_modules/yargs/yargs.js | 1126 + package.json | 11 + yarn.lock | 3336 +++ 5700 files changed, 568792 insertions(+), 2 deletions(-) create mode 100644 css/layout.css create mode 100644 css/layout.css.map create mode 100644 gulpfile.js create mode 100644 landing_page/mainpage/static/new-design/css/layout.css create mode 100644 landing_page/mainpage/static/new-design/css/layout.css.map create mode 100644 landing_page/mainpage/static/new-design/css/layout.scss create mode 100644 landing_page/mainpage/static/new-design/img/PythonRu.png create mode 100644 landing_page/mainpage/static/new-design/img/PythonRu_white.png create mode 100644 landing_page/mainpage/static/new-design/img/avatar.png create mode 100644 landing_page/mainpage/static/new-design/img/best.png create mode 100644 landing_page/mainpage/static/new-design/img/bonus.jpg create mode 100644 landing_page/mainpage/static/new-design/img/decor.png create mode 100644 landing_page/mainpage/static/new-design/img/drylabs.png create mode 100644 landing_page/mainpage/static/new-design/img/emaillove.png create mode 100644 landing_page/mainpage/static/new-design/img/event.png create mode 100644 landing_page/mainpage/static/new-design/img/event_logo.png create mode 100644 landing_page/mainpage/static/new-design/img/evrone.png create mode 100644 landing_page/mainpage/static/new-design/img/itcanfly.png create mode 100644 landing_page/mainpage/static/new-design/img/left.png create mode 100644 landing_page/mainpage/static/new-design/img/moscow_python.png create mode 100644 landing_page/mainpage/static/new-design/img/open.png create mode 100644 landing_page/mainpage/static/new-design/img/python.png create mode 100644 landing_page/mainpage/static/new-design/img/python2.png create mode 100644 landing_page/mainpage/static/new-design/img/python_week.png create mode 100644 landing_page/mainpage/static/new-design/img/right.png create mode 100644 landing_page/mainpage/static/new-design/img/search.png create mode 100644 landing_page/mainpage/static/new-design/img/single_post.png create mode 100644 landing_page/mainpage/static/new-design/img/single_post_bonus.png create mode 100644 landing_page/mainpage/static/new-design/img/single_post_image.png create mode 100644 landing_page/mainpage/static/new-design/img/social.png create mode 100644 landing_page/mainpage/static/new-design/img/speech-bubble.png create mode 100644 landing_page/mainpage/static/new-design/js/script.js create mode 100644 landing_page/mainpage/templates/new-design/blog.html create mode 100644 landing_page/mainpage/templates/new-design/events.html create mode 100644 landing_page/mainpage/templates/new-design/include/footer.html create mode 100644 landing_page/mainpage/templates/new-design/include/header.html create mode 100644 landing_page/mainpage/templates/new-design/index.html create mode 100644 landing_page/mainpage/templates/new-design/single_post.html create mode 100644 landing_page/mainpage/views_new_design.py create mode 100644 media/feedbacks/cats4.jpg create mode 100644 media/feedbacks/cats5.jpg create mode 100644 media/projects/cats4.jpg create mode 100644 media/stories/cats1.jpg create mode 120000 node_modules/.bin/acorn create mode 120000 node_modules/.bin/atob create mode 120000 node_modules/.bin/color-support create mode 120000 node_modules/.bin/gulp create mode 120000 node_modules/.bin/in-install create mode 120000 node_modules/.bin/in-publish create mode 120000 node_modules/.bin/mkdirp create mode 120000 node_modules/.bin/node-gyp create mode 120000 node_modules/.bin/node-sass create mode 120000 node_modules/.bin/nopt create mode 120000 node_modules/.bin/not-in-install create mode 120000 node_modules/.bin/not-in-publish create mode 120000 node_modules/.bin/rimraf create mode 120000 node_modules/.bin/sassgraph create mode 120000 node_modules/.bin/semver create mode 120000 node_modules/.bin/sshpk-conv create mode 120000 node_modules/.bin/sshpk-sign create mode 120000 node_modules/.bin/sshpk-verify create mode 120000 node_modules/.bin/strip-indent create mode 120000 node_modules/.bin/uuid create mode 120000 node_modules/.bin/which create mode 100644 node_modules/.yarn-integrity create mode 100644 node_modules/@gulp-sourcemaps/identity-map/LICENSE create mode 100644 node_modules/@gulp-sourcemaps/identity-map/README.md create mode 100644 node_modules/@gulp-sourcemaps/identity-map/index.js create mode 120000 node_modules/@gulp-sourcemaps/identity-map/node_modules/.bin/acorn create mode 100644 node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/LICENSE.md create mode 100644 node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/README.md create mode 100644 node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/package.json create mode 100644 node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/through2.js create mode 100644 node_modules/@gulp-sourcemaps/identity-map/package.json create mode 100644 node_modules/@gulp-sourcemaps/map-sources/LICENSE create mode 100644 node_modules/@gulp-sourcemaps/map-sources/README.md create mode 100644 node_modules/@gulp-sourcemaps/map-sources/index.js create mode 100644 node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/LICENSE.md create mode 100644 node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/README.md create mode 100644 node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/package.json create mode 100644 node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/through2.js create mode 100644 node_modules/@gulp-sourcemaps/map-sources/package.json create mode 100644 node_modules/@types/jquery/JQuery.d.ts create mode 100644 node_modules/@types/jquery/JQueryStatic.d.ts create mode 100644 node_modules/@types/jquery/LICENSE create mode 100644 node_modules/@types/jquery/README.md create mode 100644 node_modules/@types/jquery/dist/jquery.slim.d.ts create mode 100644 node_modules/@types/jquery/index.d.ts create mode 100644 node_modules/@types/jquery/legacy.d.ts create mode 100644 node_modules/@types/jquery/misc.d.ts create mode 100644 node_modules/@types/jquery/package.json create mode 100644 node_modules/@types/sizzle/LICENSE create mode 100644 node_modules/@types/sizzle/README.md create mode 100644 node_modules/@types/sizzle/index.d.ts create mode 100644 node_modules/@types/sizzle/package.json create mode 100644 node_modules/abbrev/LICENSE create mode 100644 node_modules/abbrev/README.md create mode 100644 node_modules/abbrev/abbrev.js create mode 100644 node_modules/abbrev/package.json create mode 100644 node_modules/acorn/AUTHORS create mode 100644 node_modules/acorn/CHANGELOG.md create mode 100644 node_modules/acorn/LICENSE create mode 100644 node_modules/acorn/README.md create mode 100644 node_modules/acorn/acorn-loose/dist/acorn-loose.js create mode 100644 node_modules/acorn/acorn-loose/dist/acorn-loose.js.map create mode 100644 node_modules/acorn/acorn-loose/dist/acorn-loose.mjs create mode 100644 node_modules/acorn/acorn-loose/dist/acorn-loose.mjs.map create mode 100644 node_modules/acorn/acorn-walk/dist/walk.js create mode 100644 node_modules/acorn/acorn-walk/dist/walk.js.map create mode 100644 node_modules/acorn/acorn-walk/dist/walk.mjs create mode 100644 node_modules/acorn/acorn-walk/dist/walk.mjs.map create mode 100644 node_modules/acorn/acorn/dist/acorn.js create mode 100644 node_modules/acorn/acorn/dist/acorn.js.map create mode 100644 node_modules/acorn/acorn/dist/acorn.mjs create mode 100644 node_modules/acorn/acorn/dist/acorn.mjs.map create mode 100644 node_modules/acorn/acorn/dist/bin.js create mode 100644 node_modules/acorn/dist/.keep create mode 100644 node_modules/acorn/dist/acorn.es.js create mode 100644 node_modules/acorn/dist/acorn.js create mode 100644 node_modules/acorn/dist/acorn_loose.es.js create mode 100644 node_modules/acorn/dist/acorn_loose.js create mode 100644 node_modules/acorn/dist/walk.es.js create mode 100644 node_modules/acorn/dist/walk.js create mode 100644 node_modules/acorn/package.json create mode 100644 node_modules/ajv/.tonic_example.js create mode 100644 node_modules/ajv/LICENSE create mode 100644 node_modules/ajv/README.md create mode 100644 node_modules/ajv/dist/ajv.bundle.js create mode 100644 node_modules/ajv/dist/ajv.min.js create mode 100644 node_modules/ajv/dist/ajv.min.js.map create mode 100644 node_modules/ajv/package.json create mode 100644 node_modules/ajv/scripts/.eslintrc.yml create mode 100644 node_modules/ajv/scripts/bundle.js create mode 100644 node_modules/ajv/scripts/compile-dots.js create mode 100644 node_modules/ajv/scripts/info create mode 100644 node_modules/ajv/scripts/prepare-tests create mode 100644 node_modules/ajv/scripts/publish-built-version create mode 100644 node_modules/ajv/scripts/travis-gh-pages create mode 100644 node_modules/amdefine/LICENSE create mode 100644 node_modules/amdefine/README.md create mode 100644 node_modules/amdefine/amdefine.js create mode 100644 node_modules/amdefine/intercept.js create mode 100644 node_modules/amdefine/package.json create mode 100644 node_modules/ansi-colors/LICENSE create mode 100644 node_modules/ansi-colors/README.md create mode 100644 node_modules/ansi-colors/index.js create mode 100644 node_modules/ansi-colors/package.json create mode 100644 node_modules/ansi-colors/types/index.d.ts create mode 100644 node_modules/ansi-gray/LICENSE create mode 100644 node_modules/ansi-gray/index.js create mode 100644 node_modules/ansi-gray/package.json create mode 100644 node_modules/ansi-gray/readme.md create mode 100644 node_modules/ansi-regex/index.js create mode 100644 node_modules/ansi-regex/license create mode 100644 node_modules/ansi-regex/package.json create mode 100644 node_modules/ansi-regex/readme.md create mode 100644 node_modules/ansi-styles/index.js create mode 100644 node_modules/ansi-styles/license create mode 100644 node_modules/ansi-styles/package.json create mode 100644 node_modules/ansi-styles/readme.md create mode 100644 node_modules/ansi-wrap/LICENSE create mode 100644 node_modules/ansi-wrap/README.md create mode 100644 node_modules/ansi-wrap/index.js create mode 100644 node_modules/ansi-wrap/package.json create mode 100644 node_modules/anymatch/LICENSE create mode 100644 node_modules/anymatch/README.md create mode 100644 node_modules/anymatch/index.js create mode 100644 node_modules/anymatch/package.json create mode 100644 node_modules/append-buffer/LICENSE create mode 100644 node_modules/append-buffer/README.md create mode 100644 node_modules/append-buffer/index.js create mode 100644 node_modules/append-buffer/package.json create mode 100644 node_modules/aproba/LICENSE create mode 100644 node_modules/aproba/README.md create mode 100644 node_modules/aproba/index.js create mode 100644 node_modules/aproba/package.json create mode 100644 node_modules/archy/.travis.yml create mode 100644 node_modules/archy/LICENSE create mode 100644 node_modules/archy/examples/beep.js create mode 100644 node_modules/archy/examples/multi_line.js create mode 100644 node_modules/archy/index.js create mode 100644 node_modules/archy/package.json create mode 100644 node_modules/archy/readme.markdown create mode 100644 node_modules/archy/test/beep.js create mode 100644 node_modules/archy/test/multi_line.js create mode 100644 node_modules/archy/test/non_unicode.js create mode 100644 node_modules/are-we-there-yet/CHANGES.md create mode 100644 node_modules/are-we-there-yet/LICENSE create mode 100644 node_modules/are-we-there-yet/README.md create mode 100644 node_modules/are-we-there-yet/index.js create mode 100644 node_modules/are-we-there-yet/package.json create mode 100644 node_modules/are-we-there-yet/tracker-base.js create mode 100644 node_modules/are-we-there-yet/tracker-group.js create mode 100644 node_modules/are-we-there-yet/tracker-stream.js create mode 100644 node_modules/are-we-there-yet/tracker.js create mode 100755 node_modules/arr-diff/LICENSE create mode 100644 node_modules/arr-diff/README.md create mode 100644 node_modules/arr-diff/index.js create mode 100644 node_modules/arr-diff/package.json create mode 100755 node_modules/arr-filter/LICENSE create mode 100755 node_modules/arr-filter/README.md create mode 100755 node_modules/arr-filter/index.js create mode 100644 node_modules/arr-filter/package.json create mode 100755 node_modules/arr-flatten/LICENSE create mode 100755 node_modules/arr-flatten/README.md create mode 100644 node_modules/arr-flatten/index.js create mode 100644 node_modules/arr-flatten/package.json create mode 100644 node_modules/arr-map/LICENSE create mode 100644 node_modules/arr-map/README.md create mode 100644 node_modules/arr-map/index.js create mode 100644 node_modules/arr-map/package.json create mode 100644 node_modules/arr-union/LICENSE create mode 100644 node_modules/arr-union/README.md create mode 100644 node_modules/arr-union/index.js create mode 100644 node_modules/arr-union/package.json create mode 100644 node_modules/array-each/LICENSE create mode 100644 node_modules/array-each/README.md create mode 100644 node_modules/array-each/index.js create mode 100644 node_modules/array-each/package.json create mode 100644 node_modules/array-find-index/index.js create mode 100644 node_modules/array-find-index/license create mode 100644 node_modules/array-find-index/package.json create mode 100644 node_modules/array-find-index/readme.md create mode 100644 node_modules/array-initial/.jshintrc create mode 100644 node_modules/array-initial/.npmignore create mode 100644 node_modules/array-initial/.travis.yml create mode 100644 node_modules/array-initial/LICENSE-MIT create mode 100644 node_modules/array-initial/README.md create mode 100644 node_modules/array-initial/index.js create mode 100644 node_modules/array-initial/node_modules/is-number/LICENSE create mode 100644 node_modules/array-initial/node_modules/is-number/README.md create mode 100644 node_modules/array-initial/node_modules/is-number/index.js create mode 100644 node_modules/array-initial/node_modules/is-number/package.json create mode 100644 node_modules/array-initial/package.json create mode 100644 node_modules/array-last/LICENSE create mode 100755 node_modules/array-last/README.md create mode 100644 node_modules/array-last/index.js create mode 100644 node_modules/array-last/node_modules/is-number/LICENSE create mode 100644 node_modules/array-last/node_modules/is-number/README.md create mode 100644 node_modules/array-last/node_modules/is-number/index.js create mode 100644 node_modules/array-last/node_modules/is-number/package.json create mode 100644 node_modules/array-last/package.json create mode 100755 node_modules/array-slice/LICENSE create mode 100755 node_modules/array-slice/README.md create mode 100644 node_modules/array-slice/index.js create mode 100644 node_modules/array-slice/package.json create mode 100644 node_modules/array-sort/LICENSE create mode 100644 node_modules/array-sort/README.md create mode 100644 node_modules/array-sort/index.js create mode 100644 node_modules/array-sort/node_modules/kind-of/LICENSE create mode 100644 node_modules/array-sort/node_modules/kind-of/README.md create mode 100644 node_modules/array-sort/node_modules/kind-of/index.js create mode 100644 node_modules/array-sort/node_modules/kind-of/package.json create mode 100644 node_modules/array-sort/package.json create mode 100755 node_modules/array-unique/LICENSE create mode 100755 node_modules/array-unique/README.md create mode 100644 node_modules/array-unique/index.js create mode 100644 node_modules/array-unique/package.json create mode 100644 node_modules/asn1/LICENSE create mode 100644 node_modules/asn1/README.md create mode 100644 node_modules/asn1/package.json create mode 100644 node_modules/assert-plus/AUTHORS create mode 100644 node_modules/assert-plus/CHANGES.md create mode 100644 node_modules/assert-plus/README.md create mode 100644 node_modules/assert-plus/assert.js create mode 100644 node_modules/assert-plus/package.json create mode 100644 node_modules/assign-symbols/LICENSE create mode 100644 node_modules/assign-symbols/README.md create mode 100644 node_modules/assign-symbols/index.js create mode 100644 node_modules/assign-symbols/package.json create mode 100644 node_modules/async-done/LICENSE create mode 100644 node_modules/async-done/README.md create mode 100644 node_modules/async-done/index.d.ts create mode 100644 node_modules/async-done/index.js create mode 100644 node_modules/async-done/package.json create mode 100644 node_modules/async-each/README.md create mode 100644 node_modules/async-each/index.js create mode 100644 node_modules/async-each/package.json create mode 100644 node_modules/async-foreach/LICENSE-MIT create mode 100644 node_modules/async-foreach/README.md create mode 100644 node_modules/async-foreach/dist/ba-foreach.js create mode 100644 node_modules/async-foreach/dist/ba-foreach.min.js create mode 100644 node_modules/async-foreach/grunt.js create mode 100644 node_modules/async-foreach/package.json create mode 100644 node_modules/async-foreach/test/foreach_test.js create mode 100644 node_modules/async-settle/LICENSE create mode 100644 node_modules/async-settle/README.md create mode 100644 node_modules/async-settle/index.js create mode 100644 node_modules/async-settle/package.json create mode 100644 node_modules/asynckit/LICENSE create mode 100644 node_modules/asynckit/README.md create mode 100644 node_modules/asynckit/bench.js create mode 100644 node_modules/asynckit/index.js create mode 100644 node_modules/asynckit/package.json create mode 100644 node_modules/asynckit/parallel.js create mode 100644 node_modules/asynckit/serial.js create mode 100644 node_modules/asynckit/serialOrdered.js create mode 100644 node_modules/asynckit/stream.js create mode 100644 node_modules/atob/LICENSE create mode 100644 node_modules/atob/LICENSE.DOCS create mode 100644 node_modules/atob/README.md create mode 100644 node_modules/atob/bower.json create mode 100644 node_modules/atob/browser-atob.js create mode 100644 node_modules/atob/node-atob.js create mode 100644 node_modules/atob/package.json create mode 100644 node_modules/atob/test.js create mode 100644 node_modules/aws-sign2/LICENSE create mode 100644 node_modules/aws-sign2/README.md create mode 100644 node_modules/aws-sign2/index.js create mode 100644 node_modules/aws-sign2/package.json create mode 100644 node_modules/aws4/.github/FUNDING.yml create mode 100644 node_modules/aws4/.travis.yml create mode 100644 node_modules/aws4/LICENSE create mode 100644 node_modules/aws4/README.md create mode 100644 node_modules/aws4/aws4.js create mode 100644 node_modules/aws4/lru.js create mode 100644 node_modules/aws4/package.json create mode 100644 node_modules/bach/LICENSE create mode 100644 node_modules/bach/README.md create mode 100644 node_modules/bach/index.js create mode 100644 node_modules/bach/package.json create mode 100644 node_modules/balanced-match/.npmignore create mode 100644 node_modules/balanced-match/LICENSE.md create mode 100644 node_modules/balanced-match/README.md create mode 100644 node_modules/balanced-match/index.js create mode 100644 node_modules/balanced-match/package.json create mode 100644 node_modules/base/LICENSE create mode 100644 node_modules/base/README.md create mode 100644 node_modules/base/index.js create mode 100644 node_modules/base/node_modules/define-property/LICENSE create mode 100644 node_modules/base/node_modules/define-property/README.md create mode 100644 node_modules/base/node_modules/define-property/index.js create mode 100644 node_modules/base/node_modules/define-property/package.json create mode 100644 node_modules/base/package.json create mode 100644 node_modules/bcrypt-pbkdf/CONTRIBUTING.md create mode 100644 node_modules/bcrypt-pbkdf/LICENSE create mode 100644 node_modules/bcrypt-pbkdf/README.md create mode 100644 node_modules/bcrypt-pbkdf/index.js create mode 100644 node_modules/bcrypt-pbkdf/package.json create mode 100644 node_modules/binary-extensions/binary-extensions.json create mode 100644 node_modules/binary-extensions/license create mode 100644 node_modules/binary-extensions/package.json create mode 100644 node_modules/binary-extensions/readme.md create mode 100644 node_modules/block-stream/LICENCE create mode 100644 node_modules/block-stream/LICENSE create mode 100644 node_modules/block-stream/README.md create mode 100644 node_modules/block-stream/block-stream.js create mode 100644 node_modules/block-stream/package.json create mode 100644 node_modules/brace-expansion/LICENSE create mode 100644 node_modules/brace-expansion/README.md create mode 100644 node_modules/brace-expansion/index.js create mode 100644 node_modules/brace-expansion/package.json create mode 100644 node_modules/braces/LICENSE create mode 100644 node_modules/braces/README.md create mode 100644 node_modules/braces/index.js create mode 100644 node_modules/braces/package.json create mode 100644 node_modules/buffer-equal/.travis.yml create mode 100644 node_modules/buffer-equal/LICENSE create mode 100644 node_modules/buffer-equal/README.markdown create mode 100644 node_modules/buffer-equal/example/eq.js create mode 100644 node_modules/buffer-equal/index.js create mode 100644 node_modules/buffer-equal/package.json create mode 100644 node_modules/buffer-equal/test/eq.js create mode 100644 node_modules/buffer-from/LICENSE create mode 100644 node_modules/buffer-from/index.js create mode 100644 node_modules/buffer-from/package.json create mode 100644 node_modules/buffer-from/readme.md create mode 100644 node_modules/cache-base/LICENSE create mode 100644 node_modules/cache-base/README.md create mode 100644 node_modules/cache-base/index.js create mode 100644 node_modules/cache-base/package.json create mode 100644 node_modules/call-bind/.eslintignore create mode 100644 node_modules/call-bind/.eslintrc create mode 100644 node_modules/call-bind/.github/FUNDING.yml create mode 100644 node_modules/call-bind/.nycrc create mode 100644 node_modules/call-bind/CHANGELOG.md create mode 100644 node_modules/call-bind/LICENSE create mode 100644 node_modules/call-bind/README.md create mode 100644 node_modules/call-bind/callBound.js create mode 100644 node_modules/call-bind/index.js create mode 100644 node_modules/call-bind/package.json create mode 100644 node_modules/call-bind/test/callBound.js create mode 100644 node_modules/call-bind/test/index.js create mode 100644 node_modules/camelcase-keys/index.js create mode 100644 node_modules/camelcase-keys/license create mode 100644 node_modules/camelcase-keys/node_modules/camelcase/index.js create mode 100644 node_modules/camelcase-keys/node_modules/camelcase/license create mode 100644 node_modules/camelcase-keys/node_modules/camelcase/package.json create mode 100644 node_modules/camelcase-keys/node_modules/camelcase/readme.md create mode 100644 node_modules/camelcase-keys/package.json create mode 100644 node_modules/camelcase-keys/readme.md create mode 100644 node_modules/camelcase/index.js create mode 100644 node_modules/camelcase/license create mode 100644 node_modules/camelcase/package.json create mode 100644 node_modules/camelcase/readme.md create mode 100644 node_modules/caseless/LICENSE create mode 100644 node_modules/caseless/README.md create mode 100644 node_modules/caseless/index.js create mode 100644 node_modules/caseless/package.json create mode 100644 node_modules/caseless/test.js create mode 100644 node_modules/chalk/index.js create mode 100644 node_modules/chalk/index.js.flow create mode 100644 node_modules/chalk/license create mode 100644 node_modules/chalk/package.json create mode 100644 node_modules/chalk/readme.md create mode 100644 node_modules/chalk/templates.js create mode 100644 node_modules/chalk/types/index.d.ts create mode 100644 node_modules/chokidar/CHANGELOG.md create mode 100644 node_modules/chokidar/README.md create mode 100644 node_modules/chokidar/index.js create mode 100644 node_modules/chokidar/node_modules/is-glob/LICENSE create mode 100644 node_modules/chokidar/node_modules/is-glob/README.md create mode 100644 node_modules/chokidar/node_modules/is-glob/index.js create mode 100644 node_modules/chokidar/node_modules/is-glob/package.json create mode 100644 node_modules/chokidar/node_modules/normalize-path/LICENSE create mode 100644 node_modules/chokidar/node_modules/normalize-path/README.md create mode 100644 node_modules/chokidar/node_modules/normalize-path/index.js create mode 100644 node_modules/chokidar/node_modules/normalize-path/package.json create mode 100644 node_modules/chokidar/package.json create mode 100644 node_modules/chokidar/types/index.d.ts create mode 100644 node_modules/class-utils/LICENSE create mode 100644 node_modules/class-utils/README.md create mode 100644 node_modules/class-utils/index.js create mode 100644 node_modules/class-utils/package.json create mode 100644 node_modules/cliui/CHANGELOG.md create mode 100644 node_modules/cliui/LICENSE.txt create mode 100644 node_modules/cliui/README.md create mode 100644 node_modules/cliui/index.js create mode 100644 node_modules/cliui/package.json create mode 100644 node_modules/clone-buffer/LICENSE create mode 100644 node_modules/clone-buffer/README.md create mode 100644 node_modules/clone-buffer/index.js create mode 100644 node_modules/clone-buffer/package.json create mode 100644 node_modules/clone-stats/LICENSE.md create mode 100644 node_modules/clone-stats/README.md create mode 100644 node_modules/clone-stats/index.js create mode 100644 node_modules/clone-stats/package.json create mode 100644 node_modules/clone-stats/test.js create mode 100644 node_modules/clone/.npmignore create mode 100644 node_modules/clone/LICENSE create mode 100644 node_modules/clone/README.md create mode 100644 node_modules/clone/clone.iml create mode 100644 node_modules/clone/clone.js create mode 100644 node_modules/clone/package.json create mode 100644 node_modules/cloneable-readable/.travis.yml create mode 100644 node_modules/cloneable-readable/LICENSE create mode 100644 node_modules/cloneable-readable/README.md create mode 100644 node_modules/cloneable-readable/example.js create mode 100644 node_modules/cloneable-readable/index.js create mode 100644 node_modules/cloneable-readable/package.json create mode 100644 node_modules/cloneable-readable/test.js create mode 100644 node_modules/code-point-at/index.js create mode 100644 node_modules/code-point-at/license create mode 100644 node_modules/code-point-at/package.json create mode 100644 node_modules/code-point-at/readme.md create mode 100644 node_modules/collection-map/LICENSE create mode 100644 node_modules/collection-map/README.md create mode 100644 node_modules/collection-map/index.js create mode 100644 node_modules/collection-map/package.json create mode 100644 node_modules/collection-visit/LICENSE create mode 100644 node_modules/collection-visit/README.md create mode 100644 node_modules/collection-visit/index.js create mode 100644 node_modules/collection-visit/package.json create mode 100644 node_modules/color-convert/CHANGELOG.md create mode 100644 node_modules/color-convert/LICENSE create mode 100644 node_modules/color-convert/README.md create mode 100644 node_modules/color-convert/conversions.js create mode 100644 node_modules/color-convert/index.js create mode 100644 node_modules/color-convert/package.json create mode 100644 node_modules/color-convert/route.js create mode 100644 node_modules/color-name/.eslintrc.json create mode 100644 node_modules/color-name/.npmignore create mode 100644 node_modules/color-name/LICENSE create mode 100644 node_modules/color-name/README.md create mode 100644 node_modules/color-name/index.js create mode 100644 node_modules/color-name/package.json create mode 100644 node_modules/color-name/test.js create mode 100644 node_modules/color-support/LICENSE create mode 100644 node_modules/color-support/README.md create mode 100755 node_modules/color-support/bin.js create mode 100644 node_modules/color-support/browser.js create mode 100644 node_modules/color-support/index.js create mode 100644 node_modules/color-support/package.json create mode 100644 node_modules/combined-stream/License create mode 100644 node_modules/combined-stream/Readme.md create mode 100644 node_modules/combined-stream/package.json create mode 100644 node_modules/combined-stream/yarn.lock create mode 100644 node_modules/component-emitter/History.md create mode 100644 node_modules/component-emitter/LICENSE create mode 100644 node_modules/component-emitter/Readme.md create mode 100644 node_modules/component-emitter/index.js create mode 100644 node_modules/component-emitter/package.json create mode 100644 node_modules/concat-map/.travis.yml create mode 100644 node_modules/concat-map/LICENSE create mode 100644 node_modules/concat-map/README.markdown create mode 100644 node_modules/concat-map/example/map.js create mode 100644 node_modules/concat-map/index.js create mode 100644 node_modules/concat-map/package.json create mode 100644 node_modules/concat-map/test/map.js create mode 100644 node_modules/concat-stream/LICENSE create mode 100644 node_modules/concat-stream/index.js create mode 100644 node_modules/concat-stream/package.json create mode 100644 node_modules/concat-stream/readme.md create mode 100644 node_modules/console-control-strings/LICENSE create mode 100644 node_modules/console-control-strings/README.md create mode 100644 node_modules/console-control-strings/README.md~ create mode 100644 node_modules/console-control-strings/index.js create mode 100644 node_modules/console-control-strings/package.json create mode 100644 node_modules/convert-source-map/LICENSE create mode 100644 node_modules/convert-source-map/README.md create mode 100644 node_modules/convert-source-map/index.js create mode 100644 node_modules/convert-source-map/node_modules/safe-buffer/LICENSE create mode 100644 node_modules/convert-source-map/node_modules/safe-buffer/README.md create mode 100644 node_modules/convert-source-map/node_modules/safe-buffer/index.d.ts create mode 100644 node_modules/convert-source-map/node_modules/safe-buffer/index.js create mode 100644 node_modules/convert-source-map/node_modules/safe-buffer/package.json create mode 100644 node_modules/convert-source-map/package.json create mode 100644 node_modules/copy-descriptor/LICENSE create mode 100644 node_modules/copy-descriptor/index.js create mode 100644 node_modules/copy-descriptor/package.json create mode 100644 node_modules/copy-props/LICENSE create mode 100644 node_modules/copy-props/README.md create mode 100644 node_modules/copy-props/index.js create mode 100644 node_modules/copy-props/package.json create mode 100644 node_modules/core-util-is/LICENSE create mode 100644 node_modules/core-util-is/README.md create mode 100644 node_modules/core-util-is/float.patch create mode 100644 node_modules/core-util-is/package.json create mode 100644 node_modules/core-util-is/test.js create mode 100644 node_modules/cross-spawn/.editorconfig create mode 100644 node_modules/cross-spawn/.eslintrc create mode 100644 node_modules/cross-spawn/.npmignore create mode 100644 node_modules/cross-spawn/.travis.yml create mode 100644 node_modules/cross-spawn/LICENSE create mode 100644 node_modules/cross-spawn/README.md create mode 100644 node_modules/cross-spawn/appveyor.yml create mode 100644 node_modules/cross-spawn/index.js create mode 120000 node_modules/cross-spawn/node_modules/.bin/which create mode 100644 node_modules/cross-spawn/package.json create mode 100644 node_modules/css-tree/CHANGELOG.md create mode 100644 node_modules/css-tree/LICENSE create mode 100644 node_modules/css-tree/README.md create mode 100755 node_modules/css-tree/data/index.js create mode 100644 node_modules/css-tree/data/patch.json create mode 100644 node_modules/css-tree/dist/csstree.js create mode 100644 node_modules/css-tree/dist/csstree.min.js create mode 100644 node_modules/css-tree/package.json create mode 100644 node_modules/css/History.md create mode 100644 node_modules/css/LICENSE create mode 100644 node_modules/css/Readme.md create mode 100644 node_modules/css/index.js create mode 100644 node_modules/css/package.json create mode 100644 node_modules/csso/CHANGELOG.md create mode 100644 node_modules/csso/LICENSE create mode 100644 node_modules/csso/README.md create mode 100644 node_modules/csso/dist/csso.js create mode 100644 node_modules/csso/dist/csso.min.js create mode 100644 node_modules/csso/package.json create mode 100644 node_modules/currently-unhandled/browser.js create mode 100644 node_modules/currently-unhandled/core.js create mode 100644 node_modules/currently-unhandled/index.js create mode 100644 node_modules/currently-unhandled/license create mode 100644 node_modules/currently-unhandled/package.json create mode 100644 node_modules/currently-unhandled/readme.md create mode 100755 node_modules/d/.editorconfig create mode 100644 node_modules/d/.github/FUNDING.yml create mode 100644 node_modules/d/CHANGELOG.md create mode 100644 node_modules/d/CHANGES create mode 100644 node_modules/d/LICENSE create mode 100644 node_modules/d/README.md create mode 100644 node_modules/d/auto-bind.js create mode 100644 node_modules/d/index.js create mode 100644 node_modules/d/lazy.js create mode 100644 node_modules/d/package.json create mode 100644 node_modules/d/test/auto-bind.js create mode 100644 node_modules/d/test/index.js create mode 100644 node_modules/d/test/lazy.js create mode 100644 node_modules/dashdash/CHANGES.md create mode 100644 node_modules/dashdash/LICENSE.txt create mode 100644 node_modules/dashdash/README.md create mode 100644 node_modules/dashdash/etc/dashdash.bash_completion.in create mode 100644 node_modules/dashdash/package.json create mode 100644 node_modules/debug-fabulous/LICENSE create mode 100644 node_modules/debug-fabulous/README.md create mode 100644 node_modules/debug-fabulous/index.js create mode 100644 node_modules/debug-fabulous/node_modules/debug/CHANGELOG.md create mode 100644 node_modules/debug-fabulous/node_modules/debug/LICENSE create mode 100644 node_modules/debug-fabulous/node_modules/debug/README.md create mode 100644 node_modules/debug-fabulous/node_modules/debug/node.js create mode 100644 node_modules/debug-fabulous/node_modules/debug/package.json create mode 100644 node_modules/debug-fabulous/node_modules/debug/src/browser.js create mode 100644 node_modules/debug-fabulous/node_modules/debug/src/common.js create mode 100644 node_modules/debug-fabulous/node_modules/debug/src/index.js create mode 100644 node_modules/debug-fabulous/node_modules/debug/src/node.js create mode 100644 node_modules/debug-fabulous/node_modules/ms/index.js create mode 100644 node_modules/debug-fabulous/node_modules/ms/license.md create mode 100644 node_modules/debug-fabulous/node_modules/ms/package.json create mode 100644 node_modules/debug-fabulous/node_modules/ms/readme.md create mode 100644 node_modules/debug-fabulous/package.json create mode 100644 node_modules/debug-fabulous/src/debugFabFactory.js create mode 100644 node_modules/debug-fabulous/src/formatArgs.js create mode 100644 node_modules/debug-fabulous/src/lazy-eval.js create mode 100644 node_modules/debug-fabulous/src/spawn.js create mode 100644 node_modules/debug-fabulous/yarn-error.log create mode 100644 node_modules/debug-fabulous/yarn.lock create mode 100644 node_modules/debug/.coveralls.yml create mode 100644 node_modules/debug/.eslintrc create mode 100644 node_modules/debug/.npmignore create mode 100644 node_modules/debug/.travis.yml create mode 100644 node_modules/debug/CHANGELOG.md create mode 100644 node_modules/debug/LICENSE create mode 100644 node_modules/debug/Makefile create mode 100644 node_modules/debug/README.md create mode 100644 node_modules/debug/component.json create mode 100644 node_modules/debug/karma.conf.js create mode 100644 node_modules/debug/node.js create mode 100644 node_modules/debug/package.json create mode 100644 node_modules/debug/src/browser.js create mode 100644 node_modules/debug/src/debug.js create mode 100644 node_modules/debug/src/index.js create mode 100644 node_modules/debug/src/inspector-log.js create mode 100644 node_modules/debug/src/node.js create mode 100644 node_modules/decamelize/index.js create mode 100644 node_modules/decamelize/license create mode 100644 node_modules/decamelize/package.json create mode 100644 node_modules/decamelize/readme.md create mode 100644 node_modules/decode-uri-component/index.js create mode 100644 node_modules/decode-uri-component/license create mode 100644 node_modules/decode-uri-component/package.json create mode 100644 node_modules/decode-uri-component/readme.md create mode 100644 node_modules/default-compare/LICENSE create mode 100644 node_modules/default-compare/README.md create mode 100644 node_modules/default-compare/index.js create mode 100644 node_modules/default-compare/node_modules/kind-of/LICENSE create mode 100644 node_modules/default-compare/node_modules/kind-of/README.md create mode 100644 node_modules/default-compare/node_modules/kind-of/index.js create mode 100644 node_modules/default-compare/node_modules/kind-of/package.json create mode 100644 node_modules/default-compare/package.json create mode 100644 node_modules/default-resolution/LICENSE create mode 100644 node_modules/default-resolution/README.md create mode 100644 node_modules/default-resolution/index.js create mode 100644 node_modules/default-resolution/node-version.js create mode 100644 node_modules/default-resolution/package.json create mode 100644 node_modules/define-properties/.editorconfig create mode 100644 node_modules/define-properties/.eslintrc create mode 100644 node_modules/define-properties/.jscs.json create mode 100644 node_modules/define-properties/.travis.yml create mode 100644 node_modules/define-properties/CHANGELOG.md create mode 100644 node_modules/define-properties/LICENSE create mode 100644 node_modules/define-properties/README.md create mode 100644 node_modules/define-properties/index.js create mode 100644 node_modules/define-properties/package.json create mode 100644 node_modules/define-properties/test/index.js create mode 100644 node_modules/define-property/LICENSE create mode 100644 node_modules/define-property/README.md create mode 100644 node_modules/define-property/index.js create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/LICENSE create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/README.md create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/index.js create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/node_modules/kind-of/LICENSE create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/node_modules/kind-of/README.md create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/node_modules/kind-of/index.js create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/node_modules/kind-of/package.json create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/package.json create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/LICENSE create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/README.md create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/index.js create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/node_modules/kind-of/LICENSE create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/node_modules/kind-of/README.md create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/node_modules/kind-of/index.js create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/node_modules/kind-of/package.json create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/package.json create mode 100644 node_modules/define-property/node_modules/is-descriptor/LICENSE create mode 100644 node_modules/define-property/node_modules/is-descriptor/README.md create mode 100644 node_modules/define-property/node_modules/is-descriptor/index.js create mode 100644 node_modules/define-property/node_modules/is-descriptor/package.json create mode 100644 node_modules/define-property/node_modules/kind-of/LICENSE create mode 100644 node_modules/define-property/node_modules/kind-of/README.md create mode 100644 node_modules/define-property/node_modules/kind-of/index.js create mode 100644 node_modules/define-property/node_modules/kind-of/package.json create mode 100644 node_modules/define-property/package.json create mode 100644 node_modules/delayed-stream/.npmignore create mode 100644 node_modules/delayed-stream/License create mode 100644 node_modules/delayed-stream/Makefile create mode 100644 node_modules/delayed-stream/Readme.md create mode 100644 node_modules/delayed-stream/package.json create mode 100644 node_modules/delegates/.npmignore create mode 100644 node_modules/delegates/History.md create mode 100644 node_modules/delegates/License create mode 100644 node_modules/delegates/Makefile create mode 100644 node_modules/delegates/Readme.md create mode 100644 node_modules/delegates/index.js create mode 100644 node_modules/delegates/package.json create mode 100644 node_modules/delegates/test/index.js create mode 100644 node_modules/detect-file/LICENSE create mode 100644 node_modules/detect-file/README.md create mode 100644 node_modules/detect-file/index.js create mode 100644 node_modules/detect-file/package.json create mode 100644 node_modules/detect-newline/index.js create mode 100644 node_modules/detect-newline/license create mode 100644 node_modules/detect-newline/package.json create mode 100644 node_modules/detect-newline/readme.md create mode 100644 node_modules/duplexify/.travis.yml create mode 100644 node_modules/duplexify/LICENSE create mode 100644 node_modules/duplexify/README.md create mode 100644 node_modules/duplexify/example.js create mode 100644 node_modules/duplexify/index.js create mode 100644 node_modules/duplexify/package.json create mode 100644 node_modules/duplexify/test.js create mode 100644 node_modules/each-props/LICENSE create mode 100644 node_modules/each-props/README.md create mode 100644 node_modules/each-props/index.js create mode 100644 node_modules/each-props/package.json create mode 100755 node_modules/ecc-jsbn/LICENSE create mode 100755 node_modules/ecc-jsbn/README.md create mode 100755 node_modules/ecc-jsbn/index.js create mode 100755 node_modules/ecc-jsbn/package.json create mode 100755 node_modules/ecc-jsbn/test.js create mode 100644 node_modules/emoji-regex/LICENSE-MIT.txt create mode 100644 node_modules/emoji-regex/README.md create mode 100644 node_modules/emoji-regex/es2015/index.js create mode 100644 node_modules/emoji-regex/es2015/text.js create mode 100644 node_modules/emoji-regex/index.d.ts create mode 100644 node_modules/emoji-regex/index.js create mode 100644 node_modules/emoji-regex/package.json create mode 100644 node_modules/emoji-regex/text.js create mode 100644 node_modules/end-of-stream/LICENSE create mode 100644 node_modules/end-of-stream/README.md create mode 100644 node_modules/end-of-stream/index.js create mode 100644 node_modules/end-of-stream/package.json create mode 100644 node_modules/error-ex/LICENSE create mode 100644 node_modules/error-ex/README.md create mode 100644 node_modules/error-ex/index.js create mode 100644 node_modules/error-ex/package.json create mode 100644 node_modules/es5-ext/.editorconfig create mode 100644 node_modules/es5-ext/.github/FUNDING.yml create mode 100644 node_modules/es5-ext/CHANGELOG.md create mode 100644 node_modules/es5-ext/CHANGES create mode 100644 node_modules/es5-ext/LICENSE create mode 100644 node_modules/es5-ext/README.md create mode 100644 node_modules/es5-ext/array/#/@@iterator/implement.js create mode 100644 node_modules/es5-ext/array/#/@@iterator/index.js create mode 100644 node_modules/es5-ext/array/#/@@iterator/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/@@iterator/shim.js create mode 100644 node_modules/es5-ext/array/#/_compare-by-length.js create mode 100644 node_modules/es5-ext/array/#/binary-search.js create mode 100644 node_modules/es5-ext/array/#/clear.js create mode 100644 node_modules/es5-ext/array/#/compact.js create mode 100644 node_modules/es5-ext/array/#/concat/implement.js create mode 100644 node_modules/es5-ext/array/#/concat/index.js create mode 100644 node_modules/es5-ext/array/#/concat/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/concat/shim.js create mode 100644 node_modules/es5-ext/array/#/contains.js create mode 100644 node_modules/es5-ext/array/#/copy-within/implement.js create mode 100644 node_modules/es5-ext/array/#/copy-within/index.js create mode 100644 node_modules/es5-ext/array/#/copy-within/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/copy-within/shim.js create mode 100644 node_modules/es5-ext/array/#/diff.js create mode 100644 node_modules/es5-ext/array/#/e-index-of.js create mode 100644 node_modules/es5-ext/array/#/e-last-index-of.js create mode 100644 node_modules/es5-ext/array/#/entries/implement.js create mode 100644 node_modules/es5-ext/array/#/entries/index.js create mode 100644 node_modules/es5-ext/array/#/entries/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/entries/shim.js create mode 100644 node_modules/es5-ext/array/#/exclusion.js create mode 100644 node_modules/es5-ext/array/#/fill/implement.js create mode 100644 node_modules/es5-ext/array/#/fill/index.js create mode 100644 node_modules/es5-ext/array/#/fill/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/fill/shim.js create mode 100644 node_modules/es5-ext/array/#/filter/implement.js create mode 100644 node_modules/es5-ext/array/#/filter/index.js create mode 100644 node_modules/es5-ext/array/#/filter/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/filter/shim.js create mode 100644 node_modules/es5-ext/array/#/find-index/implement.js create mode 100644 node_modules/es5-ext/array/#/find-index/index.js create mode 100644 node_modules/es5-ext/array/#/find-index/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/find-index/shim.js create mode 100644 node_modules/es5-ext/array/#/find/implement.js create mode 100644 node_modules/es5-ext/array/#/find/index.js create mode 100644 node_modules/es5-ext/array/#/find/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/find/shim.js create mode 100644 node_modules/es5-ext/array/#/first-index.js create mode 100644 node_modules/es5-ext/array/#/first.js create mode 100644 node_modules/es5-ext/array/#/flatten.js create mode 100644 node_modules/es5-ext/array/#/for-each-right.js create mode 100644 node_modules/es5-ext/array/#/group.js create mode 100644 node_modules/es5-ext/array/#/index.js create mode 100644 node_modules/es5-ext/array/#/indexes-of.js create mode 100644 node_modules/es5-ext/array/#/intersection.js create mode 100644 node_modules/es5-ext/array/#/is-copy.js create mode 100644 node_modules/es5-ext/array/#/is-empty.js create mode 100644 node_modules/es5-ext/array/#/is-uniq.js create mode 100644 node_modules/es5-ext/array/#/keys/implement.js create mode 100644 node_modules/es5-ext/array/#/keys/index.js create mode 100644 node_modules/es5-ext/array/#/keys/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/keys/shim.js create mode 100644 node_modules/es5-ext/array/#/last-index.js create mode 100644 node_modules/es5-ext/array/#/last.js create mode 100644 node_modules/es5-ext/array/#/map/implement.js create mode 100644 node_modules/es5-ext/array/#/map/index.js create mode 100644 node_modules/es5-ext/array/#/map/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/map/shim.js create mode 100644 node_modules/es5-ext/array/#/remove.js create mode 100644 node_modules/es5-ext/array/#/separate.js create mode 100644 node_modules/es5-ext/array/#/slice/implement.js create mode 100644 node_modules/es5-ext/array/#/slice/index.js create mode 100644 node_modules/es5-ext/array/#/slice/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/slice/shim.js create mode 100644 node_modules/es5-ext/array/#/some-right.js create mode 100644 node_modules/es5-ext/array/#/splice/implement.js create mode 100644 node_modules/es5-ext/array/#/splice/index.js create mode 100644 node_modules/es5-ext/array/#/splice/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/splice/shim.js create mode 100644 node_modules/es5-ext/array/#/uniq.js create mode 100644 node_modules/es5-ext/array/#/values/implement.js create mode 100644 node_modules/es5-ext/array/#/values/index.js create mode 100644 node_modules/es5-ext/array/#/values/is-implemented.js create mode 100644 node_modules/es5-ext/array/#/values/shim.js create mode 100644 node_modules/es5-ext/array/_is-extensible.js create mode 100644 node_modules/es5-ext/array/_sub-array-dummy-safe.js create mode 100644 node_modules/es5-ext/array/_sub-array-dummy.js create mode 100644 node_modules/es5-ext/array/from/implement.js create mode 100644 node_modules/es5-ext/array/from/index.js create mode 100644 node_modules/es5-ext/array/from/is-implemented.js create mode 100644 node_modules/es5-ext/array/from/shim.js create mode 100644 node_modules/es5-ext/array/generate.js create mode 100644 node_modules/es5-ext/array/index.js create mode 100644 node_modules/es5-ext/array/is-plain-array.js create mode 100644 node_modules/es5-ext/array/of/implement.js create mode 100644 node_modules/es5-ext/array/of/index.js create mode 100644 node_modules/es5-ext/array/of/is-implemented.js create mode 100644 node_modules/es5-ext/array/of/shim.js create mode 100644 node_modules/es5-ext/array/to-array.js create mode 100644 node_modules/es5-ext/array/valid-array.js create mode 100644 node_modules/es5-ext/boolean/index.js create mode 100644 node_modules/es5-ext/boolean/is-boolean.js create mode 100644 node_modules/es5-ext/date/#/copy.js create mode 100644 node_modules/es5-ext/date/#/days-in-month.js create mode 100644 node_modules/es5-ext/date/#/floor-day.js create mode 100644 node_modules/es5-ext/date/#/floor-month.js create mode 100644 node_modules/es5-ext/date/#/floor-year.js create mode 100644 node_modules/es5-ext/date/#/format.js create mode 100644 node_modules/es5-ext/date/#/index.js create mode 100644 node_modules/es5-ext/date/ensure-time-value.js create mode 100644 node_modules/es5-ext/date/index.js create mode 100644 node_modules/es5-ext/date/is-date.js create mode 100644 node_modules/es5-ext/date/is-time-value.js create mode 100644 node_modules/es5-ext/date/valid-date.js create mode 100644 node_modules/es5-ext/error/#/index.js create mode 100644 node_modules/es5-ext/error/#/throw.js create mode 100644 node_modules/es5-ext/error/custom.js create mode 100644 node_modules/es5-ext/error/index.js create mode 100644 node_modules/es5-ext/error/is-error.js create mode 100644 node_modules/es5-ext/error/valid-error.js create mode 100644 node_modules/es5-ext/function/#/compose.js create mode 100644 node_modules/es5-ext/function/#/copy.js create mode 100644 node_modules/es5-ext/function/#/curry.js create mode 100644 node_modules/es5-ext/function/#/index.js create mode 100644 node_modules/es5-ext/function/#/lock.js create mode 100644 node_modules/es5-ext/function/#/microtask-delay.js create mode 100644 node_modules/es5-ext/function/#/not.js create mode 100644 node_modules/es5-ext/function/#/partial.js create mode 100644 node_modules/es5-ext/function/#/spread.js create mode 100644 node_modules/es5-ext/function/#/to-string-tokens.js create mode 100644 node_modules/es5-ext/function/_define-length.js create mode 100644 node_modules/es5-ext/function/constant.js create mode 100644 node_modules/es5-ext/function/identity.js create mode 100644 node_modules/es5-ext/function/index.js create mode 100644 node_modules/es5-ext/function/invoke.js create mode 100644 node_modules/es5-ext/function/is-arguments.js create mode 100644 node_modules/es5-ext/function/is-function.js create mode 100644 node_modules/es5-ext/function/noop.js create mode 100644 node_modules/es5-ext/function/pluck.js create mode 100644 node_modules/es5-ext/function/valid-function.js create mode 100644 node_modules/es5-ext/global.js create mode 100644 node_modules/es5-ext/index.js create mode 100644 node_modules/es5-ext/iterable/for-each.js create mode 100644 node_modules/es5-ext/iterable/index.js create mode 100644 node_modules/es5-ext/iterable/is.js create mode 100644 node_modules/es5-ext/iterable/validate-object.js create mode 100644 node_modules/es5-ext/iterable/validate.js create mode 100644 node_modules/es5-ext/json/index.js create mode 100644 node_modules/es5-ext/json/safe-stringify.js create mode 100644 node_modules/es5-ext/math/_decimal-adjust.js create mode 100644 node_modules/es5-ext/math/_pack-ieee754.js create mode 100644 node_modules/es5-ext/math/_unpack-ieee754.js create mode 100644 node_modules/es5-ext/math/acosh/implement.js create mode 100644 node_modules/es5-ext/math/acosh/index.js create mode 100644 node_modules/es5-ext/math/acosh/is-implemented.js create mode 100644 node_modules/es5-ext/math/acosh/shim.js create mode 100644 node_modules/es5-ext/math/asinh/implement.js create mode 100644 node_modules/es5-ext/math/asinh/index.js create mode 100644 node_modules/es5-ext/math/asinh/is-implemented.js create mode 100644 node_modules/es5-ext/math/asinh/shim.js create mode 100644 node_modules/es5-ext/math/atanh/implement.js create mode 100644 node_modules/es5-ext/math/atanh/index.js create mode 100644 node_modules/es5-ext/math/atanh/is-implemented.js create mode 100644 node_modules/es5-ext/math/atanh/shim.js create mode 100644 node_modules/es5-ext/math/cbrt/implement.js create mode 100644 node_modules/es5-ext/math/cbrt/index.js create mode 100644 node_modules/es5-ext/math/cbrt/is-implemented.js create mode 100644 node_modules/es5-ext/math/cbrt/shim.js create mode 100644 node_modules/es5-ext/math/ceil-10.js create mode 100644 node_modules/es5-ext/math/clz32/implement.js create mode 100644 node_modules/es5-ext/math/clz32/index.js create mode 100644 node_modules/es5-ext/math/clz32/is-implemented.js create mode 100644 node_modules/es5-ext/math/clz32/shim.js create mode 100644 node_modules/es5-ext/math/cosh/implement.js create mode 100644 node_modules/es5-ext/math/cosh/index.js create mode 100644 node_modules/es5-ext/math/cosh/is-implemented.js create mode 100644 node_modules/es5-ext/math/cosh/shim.js create mode 100644 node_modules/es5-ext/math/expm1/implement.js create mode 100644 node_modules/es5-ext/math/expm1/index.js create mode 100644 node_modules/es5-ext/math/expm1/is-implemented.js create mode 100644 node_modules/es5-ext/math/expm1/shim.js create mode 100644 node_modules/es5-ext/math/floor-10.js create mode 100644 node_modules/es5-ext/math/fround/implement.js create mode 100644 node_modules/es5-ext/math/fround/index.js create mode 100644 node_modules/es5-ext/math/fround/is-implemented.js create mode 100644 node_modules/es5-ext/math/fround/shim.js create mode 100644 node_modules/es5-ext/math/hypot/implement.js create mode 100644 node_modules/es5-ext/math/hypot/index.js create mode 100644 node_modules/es5-ext/math/hypot/is-implemented.js create mode 100644 node_modules/es5-ext/math/hypot/shim.js create mode 100644 node_modules/es5-ext/math/imul/implement.js create mode 100644 node_modules/es5-ext/math/imul/index.js create mode 100644 node_modules/es5-ext/math/imul/is-implemented.js create mode 100644 node_modules/es5-ext/math/imul/shim.js create mode 100644 node_modules/es5-ext/math/index.js create mode 100644 node_modules/es5-ext/math/log10/implement.js create mode 100644 node_modules/es5-ext/math/log10/index.js create mode 100644 node_modules/es5-ext/math/log10/is-implemented.js create mode 100644 node_modules/es5-ext/math/log10/shim.js create mode 100644 node_modules/es5-ext/math/log1p/implement.js create mode 100644 node_modules/es5-ext/math/log1p/index.js create mode 100644 node_modules/es5-ext/math/log1p/is-implemented.js create mode 100644 node_modules/es5-ext/math/log1p/shim.js create mode 100644 node_modules/es5-ext/math/log2/implement.js create mode 100644 node_modules/es5-ext/math/log2/index.js create mode 100644 node_modules/es5-ext/math/log2/is-implemented.js create mode 100644 node_modules/es5-ext/math/log2/shim.js create mode 100644 node_modules/es5-ext/math/round-10.js create mode 100644 node_modules/es5-ext/math/sign/implement.js create mode 100644 node_modules/es5-ext/math/sign/index.js create mode 100644 node_modules/es5-ext/math/sign/is-implemented.js create mode 100644 node_modules/es5-ext/math/sign/shim.js create mode 100644 node_modules/es5-ext/math/sinh/implement.js create mode 100644 node_modules/es5-ext/math/sinh/index.js create mode 100644 node_modules/es5-ext/math/sinh/is-implemented.js create mode 100644 node_modules/es5-ext/math/sinh/shim.js create mode 100644 node_modules/es5-ext/math/tanh/implement.js create mode 100644 node_modules/es5-ext/math/tanh/index.js create mode 100644 node_modules/es5-ext/math/tanh/is-implemented.js create mode 100644 node_modules/es5-ext/math/tanh/shim.js create mode 100644 node_modules/es5-ext/math/trunc/implement.js create mode 100644 node_modules/es5-ext/math/trunc/index.js create mode 100644 node_modules/es5-ext/math/trunc/is-implemented.js create mode 100644 node_modules/es5-ext/math/trunc/shim.js create mode 100644 node_modules/es5-ext/node_modules/next-tick/.lint create mode 100644 node_modules/es5-ext/node_modules/next-tick/.npmignore create mode 100644 node_modules/es5-ext/node_modules/next-tick/.travis.yml create mode 100644 node_modules/es5-ext/node_modules/next-tick/CHANGES create mode 100644 node_modules/es5-ext/node_modules/next-tick/LICENSE create mode 100644 node_modules/es5-ext/node_modules/next-tick/README.md create mode 100644 node_modules/es5-ext/node_modules/next-tick/index.js create mode 100644 node_modules/es5-ext/node_modules/next-tick/package.json create mode 100644 node_modules/es5-ext/node_modules/next-tick/test/index.js create mode 100644 node_modules/es5-ext/number/#/index.js create mode 100644 node_modules/es5-ext/number/#/pad.js create mode 100644 node_modules/es5-ext/number/epsilon/implement.js create mode 100644 node_modules/es5-ext/number/epsilon/index.js create mode 100644 node_modules/es5-ext/number/epsilon/is-implemented.js create mode 100644 node_modules/es5-ext/number/index.js create mode 100644 node_modules/es5-ext/number/is-finite/implement.js create mode 100644 node_modules/es5-ext/number/is-finite/index.js create mode 100644 node_modules/es5-ext/number/is-finite/is-implemented.js create mode 100644 node_modules/es5-ext/number/is-finite/shim.js create mode 100644 node_modules/es5-ext/number/is-integer/implement.js create mode 100644 node_modules/es5-ext/number/is-integer/index.js create mode 100644 node_modules/es5-ext/number/is-integer/is-implemented.js create mode 100644 node_modules/es5-ext/number/is-integer/shim.js create mode 100644 node_modules/es5-ext/number/is-nan/implement.js create mode 100644 node_modules/es5-ext/number/is-nan/index.js create mode 100644 node_modules/es5-ext/number/is-nan/is-implemented.js create mode 100644 node_modules/es5-ext/number/is-nan/shim.js create mode 100644 node_modules/es5-ext/number/is-natural.js create mode 100644 node_modules/es5-ext/number/is-number.js create mode 100644 node_modules/es5-ext/number/is-safe-integer/implement.js create mode 100644 node_modules/es5-ext/number/is-safe-integer/index.js create mode 100644 node_modules/es5-ext/number/is-safe-integer/is-implemented.js create mode 100644 node_modules/es5-ext/number/is-safe-integer/shim.js create mode 100644 node_modules/es5-ext/number/max-safe-integer/implement.js create mode 100644 node_modules/es5-ext/number/max-safe-integer/index.js create mode 100644 node_modules/es5-ext/number/max-safe-integer/is-implemented.js create mode 100644 node_modules/es5-ext/number/min-safe-integer/implement.js create mode 100644 node_modules/es5-ext/number/min-safe-integer/index.js create mode 100644 node_modules/es5-ext/number/min-safe-integer/is-implemented.js create mode 100644 node_modules/es5-ext/number/to-integer.js create mode 100644 node_modules/es5-ext/number/to-pos-integer.js create mode 100644 node_modules/es5-ext/number/to-uint32.js create mode 100644 node_modules/es5-ext/object/_iterate.js create mode 100644 node_modules/es5-ext/object/assign-deep.js create mode 100644 node_modules/es5-ext/object/assign/implement.js create mode 100644 node_modules/es5-ext/object/assign/index.js create mode 100644 node_modules/es5-ext/object/assign/is-implemented.js create mode 100644 node_modules/es5-ext/object/assign/shim.js create mode 100644 node_modules/es5-ext/object/clear.js create mode 100644 node_modules/es5-ext/object/compact.js create mode 100644 node_modules/es5-ext/object/compare.js create mode 100644 node_modules/es5-ext/object/copy-deep.js create mode 100644 node_modules/es5-ext/object/copy.js create mode 100644 node_modules/es5-ext/object/count.js create mode 100644 node_modules/es5-ext/object/create.js create mode 100644 node_modules/es5-ext/object/ensure-array.js create mode 100644 node_modules/es5-ext/object/ensure-finite-number.js create mode 100644 node_modules/es5-ext/object/ensure-integer.js create mode 100644 node_modules/es5-ext/object/ensure-natural-number-value.js create mode 100644 node_modules/es5-ext/object/ensure-natural-number.js create mode 100644 node_modules/es5-ext/object/ensure-plain-function.js create mode 100644 node_modules/es5-ext/object/ensure-plain-object.js create mode 100644 node_modules/es5-ext/object/ensure-promise.js create mode 100644 node_modules/es5-ext/object/ensure-thenable.js create mode 100644 node_modules/es5-ext/object/entries/implement.js create mode 100644 node_modules/es5-ext/object/entries/index.js create mode 100644 node_modules/es5-ext/object/entries/is-implemented.js create mode 100644 node_modules/es5-ext/object/entries/shim.js create mode 100644 node_modules/es5-ext/object/eq.js create mode 100644 node_modules/es5-ext/object/every.js create mode 100644 node_modules/es5-ext/object/filter.js create mode 100644 node_modules/es5-ext/object/find-key.js create mode 100644 node_modules/es5-ext/object/find.js create mode 100644 node_modules/es5-ext/object/first-key.js create mode 100644 node_modules/es5-ext/object/flatten.js create mode 100644 node_modules/es5-ext/object/for-each.js create mode 100644 node_modules/es5-ext/object/get-property-names.js create mode 100644 node_modules/es5-ext/object/index.js create mode 100644 node_modules/es5-ext/object/is-array-like.js create mode 100644 node_modules/es5-ext/object/is-callable.js create mode 100644 node_modules/es5-ext/object/is-copy-deep.js create mode 100644 node_modules/es5-ext/object/is-copy.js create mode 100644 node_modules/es5-ext/object/is-empty.js create mode 100644 node_modules/es5-ext/object/is-finite-number.js create mode 100644 node_modules/es5-ext/object/is-integer.js create mode 100644 node_modules/es5-ext/object/is-natural-number-value.js create mode 100644 node_modules/es5-ext/object/is-natural-number.js create mode 100644 node_modules/es5-ext/object/is-number-value.js create mode 100644 node_modules/es5-ext/object/is-object.js create mode 100644 node_modules/es5-ext/object/is-plain-function.js create mode 100644 node_modules/es5-ext/object/is-plain-object.js create mode 100644 node_modules/es5-ext/object/is-promise.js create mode 100644 node_modules/es5-ext/object/is-thenable.js create mode 100644 node_modules/es5-ext/object/is-value.js create mode 100644 node_modules/es5-ext/object/is.js create mode 100644 node_modules/es5-ext/object/key-of.js create mode 100644 node_modules/es5-ext/object/keys/implement.js create mode 100644 node_modules/es5-ext/object/keys/index.js create mode 100644 node_modules/es5-ext/object/keys/is-implemented.js create mode 100644 node_modules/es5-ext/object/keys/shim.js create mode 100644 node_modules/es5-ext/object/map-keys.js create mode 100644 node_modules/es5-ext/object/map.js create mode 100644 node_modules/es5-ext/object/mixin-prototypes.js create mode 100644 node_modules/es5-ext/object/mixin.js create mode 100644 node_modules/es5-ext/object/normalize-options.js create mode 100644 node_modules/es5-ext/object/primitive-set.js create mode 100644 node_modules/es5-ext/object/safe-traverse.js create mode 100644 node_modules/es5-ext/object/serialize.js create mode 100644 node_modules/es5-ext/object/set-prototype-of/implement.js create mode 100644 node_modules/es5-ext/object/set-prototype-of/index.js create mode 100644 node_modules/es5-ext/object/set-prototype-of/is-implemented.js create mode 100644 node_modules/es5-ext/object/set-prototype-of/shim.js create mode 100644 node_modules/es5-ext/object/some.js create mode 100644 node_modules/es5-ext/object/to-array.js create mode 100644 node_modules/es5-ext/object/unserialize.js create mode 100644 node_modules/es5-ext/object/valid-callable.js create mode 100644 node_modules/es5-ext/object/valid-object.js create mode 100644 node_modules/es5-ext/object/valid-value.js create mode 100644 node_modules/es5-ext/object/validate-array-like-object.js create mode 100644 node_modules/es5-ext/object/validate-array-like.js create mode 100644 node_modules/es5-ext/object/validate-stringifiable-value.js create mode 100644 node_modules/es5-ext/object/validate-stringifiable.js create mode 100644 node_modules/es5-ext/optional-chaining.js create mode 100644 node_modules/es5-ext/package.json create mode 100644 node_modules/es5-ext/promise/#/as-callback.js create mode 100644 node_modules/es5-ext/promise/#/finally/implement.js create mode 100644 node_modules/es5-ext/promise/#/finally/index.js create mode 100644 node_modules/es5-ext/promise/#/finally/is-implemented.js create mode 100644 node_modules/es5-ext/promise/#/finally/shim.js create mode 100644 node_modules/es5-ext/promise/#/index.js create mode 100644 node_modules/es5-ext/promise/.eslintrc.json create mode 100644 node_modules/es5-ext/promise/index.js create mode 100644 node_modules/es5-ext/promise/lazy.js create mode 100644 node_modules/es5-ext/reg-exp/#/index.js create mode 100644 node_modules/es5-ext/reg-exp/#/is-sticky.js create mode 100644 node_modules/es5-ext/reg-exp/#/is-unicode.js create mode 100644 node_modules/es5-ext/reg-exp/#/match/implement.js create mode 100644 node_modules/es5-ext/reg-exp/#/match/index.js create mode 100644 node_modules/es5-ext/reg-exp/#/match/is-implemented.js create mode 100644 node_modules/es5-ext/reg-exp/#/match/shim.js create mode 100644 node_modules/es5-ext/reg-exp/#/replace/implement.js create mode 100644 node_modules/es5-ext/reg-exp/#/replace/index.js create mode 100644 node_modules/es5-ext/reg-exp/#/replace/is-implemented.js create mode 100644 node_modules/es5-ext/reg-exp/#/replace/shim.js create mode 100644 node_modules/es5-ext/reg-exp/#/search/implement.js create mode 100644 node_modules/es5-ext/reg-exp/#/search/index.js create mode 100644 node_modules/es5-ext/reg-exp/#/search/is-implemented.js create mode 100644 node_modules/es5-ext/reg-exp/#/search/shim.js create mode 100644 node_modules/es5-ext/reg-exp/#/split/implement.js create mode 100644 node_modules/es5-ext/reg-exp/#/split/index.js create mode 100644 node_modules/es5-ext/reg-exp/#/split/is-implemented.js create mode 100644 node_modules/es5-ext/reg-exp/#/split/shim.js create mode 100644 node_modules/es5-ext/reg-exp/#/sticky/implement.js create mode 100644 node_modules/es5-ext/reg-exp/#/sticky/is-implemented.js create mode 100644 node_modules/es5-ext/reg-exp/#/unicode/implement.js create mode 100644 node_modules/es5-ext/reg-exp/#/unicode/is-implemented.js create mode 100644 node_modules/es5-ext/reg-exp/escape.js create mode 100644 node_modules/es5-ext/reg-exp/index.js create mode 100644 node_modules/es5-ext/reg-exp/is-reg-exp.js create mode 100644 node_modules/es5-ext/reg-exp/valid-reg-exp.js create mode 100644 node_modules/es5-ext/safe-to-string.js create mode 100644 node_modules/es5-ext/string/#/@@iterator/implement.js create mode 100644 node_modules/es5-ext/string/#/@@iterator/index.js create mode 100644 node_modules/es5-ext/string/#/@@iterator/is-implemented.js create mode 100644 node_modules/es5-ext/string/#/@@iterator/shim.js create mode 100644 node_modules/es5-ext/string/#/at.js create mode 100644 node_modules/es5-ext/string/#/camel-to-hyphen.js create mode 100644 node_modules/es5-ext/string/#/capitalize.js create mode 100644 node_modules/es5-ext/string/#/case-insensitive-compare.js create mode 100644 node_modules/es5-ext/string/#/code-point-at/implement.js create mode 100644 node_modules/es5-ext/string/#/code-point-at/index.js create mode 100644 node_modules/es5-ext/string/#/code-point-at/is-implemented.js create mode 100644 node_modules/es5-ext/string/#/code-point-at/shim.js create mode 100644 node_modules/es5-ext/string/#/contains/implement.js create mode 100644 node_modules/es5-ext/string/#/contains/index.js create mode 100644 node_modules/es5-ext/string/#/contains/is-implemented.js create mode 100644 node_modules/es5-ext/string/#/contains/shim.js create mode 100644 node_modules/es5-ext/string/#/count.js create mode 100644 node_modules/es5-ext/string/#/ends-with/implement.js create mode 100644 node_modules/es5-ext/string/#/ends-with/index.js create mode 100644 node_modules/es5-ext/string/#/ends-with/is-implemented.js create mode 100644 node_modules/es5-ext/string/#/ends-with/shim.js create mode 100644 node_modules/es5-ext/string/#/hyphen-to-camel.js create mode 100644 node_modules/es5-ext/string/#/indent.js create mode 100644 node_modules/es5-ext/string/#/index.js create mode 100644 node_modules/es5-ext/string/#/last.js create mode 100644 node_modules/es5-ext/string/#/normalize/_data.js create mode 100644 node_modules/es5-ext/string/#/normalize/implement.js create mode 100644 node_modules/es5-ext/string/#/normalize/index.js create mode 100644 node_modules/es5-ext/string/#/normalize/is-implemented.js create mode 100644 node_modules/es5-ext/string/#/normalize/shim.js create mode 100644 node_modules/es5-ext/string/#/pad.js create mode 100644 node_modules/es5-ext/string/#/plain-replace-all.js create mode 100644 node_modules/es5-ext/string/#/plain-replace.js create mode 100644 node_modules/es5-ext/string/#/repeat/implement.js create mode 100644 node_modules/es5-ext/string/#/repeat/index.js create mode 100644 node_modules/es5-ext/string/#/repeat/is-implemented.js create mode 100644 node_modules/es5-ext/string/#/repeat/shim.js create mode 100644 node_modules/es5-ext/string/#/starts-with/implement.js create mode 100644 node_modules/es5-ext/string/#/starts-with/index.js create mode 100644 node_modules/es5-ext/string/#/starts-with/is-implemented.js create mode 100644 node_modules/es5-ext/string/#/starts-with/shim.js create mode 100644 node_modules/es5-ext/string/#/uncapitalize.js create mode 100644 node_modules/es5-ext/string/format-method.js create mode 100644 node_modules/es5-ext/string/from-code-point/implement.js create mode 100644 node_modules/es5-ext/string/from-code-point/index.js create mode 100644 node_modules/es5-ext/string/from-code-point/is-implemented.js create mode 100644 node_modules/es5-ext/string/from-code-point/shim.js create mode 100644 node_modules/es5-ext/string/index.js create mode 100644 node_modules/es5-ext/string/is-string.js create mode 100644 node_modules/es5-ext/string/random-uniq.js create mode 100644 node_modules/es5-ext/string/random.js create mode 100644 node_modules/es5-ext/string/raw/implement.js create mode 100644 node_modules/es5-ext/string/raw/index.js create mode 100644 node_modules/es5-ext/string/raw/is-implemented.js create mode 100644 node_modules/es5-ext/string/raw/shim.js create mode 100644 node_modules/es5-ext/test/.eslintrc.json create mode 100644 node_modules/es5-ext/test/__tad.js create mode 100644 node_modules/es5-ext/test/array/#/@@iterator/implement.js create mode 100644 node_modules/es5-ext/test/array/#/@@iterator/index.js create mode 100644 node_modules/es5-ext/test/array/#/@@iterator/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/@@iterator/shim.js create mode 100644 node_modules/es5-ext/test/array/#/_compare-by-length.js create mode 100644 node_modules/es5-ext/test/array/#/binary-search.js create mode 100644 node_modules/es5-ext/test/array/#/clear.js create mode 100644 node_modules/es5-ext/test/array/#/compact.js create mode 100644 node_modules/es5-ext/test/array/#/concat/implement.js create mode 100644 node_modules/es5-ext/test/array/#/concat/index.js create mode 100644 node_modules/es5-ext/test/array/#/concat/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/concat/shim.js create mode 100644 node_modules/es5-ext/test/array/#/contains.js create mode 100644 node_modules/es5-ext/test/array/#/copy-within/implement.js create mode 100644 node_modules/es5-ext/test/array/#/copy-within/index.js create mode 100644 node_modules/es5-ext/test/array/#/copy-within/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/copy-within/shim.js create mode 100644 node_modules/es5-ext/test/array/#/diff.js create mode 100644 node_modules/es5-ext/test/array/#/e-index-of.js create mode 100644 node_modules/es5-ext/test/array/#/e-last-index-of.js create mode 100644 node_modules/es5-ext/test/array/#/entries/implement.js create mode 100644 node_modules/es5-ext/test/array/#/entries/index.js create mode 100644 node_modules/es5-ext/test/array/#/entries/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/entries/shim.js create mode 100644 node_modules/es5-ext/test/array/#/exclusion.js create mode 100644 node_modules/es5-ext/test/array/#/fill/implement.js create mode 100644 node_modules/es5-ext/test/array/#/fill/index.js create mode 100644 node_modules/es5-ext/test/array/#/fill/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/fill/shim.js create mode 100644 node_modules/es5-ext/test/array/#/filter/implement.js create mode 100644 node_modules/es5-ext/test/array/#/filter/index.js create mode 100644 node_modules/es5-ext/test/array/#/filter/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/filter/shim.js create mode 100644 node_modules/es5-ext/test/array/#/find-index/implement.js create mode 100644 node_modules/es5-ext/test/array/#/find-index/index.js create mode 100644 node_modules/es5-ext/test/array/#/find-index/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/find-index/shim.js create mode 100644 node_modules/es5-ext/test/array/#/find/implement.js create mode 100644 node_modules/es5-ext/test/array/#/find/index.js create mode 100644 node_modules/es5-ext/test/array/#/find/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/find/shim.js create mode 100644 node_modules/es5-ext/test/array/#/first-index.js create mode 100644 node_modules/es5-ext/test/array/#/first.js create mode 100644 node_modules/es5-ext/test/array/#/flatten.js create mode 100644 node_modules/es5-ext/test/array/#/for-each-right.js create mode 100644 node_modules/es5-ext/test/array/#/group.js create mode 100644 node_modules/es5-ext/test/array/#/indexes-of.js create mode 100644 node_modules/es5-ext/test/array/#/intersection.js create mode 100644 node_modules/es5-ext/test/array/#/is-copy.js create mode 100644 node_modules/es5-ext/test/array/#/is-empty.js create mode 100644 node_modules/es5-ext/test/array/#/is-uniq.js create mode 100644 node_modules/es5-ext/test/array/#/keys/implement.js create mode 100644 node_modules/es5-ext/test/array/#/keys/index.js create mode 100644 node_modules/es5-ext/test/array/#/keys/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/keys/shim.js create mode 100644 node_modules/es5-ext/test/array/#/last-index.js create mode 100644 node_modules/es5-ext/test/array/#/last.js create mode 100644 node_modules/es5-ext/test/array/#/map/implement.js create mode 100644 node_modules/es5-ext/test/array/#/map/index.js create mode 100644 node_modules/es5-ext/test/array/#/map/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/map/shim.js create mode 100644 node_modules/es5-ext/test/array/#/remove.js create mode 100644 node_modules/es5-ext/test/array/#/separate.js create mode 100644 node_modules/es5-ext/test/array/#/slice/implement.js create mode 100644 node_modules/es5-ext/test/array/#/slice/index.js create mode 100644 node_modules/es5-ext/test/array/#/slice/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/slice/shim.js create mode 100644 node_modules/es5-ext/test/array/#/some-right.js create mode 100644 node_modules/es5-ext/test/array/#/splice/implement.js create mode 100644 node_modules/es5-ext/test/array/#/splice/index.js create mode 100644 node_modules/es5-ext/test/array/#/splice/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/splice/shim.js create mode 100644 node_modules/es5-ext/test/array/#/uniq.js create mode 100644 node_modules/es5-ext/test/array/#/values/implement.js create mode 100644 node_modules/es5-ext/test/array/#/values/index.js create mode 100644 node_modules/es5-ext/test/array/#/values/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/#/values/shim.js create mode 100644 node_modules/es5-ext/test/array/__scopes.js create mode 100644 node_modules/es5-ext/test/array/_is-extensible.js create mode 100644 node_modules/es5-ext/test/array/_sub-array-dummy-safe.js create mode 100644 node_modules/es5-ext/test/array/_sub-array-dummy.js create mode 100644 node_modules/es5-ext/test/array/from/implement.js create mode 100644 node_modules/es5-ext/test/array/from/index.js create mode 100644 node_modules/es5-ext/test/array/from/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/from/shim.js create mode 100644 node_modules/es5-ext/test/array/generate.js create mode 100644 node_modules/es5-ext/test/array/is-plain-array.js create mode 100644 node_modules/es5-ext/test/array/of/implement.js create mode 100644 node_modules/es5-ext/test/array/of/index.js create mode 100644 node_modules/es5-ext/test/array/of/is-implemented.js create mode 100644 node_modules/es5-ext/test/array/of/shim.js create mode 100644 node_modules/es5-ext/test/array/to-array.js create mode 100644 node_modules/es5-ext/test/array/valid-array.js create mode 100644 node_modules/es5-ext/test/boolean/is-boolean.js create mode 100644 node_modules/es5-ext/test/date/#/copy.js create mode 100644 node_modules/es5-ext/test/date/#/days-in-month.js create mode 100644 node_modules/es5-ext/test/date/#/floor-day.js create mode 100644 node_modules/es5-ext/test/date/#/floor-month.js create mode 100644 node_modules/es5-ext/test/date/#/floor-year.js create mode 100644 node_modules/es5-ext/test/date/#/format.js create mode 100644 node_modules/es5-ext/test/date/ensure-time-value.js create mode 100644 node_modules/es5-ext/test/date/is-date.js create mode 100644 node_modules/es5-ext/test/date/is-time-value.js create mode 100644 node_modules/es5-ext/test/date/valid-date.js create mode 100644 node_modules/es5-ext/test/error/#/throw.js create mode 100644 node_modules/es5-ext/test/error/custom.js create mode 100644 node_modules/es5-ext/test/error/is-error.js create mode 100644 node_modules/es5-ext/test/error/valid-error.js create mode 100644 node_modules/es5-ext/test/function/#/compose.js create mode 100644 node_modules/es5-ext/test/function/#/copy.js create mode 100644 node_modules/es5-ext/test/function/#/curry.js create mode 100644 node_modules/es5-ext/test/function/#/lock.js create mode 100644 node_modules/es5-ext/test/function/#/microtask-delay.js create mode 100644 node_modules/es5-ext/test/function/#/not.js create mode 100644 node_modules/es5-ext/test/function/#/partial.js create mode 100644 node_modules/es5-ext/test/function/#/spread.js create mode 100644 node_modules/es5-ext/test/function/#/to-string-tokens.js create mode 100644 node_modules/es5-ext/test/function/_define-length.js create mode 100644 node_modules/es5-ext/test/function/constant.js create mode 100644 node_modules/es5-ext/test/function/identity.js create mode 100644 node_modules/es5-ext/test/function/invoke.js create mode 100644 node_modules/es5-ext/test/function/is-arguments.js create mode 100644 node_modules/es5-ext/test/function/is-function.js create mode 100644 node_modules/es5-ext/test/function/noop.js create mode 100644 node_modules/es5-ext/test/function/pluck.js create mode 100644 node_modules/es5-ext/test/function/valid-function.js create mode 100644 node_modules/es5-ext/test/global.js create mode 100644 node_modules/es5-ext/test/iterable/for-each.js create mode 100644 node_modules/es5-ext/test/iterable/is.js create mode 100644 node_modules/es5-ext/test/iterable/validate-object.js create mode 100644 node_modules/es5-ext/test/iterable/validate.js create mode 100644 node_modules/es5-ext/test/json/safe-stringify.js create mode 100644 node_modules/es5-ext/test/math/_decimal-adjust.js create mode 100644 node_modules/es5-ext/test/math/_pack-ieee754.js create mode 100644 node_modules/es5-ext/test/math/_unpack-ieee754.js create mode 100644 node_modules/es5-ext/test/math/acosh/implement.js create mode 100644 node_modules/es5-ext/test/math/acosh/index.js create mode 100644 node_modules/es5-ext/test/math/acosh/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/acosh/shim.js create mode 100644 node_modules/es5-ext/test/math/asinh/implement.js create mode 100644 node_modules/es5-ext/test/math/asinh/index.js create mode 100644 node_modules/es5-ext/test/math/asinh/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/asinh/shim.js create mode 100644 node_modules/es5-ext/test/math/atanh/implement.js create mode 100644 node_modules/es5-ext/test/math/atanh/index.js create mode 100644 node_modules/es5-ext/test/math/atanh/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/atanh/shim.js create mode 100644 node_modules/es5-ext/test/math/cbrt/implement.js create mode 100644 node_modules/es5-ext/test/math/cbrt/index.js create mode 100644 node_modules/es5-ext/test/math/cbrt/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/cbrt/shim.js create mode 100644 node_modules/es5-ext/test/math/ceil-10.js create mode 100644 node_modules/es5-ext/test/math/clz32/implement.js create mode 100644 node_modules/es5-ext/test/math/clz32/index.js create mode 100644 node_modules/es5-ext/test/math/clz32/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/clz32/shim.js create mode 100644 node_modules/es5-ext/test/math/cosh/implement.js create mode 100644 node_modules/es5-ext/test/math/cosh/index.js create mode 100644 node_modules/es5-ext/test/math/cosh/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/cosh/shim.js create mode 100644 node_modules/es5-ext/test/math/expm1/implement.js create mode 100644 node_modules/es5-ext/test/math/expm1/index.js create mode 100644 node_modules/es5-ext/test/math/expm1/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/expm1/shim.js create mode 100644 node_modules/es5-ext/test/math/floor-10.js create mode 100644 node_modules/es5-ext/test/math/fround/implement.js create mode 100644 node_modules/es5-ext/test/math/fround/index.js create mode 100644 node_modules/es5-ext/test/math/fround/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/fround/shim.js create mode 100644 node_modules/es5-ext/test/math/hypot/implement.js create mode 100644 node_modules/es5-ext/test/math/hypot/index.js create mode 100644 node_modules/es5-ext/test/math/hypot/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/hypot/shim.js create mode 100644 node_modules/es5-ext/test/math/imul/implement.js create mode 100644 node_modules/es5-ext/test/math/imul/index.js create mode 100644 node_modules/es5-ext/test/math/imul/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/imul/shim.js create mode 100644 node_modules/es5-ext/test/math/log10/implement.js create mode 100644 node_modules/es5-ext/test/math/log10/index.js create mode 100644 node_modules/es5-ext/test/math/log10/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/log10/shim.js create mode 100644 node_modules/es5-ext/test/math/log1p/implement.js create mode 100644 node_modules/es5-ext/test/math/log1p/index.js create mode 100644 node_modules/es5-ext/test/math/log1p/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/log1p/shim.js create mode 100644 node_modules/es5-ext/test/math/log2/implement.js create mode 100644 node_modules/es5-ext/test/math/log2/index.js create mode 100644 node_modules/es5-ext/test/math/log2/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/log2/shim.js create mode 100644 node_modules/es5-ext/test/math/round-10.js create mode 100644 node_modules/es5-ext/test/math/sign/implement.js create mode 100644 node_modules/es5-ext/test/math/sign/index.js create mode 100644 node_modules/es5-ext/test/math/sign/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/sign/shim.js create mode 100644 node_modules/es5-ext/test/math/sinh/implement.js create mode 100644 node_modules/es5-ext/test/math/sinh/index.js create mode 100644 node_modules/es5-ext/test/math/sinh/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/sinh/shim.js create mode 100644 node_modules/es5-ext/test/math/tanh/implement.js create mode 100644 node_modules/es5-ext/test/math/tanh/index.js create mode 100644 node_modules/es5-ext/test/math/tanh/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/tanh/shim.js create mode 100644 node_modules/es5-ext/test/math/trunc/implement.js create mode 100644 node_modules/es5-ext/test/math/trunc/index.js create mode 100644 node_modules/es5-ext/test/math/trunc/is-implemented.js create mode 100644 node_modules/es5-ext/test/math/trunc/shim.js create mode 100644 node_modules/es5-ext/test/number/#/pad.js create mode 100644 node_modules/es5-ext/test/number/epsilon/implement.js create mode 100644 node_modules/es5-ext/test/number/epsilon/index.js create mode 100644 node_modules/es5-ext/test/number/epsilon/is-implemented.js create mode 100644 node_modules/es5-ext/test/number/is-finite/implement.js create mode 100644 node_modules/es5-ext/test/number/is-finite/index.js create mode 100644 node_modules/es5-ext/test/number/is-finite/is-implemented.js create mode 100644 node_modules/es5-ext/test/number/is-finite/shim.js create mode 100644 node_modules/es5-ext/test/number/is-integer/implement.js create mode 100644 node_modules/es5-ext/test/number/is-integer/index.js create mode 100644 node_modules/es5-ext/test/number/is-integer/is-implemented.js create mode 100644 node_modules/es5-ext/test/number/is-integer/shim.js create mode 100644 node_modules/es5-ext/test/number/is-nan/implement.js create mode 100644 node_modules/es5-ext/test/number/is-nan/index.js create mode 100644 node_modules/es5-ext/test/number/is-nan/is-implemented.js create mode 100644 node_modules/es5-ext/test/number/is-nan/shim.js create mode 100644 node_modules/es5-ext/test/number/is-natural.js create mode 100644 node_modules/es5-ext/test/number/is-number.js create mode 100644 node_modules/es5-ext/test/number/is-safe-integer/implement.js create mode 100644 node_modules/es5-ext/test/number/is-safe-integer/index.js create mode 100644 node_modules/es5-ext/test/number/is-safe-integer/is-implemented.js create mode 100644 node_modules/es5-ext/test/number/is-safe-integer/shim.js create mode 100644 node_modules/es5-ext/test/number/max-safe-integer/implement.js create mode 100644 node_modules/es5-ext/test/number/max-safe-integer/index.js create mode 100644 node_modules/es5-ext/test/number/max-safe-integer/is-implemented.js create mode 100644 node_modules/es5-ext/test/number/min-safe-integer/implement.js create mode 100644 node_modules/es5-ext/test/number/min-safe-integer/index.js create mode 100644 node_modules/es5-ext/test/number/min-safe-integer/is-implemented.js create mode 100644 node_modules/es5-ext/test/number/to-integer.js create mode 100644 node_modules/es5-ext/test/number/to-pos-integer.js create mode 100644 node_modules/es5-ext/test/number/to-uint32.js create mode 100644 node_modules/es5-ext/test/object/_iterate.js create mode 100644 node_modules/es5-ext/test/object/assign-deep.js create mode 100644 node_modules/es5-ext/test/object/assign/implement.js create mode 100644 node_modules/es5-ext/test/object/assign/index.js create mode 100644 node_modules/es5-ext/test/object/assign/is-implemented.js create mode 100644 node_modules/es5-ext/test/object/assign/shim.js create mode 100644 node_modules/es5-ext/test/object/clear.js create mode 100644 node_modules/es5-ext/test/object/compact.js create mode 100644 node_modules/es5-ext/test/object/compare.js create mode 100644 node_modules/es5-ext/test/object/copy-deep.js create mode 100644 node_modules/es5-ext/test/object/copy.js create mode 100644 node_modules/es5-ext/test/object/count.js create mode 100644 node_modules/es5-ext/test/object/create.js create mode 100644 node_modules/es5-ext/test/object/ensure-array.js create mode 100644 node_modules/es5-ext/test/object/ensure-finite-number.js create mode 100644 node_modules/es5-ext/test/object/ensure-integer.js create mode 100644 node_modules/es5-ext/test/object/ensure-natural-number-value.js create mode 100644 node_modules/es5-ext/test/object/ensure-natural-number.js create mode 100644 node_modules/es5-ext/test/object/ensure-plain-function.js create mode 100644 node_modules/es5-ext/test/object/ensure-plain-object.js create mode 100644 node_modules/es5-ext/test/object/ensure-promise.js create mode 100644 node_modules/es5-ext/test/object/ensure-thenable.js create mode 100644 node_modules/es5-ext/test/object/entries/implement.js create mode 100644 node_modules/es5-ext/test/object/entries/index.js create mode 100644 node_modules/es5-ext/test/object/entries/is-implemented.js create mode 100644 node_modules/es5-ext/test/object/entries/shim.js create mode 100644 node_modules/es5-ext/test/object/eq.js create mode 100644 node_modules/es5-ext/test/object/every.js create mode 100644 node_modules/es5-ext/test/object/filter.js create mode 100644 node_modules/es5-ext/test/object/find-key.js create mode 100644 node_modules/es5-ext/test/object/find.js create mode 100644 node_modules/es5-ext/test/object/first-key.js create mode 100644 node_modules/es5-ext/test/object/flatten.js create mode 100644 node_modules/es5-ext/test/object/for-each.js create mode 100644 node_modules/es5-ext/test/object/get-property-names.js create mode 100644 node_modules/es5-ext/test/object/is-array-like.js create mode 100644 node_modules/es5-ext/test/object/is-callable.js create mode 100644 node_modules/es5-ext/test/object/is-copy-deep.js create mode 100644 node_modules/es5-ext/test/object/is-copy.js create mode 100644 node_modules/es5-ext/test/object/is-empty.js create mode 100644 node_modules/es5-ext/test/object/is-finite-number.js create mode 100644 node_modules/es5-ext/test/object/is-integer.js create mode 100644 node_modules/es5-ext/test/object/is-natural-number-value.js create mode 100644 node_modules/es5-ext/test/object/is-natural-number.js create mode 100644 node_modules/es5-ext/test/object/is-number-value.js create mode 100644 node_modules/es5-ext/test/object/is-object.js create mode 100644 node_modules/es5-ext/test/object/is-plain-function.js create mode 100644 node_modules/es5-ext/test/object/is-plain-object.js create mode 100644 node_modules/es5-ext/test/object/is-promise.js create mode 100644 node_modules/es5-ext/test/object/is-thenable.js create mode 100644 node_modules/es5-ext/test/object/is-value.js create mode 100644 node_modules/es5-ext/test/object/is.js create mode 100644 node_modules/es5-ext/test/object/key-of.js create mode 100644 node_modules/es5-ext/test/object/keys/implement.js create mode 100644 node_modules/es5-ext/test/object/keys/index.js create mode 100644 node_modules/es5-ext/test/object/keys/is-implemented.js create mode 100644 node_modules/es5-ext/test/object/keys/shim.js create mode 100644 node_modules/es5-ext/test/object/map-keys.js create mode 100644 node_modules/es5-ext/test/object/map.js create mode 100644 node_modules/es5-ext/test/object/mixin-prototypes.js create mode 100644 node_modules/es5-ext/test/object/mixin.js create mode 100644 node_modules/es5-ext/test/object/normalize-options.js create mode 100644 node_modules/es5-ext/test/object/primitive-set.js create mode 100644 node_modules/es5-ext/test/object/safe-traverse.js create mode 100644 node_modules/es5-ext/test/object/serialize.js create mode 100644 node_modules/es5-ext/test/object/set-prototype-of/implement.js create mode 100644 node_modules/es5-ext/test/object/set-prototype-of/index.js create mode 100644 node_modules/es5-ext/test/object/set-prototype-of/is-implemented.js create mode 100644 node_modules/es5-ext/test/object/set-prototype-of/shim.js create mode 100644 node_modules/es5-ext/test/object/some.js create mode 100644 node_modules/es5-ext/test/object/to-array.js create mode 100644 node_modules/es5-ext/test/object/unserialize.js create mode 100644 node_modules/es5-ext/test/object/valid-callable.js create mode 100644 node_modules/es5-ext/test/object/valid-object.js create mode 100644 node_modules/es5-ext/test/object/valid-value.js create mode 100644 node_modules/es5-ext/test/object/validate-array-like-object.js create mode 100644 node_modules/es5-ext/test/object/validate-array-like.js create mode 100644 node_modules/es5-ext/test/object/validate-stringifiable-value.js create mode 100644 node_modules/es5-ext/test/object/validate-stringifiable.js create mode 100644 node_modules/es5-ext/test/optional-chaining.js create mode 100644 node_modules/es5-ext/test/promise/#/as-callback.js create mode 100644 node_modules/es5-ext/test/promise/#/finally/implement.js create mode 100644 node_modules/es5-ext/test/promise/#/finally/index.js create mode 100644 node_modules/es5-ext/test/promise/#/finally/is-implemented.js create mode 100644 node_modules/es5-ext/test/promise/#/finally/shim.js create mode 100644 node_modules/es5-ext/test/promise/.eslintrc.json create mode 100644 node_modules/es5-ext/test/promise/lazy.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/index.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/is-sticky.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/is-unicode.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/match/implement.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/match/index.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/match/is-implemented.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/match/shim.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/replace/implement.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/replace/index.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/replace/is-implemented.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/replace/shim.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/search/implement.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/search/index.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/search/is-implemented.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/search/shim.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/split/implement.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/split/index.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/split/is-implemented.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/split/shim.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/sticky/implement.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/sticky/is-implemented.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/unicode/implement.js create mode 100644 node_modules/es5-ext/test/reg-exp/#/unicode/is-implemented.js create mode 100644 node_modules/es5-ext/test/reg-exp/escape.js create mode 100644 node_modules/es5-ext/test/reg-exp/is-reg-exp.js create mode 100644 node_modules/es5-ext/test/reg-exp/valid-reg-exp.js create mode 100644 node_modules/es5-ext/test/safe-to-string.js create mode 100644 node_modules/es5-ext/test/string/#/@@iterator/implement.js create mode 100644 node_modules/es5-ext/test/string/#/@@iterator/index.js create mode 100644 node_modules/es5-ext/test/string/#/@@iterator/is-implemented.js create mode 100644 node_modules/es5-ext/test/string/#/@@iterator/shim.js create mode 100644 node_modules/es5-ext/test/string/#/at.js create mode 100644 node_modules/es5-ext/test/string/#/camel-to-hyphen.js create mode 100644 node_modules/es5-ext/test/string/#/capitalize.js create mode 100644 node_modules/es5-ext/test/string/#/case-insensitive-compare.js create mode 100644 node_modules/es5-ext/test/string/#/code-point-at/implement.js create mode 100644 node_modules/es5-ext/test/string/#/code-point-at/index.js create mode 100644 node_modules/es5-ext/test/string/#/code-point-at/is-implemented.js create mode 100644 node_modules/es5-ext/test/string/#/code-point-at/shim.js create mode 100644 node_modules/es5-ext/test/string/#/contains/implement.js create mode 100644 node_modules/es5-ext/test/string/#/contains/index.js create mode 100644 node_modules/es5-ext/test/string/#/contains/is-implemented.js create mode 100644 node_modules/es5-ext/test/string/#/contains/shim.js create mode 100644 node_modules/es5-ext/test/string/#/count.js create mode 100644 node_modules/es5-ext/test/string/#/ends-with/implement.js create mode 100644 node_modules/es5-ext/test/string/#/ends-with/index.js create mode 100644 node_modules/es5-ext/test/string/#/ends-with/is-implemented.js create mode 100644 node_modules/es5-ext/test/string/#/ends-with/shim.js create mode 100644 node_modules/es5-ext/test/string/#/hyphen-to-camel.js create mode 100644 node_modules/es5-ext/test/string/#/indent.js create mode 100644 node_modules/es5-ext/test/string/#/last.js create mode 100644 node_modules/es5-ext/test/string/#/normalize/_data.js create mode 100644 node_modules/es5-ext/test/string/#/normalize/implement.js create mode 100644 node_modules/es5-ext/test/string/#/normalize/index.js create mode 100644 node_modules/es5-ext/test/string/#/normalize/is-implemented.js create mode 100644 node_modules/es5-ext/test/string/#/normalize/shim.js create mode 100644 node_modules/es5-ext/test/string/#/pad.js create mode 100644 node_modules/es5-ext/test/string/#/plain-replace-all.js create mode 100644 node_modules/es5-ext/test/string/#/plain-replace.js create mode 100644 node_modules/es5-ext/test/string/#/repeat/implement.js create mode 100644 node_modules/es5-ext/test/string/#/repeat/index.js create mode 100644 node_modules/es5-ext/test/string/#/repeat/is-implemented.js create mode 100644 node_modules/es5-ext/test/string/#/repeat/shim.js create mode 100644 node_modules/es5-ext/test/string/#/starts-with/implement.js create mode 100644 node_modules/es5-ext/test/string/#/starts-with/index.js create mode 100644 node_modules/es5-ext/test/string/#/starts-with/is-implemented.js create mode 100644 node_modules/es5-ext/test/string/#/starts-with/shim.js create mode 100644 node_modules/es5-ext/test/string/#/uncapitalize.js create mode 100644 node_modules/es5-ext/test/string/format-method.js create mode 100644 node_modules/es5-ext/test/string/from-code-point/implement.js create mode 100644 node_modules/es5-ext/test/string/from-code-point/index.js create mode 100644 node_modules/es5-ext/test/string/from-code-point/is-implemented.js create mode 100644 node_modules/es5-ext/test/string/from-code-point/shim.js create mode 100644 node_modules/es5-ext/test/string/is-string.js create mode 100644 node_modules/es5-ext/test/string/random-uniq.js create mode 100644 node_modules/es5-ext/test/string/random.js create mode 100644 node_modules/es5-ext/test/string/raw/implement.js create mode 100644 node_modules/es5-ext/test/string/raw/index.js create mode 100644 node_modules/es5-ext/test/string/raw/is-implemented.js create mode 100644 node_modules/es5-ext/test/string/raw/shim.js create mode 100644 node_modules/es5-ext/test/to-short-string-representation.js create mode 100644 node_modules/es5-ext/to-short-string-representation.js create mode 100644 node_modules/es6-iterator/#/chain.js create mode 100644 node_modules/es6-iterator/.editorconfig create mode 100644 node_modules/es6-iterator/.npmignore create mode 100644 node_modules/es6-iterator/CHANGELOG.md create mode 100644 node_modules/es6-iterator/CHANGES create mode 100644 node_modules/es6-iterator/LICENSE create mode 100644 node_modules/es6-iterator/README.md create mode 100644 node_modules/es6-iterator/appveyor.yml create mode 100644 node_modules/es6-iterator/array.js create mode 100644 node_modules/es6-iterator/for-of.js create mode 100644 node_modules/es6-iterator/get.js create mode 100644 node_modules/es6-iterator/index.js create mode 100644 node_modules/es6-iterator/is-iterable.js create mode 100644 node_modules/es6-iterator/package.json create mode 100644 node_modules/es6-iterator/string.js create mode 100644 node_modules/es6-iterator/test/#/chain.js create mode 100644 node_modules/es6-iterator/test/.eslintrc.json create mode 100644 node_modules/es6-iterator/test/array.js create mode 100644 node_modules/es6-iterator/test/for-of.js create mode 100644 node_modules/es6-iterator/test/get.js create mode 100644 node_modules/es6-iterator/test/index.js create mode 100644 node_modules/es6-iterator/test/is-iterable.js create mode 100644 node_modules/es6-iterator/test/string.js create mode 100644 node_modules/es6-iterator/test/valid-iterable.js create mode 100644 node_modules/es6-iterator/valid-iterable.js create mode 100755 node_modules/es6-symbol/.editorconfig create mode 100644 node_modules/es6-symbol/.github/FUNDING.yml create mode 100644 node_modules/es6-symbol/.testignore create mode 100644 node_modules/es6-symbol/CHANGELOG.md create mode 100644 node_modules/es6-symbol/CHANGES create mode 100644 node_modules/es6-symbol/LICENSE create mode 100644 node_modules/es6-symbol/README.md create mode 100644 node_modules/es6-symbol/implement.js create mode 100644 node_modules/es6-symbol/index.js create mode 100644 node_modules/es6-symbol/is-implemented.js create mode 100644 node_modules/es6-symbol/is-native-implemented.js create mode 100644 node_modules/es6-symbol/is-symbol.js create mode 100644 node_modules/es6-symbol/package.json create mode 100644 node_modules/es6-symbol/polyfill.js create mode 100644 node_modules/es6-symbol/test/implement.js create mode 100644 node_modules/es6-symbol/test/index.js create mode 100644 node_modules/es6-symbol/test/is-implemented.js create mode 100644 node_modules/es6-symbol/test/is-native-implemented.js create mode 100644 node_modules/es6-symbol/test/is-symbol.js create mode 100644 node_modules/es6-symbol/test/polyfill.js create mode 100644 node_modules/es6-symbol/test/validate-symbol.js create mode 100644 node_modules/es6-symbol/validate-symbol.js create mode 100644 node_modules/es6-weak-map/.editorconfig create mode 100644 node_modules/es6-weak-map/CHANGELOG.md create mode 100644 node_modules/es6-weak-map/CHANGES create mode 100644 node_modules/es6-weak-map/LICENSE create mode 100644 node_modules/es6-weak-map/README.md create mode 100644 node_modules/es6-weak-map/implement.js create mode 100644 node_modules/es6-weak-map/index.js create mode 100644 node_modules/es6-weak-map/is-implemented.js create mode 100644 node_modules/es6-weak-map/is-native-implemented.js create mode 100644 node_modules/es6-weak-map/is-weak-map.js create mode 100644 node_modules/es6-weak-map/package.json create mode 100644 node_modules/es6-weak-map/polyfill.js create mode 100644 node_modules/es6-weak-map/test/implement.js create mode 100644 node_modules/es6-weak-map/test/index.js create mode 100644 node_modules/es6-weak-map/test/is-implemented.js create mode 100644 node_modules/es6-weak-map/test/is-native-implemented.js create mode 100644 node_modules/es6-weak-map/test/is-weak-map.js create mode 100644 node_modules/es6-weak-map/test/polyfill.js create mode 100644 node_modules/es6-weak-map/test/valid-weak-map.js create mode 100644 node_modules/es6-weak-map/valid-weak-map.js create mode 100644 node_modules/escape-string-regexp/index.js create mode 100644 node_modules/escape-string-regexp/license create mode 100644 node_modules/escape-string-regexp/package.json create mode 100644 node_modules/escape-string-regexp/readme.md create mode 100644 node_modules/event-emitter/.lint create mode 100644 node_modules/event-emitter/.npmignore create mode 100644 node_modules/event-emitter/.testignore create mode 100644 node_modules/event-emitter/.travis.yml create mode 100644 node_modules/event-emitter/CHANGES create mode 100644 node_modules/event-emitter/LICENSE create mode 100644 node_modules/event-emitter/README.md create mode 100644 node_modules/event-emitter/all-off.js create mode 100644 node_modules/event-emitter/benchmark/many-on.js create mode 100644 node_modules/event-emitter/benchmark/single-on.js create mode 100644 node_modules/event-emitter/emit-error.js create mode 100644 node_modules/event-emitter/has-listeners.js create mode 100644 node_modules/event-emitter/index.js create mode 100644 node_modules/event-emitter/package.json create mode 100644 node_modules/event-emitter/pipe.js create mode 100644 node_modules/event-emitter/test/all-off.js create mode 100644 node_modules/event-emitter/test/emit-error.js create mode 100644 node_modules/event-emitter/test/has-listeners.js create mode 100644 node_modules/event-emitter/test/index.js create mode 100644 node_modules/event-emitter/test/pipe.js create mode 100644 node_modules/event-emitter/test/unify.js create mode 100644 node_modules/event-emitter/unify.js create mode 100644 node_modules/expand-brackets/LICENSE create mode 100644 node_modules/expand-brackets/README.md create mode 100644 node_modules/expand-brackets/changelog.md create mode 100644 node_modules/expand-brackets/index.js create mode 100644 node_modules/expand-brackets/package.json create mode 100644 node_modules/expand-tilde/LICENSE create mode 100644 node_modules/expand-tilde/README.md create mode 100644 node_modules/expand-tilde/index.js create mode 100644 node_modules/expand-tilde/package.json create mode 100644 node_modules/ext/.editorconfig create mode 100644 node_modules/ext/CHANGELOG.md create mode 100644 node_modules/ext/LICENSE create mode 100644 node_modules/ext/README.md create mode 100644 node_modules/ext/docs/function/identity.md create mode 100644 node_modules/ext/docs/global-this.md create mode 100644 node_modules/ext/docs/math/ceil-10.md create mode 100644 node_modules/ext/docs/math/floor-10.md create mode 100644 node_modules/ext/docs/math/round-10.md create mode 100644 node_modules/ext/docs/object/entries.md create mode 100644 node_modules/ext/docs/string/random.md create mode 100644 node_modules/ext/docs/string_/includes.md create mode 100644 node_modules/ext/docs/thenable_/finally.md create mode 100644 node_modules/ext/function/identity.js create mode 100644 node_modules/ext/global-this/implementation.js create mode 100644 node_modules/ext/global-this/index.js create mode 100644 node_modules/ext/global-this/is-implemented.js create mode 100644 node_modules/ext/math/ceil-10.js create mode 100644 node_modules/ext/math/floor-10.js create mode 100644 node_modules/ext/math/round-10.js create mode 100644 node_modules/ext/node_modules/type/.editorconfig create mode 100644 node_modules/ext/node_modules/type/CHANGELOG.md create mode 100644 node_modules/ext/node_modules/type/LICENSE create mode 100644 node_modules/ext/node_modules/type/README.md create mode 100644 node_modules/ext/node_modules/type/array-length/coerce.js create mode 100644 node_modules/ext/node_modules/type/array-length/ensure.js create mode 100644 node_modules/ext/node_modules/type/array-like/ensure.js create mode 100644 node_modules/ext/node_modules/type/array-like/is.js create mode 100644 node_modules/ext/node_modules/type/array/ensure.js create mode 100644 node_modules/ext/node_modules/type/array/is.js create mode 100644 node_modules/ext/node_modules/type/date/ensure.js create mode 100644 node_modules/ext/node_modules/type/date/is.js create mode 100644 node_modules/ext/node_modules/type/docs/array-length.md create mode 100644 node_modules/ext/node_modules/type/docs/array-like.md create mode 100644 node_modules/ext/node_modules/type/docs/array.md create mode 100644 node_modules/ext/node_modules/type/docs/date.md create mode 100644 node_modules/ext/node_modules/type/docs/ensure.md create mode 100644 node_modules/ext/node_modules/type/docs/error.md create mode 100644 node_modules/ext/node_modules/type/docs/finite.md create mode 100644 node_modules/ext/node_modules/type/docs/function.md create mode 100644 node_modules/ext/node_modules/type/docs/integer.md create mode 100644 node_modules/ext/node_modules/type/docs/iterable.md create mode 100644 node_modules/ext/node_modules/type/docs/natural-number.md create mode 100644 node_modules/ext/node_modules/type/docs/number.md create mode 100644 node_modules/ext/node_modules/type/docs/object.md create mode 100644 node_modules/ext/node_modules/type/docs/plain-function.md create mode 100644 node_modules/ext/node_modules/type/docs/plain-object.md create mode 100644 node_modules/ext/node_modules/type/docs/promise.md create mode 100644 node_modules/ext/node_modules/type/docs/prototype.md create mode 100644 node_modules/ext/node_modules/type/docs/reg-exp.md create mode 100644 node_modules/ext/node_modules/type/docs/safe-integer.md create mode 100644 node_modules/ext/node_modules/type/docs/string.md create mode 100644 node_modules/ext/node_modules/type/docs/thenable.md create mode 100644 node_modules/ext/node_modules/type/docs/time-value.md create mode 100644 node_modules/ext/node_modules/type/docs/value.md create mode 100644 node_modules/ext/node_modules/type/ensure.js create mode 100644 node_modules/ext/node_modules/type/error/ensure.js create mode 100644 node_modules/ext/node_modules/type/error/is.js create mode 100644 node_modules/ext/node_modules/type/finite/coerce.js create mode 100644 node_modules/ext/node_modules/type/finite/ensure.js create mode 100644 node_modules/ext/node_modules/type/function/ensure.js create mode 100644 node_modules/ext/node_modules/type/function/is.js create mode 100644 node_modules/ext/node_modules/type/integer/coerce.js create mode 100644 node_modules/ext/node_modules/type/integer/ensure.js create mode 100644 node_modules/ext/node_modules/type/iterable/ensure.js create mode 100644 node_modules/ext/node_modules/type/iterable/is.js create mode 100644 node_modules/ext/node_modules/type/natural-number/coerce.js create mode 100644 node_modules/ext/node_modules/type/natural-number/ensure.js create mode 100644 node_modules/ext/node_modules/type/number/coerce.js create mode 100644 node_modules/ext/node_modules/type/number/ensure.js create mode 100644 node_modules/ext/node_modules/type/object/ensure.js create mode 100644 node_modules/ext/node_modules/type/object/is.js create mode 100644 node_modules/ext/node_modules/type/package.json create mode 100644 node_modules/ext/node_modules/type/plain-function/ensure.js create mode 100644 node_modules/ext/node_modules/type/plain-function/is.js create mode 100644 node_modules/ext/node_modules/type/plain-object/ensure.js create mode 100644 node_modules/ext/node_modules/type/plain-object/is.js create mode 100644 node_modules/ext/node_modules/type/promise/ensure.js create mode 100644 node_modules/ext/node_modules/type/promise/is.js create mode 100644 node_modules/ext/node_modules/type/prototype/is.js create mode 100644 node_modules/ext/node_modules/type/reg-exp/ensure.js create mode 100644 node_modules/ext/node_modules/type/reg-exp/is.js create mode 100644 node_modules/ext/node_modules/type/safe-integer/coerce.js create mode 100644 node_modules/ext/node_modules/type/safe-integer/ensure.js create mode 100644 node_modules/ext/node_modules/type/string/coerce.js create mode 100644 node_modules/ext/node_modules/type/string/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/_lib/arrow-function-if-supported.js create mode 100644 node_modules/ext/node_modules/type/test/_lib/class-if-supported.js create mode 100644 node_modules/ext/node_modules/type/test/array-length/coerce.js create mode 100644 node_modules/ext/node_modules/type/test/array-length/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/array-like/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/array-like/is.js create mode 100644 node_modules/ext/node_modules/type/test/array/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/array/is.js create mode 100644 node_modules/ext/node_modules/type/test/date/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/date/is.js create mode 100644 node_modules/ext/node_modules/type/test/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/error/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/error/is.js create mode 100644 node_modules/ext/node_modules/type/test/finite/coerce.js create mode 100644 node_modules/ext/node_modules/type/test/finite/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/function/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/function/is.js create mode 100644 node_modules/ext/node_modules/type/test/integer/coerce.js create mode 100644 node_modules/ext/node_modules/type/test/integer/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/iterable/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/iterable/is.js create mode 100644 node_modules/ext/node_modules/type/test/natural-number/coerce.js create mode 100644 node_modules/ext/node_modules/type/test/natural-number/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/number/coerce.js create mode 100644 node_modules/ext/node_modules/type/test/number/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/object/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/object/is.js create mode 100644 node_modules/ext/node_modules/type/test/plain-function/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/plain-function/is.js create mode 100644 node_modules/ext/node_modules/type/test/plain-object/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/plain-object/is.js create mode 100644 node_modules/ext/node_modules/type/test/promise/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/promise/is.js create mode 100644 node_modules/ext/node_modules/type/test/prototype/is.js create mode 100644 node_modules/ext/node_modules/type/test/reg-exp/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/reg-exp/is.js create mode 100644 node_modules/ext/node_modules/type/test/safe-integer/coerce.js create mode 100644 node_modules/ext/node_modules/type/test/safe-integer/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/string/coerce.js create mode 100644 node_modules/ext/node_modules/type/test/string/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/thenable/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/thenable/is.js create mode 100644 node_modules/ext/node_modules/type/test/time-value/coerce.js create mode 100644 node_modules/ext/node_modules/type/test/time-value/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/value/ensure.js create mode 100644 node_modules/ext/node_modules/type/test/value/is.js create mode 100644 node_modules/ext/node_modules/type/thenable/ensure.js create mode 100644 node_modules/ext/node_modules/type/thenable/is.js create mode 100644 node_modules/ext/node_modules/type/time-value/coerce.js create mode 100644 node_modules/ext/node_modules/type/time-value/ensure.js create mode 100644 node_modules/ext/node_modules/type/value/ensure.js create mode 100644 node_modules/ext/node_modules/type/value/is.js create mode 100644 node_modules/ext/object/entries/implement.js create mode 100644 node_modules/ext/object/entries/implementation.js create mode 100644 node_modules/ext/object/entries/index.js create mode 100644 node_modules/ext/object/entries/is-implemented.js create mode 100644 node_modules/ext/package.json create mode 100644 node_modules/ext/string/random.js create mode 100644 node_modules/ext/string_/includes/implementation.js create mode 100644 node_modules/ext/string_/includes/index.js create mode 100644 node_modules/ext/string_/includes/is-implemented.js create mode 100644 node_modules/ext/test/function/identity.js create mode 100644 node_modules/ext/test/global-this/implementation.js create mode 100644 node_modules/ext/test/global-this/index.js create mode 100644 node_modules/ext/test/global-this/is-implemented.js create mode 100644 node_modules/ext/test/math/ceil-10.js create mode 100644 node_modules/ext/test/math/floor-10.js create mode 100644 node_modules/ext/test/math/round-10.js create mode 100644 node_modules/ext/test/object/entries/_tests.js create mode 100644 node_modules/ext/test/object/entries/implementation.js create mode 100644 node_modules/ext/test/object/entries/index.js create mode 100644 node_modules/ext/test/object/entries/is-implemented.js create mode 100644 node_modules/ext/test/string/random.js create mode 100644 node_modules/ext/test/string_/includes/_tests.js create mode 100644 node_modules/ext/test/string_/includes/implementation.js create mode 100644 node_modules/ext/test/string_/includes/index.js create mode 100644 node_modules/ext/test/string_/includes/is-implemented.js create mode 100644 node_modules/ext/test/thenable_/finally.js create mode 100644 node_modules/ext/thenable_/finally.js create mode 100644 node_modules/extend-shallow/LICENSE create mode 100644 node_modules/extend-shallow/README.md create mode 100644 node_modules/extend-shallow/index.js create mode 100644 node_modules/extend-shallow/package.json create mode 100644 node_modules/extend/.editorconfig create mode 100644 node_modules/extend/.eslintrc create mode 100644 node_modules/extend/.jscs.json create mode 100644 node_modules/extend/.travis.yml create mode 100644 node_modules/extend/CHANGELOG.md create mode 100644 node_modules/extend/LICENSE create mode 100644 node_modules/extend/README.md create mode 100644 node_modules/extend/component.json create mode 100644 node_modules/extend/index.js create mode 100644 node_modules/extend/package.json create mode 100644 node_modules/extglob/LICENSE create mode 100644 node_modules/extglob/README.md create mode 100644 node_modules/extglob/changelog.md create mode 100644 node_modules/extglob/index.js create mode 100644 node_modules/extglob/node_modules/define-property/LICENSE create mode 100644 node_modules/extglob/node_modules/define-property/README.md create mode 100644 node_modules/extglob/node_modules/define-property/index.js create mode 100644 node_modules/extglob/node_modules/define-property/package.json create mode 100644 node_modules/extglob/package.json create mode 100644 node_modules/extsprintf/.gitmodules create mode 100644 node_modules/extsprintf/.npmignore create mode 100644 node_modules/extsprintf/LICENSE create mode 100644 node_modules/extsprintf/Makefile create mode 100644 node_modules/extsprintf/Makefile.targ create mode 100644 node_modules/extsprintf/README.md create mode 100644 node_modules/extsprintf/jsl.node.conf create mode 100644 node_modules/extsprintf/package.json create mode 100644 node_modules/fancy-log/LICENSE create mode 100644 node_modules/fancy-log/README.md create mode 100644 node_modules/fancy-log/index.js create mode 120000 node_modules/fancy-log/node_modules/.bin/color-support create mode 100644 node_modules/fancy-log/package.json create mode 100644 node_modules/fast-deep-equal/LICENSE create mode 100644 node_modules/fast-deep-equal/README.md create mode 100644 node_modules/fast-deep-equal/es6/index.d.ts create mode 100644 node_modules/fast-deep-equal/es6/index.js create mode 100644 node_modules/fast-deep-equal/es6/react.d.ts create mode 100644 node_modules/fast-deep-equal/es6/react.js create mode 100644 node_modules/fast-deep-equal/index.d.ts create mode 100644 node_modules/fast-deep-equal/index.js create mode 100644 node_modules/fast-deep-equal/package.json create mode 100644 node_modules/fast-deep-equal/react.d.ts create mode 100644 node_modules/fast-deep-equal/react.js create mode 100644 node_modules/fast-json-stable-stringify/.eslintrc.yml create mode 100644 node_modules/fast-json-stable-stringify/.github/FUNDING.yml create mode 100644 node_modules/fast-json-stable-stringify/.travis.yml create mode 100644 node_modules/fast-json-stable-stringify/LICENSE create mode 100644 node_modules/fast-json-stable-stringify/README.md create mode 100644 node_modules/fast-json-stable-stringify/benchmark/index.js create mode 100644 node_modules/fast-json-stable-stringify/benchmark/test.json create mode 100644 node_modules/fast-json-stable-stringify/example/key_cmp.js create mode 100644 node_modules/fast-json-stable-stringify/example/nested.js create mode 100644 node_modules/fast-json-stable-stringify/example/str.js create mode 100644 node_modules/fast-json-stable-stringify/example/value_cmp.js create mode 100644 node_modules/fast-json-stable-stringify/index.d.ts create mode 100644 node_modules/fast-json-stable-stringify/index.js create mode 100644 node_modules/fast-json-stable-stringify/package.json create mode 100644 node_modules/fast-json-stable-stringify/test/cmp.js create mode 100644 node_modules/fast-json-stable-stringify/test/nested.js create mode 100644 node_modules/fast-json-stable-stringify/test/str.js create mode 100644 node_modules/fast-json-stable-stringify/test/to-json.js create mode 100644 node_modules/fast-levenshtein/LICENSE.md create mode 100644 node_modules/fast-levenshtein/README.md create mode 100644 node_modules/fast-levenshtein/levenshtein.js create mode 100644 node_modules/fast-levenshtein/package.json create mode 100644 node_modules/fill-range/LICENSE create mode 100644 node_modules/fill-range/README.md create mode 100644 node_modules/fill-range/index.js create mode 100644 node_modules/fill-range/package.json create mode 100644 node_modules/find-up/index.js create mode 100644 node_modules/find-up/license create mode 100644 node_modules/find-up/package.json create mode 100644 node_modules/find-up/readme.md create mode 100644 node_modules/findup-sync/README.md create mode 100644 node_modules/findup-sync/index.js create mode 100644 node_modules/findup-sync/package.json create mode 100644 node_modules/fined/LICENSE create mode 100644 node_modules/fined/README.md create mode 100644 node_modules/fined/index.js create mode 100644 node_modules/fined/package.json create mode 100644 node_modules/flagged-respawn/LICENSE create mode 100644 node_modules/flagged-respawn/README.md create mode 100644 node_modules/flagged-respawn/index.js create mode 100644 node_modules/flagged-respawn/package.json create mode 100644 node_modules/flush-write-stream/.travis.yml create mode 100644 node_modules/flush-write-stream/LICENSE create mode 100644 node_modules/flush-write-stream/README.md create mode 100644 node_modules/flush-write-stream/example.js create mode 100644 node_modules/flush-write-stream/index.js create mode 100644 node_modules/flush-write-stream/package.json create mode 100644 node_modules/flush-write-stream/test.js create mode 100644 node_modules/for-in/LICENSE create mode 100644 node_modules/for-in/README.md create mode 100644 node_modules/for-in/index.js create mode 100644 node_modules/for-in/package.json create mode 100644 node_modules/for-own/LICENSE create mode 100644 node_modules/for-own/README.md create mode 100644 node_modules/for-own/index.js create mode 100644 node_modules/for-own/package.json create mode 100644 node_modules/forever-agent/LICENSE create mode 100644 node_modules/forever-agent/README.md create mode 100644 node_modules/forever-agent/index.js create mode 100644 node_modules/forever-agent/package.json create mode 100644 node_modules/form-data/License create mode 100644 node_modules/form-data/README.md create mode 100644 node_modules/form-data/README.md.bak create mode 100644 node_modules/form-data/package.json create mode 100644 node_modules/form-data/yarn.lock create mode 100644 node_modules/fragment-cache/LICENSE create mode 100644 node_modules/fragment-cache/README.md create mode 100644 node_modules/fragment-cache/index.js create mode 100644 node_modules/fragment-cache/package.json create mode 100644 node_modules/fs-mkdirp-stream/LICENSE create mode 100644 node_modules/fs-mkdirp-stream/README.md create mode 100644 node_modules/fs-mkdirp-stream/index.js create mode 100644 node_modules/fs-mkdirp-stream/mkdirp.js create mode 100644 node_modules/fs-mkdirp-stream/node_modules/through2/LICENSE.md create mode 100644 node_modules/fs-mkdirp-stream/node_modules/through2/README.md create mode 100644 node_modules/fs-mkdirp-stream/node_modules/through2/package.json create mode 100644 node_modules/fs-mkdirp-stream/node_modules/through2/through2.js create mode 100644 node_modules/fs-mkdirp-stream/package.json create mode 100644 node_modules/fs.realpath/LICENSE create mode 100644 node_modules/fs.realpath/README.md create mode 100644 node_modules/fs.realpath/index.js create mode 100644 node_modules/fs.realpath/old.js create mode 100644 node_modules/fs.realpath/package.json create mode 100644 node_modules/fstream/.travis.yml create mode 100644 node_modules/fstream/LICENSE create mode 100644 node_modules/fstream/README.md create mode 100644 node_modules/fstream/examples/filter-pipe.js create mode 100644 node_modules/fstream/examples/pipe.js create mode 100644 node_modules/fstream/examples/reader.js create mode 100644 node_modules/fstream/examples/symlink-write.js create mode 100644 node_modules/fstream/fstream.js create mode 120000 node_modules/fstream/node_modules/.bin/mkdirp create mode 120000 node_modules/fstream/node_modules/.bin/rimraf create mode 100644 node_modules/fstream/package.json create mode 100644 node_modules/function-bind/.editorconfig create mode 100644 node_modules/function-bind/.eslintrc create mode 100644 node_modules/function-bind/.jscs.json create mode 100644 node_modules/function-bind/.npmignore create mode 100644 node_modules/function-bind/.travis.yml create mode 100644 node_modules/function-bind/LICENSE create mode 100644 node_modules/function-bind/README.md create mode 100644 node_modules/function-bind/implementation.js create mode 100644 node_modules/function-bind/index.js create mode 100644 node_modules/function-bind/package.json create mode 100644 node_modules/function-bind/test/.eslintrc create mode 100644 node_modules/function-bind/test/index.js create mode 100644 node_modules/gauge/CHANGELOG.md create mode 100644 node_modules/gauge/LICENSE create mode 100644 node_modules/gauge/README.md create mode 100644 node_modules/gauge/base-theme.js create mode 100644 node_modules/gauge/error.js create mode 100644 node_modules/gauge/has-color.js create mode 100644 node_modules/gauge/index.js create mode 100644 node_modules/gauge/package.json create mode 100644 node_modules/gauge/plumbing.js create mode 100644 node_modules/gauge/process.js create mode 100644 node_modules/gauge/progress-bar.js create mode 100644 node_modules/gauge/render-template.js create mode 100644 node_modules/gauge/set-immediate.js create mode 100644 node_modules/gauge/set-interval.js create mode 100644 node_modules/gauge/spin.js create mode 100644 node_modules/gauge/template-item.js create mode 100644 node_modules/gauge/theme-set.js create mode 100644 node_modules/gauge/themes.js create mode 100644 node_modules/gauge/wide-truncate.js create mode 100644 node_modules/gaze/LICENSE-MIT create mode 100644 node_modules/gaze/README.md create mode 100644 node_modules/gaze/package.json create mode 100644 node_modules/get-caller-file/LICENSE.md create mode 100644 node_modules/get-caller-file/README.md create mode 100644 node_modules/get-caller-file/index.js create mode 100644 node_modules/get-caller-file/package.json create mode 100644 node_modules/get-intrinsic/.eslintignore create mode 100644 node_modules/get-intrinsic/.eslintrc create mode 100644 node_modules/get-intrinsic/.github/FUNDING.yml create mode 100644 node_modules/get-intrinsic/.github/rebase.yml create mode 100644 node_modules/get-intrinsic/.github/require-allow-edits.yml create mode 100644 node_modules/get-intrinsic/.nycrc create mode 100644 node_modules/get-intrinsic/.travis.yml create mode 100644 node_modules/get-intrinsic/CHANGELOG.md create mode 100644 node_modules/get-intrinsic/LICENSE create mode 100644 node_modules/get-intrinsic/README.md create mode 100644 node_modules/get-intrinsic/index.js create mode 100644 node_modules/get-intrinsic/package.json create mode 100644 node_modules/get-intrinsic/test/GetIntrinsic.js create mode 100644 node_modules/get-stdin/index.js create mode 100644 node_modules/get-stdin/package.json create mode 100644 node_modules/get-stdin/readme.md create mode 100644 node_modules/get-value/LICENSE create mode 100644 node_modules/get-value/index.js create mode 100644 node_modules/get-value/package.json create mode 100644 node_modules/getpass/.npmignore create mode 100644 node_modules/getpass/.travis.yml create mode 100644 node_modules/getpass/LICENSE create mode 100644 node_modules/getpass/README.md create mode 100644 node_modules/getpass/package.json create mode 100644 node_modules/glob-parent/LICENSE create mode 100644 node_modules/glob-parent/README.md create mode 100644 node_modules/glob-parent/index.js create mode 100644 node_modules/glob-parent/package.json create mode 100755 node_modules/glob-stream/LICENSE create mode 100644 node_modules/glob-stream/README.md create mode 100644 node_modules/glob-stream/index.js create mode 100644 node_modules/glob-stream/package.json create mode 100644 node_modules/glob-stream/readable.js create mode 100755 node_modules/glob-watcher/LICENSE create mode 100644 node_modules/glob-watcher/README.md create mode 100644 node_modules/glob-watcher/index.js create mode 100644 node_modules/glob-watcher/node_modules/normalize-path/LICENSE create mode 100644 node_modules/glob-watcher/node_modules/normalize-path/README.md create mode 100644 node_modules/glob-watcher/node_modules/normalize-path/index.js create mode 100644 node_modules/glob-watcher/node_modules/normalize-path/package.json create mode 100644 node_modules/glob-watcher/package.json create mode 100644 node_modules/glob/LICENSE create mode 100644 node_modules/glob/README.md create mode 100644 node_modules/glob/changelog.md create mode 100644 node_modules/glob/common.js create mode 100644 node_modules/glob/glob.js create mode 100644 node_modules/glob/package.json create mode 100644 node_modules/glob/sync.js create mode 100644 node_modules/global-modules/LICENSE create mode 100644 node_modules/global-modules/README.md create mode 100644 node_modules/global-modules/index.js create mode 100644 node_modules/global-modules/package.json create mode 100644 node_modules/global-prefix/LICENSE create mode 100644 node_modules/global-prefix/README.md create mode 100644 node_modules/global-prefix/index.js create mode 120000 node_modules/global-prefix/node_modules/.bin/which create mode 100644 node_modules/global-prefix/package.json create mode 100644 node_modules/globule/LICENSE create mode 100644 node_modules/globule/README.md create mode 100644 node_modules/globule/package.json create mode 100644 node_modules/glogg/LICENSE create mode 100644 node_modules/glogg/README.md create mode 100644 node_modules/glogg/index.js create mode 100644 node_modules/glogg/package.json create mode 100644 node_modules/graceful-fs/LICENSE create mode 100644 node_modules/graceful-fs/README.md create mode 100644 node_modules/graceful-fs/clone.js create mode 100644 node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/graceful-fs/legacy-streams.js create mode 100644 node_modules/graceful-fs/package.json create mode 100644 node_modules/graceful-fs/polyfills.js create mode 100644 node_modules/gulp-cli/LICENSE create mode 100644 node_modules/gulp-cli/README.md create mode 100644 node_modules/gulp-cli/completion/README.md create mode 100644 node_modules/gulp-cli/completion/bash create mode 100644 node_modules/gulp-cli/completion/fish create mode 100644 node_modules/gulp-cli/completion/powershell create mode 100644 node_modules/gulp-cli/completion/zsh create mode 100644 node_modules/gulp-cli/gulp.1 create mode 100644 node_modules/gulp-cli/index.js create mode 120000 node_modules/gulp-cli/node_modules/.bin/color-support create mode 100644 node_modules/gulp-cli/package.json create mode 100644 node_modules/gulp-csso/CHANGELOG.md create mode 100644 node_modules/gulp-csso/LICENSE-MIT create mode 100644 node_modules/gulp-csso/README.md create mode 100644 node_modules/gulp-csso/index.js create mode 100644 node_modules/gulp-csso/package.json create mode 100644 node_modules/gulp-sass/.editorconfig create mode 100644 node_modules/gulp-sass/.eslintrc create mode 100644 node_modules/gulp-sass/.travis.yml create mode 100644 node_modules/gulp-sass/CHANGELOG.md create mode 100644 node_modules/gulp-sass/CONTRIBUTING.md create mode 100644 node_modules/gulp-sass/LICENSE create mode 100644 node_modules/gulp-sass/README.md create mode 100644 node_modules/gulp-sass/appveyor.yml create mode 100644 node_modules/gulp-sass/index.js create mode 120000 node_modules/gulp-sass/node_modules/.bin/node-sass create mode 100644 node_modules/gulp-sass/node_modules/ansi-regex/index.js create mode 100644 node_modules/gulp-sass/node_modules/ansi-regex/license create mode 100644 node_modules/gulp-sass/node_modules/ansi-regex/package.json create mode 100644 node_modules/gulp-sass/node_modules/ansi-regex/readme.md create mode 100644 node_modules/gulp-sass/node_modules/strip-ansi/index.js create mode 100644 node_modules/gulp-sass/node_modules/strip-ansi/license create mode 100644 node_modules/gulp-sass/node_modules/strip-ansi/package.json create mode 100644 node_modules/gulp-sass/node_modules/strip-ansi/readme.md create mode 100644 node_modules/gulp-sass/node_modules/through2/LICENSE.md create mode 100644 node_modules/gulp-sass/node_modules/through2/README.md create mode 100644 node_modules/gulp-sass/node_modules/through2/package.json create mode 100644 node_modules/gulp-sass/node_modules/through2/through2.js create mode 100644 node_modules/gulp-sass/package.json create mode 100644 node_modules/gulp-sourcemaps/LICENSE.md create mode 100644 node_modules/gulp-sourcemaps/README.md create mode 100644 node_modules/gulp-sourcemaps/index.js create mode 120000 node_modules/gulp-sourcemaps/node_modules/.bin/acorn create mode 100644 node_modules/gulp-sourcemaps/node_modules/through2/LICENSE.md create mode 100644 node_modules/gulp-sourcemaps/node_modules/through2/README.md create mode 100644 node_modules/gulp-sourcemaps/node_modules/through2/package.json create mode 100644 node_modules/gulp-sourcemaps/node_modules/through2/through2.js create mode 100644 node_modules/gulp-sourcemaps/package.json create mode 100644 node_modules/gulp-sourcemaps/src/debug.js create mode 100644 node_modules/gulp-sourcemaps/src/init/index.internals.js create mode 100644 node_modules/gulp-sourcemaps/src/init/index.js create mode 100644 node_modules/gulp-sourcemaps/src/utils.js create mode 100644 node_modules/gulp-sourcemaps/src/write/index.internals.js create mode 100644 node_modules/gulp-sourcemaps/src/write/index.js create mode 100644 node_modules/gulp/CHANGELOG.md create mode 100644 node_modules/gulp/LICENSE create mode 100644 node_modules/gulp/README.md create mode 100644 node_modules/gulp/index.js create mode 120000 node_modules/gulp/node_modules/.bin/gulp create mode 100644 node_modules/gulp/package.json create mode 100644 node_modules/gulplog/CHANGELOG.md create mode 100644 node_modules/gulplog/LICENSE create mode 100644 node_modules/gulplog/README.md create mode 100644 node_modules/gulplog/index.js create mode 100644 node_modules/gulplog/package.json create mode 100644 node_modules/har-schema/LICENSE create mode 100644 node_modules/har-schema/README.md create mode 100644 node_modules/har-schema/package.json create mode 100644 node_modules/har-validator/LICENSE create mode 100644 node_modules/har-validator/README.md create mode 100644 node_modules/har-validator/package.json create mode 100644 node_modules/has-ansi/index.js create mode 100644 node_modules/has-ansi/license create mode 100644 node_modules/has-ansi/package.json create mode 100644 node_modules/has-ansi/readme.md create mode 100644 node_modules/has-flag/index.js create mode 100644 node_modules/has-flag/license create mode 100644 node_modules/has-flag/package.json create mode 100644 node_modules/has-flag/readme.md create mode 100644 node_modules/has-symbols/.eslintrc create mode 100644 node_modules/has-symbols/.github/FUNDING.yml create mode 100644 node_modules/has-symbols/.github/workflows/rebase.yml create mode 100644 node_modules/has-symbols/.travis.yml create mode 100644 node_modules/has-symbols/CHANGELOG.md create mode 100644 node_modules/has-symbols/LICENSE create mode 100644 node_modules/has-symbols/README.md create mode 100644 node_modules/has-symbols/index.js create mode 100644 node_modules/has-symbols/package.json create mode 100644 node_modules/has-symbols/shams.js create mode 100644 node_modules/has-symbols/test/index.js create mode 100644 node_modules/has-symbols/test/shams/core-js.js create mode 100644 node_modules/has-symbols/test/shams/get-own-property-symbols.js create mode 100644 node_modules/has-symbols/test/tests.js create mode 100644 node_modules/has-unicode/LICENSE create mode 100644 node_modules/has-unicode/README.md create mode 100644 node_modules/has-unicode/index.js create mode 100644 node_modules/has-unicode/package.json create mode 100644 node_modules/has-value/LICENSE create mode 100644 node_modules/has-value/README.md create mode 100644 node_modules/has-value/index.js create mode 100644 node_modules/has-value/package.json create mode 100644 node_modules/has-values/LICENSE create mode 100644 node_modules/has-values/README.md create mode 100644 node_modules/has-values/index.js create mode 100644 node_modules/has-values/node_modules/kind-of/LICENSE create mode 100644 node_modules/has-values/node_modules/kind-of/README.md create mode 100644 node_modules/has-values/node_modules/kind-of/index.js create mode 100644 node_modules/has-values/node_modules/kind-of/package.json create mode 100644 node_modules/has-values/package.json create mode 100644 node_modules/has/LICENSE-MIT create mode 100644 node_modules/has/README.md create mode 100644 node_modules/has/package.json create mode 100644 node_modules/has/src/index.js create mode 100644 node_modules/has/test/index.js create mode 100644 node_modules/homedir-polyfill/LICENSE create mode 100644 node_modules/homedir-polyfill/README.md create mode 100644 node_modules/homedir-polyfill/index.js create mode 100644 node_modules/homedir-polyfill/package.json create mode 100644 node_modules/homedir-polyfill/polyfill.js create mode 100644 node_modules/hosted-git-info/CHANGELOG.md create mode 100644 node_modules/hosted-git-info/LICENSE create mode 100644 node_modules/hosted-git-info/README.md create mode 100644 node_modules/hosted-git-info/git-host-info.js create mode 100644 node_modules/hosted-git-info/git-host.js create mode 100644 node_modules/hosted-git-info/index.js create mode 100644 node_modules/hosted-git-info/package.json create mode 100644 node_modules/http-signature/.dir-locals.el create mode 100644 node_modules/http-signature/.npmignore create mode 100644 node_modules/http-signature/CHANGES.md create mode 100644 node_modules/http-signature/LICENSE create mode 100644 node_modules/http-signature/README.md create mode 100644 node_modules/http-signature/http_signing.md create mode 120000 node_modules/http-signature/node_modules/.bin/sshpk-conv create mode 120000 node_modules/http-signature/node_modules/.bin/sshpk-sign create mode 120000 node_modules/http-signature/node_modules/.bin/sshpk-verify create mode 100644 node_modules/http-signature/package.json create mode 100644 node_modules/in-publish/LICENSE create mode 100644 node_modules/in-publish/README.md create mode 100755 node_modules/in-publish/in-install.js create mode 100755 node_modules/in-publish/in-publish.js create mode 100644 node_modules/in-publish/index.js create mode 100755 node_modules/in-publish/not-in-install.js create mode 100755 node_modules/in-publish/not-in-publish.js create mode 100644 node_modules/in-publish/package.json create mode 100644 node_modules/in-publish/test/package.json create mode 100644 node_modules/indent-string/index.js create mode 100644 node_modules/indent-string/license create mode 100644 node_modules/indent-string/package.json create mode 100644 node_modules/indent-string/readme.md create mode 100644 node_modules/inflight/LICENSE create mode 100644 node_modules/inflight/README.md create mode 100644 node_modules/inflight/inflight.js create mode 100644 node_modules/inflight/package.json create mode 100644 node_modules/inherits/LICENSE create mode 100644 node_modules/inherits/README.md create mode 100644 node_modules/inherits/inherits.js create mode 100644 node_modules/inherits/inherits_browser.js create mode 100644 node_modules/inherits/package.json create mode 100644 node_modules/ini/LICENSE create mode 100644 node_modules/ini/README.md create mode 100644 node_modules/ini/ini.js create mode 100644 node_modules/ini/package.json create mode 100644 node_modules/interpret/CHANGELOG create mode 100644 node_modules/interpret/LICENSE create mode 100644 node_modules/interpret/README.md create mode 100644 node_modules/interpret/index.js create mode 100644 node_modules/interpret/mjs-stub.js create mode 100644 node_modules/interpret/package.json create mode 100644 node_modules/invert-kv/index.js create mode 100644 node_modules/invert-kv/package.json create mode 100644 node_modules/invert-kv/readme.md create mode 100644 node_modules/is-absolute/LICENSE create mode 100644 node_modules/is-absolute/README.md create mode 100644 node_modules/is-absolute/index.js create mode 100644 node_modules/is-absolute/package.json create mode 100644 node_modules/is-accessor-descriptor/LICENSE create mode 100644 node_modules/is-accessor-descriptor/README.md create mode 100644 node_modules/is-accessor-descriptor/index.js create mode 100644 node_modules/is-accessor-descriptor/node_modules/kind-of/CHANGELOG.md create mode 100644 node_modules/is-accessor-descriptor/node_modules/kind-of/LICENSE create mode 100644 node_modules/is-accessor-descriptor/node_modules/kind-of/README.md create mode 100644 node_modules/is-accessor-descriptor/node_modules/kind-of/index.js create mode 100644 node_modules/is-accessor-descriptor/node_modules/kind-of/package.json create mode 100644 node_modules/is-accessor-descriptor/package.json create mode 100644 node_modules/is-arrayish/.editorconfig create mode 100644 node_modules/is-arrayish/.istanbul.yml create mode 100644 node_modules/is-arrayish/.npmignore create mode 100644 node_modules/is-arrayish/.travis.yml create mode 100644 node_modules/is-arrayish/LICENSE create mode 100644 node_modules/is-arrayish/README.md create mode 100644 node_modules/is-arrayish/index.js create mode 100644 node_modules/is-arrayish/package.json create mode 100644 node_modules/is-binary-path/index.js create mode 100644 node_modules/is-binary-path/license create mode 100644 node_modules/is-binary-path/package.json create mode 100644 node_modules/is-binary-path/readme.md create mode 100644 node_modules/is-buffer/LICENSE create mode 100644 node_modules/is-buffer/README.md create mode 100644 node_modules/is-buffer/index.js create mode 100644 node_modules/is-buffer/package.json create mode 100644 node_modules/is-buffer/test/basic.js create mode 100644 node_modules/is-core-module/.eslintignore create mode 100644 node_modules/is-core-module/.eslintrc create mode 100644 node_modules/is-core-module/.github/FUNDING.yml create mode 100644 node_modules/is-core-module/.github/workflows/node-4+.yml create mode 100644 node_modules/is-core-module/.github/workflows/node-iojs.yml create mode 100644 node_modules/is-core-module/.github/workflows/node-pretest.yml create mode 100644 node_modules/is-core-module/.github/workflows/node-zero.yml create mode 100644 node_modules/is-core-module/.github/workflows/rebase.yml create mode 100644 node_modules/is-core-module/.github/workflows/require-allow-edits.yml create mode 100644 node_modules/is-core-module/.nycrc create mode 100644 node_modules/is-core-module/CHANGELOG.md create mode 100644 node_modules/is-core-module/LICENSE create mode 100644 node_modules/is-core-module/README.md create mode 100644 node_modules/is-core-module/core.json create mode 100644 node_modules/is-core-module/index.js create mode 100644 node_modules/is-core-module/package.json create mode 100644 node_modules/is-core-module/test/index.js create mode 100644 node_modules/is-data-descriptor/LICENSE create mode 100644 node_modules/is-data-descriptor/README.md create mode 100644 node_modules/is-data-descriptor/index.js create mode 100644 node_modules/is-data-descriptor/node_modules/kind-of/CHANGELOG.md create mode 100644 node_modules/is-data-descriptor/node_modules/kind-of/LICENSE create mode 100644 node_modules/is-data-descriptor/node_modules/kind-of/README.md create mode 100644 node_modules/is-data-descriptor/node_modules/kind-of/index.js create mode 100644 node_modules/is-data-descriptor/node_modules/kind-of/package.json create mode 100644 node_modules/is-data-descriptor/package.json create mode 100644 node_modules/is-descriptor/LICENSE create mode 100644 node_modules/is-descriptor/README.md create mode 100644 node_modules/is-descriptor/index.js create mode 100644 node_modules/is-descriptor/node_modules/kind-of/CHANGELOG.md create mode 100644 node_modules/is-descriptor/node_modules/kind-of/LICENSE create mode 100644 node_modules/is-descriptor/node_modules/kind-of/README.md create mode 100644 node_modules/is-descriptor/node_modules/kind-of/index.js create mode 100644 node_modules/is-descriptor/node_modules/kind-of/package.json create mode 100644 node_modules/is-descriptor/package.json create mode 100644 node_modules/is-extendable/LICENSE create mode 100644 node_modules/is-extendable/README.md create mode 100644 node_modules/is-extendable/index.js create mode 100644 node_modules/is-extendable/package.json create mode 100644 node_modules/is-extglob/LICENSE create mode 100644 node_modules/is-extglob/README.md create mode 100644 node_modules/is-extglob/index.js create mode 100644 node_modules/is-extglob/package.json create mode 100644 node_modules/is-finite/index.js create mode 100644 node_modules/is-finite/license create mode 100644 node_modules/is-finite/package.json create mode 100644 node_modules/is-finite/readme.md create mode 100644 node_modules/is-fullwidth-code-point/index.js create mode 100644 node_modules/is-fullwidth-code-point/license create mode 100644 node_modules/is-fullwidth-code-point/package.json create mode 100644 node_modules/is-fullwidth-code-point/readme.md create mode 100644 node_modules/is-glob/LICENSE create mode 100644 node_modules/is-glob/README.md create mode 100644 node_modules/is-glob/index.js create mode 100644 node_modules/is-glob/package.json create mode 100644 node_modules/is-negated-glob/LICENSE create mode 100644 node_modules/is-negated-glob/README.md create mode 100644 node_modules/is-negated-glob/index.js create mode 100644 node_modules/is-negated-glob/package.json create mode 100644 node_modules/is-number/LICENSE create mode 100644 node_modules/is-number/README.md create mode 100644 node_modules/is-number/index.js create mode 100644 node_modules/is-number/package.json create mode 100644 node_modules/is-plain-object/LICENSE create mode 100644 node_modules/is-plain-object/README.md create mode 100644 node_modules/is-plain-object/index.d.ts create mode 100644 node_modules/is-plain-object/index.js create mode 100644 node_modules/is-plain-object/package.json create mode 100644 node_modules/is-promise/LICENSE create mode 100644 node_modules/is-promise/index.js create mode 100644 node_modules/is-promise/index.mjs create mode 100644 node_modules/is-promise/package.json create mode 100644 node_modules/is-promise/readme.md create mode 100644 node_modules/is-relative/LICENSE create mode 100644 node_modules/is-relative/README.md create mode 100644 node_modules/is-relative/index.js create mode 100644 node_modules/is-relative/package.json create mode 100644 node_modules/is-typedarray/LICENSE.md create mode 100644 node_modules/is-typedarray/README.md create mode 100644 node_modules/is-typedarray/index.js create mode 100644 node_modules/is-typedarray/package.json create mode 100644 node_modules/is-typedarray/test.js create mode 100644 node_modules/is-unc-path/LICENSE create mode 100644 node_modules/is-unc-path/README.md create mode 100644 node_modules/is-unc-path/index.js create mode 100644 node_modules/is-unc-path/package.json create mode 100644 node_modules/is-utf8/LICENSE create mode 100644 node_modules/is-utf8/README.md create mode 100644 node_modules/is-utf8/is-utf8.js create mode 100644 node_modules/is-utf8/package.json create mode 100644 node_modules/is-valid-glob/LICENSE create mode 100644 node_modules/is-valid-glob/README.md create mode 100644 node_modules/is-valid-glob/index.js create mode 100644 node_modules/is-valid-glob/package.json create mode 100644 node_modules/is-windows/LICENSE create mode 100644 node_modules/is-windows/README.md create mode 100644 node_modules/is-windows/index.js create mode 100644 node_modules/is-windows/package.json create mode 100644 node_modules/isarray/.npmignore create mode 100644 node_modules/isarray/.travis.yml create mode 100644 node_modules/isarray/Makefile create mode 100644 node_modules/isarray/README.md create mode 100644 node_modules/isarray/component.json create mode 100644 node_modules/isarray/index.js create mode 100644 node_modules/isarray/package.json create mode 100644 node_modules/isarray/test.js create mode 100644 node_modules/isexe/.npmignore create mode 100644 node_modules/isexe/LICENSE create mode 100644 node_modules/isexe/README.md create mode 100644 node_modules/isexe/index.js create mode 100644 node_modules/isexe/mode.js create mode 100644 node_modules/isexe/package.json create mode 100644 node_modules/isexe/test/basic.js create mode 100644 node_modules/isexe/windows.js create mode 100644 node_modules/isobject/LICENSE create mode 100644 node_modules/isobject/README.md create mode 100644 node_modules/isobject/index.d.ts create mode 100644 node_modules/isobject/index.js create mode 100644 node_modules/isobject/package.json create mode 100644 node_modules/isstream/.jshintrc create mode 100644 node_modules/isstream/.npmignore create mode 100644 node_modules/isstream/.travis.yml create mode 100644 node_modules/isstream/LICENSE.md create mode 100644 node_modules/isstream/README.md create mode 100644 node_modules/isstream/isstream.js create mode 100644 node_modules/isstream/package.json create mode 100644 node_modules/isstream/test.js create mode 100644 node_modules/js-base64/LICENSE.md create mode 100644 node_modules/js-base64/README.md create mode 100644 node_modules/js-base64/base64.js create mode 100644 node_modules/js-base64/base64.min.js create mode 100644 node_modules/js-base64/package.json create mode 100644 node_modules/jsbn/.npmignore create mode 100644 node_modules/jsbn/LICENSE create mode 100644 node_modules/jsbn/README.md create mode 100644 node_modules/jsbn/example.html create mode 100644 node_modules/jsbn/example.js create mode 100644 node_modules/jsbn/index.js create mode 100644 node_modules/jsbn/package.json create mode 100644 node_modules/json-schema-traverse/.eslintrc.yml create mode 100644 node_modules/json-schema-traverse/.travis.yml create mode 100644 node_modules/json-schema-traverse/LICENSE create mode 100644 node_modules/json-schema-traverse/README.md create mode 100644 node_modules/json-schema-traverse/index.js create mode 100644 node_modules/json-schema-traverse/package.json create mode 100644 node_modules/json-schema-traverse/spec/.eslintrc.yml create mode 100644 node_modules/json-schema-traverse/spec/fixtures/schema.js create mode 100644 node_modules/json-schema-traverse/spec/index.spec.js create mode 100644 node_modules/json-schema/README.md create mode 100644 node_modules/json-schema/draft-00/hyper-schema create mode 100644 node_modules/json-schema/draft-00/json-ref create mode 100644 node_modules/json-schema/draft-00/links create mode 100644 node_modules/json-schema/draft-00/schema create mode 100644 node_modules/json-schema/draft-01/hyper-schema create mode 100644 node_modules/json-schema/draft-01/json-ref create mode 100644 node_modules/json-schema/draft-01/links create mode 100644 node_modules/json-schema/draft-01/schema create mode 100644 node_modules/json-schema/draft-02/hyper-schema create mode 100644 node_modules/json-schema/draft-02/json-ref create mode 100644 node_modules/json-schema/draft-02/links create mode 100644 node_modules/json-schema/draft-02/schema create mode 100644 node_modules/json-schema/draft-03/examples/address create mode 100644 node_modules/json-schema/draft-03/examples/calendar create mode 100644 node_modules/json-schema/draft-03/examples/card create mode 100644 node_modules/json-schema/draft-03/examples/geo create mode 100644 node_modules/json-schema/draft-03/examples/interfaces create mode 100644 node_modules/json-schema/draft-03/hyper-schema create mode 100644 node_modules/json-schema/draft-03/json-ref create mode 100644 node_modules/json-schema/draft-03/links create mode 100644 node_modules/json-schema/draft-03/schema create mode 100644 node_modules/json-schema/draft-04/hyper-schema create mode 100644 node_modules/json-schema/draft-04/links create mode 100644 node_modules/json-schema/draft-04/schema create mode 100644 node_modules/json-schema/draft-zyp-json-schema-03.xml create mode 100644 node_modules/json-schema/draft-zyp-json-schema-04.xml create mode 100644 node_modules/json-schema/package.json create mode 100644 node_modules/json-schema/test/tests.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/.npmignore create mode 100644 node_modules/json-stable-stringify-without-jsonify/.travis.yml create mode 100644 node_modules/json-stable-stringify-without-jsonify/LICENSE create mode 100644 node_modules/json-stable-stringify-without-jsonify/example/key_cmp.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/example/nested.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/example/str.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/example/value_cmp.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/index.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/package.json create mode 100644 node_modules/json-stable-stringify-without-jsonify/readme.markdown create mode 100644 node_modules/json-stable-stringify-without-jsonify/test/cmp.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/test/nested.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/test/replacer.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/test/space.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/test/str.js create mode 100644 node_modules/json-stable-stringify-without-jsonify/test/to-json.js create mode 100644 node_modules/json-stringify-safe/.npmignore create mode 100644 node_modules/json-stringify-safe/CHANGELOG.md create mode 100644 node_modules/json-stringify-safe/LICENSE create mode 100644 node_modules/json-stringify-safe/Makefile create mode 100644 node_modules/json-stringify-safe/README.md create mode 100644 node_modules/json-stringify-safe/package.json create mode 100644 node_modules/json-stringify-safe/stringify.js create mode 100644 node_modules/json-stringify-safe/test/mocha.opts create mode 100644 node_modules/json-stringify-safe/test/stringify_test.js create mode 100644 node_modules/jsprim/CHANGES.md create mode 100644 node_modules/jsprim/CONTRIBUTING.md create mode 100644 node_modules/jsprim/LICENSE create mode 100644 node_modules/jsprim/README.md create mode 100644 node_modules/jsprim/package.json create mode 100644 node_modules/just-debounce/.eslintrc create mode 100644 node_modules/just-debounce/.npmignore create mode 100644 node_modules/just-debounce/LICENSE create mode 100644 node_modules/just-debounce/README.md create mode 100644 node_modules/just-debounce/index.js create mode 100644 node_modules/just-debounce/package.json create mode 100644 node_modules/just-debounce/test.js create mode 100644 node_modules/kind-of/LICENSE create mode 100644 node_modules/kind-of/README.md create mode 100644 node_modules/kind-of/index.js create mode 100644 node_modules/kind-of/package.json create mode 100644 node_modules/last-run/LICENSE create mode 100644 node_modules/last-run/README.md create mode 100644 node_modules/last-run/index.js create mode 100644 node_modules/last-run/package.json create mode 100644 node_modules/lazystream/.npmignore create mode 100644 node_modules/lazystream/.travis.yml create mode 100644 node_modules/lazystream/LICENSE-MIT create mode 100644 node_modules/lazystream/README.md create mode 100644 node_modules/lazystream/package.json create mode 100644 node_modules/lazystream/secret create mode 100644 node_modules/lazystream/test/data.md create mode 100644 node_modules/lazystream/test/fs_test.js create mode 100644 node_modules/lazystream/test/helper.js create mode 100644 node_modules/lazystream/test/pipe_test.js create mode 100644 node_modules/lazystream/test/readable_test.js create mode 100644 node_modules/lazystream/test/writable_test.js create mode 100644 node_modules/lcid/index.js create mode 100644 node_modules/lcid/lcid.json create mode 100644 node_modules/lcid/license create mode 100644 node_modules/lcid/package.json create mode 100644 node_modules/lcid/readme.md create mode 100644 node_modules/lead/LICENSE create mode 100644 node_modules/lead/README.md create mode 100644 node_modules/lead/index.js create mode 100644 node_modules/lead/package.json create mode 100644 node_modules/liftoff/CHANGELOG create mode 100644 node_modules/liftoff/LICENSE create mode 100644 node_modules/liftoff/README.md create mode 100644 node_modules/liftoff/index.js create mode 100644 node_modules/liftoff/node_modules/findup-sync/LICENSE create mode 100644 node_modules/liftoff/node_modules/findup-sync/README.md create mode 100644 node_modules/liftoff/node_modules/findup-sync/index.js create mode 100644 node_modules/liftoff/node_modules/findup-sync/package.json create mode 100644 node_modules/liftoff/node_modules/is-glob/LICENSE create mode 100644 node_modules/liftoff/node_modules/is-glob/README.md create mode 100644 node_modules/liftoff/node_modules/is-glob/index.js create mode 100644 node_modules/liftoff/node_modules/is-glob/package.json create mode 100644 node_modules/liftoff/package.json create mode 100644 node_modules/load-json-file/index.js create mode 100644 node_modules/load-json-file/license create mode 100644 node_modules/load-json-file/package.json create mode 100644 node_modules/load-json-file/readme.md create mode 100644 node_modules/locate-path/index.js create mode 100644 node_modules/locate-path/license create mode 100644 node_modules/locate-path/node_modules/path-exists/index.js create mode 100644 node_modules/locate-path/node_modules/path-exists/license create mode 100644 node_modules/locate-path/node_modules/path-exists/package.json create mode 100644 node_modules/locate-path/node_modules/path-exists/readme.md create mode 100644 node_modules/locate-path/package.json create mode 100644 node_modules/locate-path/readme.md create mode 100644 node_modules/lodash/LICENSE create mode 100644 node_modules/lodash/README.md create mode 100644 node_modules/lodash/_DataView.js create mode 100644 node_modules/lodash/_Hash.js create mode 100644 node_modules/lodash/_LazyWrapper.js create mode 100644 node_modules/lodash/_ListCache.js create mode 100644 node_modules/lodash/_LodashWrapper.js create mode 100644 node_modules/lodash/_Map.js create mode 100644 node_modules/lodash/_MapCache.js create mode 100644 node_modules/lodash/_Promise.js create mode 100644 node_modules/lodash/_Set.js create mode 100644 node_modules/lodash/_SetCache.js create mode 100644 node_modules/lodash/_Stack.js create mode 100644 node_modules/lodash/_Symbol.js create mode 100644 node_modules/lodash/_Uint8Array.js create mode 100644 node_modules/lodash/_WeakMap.js create mode 100644 node_modules/lodash/_apply.js create mode 100644 node_modules/lodash/_arrayAggregator.js create mode 100644 node_modules/lodash/_arrayEach.js create mode 100644 node_modules/lodash/_arrayEachRight.js create mode 100644 node_modules/lodash/_arrayEvery.js create mode 100644 node_modules/lodash/_arrayFilter.js create mode 100644 node_modules/lodash/_arrayIncludes.js create mode 100644 node_modules/lodash/_arrayIncludesWith.js create mode 100644 node_modules/lodash/_arrayLikeKeys.js create mode 100644 node_modules/lodash/_arrayMap.js create mode 100644 node_modules/lodash/_arrayPush.js create mode 100644 node_modules/lodash/_arrayReduce.js create mode 100644 node_modules/lodash/_arrayReduceRight.js create mode 100644 node_modules/lodash/_arraySample.js create mode 100644 node_modules/lodash/_arraySampleSize.js create mode 100644 node_modules/lodash/_arrayShuffle.js create mode 100644 node_modules/lodash/_arraySome.js create mode 100644 node_modules/lodash/_asciiSize.js create mode 100644 node_modules/lodash/_asciiToArray.js create mode 100644 node_modules/lodash/_asciiWords.js create mode 100644 node_modules/lodash/_assignMergeValue.js create mode 100644 node_modules/lodash/_assignValue.js create mode 100644 node_modules/lodash/_assocIndexOf.js create mode 100644 node_modules/lodash/_baseAggregator.js create mode 100644 node_modules/lodash/_baseAssign.js create mode 100644 node_modules/lodash/_baseAssignIn.js create mode 100644 node_modules/lodash/_baseAssignValue.js create mode 100644 node_modules/lodash/_baseAt.js create mode 100644 node_modules/lodash/_baseClamp.js create mode 100644 node_modules/lodash/_baseClone.js create mode 100644 node_modules/lodash/_baseConforms.js create mode 100644 node_modules/lodash/_baseConformsTo.js create mode 100644 node_modules/lodash/_baseCreate.js create mode 100644 node_modules/lodash/_baseDelay.js create mode 100644 node_modules/lodash/_baseDifference.js create mode 100644 node_modules/lodash/_baseEach.js create mode 100644 node_modules/lodash/_baseEachRight.js create mode 100644 node_modules/lodash/_baseEvery.js create mode 100644 node_modules/lodash/_baseExtremum.js create mode 100644 node_modules/lodash/_baseFill.js create mode 100644 node_modules/lodash/_baseFilter.js create mode 100644 node_modules/lodash/_baseFindIndex.js create mode 100644 node_modules/lodash/_baseFindKey.js create mode 100644 node_modules/lodash/_baseFlatten.js create mode 100644 node_modules/lodash/_baseFor.js create mode 100644 node_modules/lodash/_baseForOwn.js create mode 100644 node_modules/lodash/_baseForOwnRight.js create mode 100644 node_modules/lodash/_baseForRight.js create mode 100644 node_modules/lodash/_baseFunctions.js create mode 100644 node_modules/lodash/_baseGet.js create mode 100644 node_modules/lodash/_baseGetAllKeys.js create mode 100644 node_modules/lodash/_baseGetTag.js create mode 100644 node_modules/lodash/_baseGt.js create mode 100644 node_modules/lodash/_baseHas.js create mode 100644 node_modules/lodash/_baseHasIn.js create mode 100644 node_modules/lodash/_baseInRange.js create mode 100644 node_modules/lodash/_baseIndexOf.js create mode 100644 node_modules/lodash/_baseIndexOfWith.js create mode 100644 node_modules/lodash/_baseIntersection.js create mode 100644 node_modules/lodash/_baseInverter.js create mode 100644 node_modules/lodash/_baseInvoke.js create mode 100644 node_modules/lodash/_baseIsArguments.js create mode 100644 node_modules/lodash/_baseIsArrayBuffer.js create mode 100644 node_modules/lodash/_baseIsDate.js create mode 100644 node_modules/lodash/_baseIsEqual.js create mode 100644 node_modules/lodash/_baseIsEqualDeep.js create mode 100644 node_modules/lodash/_baseIsMap.js create mode 100644 node_modules/lodash/_baseIsMatch.js create mode 100644 node_modules/lodash/_baseIsNaN.js create mode 100644 node_modules/lodash/_baseIsNative.js create mode 100644 node_modules/lodash/_baseIsRegExp.js create mode 100644 node_modules/lodash/_baseIsSet.js create mode 100644 node_modules/lodash/_baseIsTypedArray.js create mode 100644 node_modules/lodash/_baseIteratee.js create mode 100644 node_modules/lodash/_baseKeys.js create mode 100644 node_modules/lodash/_baseKeysIn.js create mode 100644 node_modules/lodash/_baseLodash.js create mode 100644 node_modules/lodash/_baseLt.js create mode 100644 node_modules/lodash/_baseMap.js create mode 100644 node_modules/lodash/_baseMatches.js create mode 100644 node_modules/lodash/_baseMatchesProperty.js create mode 100644 node_modules/lodash/_baseMean.js create mode 100644 node_modules/lodash/_baseMerge.js create mode 100644 node_modules/lodash/_baseMergeDeep.js create mode 100644 node_modules/lodash/_baseNth.js create mode 100644 node_modules/lodash/_baseOrderBy.js create mode 100644 node_modules/lodash/_basePick.js create mode 100644 node_modules/lodash/_basePickBy.js create mode 100644 node_modules/lodash/_baseProperty.js create mode 100644 node_modules/lodash/_basePropertyDeep.js create mode 100644 node_modules/lodash/_basePropertyOf.js create mode 100644 node_modules/lodash/_basePullAll.js create mode 100644 node_modules/lodash/_basePullAt.js create mode 100644 node_modules/lodash/_baseRandom.js create mode 100644 node_modules/lodash/_baseRange.js create mode 100644 node_modules/lodash/_baseReduce.js create mode 100644 node_modules/lodash/_baseRepeat.js create mode 100644 node_modules/lodash/_baseRest.js create mode 100644 node_modules/lodash/_baseSample.js create mode 100644 node_modules/lodash/_baseSampleSize.js create mode 100644 node_modules/lodash/_baseSet.js create mode 100644 node_modules/lodash/_baseSetData.js create mode 100644 node_modules/lodash/_baseSetToString.js create mode 100644 node_modules/lodash/_baseShuffle.js create mode 100644 node_modules/lodash/_baseSlice.js create mode 100644 node_modules/lodash/_baseSome.js create mode 100644 node_modules/lodash/_baseSortBy.js create mode 100644 node_modules/lodash/_baseSortedIndex.js create mode 100644 node_modules/lodash/_baseSortedIndexBy.js create mode 100644 node_modules/lodash/_baseSortedUniq.js create mode 100644 node_modules/lodash/_baseSum.js create mode 100644 node_modules/lodash/_baseTimes.js create mode 100644 node_modules/lodash/_baseToNumber.js create mode 100644 node_modules/lodash/_baseToPairs.js create mode 100644 node_modules/lodash/_baseToString.js create mode 100644 node_modules/lodash/_baseUnary.js create mode 100644 node_modules/lodash/_baseUniq.js create mode 100644 node_modules/lodash/_baseUnset.js create mode 100644 node_modules/lodash/_baseUpdate.js create mode 100644 node_modules/lodash/_baseValues.js create mode 100644 node_modules/lodash/_baseWhile.js create mode 100644 node_modules/lodash/_baseWrapperValue.js create mode 100644 node_modules/lodash/_baseXor.js create mode 100644 node_modules/lodash/_baseZipObject.js create mode 100644 node_modules/lodash/_cacheHas.js create mode 100644 node_modules/lodash/_castArrayLikeObject.js create mode 100644 node_modules/lodash/_castFunction.js create mode 100644 node_modules/lodash/_castPath.js create mode 100644 node_modules/lodash/_castRest.js create mode 100644 node_modules/lodash/_castSlice.js create mode 100644 node_modules/lodash/_charsEndIndex.js create mode 100644 node_modules/lodash/_charsStartIndex.js create mode 100644 node_modules/lodash/_cloneArrayBuffer.js create mode 100644 node_modules/lodash/_cloneBuffer.js create mode 100644 node_modules/lodash/_cloneDataView.js create mode 100644 node_modules/lodash/_cloneRegExp.js create mode 100644 node_modules/lodash/_cloneSymbol.js create mode 100644 node_modules/lodash/_cloneTypedArray.js create mode 100644 node_modules/lodash/_compareAscending.js create mode 100644 node_modules/lodash/_compareMultiple.js create mode 100644 node_modules/lodash/_composeArgs.js create mode 100644 node_modules/lodash/_composeArgsRight.js create mode 100644 node_modules/lodash/_copyArray.js create mode 100644 node_modules/lodash/_copyObject.js create mode 100644 node_modules/lodash/_copySymbols.js create mode 100644 node_modules/lodash/_copySymbolsIn.js create mode 100644 node_modules/lodash/_coreJsData.js create mode 100644 node_modules/lodash/_countHolders.js create mode 100644 node_modules/lodash/_createAggregator.js create mode 100644 node_modules/lodash/_createAssigner.js create mode 100644 node_modules/lodash/_createBaseEach.js create mode 100644 node_modules/lodash/_createBaseFor.js create mode 100644 node_modules/lodash/_createBind.js create mode 100644 node_modules/lodash/_createCaseFirst.js create mode 100644 node_modules/lodash/_createCompounder.js create mode 100644 node_modules/lodash/_createCtor.js create mode 100644 node_modules/lodash/_createCurry.js create mode 100644 node_modules/lodash/_createFind.js create mode 100644 node_modules/lodash/_createFlow.js create mode 100644 node_modules/lodash/_createHybrid.js create mode 100644 node_modules/lodash/_createInverter.js create mode 100644 node_modules/lodash/_createMathOperation.js create mode 100644 node_modules/lodash/_createOver.js create mode 100644 node_modules/lodash/_createPadding.js create mode 100644 node_modules/lodash/_createPartial.js create mode 100644 node_modules/lodash/_createRange.js create mode 100644 node_modules/lodash/_createRecurry.js create mode 100644 node_modules/lodash/_createRelationalOperation.js create mode 100644 node_modules/lodash/_createRound.js create mode 100644 node_modules/lodash/_createSet.js create mode 100644 node_modules/lodash/_createToPairs.js create mode 100644 node_modules/lodash/_createWrap.js create mode 100644 node_modules/lodash/_customDefaultsAssignIn.js create mode 100644 node_modules/lodash/_customDefaultsMerge.js create mode 100644 node_modules/lodash/_customOmitClone.js create mode 100644 node_modules/lodash/_deburrLetter.js create mode 100644 node_modules/lodash/_defineProperty.js create mode 100644 node_modules/lodash/_equalArrays.js create mode 100644 node_modules/lodash/_equalByTag.js create mode 100644 node_modules/lodash/_equalObjects.js create mode 100644 node_modules/lodash/_escapeHtmlChar.js create mode 100644 node_modules/lodash/_escapeStringChar.js create mode 100644 node_modules/lodash/_flatRest.js create mode 100644 node_modules/lodash/_freeGlobal.js create mode 100644 node_modules/lodash/_getAllKeys.js create mode 100644 node_modules/lodash/_getAllKeysIn.js create mode 100644 node_modules/lodash/_getData.js create mode 100644 node_modules/lodash/_getFuncName.js create mode 100644 node_modules/lodash/_getHolder.js create mode 100644 node_modules/lodash/_getMapData.js create mode 100644 node_modules/lodash/_getMatchData.js create mode 100644 node_modules/lodash/_getNative.js create mode 100644 node_modules/lodash/_getPrototype.js create mode 100644 node_modules/lodash/_getRawTag.js create mode 100644 node_modules/lodash/_getSymbols.js create mode 100644 node_modules/lodash/_getSymbolsIn.js create mode 100644 node_modules/lodash/_getTag.js create mode 100644 node_modules/lodash/_getValue.js create mode 100644 node_modules/lodash/_getView.js create mode 100644 node_modules/lodash/_getWrapDetails.js create mode 100644 node_modules/lodash/_hasPath.js create mode 100644 node_modules/lodash/_hasUnicode.js create mode 100644 node_modules/lodash/_hasUnicodeWord.js create mode 100644 node_modules/lodash/_hashClear.js create mode 100644 node_modules/lodash/_hashDelete.js create mode 100644 node_modules/lodash/_hashGet.js create mode 100644 node_modules/lodash/_hashHas.js create mode 100644 node_modules/lodash/_hashSet.js create mode 100644 node_modules/lodash/_initCloneArray.js create mode 100644 node_modules/lodash/_initCloneByTag.js create mode 100644 node_modules/lodash/_initCloneObject.js create mode 100644 node_modules/lodash/_insertWrapDetails.js create mode 100644 node_modules/lodash/_isFlattenable.js create mode 100644 node_modules/lodash/_isIndex.js create mode 100644 node_modules/lodash/_isIterateeCall.js create mode 100644 node_modules/lodash/_isKey.js create mode 100644 node_modules/lodash/_isKeyable.js create mode 100644 node_modules/lodash/_isLaziable.js create mode 100644 node_modules/lodash/_isMaskable.js create mode 100644 node_modules/lodash/_isMasked.js create mode 100644 node_modules/lodash/_isPrototype.js create mode 100644 node_modules/lodash/_isStrictComparable.js create mode 100644 node_modules/lodash/_iteratorToArray.js create mode 100644 node_modules/lodash/_lazyClone.js create mode 100644 node_modules/lodash/_lazyReverse.js create mode 100644 node_modules/lodash/_lazyValue.js create mode 100644 node_modules/lodash/_listCacheClear.js create mode 100644 node_modules/lodash/_listCacheDelete.js create mode 100644 node_modules/lodash/_listCacheGet.js create mode 100644 node_modules/lodash/_listCacheHas.js create mode 100644 node_modules/lodash/_listCacheSet.js create mode 100644 node_modules/lodash/_mapCacheClear.js create mode 100644 node_modules/lodash/_mapCacheDelete.js create mode 100644 node_modules/lodash/_mapCacheGet.js create mode 100644 node_modules/lodash/_mapCacheHas.js create mode 100644 node_modules/lodash/_mapCacheSet.js create mode 100644 node_modules/lodash/_mapToArray.js create mode 100644 node_modules/lodash/_matchesStrictComparable.js create mode 100644 node_modules/lodash/_memoizeCapped.js create mode 100644 node_modules/lodash/_mergeData.js create mode 100644 node_modules/lodash/_metaMap.js create mode 100644 node_modules/lodash/_nativeCreate.js create mode 100644 node_modules/lodash/_nativeKeys.js create mode 100644 node_modules/lodash/_nativeKeysIn.js create mode 100644 node_modules/lodash/_nodeUtil.js create mode 100644 node_modules/lodash/_objectToString.js create mode 100644 node_modules/lodash/_overArg.js create mode 100644 node_modules/lodash/_overRest.js create mode 100644 node_modules/lodash/_parent.js create mode 100644 node_modules/lodash/_reEscape.js create mode 100644 node_modules/lodash/_reEvaluate.js create mode 100644 node_modules/lodash/_reInterpolate.js create mode 100644 node_modules/lodash/_realNames.js create mode 100644 node_modules/lodash/_reorder.js create mode 100644 node_modules/lodash/_replaceHolders.js create mode 100644 node_modules/lodash/_root.js create mode 100644 node_modules/lodash/_safeGet.js create mode 100644 node_modules/lodash/_setCacheAdd.js create mode 100644 node_modules/lodash/_setCacheHas.js create mode 100644 node_modules/lodash/_setData.js create mode 100644 node_modules/lodash/_setToArray.js create mode 100644 node_modules/lodash/_setToPairs.js create mode 100644 node_modules/lodash/_setToString.js create mode 100644 node_modules/lodash/_setWrapToString.js create mode 100644 node_modules/lodash/_shortOut.js create mode 100644 node_modules/lodash/_shuffleSelf.js create mode 100644 node_modules/lodash/_stackClear.js create mode 100644 node_modules/lodash/_stackDelete.js create mode 100644 node_modules/lodash/_stackGet.js create mode 100644 node_modules/lodash/_stackHas.js create mode 100644 node_modules/lodash/_stackSet.js create mode 100644 node_modules/lodash/_strictIndexOf.js create mode 100644 node_modules/lodash/_strictLastIndexOf.js create mode 100644 node_modules/lodash/_stringSize.js create mode 100644 node_modules/lodash/_stringToArray.js create mode 100644 node_modules/lodash/_stringToPath.js create mode 100644 node_modules/lodash/_toKey.js create mode 100644 node_modules/lodash/_toSource.js create mode 100644 node_modules/lodash/_unescapeHtmlChar.js create mode 100644 node_modules/lodash/_unicodeSize.js create mode 100644 node_modules/lodash/_unicodeToArray.js create mode 100644 node_modules/lodash/_unicodeWords.js create mode 100644 node_modules/lodash/_updateWrapDetails.js create mode 100644 node_modules/lodash/_wrapperClone.js create mode 100644 node_modules/lodash/add.js create mode 100644 node_modules/lodash/after.js create mode 100644 node_modules/lodash/array.js create mode 100644 node_modules/lodash/ary.js create mode 100644 node_modules/lodash/assign.js create mode 100644 node_modules/lodash/assignIn.js create mode 100644 node_modules/lodash/assignInWith.js create mode 100644 node_modules/lodash/assignWith.js create mode 100644 node_modules/lodash/at.js create mode 100644 node_modules/lodash/attempt.js create mode 100644 node_modules/lodash/before.js create mode 100644 node_modules/lodash/bind.js create mode 100644 node_modules/lodash/bindAll.js create mode 100644 node_modules/lodash/bindKey.js create mode 100644 node_modules/lodash/camelCase.js create mode 100644 node_modules/lodash/capitalize.js create mode 100644 node_modules/lodash/castArray.js create mode 100644 node_modules/lodash/ceil.js create mode 100644 node_modules/lodash/chain.js create mode 100644 node_modules/lodash/chunk.js create mode 100644 node_modules/lodash/clamp.js create mode 100644 node_modules/lodash/clone.js create mode 100644 node_modules/lodash/cloneDeep.js create mode 100644 node_modules/lodash/cloneDeepWith.js create mode 100644 node_modules/lodash/cloneWith.js create mode 100644 node_modules/lodash/collection.js create mode 100644 node_modules/lodash/commit.js create mode 100644 node_modules/lodash/compact.js create mode 100644 node_modules/lodash/concat.js create mode 100644 node_modules/lodash/cond.js create mode 100644 node_modules/lodash/conforms.js create mode 100644 node_modules/lodash/conformsTo.js create mode 100644 node_modules/lodash/constant.js create mode 100644 node_modules/lodash/core.js create mode 100644 node_modules/lodash/core.min.js create mode 100644 node_modules/lodash/countBy.js create mode 100644 node_modules/lodash/create.js create mode 100644 node_modules/lodash/curry.js create mode 100644 node_modules/lodash/curryRight.js create mode 100644 node_modules/lodash/date.js create mode 100644 node_modules/lodash/debounce.js create mode 100644 node_modules/lodash/deburr.js create mode 100644 node_modules/lodash/defaultTo.js create mode 100644 node_modules/lodash/defaults.js create mode 100644 node_modules/lodash/defaultsDeep.js create mode 100644 node_modules/lodash/defer.js create mode 100644 node_modules/lodash/delay.js create mode 100644 node_modules/lodash/difference.js create mode 100644 node_modules/lodash/differenceBy.js create mode 100644 node_modules/lodash/differenceWith.js create mode 100644 node_modules/lodash/divide.js create mode 100644 node_modules/lodash/drop.js create mode 100644 node_modules/lodash/dropRight.js create mode 100644 node_modules/lodash/dropRightWhile.js create mode 100644 node_modules/lodash/dropWhile.js create mode 100644 node_modules/lodash/each.js create mode 100644 node_modules/lodash/eachRight.js create mode 100644 node_modules/lodash/endsWith.js create mode 100644 node_modules/lodash/entries.js create mode 100644 node_modules/lodash/entriesIn.js create mode 100644 node_modules/lodash/eq.js create mode 100644 node_modules/lodash/escape.js create mode 100644 node_modules/lodash/escapeRegExp.js create mode 100644 node_modules/lodash/every.js create mode 100644 node_modules/lodash/extend.js create mode 100644 node_modules/lodash/extendWith.js create mode 100644 node_modules/lodash/fill.js create mode 100644 node_modules/lodash/filter.js create mode 100644 node_modules/lodash/find.js create mode 100644 node_modules/lodash/findIndex.js create mode 100644 node_modules/lodash/findKey.js create mode 100644 node_modules/lodash/findLast.js create mode 100644 node_modules/lodash/findLastIndex.js create mode 100644 node_modules/lodash/findLastKey.js create mode 100644 node_modules/lodash/first.js create mode 100644 node_modules/lodash/flatMap.js create mode 100644 node_modules/lodash/flatMapDeep.js create mode 100644 node_modules/lodash/flatMapDepth.js create mode 100644 node_modules/lodash/flatten.js create mode 100644 node_modules/lodash/flattenDeep.js create mode 100644 node_modules/lodash/flattenDepth.js create mode 100644 node_modules/lodash/flip.js create mode 100644 node_modules/lodash/floor.js create mode 100644 node_modules/lodash/flow.js create mode 100644 node_modules/lodash/flowRight.js create mode 100644 node_modules/lodash/forEach.js create mode 100644 node_modules/lodash/forEachRight.js create mode 100644 node_modules/lodash/forIn.js create mode 100644 node_modules/lodash/forInRight.js create mode 100644 node_modules/lodash/forOwn.js create mode 100644 node_modules/lodash/forOwnRight.js create mode 100644 node_modules/lodash/fp.js create mode 100644 node_modules/lodash/fp/F.js create mode 100644 node_modules/lodash/fp/T.js create mode 100644 node_modules/lodash/fp/__.js create mode 100644 node_modules/lodash/fp/_baseConvert.js create mode 100644 node_modules/lodash/fp/_convertBrowser.js create mode 100644 node_modules/lodash/fp/_falseOptions.js create mode 100644 node_modules/lodash/fp/_mapping.js create mode 100644 node_modules/lodash/fp/_util.js create mode 100644 node_modules/lodash/fp/add.js create mode 100644 node_modules/lodash/fp/after.js create mode 100644 node_modules/lodash/fp/all.js create mode 100644 node_modules/lodash/fp/allPass.js create mode 100644 node_modules/lodash/fp/always.js create mode 100644 node_modules/lodash/fp/any.js create mode 100644 node_modules/lodash/fp/anyPass.js create mode 100644 node_modules/lodash/fp/apply.js create mode 100644 node_modules/lodash/fp/array.js create mode 100644 node_modules/lodash/fp/ary.js create mode 100644 node_modules/lodash/fp/assign.js create mode 100644 node_modules/lodash/fp/assignAll.js create mode 100644 node_modules/lodash/fp/assignAllWith.js create mode 100644 node_modules/lodash/fp/assignIn.js create mode 100644 node_modules/lodash/fp/assignInAll.js create mode 100644 node_modules/lodash/fp/assignInAllWith.js create mode 100644 node_modules/lodash/fp/assignInWith.js create mode 100644 node_modules/lodash/fp/assignWith.js create mode 100644 node_modules/lodash/fp/assoc.js create mode 100644 node_modules/lodash/fp/assocPath.js create mode 100644 node_modules/lodash/fp/at.js create mode 100644 node_modules/lodash/fp/attempt.js create mode 100644 node_modules/lodash/fp/before.js create mode 100644 node_modules/lodash/fp/bind.js create mode 100644 node_modules/lodash/fp/bindAll.js create mode 100644 node_modules/lodash/fp/bindKey.js create mode 100644 node_modules/lodash/fp/camelCase.js create mode 100644 node_modules/lodash/fp/capitalize.js create mode 100644 node_modules/lodash/fp/castArray.js create mode 100644 node_modules/lodash/fp/ceil.js create mode 100644 node_modules/lodash/fp/chain.js create mode 100644 node_modules/lodash/fp/chunk.js create mode 100644 node_modules/lodash/fp/clamp.js create mode 100644 node_modules/lodash/fp/clone.js create mode 100644 node_modules/lodash/fp/cloneDeep.js create mode 100644 node_modules/lodash/fp/cloneDeepWith.js create mode 100644 node_modules/lodash/fp/cloneWith.js create mode 100644 node_modules/lodash/fp/collection.js create mode 100644 node_modules/lodash/fp/commit.js create mode 100644 node_modules/lodash/fp/compact.js create mode 100644 node_modules/lodash/fp/complement.js create mode 100644 node_modules/lodash/fp/compose.js create mode 100644 node_modules/lodash/fp/concat.js create mode 100644 node_modules/lodash/fp/cond.js create mode 100644 node_modules/lodash/fp/conforms.js create mode 100644 node_modules/lodash/fp/conformsTo.js create mode 100644 node_modules/lodash/fp/constant.js create mode 100644 node_modules/lodash/fp/contains.js create mode 100644 node_modules/lodash/fp/convert.js create mode 100644 node_modules/lodash/fp/countBy.js create mode 100644 node_modules/lodash/fp/create.js create mode 100644 node_modules/lodash/fp/curry.js create mode 100644 node_modules/lodash/fp/curryN.js create mode 100644 node_modules/lodash/fp/curryRight.js create mode 100644 node_modules/lodash/fp/curryRightN.js create mode 100644 node_modules/lodash/fp/date.js create mode 100644 node_modules/lodash/fp/debounce.js create mode 100644 node_modules/lodash/fp/deburr.js create mode 100644 node_modules/lodash/fp/defaultTo.js create mode 100644 node_modules/lodash/fp/defaults.js create mode 100644 node_modules/lodash/fp/defaultsAll.js create mode 100644 node_modules/lodash/fp/defaultsDeep.js create mode 100644 node_modules/lodash/fp/defaultsDeepAll.js create mode 100644 node_modules/lodash/fp/defer.js create mode 100644 node_modules/lodash/fp/delay.js create mode 100644 node_modules/lodash/fp/difference.js create mode 100644 node_modules/lodash/fp/differenceBy.js create mode 100644 node_modules/lodash/fp/differenceWith.js create mode 100644 node_modules/lodash/fp/dissoc.js create mode 100644 node_modules/lodash/fp/dissocPath.js create mode 100644 node_modules/lodash/fp/divide.js create mode 100644 node_modules/lodash/fp/drop.js create mode 100644 node_modules/lodash/fp/dropLast.js create mode 100644 node_modules/lodash/fp/dropLastWhile.js create mode 100644 node_modules/lodash/fp/dropRight.js create mode 100644 node_modules/lodash/fp/dropRightWhile.js create mode 100644 node_modules/lodash/fp/dropWhile.js create mode 100644 node_modules/lodash/fp/each.js create mode 100644 node_modules/lodash/fp/eachRight.js create mode 100644 node_modules/lodash/fp/endsWith.js create mode 100644 node_modules/lodash/fp/entries.js create mode 100644 node_modules/lodash/fp/entriesIn.js create mode 100644 node_modules/lodash/fp/eq.js create mode 100644 node_modules/lodash/fp/equals.js create mode 100644 node_modules/lodash/fp/escape.js create mode 100644 node_modules/lodash/fp/escapeRegExp.js create mode 100644 node_modules/lodash/fp/every.js create mode 100644 node_modules/lodash/fp/extend.js create mode 100644 node_modules/lodash/fp/extendAll.js create mode 100644 node_modules/lodash/fp/extendAllWith.js create mode 100644 node_modules/lodash/fp/extendWith.js create mode 100644 node_modules/lodash/fp/fill.js create mode 100644 node_modules/lodash/fp/filter.js create mode 100644 node_modules/lodash/fp/find.js create mode 100644 node_modules/lodash/fp/findFrom.js create mode 100644 node_modules/lodash/fp/findIndex.js create mode 100644 node_modules/lodash/fp/findIndexFrom.js create mode 100644 node_modules/lodash/fp/findKey.js create mode 100644 node_modules/lodash/fp/findLast.js create mode 100644 node_modules/lodash/fp/findLastFrom.js create mode 100644 node_modules/lodash/fp/findLastIndex.js create mode 100644 node_modules/lodash/fp/findLastIndexFrom.js create mode 100644 node_modules/lodash/fp/findLastKey.js create mode 100644 node_modules/lodash/fp/first.js create mode 100644 node_modules/lodash/fp/flatMap.js create mode 100644 node_modules/lodash/fp/flatMapDeep.js create mode 100644 node_modules/lodash/fp/flatMapDepth.js create mode 100644 node_modules/lodash/fp/flatten.js create mode 100644 node_modules/lodash/fp/flattenDeep.js create mode 100644 node_modules/lodash/fp/flattenDepth.js create mode 100644 node_modules/lodash/fp/flip.js create mode 100644 node_modules/lodash/fp/floor.js create mode 100644 node_modules/lodash/fp/flow.js create mode 100644 node_modules/lodash/fp/flowRight.js create mode 100644 node_modules/lodash/fp/forEach.js create mode 100644 node_modules/lodash/fp/forEachRight.js create mode 100644 node_modules/lodash/fp/forIn.js create mode 100644 node_modules/lodash/fp/forInRight.js create mode 100644 node_modules/lodash/fp/forOwn.js create mode 100644 node_modules/lodash/fp/forOwnRight.js create mode 100644 node_modules/lodash/fp/fromPairs.js create mode 100644 node_modules/lodash/fp/function.js create mode 100644 node_modules/lodash/fp/functions.js create mode 100644 node_modules/lodash/fp/functionsIn.js create mode 100644 node_modules/lodash/fp/get.js create mode 100644 node_modules/lodash/fp/getOr.js create mode 100644 node_modules/lodash/fp/groupBy.js create mode 100644 node_modules/lodash/fp/gt.js create mode 100644 node_modules/lodash/fp/gte.js create mode 100644 node_modules/lodash/fp/has.js create mode 100644 node_modules/lodash/fp/hasIn.js create mode 100644 node_modules/lodash/fp/head.js create mode 100644 node_modules/lodash/fp/identical.js create mode 100644 node_modules/lodash/fp/identity.js create mode 100644 node_modules/lodash/fp/inRange.js create mode 100644 node_modules/lodash/fp/includes.js create mode 100644 node_modules/lodash/fp/includesFrom.js create mode 100644 node_modules/lodash/fp/indexBy.js create mode 100644 node_modules/lodash/fp/indexOf.js create mode 100644 node_modules/lodash/fp/indexOfFrom.js create mode 100644 node_modules/lodash/fp/init.js create mode 100644 node_modules/lodash/fp/initial.js create mode 100644 node_modules/lodash/fp/intersection.js create mode 100644 node_modules/lodash/fp/intersectionBy.js create mode 100644 node_modules/lodash/fp/intersectionWith.js create mode 100644 node_modules/lodash/fp/invert.js create mode 100644 node_modules/lodash/fp/invertBy.js create mode 100644 node_modules/lodash/fp/invertObj.js create mode 100644 node_modules/lodash/fp/invoke.js create mode 100644 node_modules/lodash/fp/invokeArgs.js create mode 100644 node_modules/lodash/fp/invokeArgsMap.js create mode 100644 node_modules/lodash/fp/invokeMap.js create mode 100644 node_modules/lodash/fp/isArguments.js create mode 100644 node_modules/lodash/fp/isArray.js create mode 100644 node_modules/lodash/fp/isArrayBuffer.js create mode 100644 node_modules/lodash/fp/isArrayLike.js create mode 100644 node_modules/lodash/fp/isArrayLikeObject.js create mode 100644 node_modules/lodash/fp/isBoolean.js create mode 100644 node_modules/lodash/fp/isBuffer.js create mode 100644 node_modules/lodash/fp/isDate.js create mode 100644 node_modules/lodash/fp/isElement.js create mode 100644 node_modules/lodash/fp/isEmpty.js create mode 100644 node_modules/lodash/fp/isEqual.js create mode 100644 node_modules/lodash/fp/isEqualWith.js create mode 100644 node_modules/lodash/fp/isError.js create mode 100644 node_modules/lodash/fp/isFinite.js create mode 100644 node_modules/lodash/fp/isFunction.js create mode 100644 node_modules/lodash/fp/isInteger.js create mode 100644 node_modules/lodash/fp/isLength.js create mode 100644 node_modules/lodash/fp/isMap.js create mode 100644 node_modules/lodash/fp/isMatch.js create mode 100644 node_modules/lodash/fp/isMatchWith.js create mode 100644 node_modules/lodash/fp/isNaN.js create mode 100644 node_modules/lodash/fp/isNative.js create mode 100644 node_modules/lodash/fp/isNil.js create mode 100644 node_modules/lodash/fp/isNull.js create mode 100644 node_modules/lodash/fp/isNumber.js create mode 100644 node_modules/lodash/fp/isObject.js create mode 100644 node_modules/lodash/fp/isObjectLike.js create mode 100644 node_modules/lodash/fp/isPlainObject.js create mode 100644 node_modules/lodash/fp/isRegExp.js create mode 100644 node_modules/lodash/fp/isSafeInteger.js create mode 100644 node_modules/lodash/fp/isSet.js create mode 100644 node_modules/lodash/fp/isString.js create mode 100644 node_modules/lodash/fp/isSymbol.js create mode 100644 node_modules/lodash/fp/isTypedArray.js create mode 100644 node_modules/lodash/fp/isUndefined.js create mode 100644 node_modules/lodash/fp/isWeakMap.js create mode 100644 node_modules/lodash/fp/isWeakSet.js create mode 100644 node_modules/lodash/fp/iteratee.js create mode 100644 node_modules/lodash/fp/join.js create mode 100644 node_modules/lodash/fp/juxt.js create mode 100644 node_modules/lodash/fp/kebabCase.js create mode 100644 node_modules/lodash/fp/keyBy.js create mode 100644 node_modules/lodash/fp/keys.js create mode 100644 node_modules/lodash/fp/keysIn.js create mode 100644 node_modules/lodash/fp/lang.js create mode 100644 node_modules/lodash/fp/last.js create mode 100644 node_modules/lodash/fp/lastIndexOf.js create mode 100644 node_modules/lodash/fp/lastIndexOfFrom.js create mode 100644 node_modules/lodash/fp/lowerCase.js create mode 100644 node_modules/lodash/fp/lowerFirst.js create mode 100644 node_modules/lodash/fp/lt.js create mode 100644 node_modules/lodash/fp/lte.js create mode 100644 node_modules/lodash/fp/map.js create mode 100644 node_modules/lodash/fp/mapKeys.js create mode 100644 node_modules/lodash/fp/mapValues.js create mode 100644 node_modules/lodash/fp/matches.js create mode 100644 node_modules/lodash/fp/matchesProperty.js create mode 100644 node_modules/lodash/fp/math.js create mode 100644 node_modules/lodash/fp/max.js create mode 100644 node_modules/lodash/fp/maxBy.js create mode 100644 node_modules/lodash/fp/mean.js create mode 100644 node_modules/lodash/fp/meanBy.js create mode 100644 node_modules/lodash/fp/memoize.js create mode 100644 node_modules/lodash/fp/merge.js create mode 100644 node_modules/lodash/fp/mergeAll.js create mode 100644 node_modules/lodash/fp/mergeAllWith.js create mode 100644 node_modules/lodash/fp/mergeWith.js create mode 100644 node_modules/lodash/fp/method.js create mode 100644 node_modules/lodash/fp/methodOf.js create mode 100644 node_modules/lodash/fp/min.js create mode 100644 node_modules/lodash/fp/minBy.js create mode 100644 node_modules/lodash/fp/mixin.js create mode 100644 node_modules/lodash/fp/multiply.js create mode 100644 node_modules/lodash/fp/nAry.js create mode 100644 node_modules/lodash/fp/negate.js create mode 100644 node_modules/lodash/fp/next.js create mode 100644 node_modules/lodash/fp/noop.js create mode 100644 node_modules/lodash/fp/now.js create mode 100644 node_modules/lodash/fp/nth.js create mode 100644 node_modules/lodash/fp/nthArg.js create mode 100644 node_modules/lodash/fp/number.js create mode 100644 node_modules/lodash/fp/object.js create mode 100644 node_modules/lodash/fp/omit.js create mode 100644 node_modules/lodash/fp/omitAll.js create mode 100644 node_modules/lodash/fp/omitBy.js create mode 100644 node_modules/lodash/fp/once.js create mode 100644 node_modules/lodash/fp/orderBy.js create mode 100644 node_modules/lodash/fp/over.js create mode 100644 node_modules/lodash/fp/overArgs.js create mode 100644 node_modules/lodash/fp/overEvery.js create mode 100644 node_modules/lodash/fp/overSome.js create mode 100644 node_modules/lodash/fp/pad.js create mode 100644 node_modules/lodash/fp/padChars.js create mode 100644 node_modules/lodash/fp/padCharsEnd.js create mode 100644 node_modules/lodash/fp/padCharsStart.js create mode 100644 node_modules/lodash/fp/padEnd.js create mode 100644 node_modules/lodash/fp/padStart.js create mode 100644 node_modules/lodash/fp/parseInt.js create mode 100644 node_modules/lodash/fp/partial.js create mode 100644 node_modules/lodash/fp/partialRight.js create mode 100644 node_modules/lodash/fp/partition.js create mode 100644 node_modules/lodash/fp/path.js create mode 100644 node_modules/lodash/fp/pathEq.js create mode 100644 node_modules/lodash/fp/pathOr.js create mode 100644 node_modules/lodash/fp/paths.js create mode 100644 node_modules/lodash/fp/pick.js create mode 100644 node_modules/lodash/fp/pickAll.js create mode 100644 node_modules/lodash/fp/pickBy.js create mode 100644 node_modules/lodash/fp/pipe.js create mode 100644 node_modules/lodash/fp/placeholder.js create mode 100644 node_modules/lodash/fp/plant.js create mode 100644 node_modules/lodash/fp/pluck.js create mode 100644 node_modules/lodash/fp/prop.js create mode 100644 node_modules/lodash/fp/propEq.js create mode 100644 node_modules/lodash/fp/propOr.js create mode 100644 node_modules/lodash/fp/property.js create mode 100644 node_modules/lodash/fp/propertyOf.js create mode 100644 node_modules/lodash/fp/props.js create mode 100644 node_modules/lodash/fp/pull.js create mode 100644 node_modules/lodash/fp/pullAll.js create mode 100644 node_modules/lodash/fp/pullAllBy.js create mode 100644 node_modules/lodash/fp/pullAllWith.js create mode 100644 node_modules/lodash/fp/pullAt.js create mode 100644 node_modules/lodash/fp/random.js create mode 100644 node_modules/lodash/fp/range.js create mode 100644 node_modules/lodash/fp/rangeRight.js create mode 100644 node_modules/lodash/fp/rangeStep.js create mode 100644 node_modules/lodash/fp/rangeStepRight.js create mode 100644 node_modules/lodash/fp/rearg.js create mode 100644 node_modules/lodash/fp/reduce.js create mode 100644 node_modules/lodash/fp/reduceRight.js create mode 100644 node_modules/lodash/fp/reject.js create mode 100644 node_modules/lodash/fp/remove.js create mode 100644 node_modules/lodash/fp/repeat.js create mode 100644 node_modules/lodash/fp/replace.js create mode 100644 node_modules/lodash/fp/rest.js create mode 100644 node_modules/lodash/fp/restFrom.js create mode 100644 node_modules/lodash/fp/result.js create mode 100644 node_modules/lodash/fp/reverse.js create mode 100644 node_modules/lodash/fp/round.js create mode 100644 node_modules/lodash/fp/sample.js create mode 100644 node_modules/lodash/fp/sampleSize.js create mode 100644 node_modules/lodash/fp/seq.js create mode 100644 node_modules/lodash/fp/set.js create mode 100644 node_modules/lodash/fp/setWith.js create mode 100644 node_modules/lodash/fp/shuffle.js create mode 100644 node_modules/lodash/fp/size.js create mode 100644 node_modules/lodash/fp/slice.js create mode 100644 node_modules/lodash/fp/snakeCase.js create mode 100644 node_modules/lodash/fp/some.js create mode 100644 node_modules/lodash/fp/sortBy.js create mode 100644 node_modules/lodash/fp/sortedIndex.js create mode 100644 node_modules/lodash/fp/sortedIndexBy.js create mode 100644 node_modules/lodash/fp/sortedIndexOf.js create mode 100644 node_modules/lodash/fp/sortedLastIndex.js create mode 100644 node_modules/lodash/fp/sortedLastIndexBy.js create mode 100644 node_modules/lodash/fp/sortedLastIndexOf.js create mode 100644 node_modules/lodash/fp/sortedUniq.js create mode 100644 node_modules/lodash/fp/sortedUniqBy.js create mode 100644 node_modules/lodash/fp/split.js create mode 100644 node_modules/lodash/fp/spread.js create mode 100644 node_modules/lodash/fp/spreadFrom.js create mode 100644 node_modules/lodash/fp/startCase.js create mode 100644 node_modules/lodash/fp/startsWith.js create mode 100644 node_modules/lodash/fp/string.js create mode 100644 node_modules/lodash/fp/stubArray.js create mode 100644 node_modules/lodash/fp/stubFalse.js create mode 100644 node_modules/lodash/fp/stubObject.js create mode 100644 node_modules/lodash/fp/stubString.js create mode 100644 node_modules/lodash/fp/stubTrue.js create mode 100644 node_modules/lodash/fp/subtract.js create mode 100644 node_modules/lodash/fp/sum.js create mode 100644 node_modules/lodash/fp/sumBy.js create mode 100644 node_modules/lodash/fp/symmetricDifference.js create mode 100644 node_modules/lodash/fp/symmetricDifferenceBy.js create mode 100644 node_modules/lodash/fp/symmetricDifferenceWith.js create mode 100644 node_modules/lodash/fp/tail.js create mode 100644 node_modules/lodash/fp/take.js create mode 100644 node_modules/lodash/fp/takeLast.js create mode 100644 node_modules/lodash/fp/takeLastWhile.js create mode 100644 node_modules/lodash/fp/takeRight.js create mode 100644 node_modules/lodash/fp/takeRightWhile.js create mode 100644 node_modules/lodash/fp/takeWhile.js create mode 100644 node_modules/lodash/fp/tap.js create mode 100644 node_modules/lodash/fp/template.js create mode 100644 node_modules/lodash/fp/templateSettings.js create mode 100644 node_modules/lodash/fp/throttle.js create mode 100644 node_modules/lodash/fp/thru.js create mode 100644 node_modules/lodash/fp/times.js create mode 100644 node_modules/lodash/fp/toArray.js create mode 100644 node_modules/lodash/fp/toFinite.js create mode 100644 node_modules/lodash/fp/toInteger.js create mode 100644 node_modules/lodash/fp/toIterator.js create mode 100644 node_modules/lodash/fp/toJSON.js create mode 100644 node_modules/lodash/fp/toLength.js create mode 100644 node_modules/lodash/fp/toLower.js create mode 100644 node_modules/lodash/fp/toNumber.js create mode 100644 node_modules/lodash/fp/toPairs.js create mode 100644 node_modules/lodash/fp/toPairsIn.js create mode 100644 node_modules/lodash/fp/toPath.js create mode 100644 node_modules/lodash/fp/toPlainObject.js create mode 100644 node_modules/lodash/fp/toSafeInteger.js create mode 100644 node_modules/lodash/fp/toString.js create mode 100644 node_modules/lodash/fp/toUpper.js create mode 100644 node_modules/lodash/fp/transform.js create mode 100644 node_modules/lodash/fp/trim.js create mode 100644 node_modules/lodash/fp/trimChars.js create mode 100644 node_modules/lodash/fp/trimCharsEnd.js create mode 100644 node_modules/lodash/fp/trimCharsStart.js create mode 100644 node_modules/lodash/fp/trimEnd.js create mode 100644 node_modules/lodash/fp/trimStart.js create mode 100644 node_modules/lodash/fp/truncate.js create mode 100644 node_modules/lodash/fp/unapply.js create mode 100644 node_modules/lodash/fp/unary.js create mode 100644 node_modules/lodash/fp/unescape.js create mode 100644 node_modules/lodash/fp/union.js create mode 100644 node_modules/lodash/fp/unionBy.js create mode 100644 node_modules/lodash/fp/unionWith.js create mode 100644 node_modules/lodash/fp/uniq.js create mode 100644 node_modules/lodash/fp/uniqBy.js create mode 100644 node_modules/lodash/fp/uniqWith.js create mode 100644 node_modules/lodash/fp/uniqueId.js create mode 100644 node_modules/lodash/fp/unnest.js create mode 100644 node_modules/lodash/fp/unset.js create mode 100644 node_modules/lodash/fp/unzip.js create mode 100644 node_modules/lodash/fp/unzipWith.js create mode 100644 node_modules/lodash/fp/update.js create mode 100644 node_modules/lodash/fp/updateWith.js create mode 100644 node_modules/lodash/fp/upperCase.js create mode 100644 node_modules/lodash/fp/upperFirst.js create mode 100644 node_modules/lodash/fp/useWith.js create mode 100644 node_modules/lodash/fp/util.js create mode 100644 node_modules/lodash/fp/value.js create mode 100644 node_modules/lodash/fp/valueOf.js create mode 100644 node_modules/lodash/fp/values.js create mode 100644 node_modules/lodash/fp/valuesIn.js create mode 100644 node_modules/lodash/fp/where.js create mode 100644 node_modules/lodash/fp/whereEq.js create mode 100644 node_modules/lodash/fp/without.js create mode 100644 node_modules/lodash/fp/words.js create mode 100644 node_modules/lodash/fp/wrap.js create mode 100644 node_modules/lodash/fp/wrapperAt.js create mode 100644 node_modules/lodash/fp/wrapperChain.js create mode 100644 node_modules/lodash/fp/wrapperLodash.js create mode 100644 node_modules/lodash/fp/wrapperReverse.js create mode 100644 node_modules/lodash/fp/wrapperValue.js create mode 100644 node_modules/lodash/fp/xor.js create mode 100644 node_modules/lodash/fp/xorBy.js create mode 100644 node_modules/lodash/fp/xorWith.js create mode 100644 node_modules/lodash/fp/zip.js create mode 100644 node_modules/lodash/fp/zipAll.js create mode 100644 node_modules/lodash/fp/zipObj.js create mode 100644 node_modules/lodash/fp/zipObject.js create mode 100644 node_modules/lodash/fp/zipObjectDeep.js create mode 100644 node_modules/lodash/fp/zipWith.js create mode 100644 node_modules/lodash/fromPairs.js create mode 100644 node_modules/lodash/function.js create mode 100644 node_modules/lodash/functions.js create mode 100644 node_modules/lodash/functionsIn.js create mode 100644 node_modules/lodash/get.js create mode 100644 node_modules/lodash/groupBy.js create mode 100644 node_modules/lodash/gt.js create mode 100644 node_modules/lodash/gte.js create mode 100644 node_modules/lodash/has.js create mode 100644 node_modules/lodash/hasIn.js create mode 100644 node_modules/lodash/head.js create mode 100644 node_modules/lodash/identity.js create mode 100644 node_modules/lodash/inRange.js create mode 100644 node_modules/lodash/includes.js create mode 100644 node_modules/lodash/index.js create mode 100644 node_modules/lodash/indexOf.js create mode 100644 node_modules/lodash/initial.js create mode 100644 node_modules/lodash/intersection.js create mode 100644 node_modules/lodash/intersectionBy.js create mode 100644 node_modules/lodash/intersectionWith.js create mode 100644 node_modules/lodash/invert.js create mode 100644 node_modules/lodash/invertBy.js create mode 100644 node_modules/lodash/invoke.js create mode 100644 node_modules/lodash/invokeMap.js create mode 100644 node_modules/lodash/isArguments.js create mode 100644 node_modules/lodash/isArray.js create mode 100644 node_modules/lodash/isArrayBuffer.js create mode 100644 node_modules/lodash/isArrayLike.js create mode 100644 node_modules/lodash/isArrayLikeObject.js create mode 100644 node_modules/lodash/isBoolean.js create mode 100644 node_modules/lodash/isBuffer.js create mode 100644 node_modules/lodash/isDate.js create mode 100644 node_modules/lodash/isElement.js create mode 100644 node_modules/lodash/isEmpty.js create mode 100644 node_modules/lodash/isEqual.js create mode 100644 node_modules/lodash/isEqualWith.js create mode 100644 node_modules/lodash/isError.js create mode 100644 node_modules/lodash/isFinite.js create mode 100644 node_modules/lodash/isFunction.js create mode 100644 node_modules/lodash/isInteger.js create mode 100644 node_modules/lodash/isLength.js create mode 100644 node_modules/lodash/isMap.js create mode 100644 node_modules/lodash/isMatch.js create mode 100644 node_modules/lodash/isMatchWith.js create mode 100644 node_modules/lodash/isNaN.js create mode 100644 node_modules/lodash/isNative.js create mode 100644 node_modules/lodash/isNil.js create mode 100644 node_modules/lodash/isNull.js create mode 100644 node_modules/lodash/isNumber.js create mode 100644 node_modules/lodash/isObject.js create mode 100644 node_modules/lodash/isObjectLike.js create mode 100644 node_modules/lodash/isPlainObject.js create mode 100644 node_modules/lodash/isRegExp.js create mode 100644 node_modules/lodash/isSafeInteger.js create mode 100644 node_modules/lodash/isSet.js create mode 100644 node_modules/lodash/isString.js create mode 100644 node_modules/lodash/isSymbol.js create mode 100644 node_modules/lodash/isTypedArray.js create mode 100644 node_modules/lodash/isUndefined.js create mode 100644 node_modules/lodash/isWeakMap.js create mode 100644 node_modules/lodash/isWeakSet.js create mode 100644 node_modules/lodash/iteratee.js create mode 100644 node_modules/lodash/join.js create mode 100644 node_modules/lodash/kebabCase.js create mode 100644 node_modules/lodash/keyBy.js create mode 100644 node_modules/lodash/keys.js create mode 100644 node_modules/lodash/keysIn.js create mode 100644 node_modules/lodash/lang.js create mode 100644 node_modules/lodash/last.js create mode 100644 node_modules/lodash/lastIndexOf.js create mode 100644 node_modules/lodash/lodash.js create mode 100644 node_modules/lodash/lodash.min.js create mode 100644 node_modules/lodash/lowerCase.js create mode 100644 node_modules/lodash/lowerFirst.js create mode 100644 node_modules/lodash/lt.js create mode 100644 node_modules/lodash/lte.js create mode 100644 node_modules/lodash/map.js create mode 100644 node_modules/lodash/mapKeys.js create mode 100644 node_modules/lodash/mapValues.js create mode 100644 node_modules/lodash/matches.js create mode 100644 node_modules/lodash/matchesProperty.js create mode 100644 node_modules/lodash/math.js create mode 100644 node_modules/lodash/max.js create mode 100644 node_modules/lodash/maxBy.js create mode 100644 node_modules/lodash/mean.js create mode 100644 node_modules/lodash/meanBy.js create mode 100644 node_modules/lodash/memoize.js create mode 100644 node_modules/lodash/merge.js create mode 100644 node_modules/lodash/mergeWith.js create mode 100644 node_modules/lodash/method.js create mode 100644 node_modules/lodash/methodOf.js create mode 100644 node_modules/lodash/min.js create mode 100644 node_modules/lodash/minBy.js create mode 100644 node_modules/lodash/mixin.js create mode 100644 node_modules/lodash/multiply.js create mode 100644 node_modules/lodash/negate.js create mode 100644 node_modules/lodash/next.js create mode 100644 node_modules/lodash/noop.js create mode 100644 node_modules/lodash/now.js create mode 100644 node_modules/lodash/nth.js create mode 100644 node_modules/lodash/nthArg.js create mode 100644 node_modules/lodash/number.js create mode 100644 node_modules/lodash/object.js create mode 100644 node_modules/lodash/omit.js create mode 100644 node_modules/lodash/omitBy.js create mode 100644 node_modules/lodash/once.js create mode 100644 node_modules/lodash/orderBy.js create mode 100644 node_modules/lodash/over.js create mode 100644 node_modules/lodash/overArgs.js create mode 100644 node_modules/lodash/overEvery.js create mode 100644 node_modules/lodash/overSome.js create mode 100644 node_modules/lodash/package.json create mode 100644 node_modules/lodash/pad.js create mode 100644 node_modules/lodash/padEnd.js create mode 100644 node_modules/lodash/padStart.js create mode 100644 node_modules/lodash/parseInt.js create mode 100644 node_modules/lodash/partial.js create mode 100644 node_modules/lodash/partialRight.js create mode 100644 node_modules/lodash/partition.js create mode 100644 node_modules/lodash/pick.js create mode 100644 node_modules/lodash/pickBy.js create mode 100644 node_modules/lodash/plant.js create mode 100644 node_modules/lodash/property.js create mode 100644 node_modules/lodash/propertyOf.js create mode 100644 node_modules/lodash/pull.js create mode 100644 node_modules/lodash/pullAll.js create mode 100644 node_modules/lodash/pullAllBy.js create mode 100644 node_modules/lodash/pullAllWith.js create mode 100644 node_modules/lodash/pullAt.js create mode 100644 node_modules/lodash/random.js create mode 100644 node_modules/lodash/range.js create mode 100644 node_modules/lodash/rangeRight.js create mode 100644 node_modules/lodash/rearg.js create mode 100644 node_modules/lodash/reduce.js create mode 100644 node_modules/lodash/reduceRight.js create mode 100644 node_modules/lodash/reject.js create mode 100644 node_modules/lodash/remove.js create mode 100644 node_modules/lodash/repeat.js create mode 100644 node_modules/lodash/replace.js create mode 100644 node_modules/lodash/rest.js create mode 100644 node_modules/lodash/result.js create mode 100644 node_modules/lodash/reverse.js create mode 100644 node_modules/lodash/round.js create mode 100644 node_modules/lodash/sample.js create mode 100644 node_modules/lodash/sampleSize.js create mode 100644 node_modules/lodash/seq.js create mode 100644 node_modules/lodash/set.js create mode 100644 node_modules/lodash/setWith.js create mode 100644 node_modules/lodash/shuffle.js create mode 100644 node_modules/lodash/size.js create mode 100644 node_modules/lodash/slice.js create mode 100644 node_modules/lodash/snakeCase.js create mode 100644 node_modules/lodash/some.js create mode 100644 node_modules/lodash/sortBy.js create mode 100644 node_modules/lodash/sortedIndex.js create mode 100644 node_modules/lodash/sortedIndexBy.js create mode 100644 node_modules/lodash/sortedIndexOf.js create mode 100644 node_modules/lodash/sortedLastIndex.js create mode 100644 node_modules/lodash/sortedLastIndexBy.js create mode 100644 node_modules/lodash/sortedLastIndexOf.js create mode 100644 node_modules/lodash/sortedUniq.js create mode 100644 node_modules/lodash/sortedUniqBy.js create mode 100644 node_modules/lodash/split.js create mode 100644 node_modules/lodash/spread.js create mode 100644 node_modules/lodash/startCase.js create mode 100644 node_modules/lodash/startsWith.js create mode 100644 node_modules/lodash/string.js create mode 100644 node_modules/lodash/stubArray.js create mode 100644 node_modules/lodash/stubFalse.js create mode 100644 node_modules/lodash/stubObject.js create mode 100644 node_modules/lodash/stubString.js create mode 100644 node_modules/lodash/stubTrue.js create mode 100644 node_modules/lodash/subtract.js create mode 100644 node_modules/lodash/sum.js create mode 100644 node_modules/lodash/sumBy.js create mode 100644 node_modules/lodash/tail.js create mode 100644 node_modules/lodash/take.js create mode 100644 node_modules/lodash/takeRight.js create mode 100644 node_modules/lodash/takeRightWhile.js create mode 100644 node_modules/lodash/takeWhile.js create mode 100644 node_modules/lodash/tap.js create mode 100644 node_modules/lodash/template.js create mode 100644 node_modules/lodash/templateSettings.js create mode 100644 node_modules/lodash/throttle.js create mode 100644 node_modules/lodash/thru.js create mode 100644 node_modules/lodash/times.js create mode 100644 node_modules/lodash/toArray.js create mode 100644 node_modules/lodash/toFinite.js create mode 100644 node_modules/lodash/toInteger.js create mode 100644 node_modules/lodash/toIterator.js create mode 100644 node_modules/lodash/toJSON.js create mode 100644 node_modules/lodash/toLength.js create mode 100644 node_modules/lodash/toLower.js create mode 100644 node_modules/lodash/toNumber.js create mode 100644 node_modules/lodash/toPairs.js create mode 100644 node_modules/lodash/toPairsIn.js create mode 100644 node_modules/lodash/toPath.js create mode 100644 node_modules/lodash/toPlainObject.js create mode 100644 node_modules/lodash/toSafeInteger.js create mode 100644 node_modules/lodash/toString.js create mode 100644 node_modules/lodash/toUpper.js create mode 100644 node_modules/lodash/transform.js create mode 100644 node_modules/lodash/trim.js create mode 100644 node_modules/lodash/trimEnd.js create mode 100644 node_modules/lodash/trimStart.js create mode 100644 node_modules/lodash/truncate.js create mode 100644 node_modules/lodash/unary.js create mode 100644 node_modules/lodash/unescape.js create mode 100644 node_modules/lodash/union.js create mode 100644 node_modules/lodash/unionBy.js create mode 100644 node_modules/lodash/unionWith.js create mode 100644 node_modules/lodash/uniq.js create mode 100644 node_modules/lodash/uniqBy.js create mode 100644 node_modules/lodash/uniqWith.js create mode 100644 node_modules/lodash/uniqueId.js create mode 100644 node_modules/lodash/unset.js create mode 100644 node_modules/lodash/unzip.js create mode 100644 node_modules/lodash/unzipWith.js create mode 100644 node_modules/lodash/update.js create mode 100644 node_modules/lodash/updateWith.js create mode 100644 node_modules/lodash/upperCase.js create mode 100644 node_modules/lodash/upperFirst.js create mode 100644 node_modules/lodash/util.js create mode 100644 node_modules/lodash/value.js create mode 100644 node_modules/lodash/valueOf.js create mode 100644 node_modules/lodash/values.js create mode 100644 node_modules/lodash/valuesIn.js create mode 100644 node_modules/lodash/without.js create mode 100644 node_modules/lodash/words.js create mode 100644 node_modules/lodash/wrap.js create mode 100644 node_modules/lodash/wrapperAt.js create mode 100644 node_modules/lodash/wrapperChain.js create mode 100644 node_modules/lodash/wrapperLodash.js create mode 100644 node_modules/lodash/wrapperReverse.js create mode 100644 node_modules/lodash/wrapperValue.js create mode 100644 node_modules/lodash/xor.js create mode 100644 node_modules/lodash/xorBy.js create mode 100644 node_modules/lodash/xorWith.js create mode 100644 node_modules/lodash/zip.js create mode 100644 node_modules/lodash/zipObject.js create mode 100644 node_modules/lodash/zipObjectDeep.js create mode 100644 node_modules/lodash/zipWith.js create mode 100644 node_modules/loud-rejection/api.js create mode 100644 node_modules/loud-rejection/index.js create mode 100644 node_modules/loud-rejection/license create mode 100644 node_modules/loud-rejection/package.json create mode 100644 node_modules/loud-rejection/readme.md create mode 100644 node_modules/loud-rejection/register.js create mode 100644 node_modules/lru-cache/LICENSE create mode 100644 node_modules/lru-cache/README.md create mode 100644 node_modules/lru-cache/index.js create mode 100644 node_modules/lru-cache/package.json create mode 100644 node_modules/lru-queue/.lint create mode 100644 node_modules/lru-queue/.npmignore create mode 100644 node_modules/lru-queue/.travis.yml create mode 100644 node_modules/lru-queue/CHANGES create mode 100644 node_modules/lru-queue/LICENCE create mode 100644 node_modules/lru-queue/README.md create mode 100644 node_modules/lru-queue/index.js create mode 100644 node_modules/lru-queue/package.json create mode 100644 node_modules/lru-queue/test/index.js create mode 100644 node_modules/make-iterator/LICENSE create mode 100644 node_modules/make-iterator/README.md create mode 100644 node_modules/make-iterator/index.js create mode 100644 node_modules/make-iterator/node_modules/kind-of/CHANGELOG.md create mode 100644 node_modules/make-iterator/node_modules/kind-of/LICENSE create mode 100644 node_modules/make-iterator/node_modules/kind-of/README.md create mode 100644 node_modules/make-iterator/node_modules/kind-of/index.js create mode 100644 node_modules/make-iterator/node_modules/kind-of/package.json create mode 100644 node_modules/make-iterator/package.json create mode 100644 node_modules/map-cache/LICENSE create mode 100644 node_modules/map-cache/README.md create mode 100644 node_modules/map-cache/index.js create mode 100644 node_modules/map-cache/package.json create mode 100644 node_modules/map-obj/index.js create mode 100644 node_modules/map-obj/license create mode 100644 node_modules/map-obj/package.json create mode 100644 node_modules/map-obj/readme.md create mode 100644 node_modules/map-visit/LICENSE create mode 100644 node_modules/map-visit/README.md create mode 100644 node_modules/map-visit/index.js create mode 100644 node_modules/map-visit/package.json create mode 100644 node_modules/matchdep/.jshintrc create mode 100644 node_modules/matchdep/.npmignore create mode 100644 node_modules/matchdep/.travis.yml create mode 100644 node_modules/matchdep/LICENSE-MIT create mode 100644 node_modules/matchdep/README.md create mode 100644 node_modules/matchdep/package.json create mode 100644 node_modules/mdn-data/LICENSE create mode 100644 node_modules/mdn-data/README.md create mode 100644 node_modules/mdn-data/api/index.js create mode 100644 node_modules/mdn-data/api/inheritance.json create mode 100644 node_modules/mdn-data/api/inheritance.schema.json create mode 100644 node_modules/mdn-data/css/at-rules.json create mode 100644 node_modules/mdn-data/css/at-rules.schema.json create mode 100644 node_modules/mdn-data/css/definitions.json create mode 100644 node_modules/mdn-data/css/index.js create mode 100644 node_modules/mdn-data/css/properties.json create mode 100644 node_modules/mdn-data/css/properties.schema.json create mode 100644 node_modules/mdn-data/css/selectors.json create mode 100644 node_modules/mdn-data/css/selectors.schema.json create mode 100644 node_modules/mdn-data/css/syntaxes.json create mode 100644 node_modules/mdn-data/css/syntaxes.schema.json create mode 100644 node_modules/mdn-data/css/types.json create mode 100644 node_modules/mdn-data/css/types.schema.json create mode 100644 node_modules/mdn-data/css/units.json create mode 100644 node_modules/mdn-data/css/units.schema.json create mode 100644 node_modules/mdn-data/index.js create mode 100644 node_modules/mdn-data/l10n/css.json create mode 100644 node_modules/mdn-data/l10n/index.js create mode 100644 node_modules/mdn-data/package.json create mode 100644 node_modules/memoizee/LICENSE create mode 100644 node_modules/memoizee/README.md create mode 100644 node_modules/memoizee/ext/async.js create mode 100644 node_modules/memoizee/ext/dispose.js create mode 100644 node_modules/memoizee/ext/max-age.js create mode 100644 node_modules/memoizee/ext/max.js create mode 100644 node_modules/memoizee/ext/promise.js create mode 100644 node_modules/memoizee/ext/ref-counter.js create mode 100644 node_modules/memoizee/index.js create mode 100644 node_modules/memoizee/methods-plain.js create mode 100644 node_modules/memoizee/methods.js create mode 100644 node_modules/memoizee/normalizers/get-1.js create mode 100644 node_modules/memoizee/normalizers/get-fixed.js create mode 100644 node_modules/memoizee/normalizers/get-primitive-fixed.js create mode 100644 node_modules/memoizee/normalizers/get.js create mode 100644 node_modules/memoizee/normalizers/primitive.js create mode 100644 node_modules/memoizee/package.json create mode 100644 node_modules/memoizee/plain.js create mode 100644 node_modules/memoizee/profile.js create mode 100644 node_modules/memoizee/weak-plain.js create mode 100644 node_modules/memoizee/weak.js create mode 100644 node_modules/meow/index.js create mode 100644 node_modules/meow/license create mode 100644 node_modules/meow/package.json create mode 100644 node_modules/meow/readme.md create mode 100644 node_modules/merge-stream/LICENSE create mode 100644 node_modules/merge-stream/README.md create mode 100644 node_modules/merge-stream/index.js create mode 100644 node_modules/merge-stream/package.json create mode 100644 node_modules/micromatch/CHANGELOG.md create mode 100755 node_modules/micromatch/LICENSE create mode 100644 node_modules/micromatch/README.md create mode 100644 node_modules/micromatch/index.js create mode 100644 node_modules/micromatch/node_modules/define-property/CHANGELOG.md create mode 100644 node_modules/micromatch/node_modules/define-property/LICENSE create mode 100644 node_modules/micromatch/node_modules/define-property/README.md create mode 100644 node_modules/micromatch/node_modules/define-property/index.js create mode 100644 node_modules/micromatch/node_modules/define-property/package.json create mode 100644 node_modules/micromatch/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/micromatch/node_modules/extend-shallow/README.md create mode 100644 node_modules/micromatch/node_modules/extend-shallow/index.js create mode 100644 node_modules/micromatch/node_modules/extend-shallow/package.json create mode 100644 node_modules/micromatch/node_modules/is-extendable/LICENSE create mode 100644 node_modules/micromatch/node_modules/is-extendable/README.md create mode 100644 node_modules/micromatch/node_modules/is-extendable/index.d.ts create mode 100644 node_modules/micromatch/node_modules/is-extendable/index.js create mode 100644 node_modules/micromatch/node_modules/is-extendable/package.json create mode 100644 node_modules/micromatch/node_modules/kind-of/CHANGELOG.md create mode 100644 node_modules/micromatch/node_modules/kind-of/LICENSE create mode 100644 node_modules/micromatch/node_modules/kind-of/README.md create mode 100644 node_modules/micromatch/node_modules/kind-of/index.js create mode 100644 node_modules/micromatch/node_modules/kind-of/package.json create mode 100644 node_modules/micromatch/package.json create mode 100644 node_modules/mime-db/HISTORY.md create mode 100644 node_modules/mime-db/LICENSE create mode 100644 node_modules/mime-db/README.md create mode 100644 node_modules/mime-db/db.json create mode 100644 node_modules/mime-db/index.js create mode 100644 node_modules/mime-db/package.json create mode 100644 node_modules/mime-types/HISTORY.md create mode 100644 node_modules/mime-types/LICENSE create mode 100644 node_modules/mime-types/README.md create mode 100644 node_modules/mime-types/index.js create mode 100644 node_modules/mime-types/package.json create mode 100644 node_modules/minimatch/LICENSE create mode 100644 node_modules/minimatch/README.md create mode 100644 node_modules/minimatch/minimatch.js create mode 100644 node_modules/minimatch/package.json create mode 100644 node_modules/minimist/.travis.yml create mode 100644 node_modules/minimist/LICENSE create mode 100644 node_modules/minimist/example/parse.js create mode 100644 node_modules/minimist/index.js create mode 100644 node_modules/minimist/package.json create mode 100644 node_modules/minimist/readme.markdown create mode 100644 node_modules/minimist/test/all_bool.js create mode 100644 node_modules/minimist/test/bool.js create mode 100644 node_modules/minimist/test/dash.js create mode 100644 node_modules/minimist/test/default_bool.js create mode 100644 node_modules/minimist/test/dotted.js create mode 100644 node_modules/minimist/test/kv_short.js create mode 100644 node_modules/minimist/test/long.js create mode 100644 node_modules/minimist/test/num.js create mode 100644 node_modules/minimist/test/parse.js create mode 100644 node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/minimist/test/proto.js create mode 100644 node_modules/minimist/test/short.js create mode 100644 node_modules/minimist/test/stop_early.js create mode 100644 node_modules/minimist/test/unknown.js create mode 100644 node_modules/minimist/test/whitespace.js create mode 100644 node_modules/mixin-deep/LICENSE create mode 100644 node_modules/mixin-deep/README.md create mode 100644 node_modules/mixin-deep/index.js create mode 100644 node_modules/mixin-deep/node_modules/is-extendable/LICENSE create mode 100644 node_modules/mixin-deep/node_modules/is-extendable/README.md create mode 100644 node_modules/mixin-deep/node_modules/is-extendable/index.d.ts create mode 100644 node_modules/mixin-deep/node_modules/is-extendable/index.js create mode 100644 node_modules/mixin-deep/node_modules/is-extendable/package.json create mode 100644 node_modules/mixin-deep/package.json create mode 100644 node_modules/mkdirp/LICENSE create mode 100644 node_modules/mkdirp/index.js create mode 100644 node_modules/mkdirp/package.json create mode 100644 node_modules/mkdirp/readme.markdown create mode 100644 node_modules/ms/index.js create mode 100644 node_modules/ms/license.md create mode 100644 node_modules/ms/package.json create mode 100644 node_modules/ms/readme.md create mode 100644 node_modules/mute-stdout/LICENSE create mode 100644 node_modules/mute-stdout/README.md create mode 100644 node_modules/mute-stdout/index.js create mode 100644 node_modules/mute-stdout/package.json create mode 100644 node_modules/nan/CHANGELOG.md create mode 100644 node_modules/nan/LICENSE.md create mode 100644 node_modules/nan/README.md create mode 100644 node_modules/nan/doc/asyncworker.md create mode 100644 node_modules/nan/doc/buffers.md create mode 100644 node_modules/nan/doc/callback.md create mode 100644 node_modules/nan/doc/converters.md create mode 100644 node_modules/nan/doc/errors.md create mode 100644 node_modules/nan/doc/json.md create mode 100644 node_modules/nan/doc/maybe_types.md create mode 100644 node_modules/nan/doc/methods.md create mode 100644 node_modules/nan/doc/new.md create mode 100644 node_modules/nan/doc/node_misc.md create mode 100644 node_modules/nan/doc/object_wrappers.md create mode 100644 node_modules/nan/doc/persistent.md create mode 100644 node_modules/nan/doc/scopes.md create mode 100644 node_modules/nan/doc/script.md create mode 100644 node_modules/nan/doc/string_bytes.md create mode 100644 node_modules/nan/doc/v8_internals.md create mode 100644 node_modules/nan/doc/v8_misc.md create mode 100644 node_modules/nan/include_dirs.js create mode 100644 node_modules/nan/nan.h create mode 100644 node_modules/nan/nan_callbacks.h create mode 100644 node_modules/nan/nan_callbacks_12_inl.h create mode 100644 node_modules/nan/nan_callbacks_pre_12_inl.h create mode 100644 node_modules/nan/nan_converters.h create mode 100644 node_modules/nan/nan_converters_43_inl.h create mode 100644 node_modules/nan/nan_converters_pre_43_inl.h create mode 100644 node_modules/nan/nan_define_own_property_helper.h create mode 100644 node_modules/nan/nan_implementation_12_inl.h create mode 100644 node_modules/nan/nan_implementation_pre_12_inl.h create mode 100644 node_modules/nan/nan_json.h create mode 100644 node_modules/nan/nan_maybe_43_inl.h create mode 100644 node_modules/nan/nan_maybe_pre_43_inl.h create mode 100644 node_modules/nan/nan_new.h create mode 100644 node_modules/nan/nan_object_wrap.h create mode 100644 node_modules/nan/nan_persistent_12_inl.h create mode 100644 node_modules/nan/nan_persistent_pre_12_inl.h create mode 100644 node_modules/nan/nan_private.h create mode 100644 node_modules/nan/nan_string_bytes.h create mode 100644 node_modules/nan/nan_typedarray_contents.h create mode 100644 node_modules/nan/nan_weak.h create mode 100644 node_modules/nan/package.json create mode 100755 node_modules/nan/tools/1to2.js create mode 100644 node_modules/nan/tools/README.md create mode 100644 node_modules/nan/tools/package.json create mode 100644 node_modules/nanomatch/CHANGELOG.md create mode 100644 node_modules/nanomatch/LICENSE create mode 100644 node_modules/nanomatch/README.md create mode 100644 node_modules/nanomatch/index.js create mode 100644 node_modules/nanomatch/node_modules/define-property/CHANGELOG.md create mode 100644 node_modules/nanomatch/node_modules/define-property/LICENSE create mode 100644 node_modules/nanomatch/node_modules/define-property/README.md create mode 100644 node_modules/nanomatch/node_modules/define-property/index.js create mode 100644 node_modules/nanomatch/node_modules/define-property/package.json create mode 100644 node_modules/nanomatch/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/nanomatch/node_modules/extend-shallow/README.md create mode 100644 node_modules/nanomatch/node_modules/extend-shallow/index.js create mode 100644 node_modules/nanomatch/node_modules/extend-shallow/package.json create mode 100644 node_modules/nanomatch/node_modules/is-extendable/LICENSE create mode 100644 node_modules/nanomatch/node_modules/is-extendable/README.md create mode 100644 node_modules/nanomatch/node_modules/is-extendable/index.d.ts create mode 100644 node_modules/nanomatch/node_modules/is-extendable/index.js create mode 100644 node_modules/nanomatch/node_modules/is-extendable/package.json create mode 100644 node_modules/nanomatch/node_modules/kind-of/CHANGELOG.md create mode 100644 node_modules/nanomatch/node_modules/kind-of/LICENSE create mode 100644 node_modules/nanomatch/node_modules/kind-of/README.md create mode 100644 node_modules/nanomatch/node_modules/kind-of/index.js create mode 100644 node_modules/nanomatch/node_modules/kind-of/package.json create mode 100644 node_modules/nanomatch/package.json create mode 100644 node_modules/next-tick/.editorconfig create mode 100644 node_modules/next-tick/.github/FUNDING.yml create mode 100644 node_modules/next-tick/.lint create mode 100644 node_modules/next-tick/CHANGELOG.md create mode 100644 node_modules/next-tick/CHANGES create mode 100644 node_modules/next-tick/LICENSE create mode 100644 node_modules/next-tick/README.md create mode 100644 node_modules/next-tick/index.js create mode 100644 node_modules/next-tick/package.json create mode 100644 node_modules/next-tick/test/index.js create mode 100644 node_modules/node-gyp/.github/ISSUE_TEMPLATE.md create mode 100644 node_modules/node-gyp/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 node_modules/node-gyp/.jshintrc create mode 100644 node_modules/node-gyp/CHANGELOG.md create mode 100644 node_modules/node-gyp/CONTRIBUTING.md create mode 100644 node_modules/node-gyp/LICENSE create mode 100644 node_modules/node-gyp/README.md create mode 100644 node_modules/node-gyp/addon.gypi create mode 100644 node_modules/node-gyp/gyp/AUTHORS create mode 100644 node_modules/node-gyp/gyp/DEPS create mode 100644 node_modules/node-gyp/gyp/LICENSE create mode 100644 node_modules/node-gyp/gyp/OWNERS create mode 100644 node_modules/node-gyp/gyp/PRESUBMIT.py create mode 100644 node_modules/node-gyp/gyp/codereview.settings create mode 100644 node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc create mode 100755 node_modules/node-gyp/gyp/gyp create mode 100644 node_modules/node-gyp/gyp/gyp.bat create mode 100755 node_modules/node-gyp/gyp/gyp_main.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py create mode 100755 node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py create mode 100755 node_modules/node-gyp/gyp/pylib/gyp/__init__.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/common.py create mode 100755 node_modules/node-gyp/gyp/pylib/gyp/common_test.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py create mode 100755 node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py create mode 100755 node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/android.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/make.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py create mode 100755 node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/input.py create mode 100755 node_modules/node-gyp/gyp/pylib/gyp/input_test.py create mode 100755 node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/ordered_dict.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py create mode 100755 node_modules/node-gyp/gyp/pylib/gyp/win_tool.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py create mode 100644 node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py create mode 100755 node_modules/node-gyp/gyp/samples/samples create mode 100644 node_modules/node-gyp/gyp/samples/samples.bat create mode 100755 node_modules/node-gyp/gyp/setup.py create mode 100644 node_modules/node-gyp/gyp/tools/README create mode 100644 node_modules/node-gyp/gyp/tools/Xcode/README create mode 100644 node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.pbfilespec create mode 100644 node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec create mode 100644 node_modules/node-gyp/gyp/tools/emacs/README create mode 100644 node_modules/node-gyp/gyp/tools/emacs/gyp-tests.el create mode 100644 node_modules/node-gyp/gyp/tools/emacs/gyp.el create mode 100755 node_modules/node-gyp/gyp/tools/emacs/run-unit-tests.sh create mode 100644 node_modules/node-gyp/gyp/tools/emacs/testdata/media.gyp create mode 100644 node_modules/node-gyp/gyp/tools/emacs/testdata/media.gyp.fontified create mode 100755 node_modules/node-gyp/gyp/tools/graphviz.py create mode 100755 node_modules/node-gyp/gyp/tools/pretty_gyp.py create mode 100755 node_modules/node-gyp/gyp/tools/pretty_sln.py create mode 100755 node_modules/node-gyp/gyp/tools/pretty_vcproj.py create mode 120000 node_modules/node-gyp/node_modules/.bin/mkdirp create mode 120000 node_modules/node-gyp/node_modules/.bin/nopt create mode 120000 node_modules/node-gyp/node_modules/.bin/rimraf create mode 120000 node_modules/node-gyp/node_modules/.bin/semver create mode 120000 node_modules/node-gyp/node_modules/.bin/which create mode 100644 node_modules/node-gyp/package.json create mode 100644 node_modules/node-gyp/src/win_delay_load_hook.cc create mode 100755 node_modules/node-gyp/test/docker.sh create mode 100644 node_modules/node-gyp/test/fixtures/ca-bundle.crt create mode 100644 node_modules/node-gyp/test/fixtures/ca.crt create mode 100644 node_modules/node-gyp/test/fixtures/server.crt create mode 100644 node_modules/node-gyp/test/fixtures/server.key create mode 100644 node_modules/node-gyp/test/fixtures/test-charmap.py create mode 100644 node_modules/node-gyp/test/process-exec-sync.js create mode 100644 node_modules/node-gyp/test/simple-proxy.js create mode 100644 node_modules/node-gyp/test/test-addon.js create mode 100644 node_modules/node-gyp/test/test-configure-python.js create mode 100644 node_modules/node-gyp/test/test-download.js create mode 100644 node_modules/node-gyp/test/test-find-accessible-sync.js create mode 100644 node_modules/node-gyp/test/test-find-node-directory.js create mode 100644 node_modules/node-gyp/test/test-find-python.js create mode 100644 node_modules/node-gyp/test/test-install.js create mode 100644 node_modules/node-gyp/test/test-options.js create mode 100644 node_modules/node-gyp/test/test-process-release.js create mode 100644 node_modules/node-gyp/tools/gyp/pylib/gyp/generator/compile_commands_json.py create mode 100644 node_modules/node-sass/CHANGELOG.md create mode 100644 node_modules/node-sass/LICENSE create mode 100644 node_modules/node-sass/README.md create mode 100644 node_modules/node-sass/binding.gyp create mode 120000 node_modules/node-sass/node_modules/.bin/in-install create mode 120000 node_modules/node-sass/node_modules/.bin/in-publish create mode 120000 node_modules/node-sass/node_modules/.bin/mkdirp create mode 120000 node_modules/node-sass/node_modules/.bin/node-gyp create mode 120000 node_modules/node-sass/node_modules/.bin/not-in-install create mode 120000 node_modules/node-sass/node_modules/.bin/not-in-publish create mode 120000 node_modules/node-sass/node_modules/.bin/sassgraph create mode 100644 node_modules/node-sass/node_modules/ansi-styles/index.js create mode 100644 node_modules/node-sass/node_modules/ansi-styles/license create mode 100644 node_modules/node-sass/node_modules/ansi-styles/package.json create mode 100644 node_modules/node-sass/node_modules/ansi-styles/readme.md create mode 100644 node_modules/node-sass/node_modules/chalk/index.js create mode 100644 node_modules/node-sass/node_modules/chalk/license create mode 100644 node_modules/node-sass/node_modules/chalk/package.json create mode 100644 node_modules/node-sass/node_modules/chalk/readme.md create mode 100644 node_modules/node-sass/node_modules/supports-color/index.js create mode 100644 node_modules/node-sass/node_modules/supports-color/license create mode 100644 node_modules/node-sass/node_modules/supports-color/package.json create mode 100644 node_modules/node-sass/node_modules/supports-color/readme.md create mode 100644 node_modules/node-sass/package.json create mode 100644 node_modules/node-sass/scripts/build.js create mode 100644 node_modules/node-sass/scripts/coverage.js create mode 100644 node_modules/node-sass/scripts/install.js create mode 100644 node_modules/node-sass/scripts/prepublish.js create mode 100644 node_modules/node-sass/scripts/util/downloadoptions.js create mode 100644 node_modules/node-sass/scripts/util/proxy.js create mode 100644 node_modules/node-sass/scripts/util/useragent.js create mode 100644 node_modules/node-sass/src/binding.cpp create mode 100644 node_modules/node-sass/src/callback_bridge.h create mode 100644 node_modules/node-sass/src/create_string.cpp create mode 100644 node_modules/node-sass/src/create_string.h create mode 100644 node_modules/node-sass/src/custom_function_bridge.cpp create mode 100644 node_modules/node-sass/src/custom_function_bridge.h create mode 100644 node_modules/node-sass/src/custom_importer_bridge.cpp create mode 100644 node_modules/node-sass/src/custom_importer_bridge.h create mode 100644 node_modules/node-sass/src/libsass.gyp create mode 100644 node_modules/node-sass/src/libsass/.editorconfig create mode 100644 node_modules/node-sass/src/libsass/.gitattributes create mode 100644 node_modules/node-sass/src/libsass/.github/CONTRIBUTING.md create mode 100644 node_modules/node-sass/src/libsass/.github/ISSUE_TEMPLATE.md create mode 100644 node_modules/node-sass/src/libsass/.gitignore create mode 100644 node_modules/node-sass/src/libsass/.travis.yml create mode 100644 node_modules/node-sass/src/libsass/COPYING create mode 100644 node_modules/node-sass/src/libsass/GNUmakefile.am create mode 100644 node_modules/node-sass/src/libsass/INSTALL create mode 100644 node_modules/node-sass/src/libsass/LICENSE create mode 100644 node_modules/node-sass/src/libsass/Makefile create mode 100644 node_modules/node-sass/src/libsass/Makefile.conf create mode 100644 node_modules/node-sass/src/libsass/Readme.md create mode 100644 node_modules/node-sass/src/libsass/SECURITY.md create mode 100644 node_modules/node-sass/src/libsass/appveyor.yml create mode 100644 node_modules/node-sass/src/libsass/configure.ac create mode 100644 node_modules/node-sass/src/libsass/contrib/libsass.spec create mode 100644 node_modules/node-sass/src/libsass/contrib/plugin.cpp create mode 100644 node_modules/node-sass/src/libsass/docs/README.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-context-example.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-context-internal.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-context.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-doc.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-function-example.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-function-internal.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-function.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-importer-example.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-importer-internal.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-importer.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-value-example.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-value-internal.md create mode 100644 node_modules/node-sass/src/libsass/docs/api-value.md create mode 100644 node_modules/node-sass/src/libsass/docs/build-on-darwin.md create mode 100644 node_modules/node-sass/src/libsass/docs/build-on-gentoo.md create mode 100644 node_modules/node-sass/src/libsass/docs/build-on-windows.md create mode 100644 node_modules/node-sass/src/libsass/docs/build-shared-library.md create mode 100644 node_modules/node-sass/src/libsass/docs/build-with-autotools.md create mode 100644 node_modules/node-sass/src/libsass/docs/build-with-makefiles.md create mode 100644 node_modules/node-sass/src/libsass/docs/build-with-mingw.md create mode 100644 node_modules/node-sass/src/libsass/docs/build-with-visual-studio.md create mode 100644 node_modules/node-sass/src/libsass/docs/build.md create mode 100644 node_modules/node-sass/src/libsass/docs/compatibility-plan.md create mode 100644 node_modules/node-sass/src/libsass/docs/contributing.md create mode 100644 node_modules/node-sass/src/libsass/docs/custom-functions-internal.md create mode 100644 node_modules/node-sass/src/libsass/docs/dev-ast-memory.md create mode 100644 node_modules/node-sass/src/libsass/docs/implementations.md create mode 100644 node_modules/node-sass/src/libsass/docs/plugins.md create mode 100644 node_modules/node-sass/src/libsass/docs/setup-environment.md create mode 100644 node_modules/node-sass/src/libsass/docs/source-map-internals.md create mode 100644 node_modules/node-sass/src/libsass/docs/trace.md create mode 100644 node_modules/node-sass/src/libsass/docs/triage.md create mode 100644 node_modules/node-sass/src/libsass/docs/unicode.md create mode 100644 node_modules/node-sass/src/libsass/extconf.rb create mode 100644 node_modules/node-sass/src/libsass/include/sass.h create mode 100644 node_modules/node-sass/src/libsass/include/sass/base.h create mode 100644 node_modules/node-sass/src/libsass/include/sass/context.h create mode 100644 node_modules/node-sass/src/libsass/include/sass/functions.h create mode 100644 node_modules/node-sass/src/libsass/include/sass/values.h create mode 100644 node_modules/node-sass/src/libsass/include/sass/version.h create mode 100644 node_modules/node-sass/src/libsass/include/sass/version.h.in create mode 100644 node_modules/node-sass/src/libsass/include/sass2scss.h create mode 100644 node_modules/node-sass/src/libsass/m4/.gitkeep create mode 100644 node_modules/node-sass/src/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 create mode 100644 node_modules/node-sass/src/libsass/res/resource.rc create mode 100755 node_modules/node-sass/src/libsass/script/bootstrap create mode 100755 node_modules/node-sass/src/libsass/script/branding create mode 100755 node_modules/node-sass/src/libsass/script/ci-build-libsass create mode 100755 node_modules/node-sass/src/libsass/script/ci-build-plugin create mode 100755 node_modules/node-sass/src/libsass/script/ci-install-compiler create mode 100755 node_modules/node-sass/src/libsass/script/ci-install-deps create mode 100755 node_modules/node-sass/src/libsass/script/ci-report-coverage create mode 100755 node_modules/node-sass/src/libsass/script/spec create mode 100755 node_modules/node-sass/src/libsass/script/tap-driver create mode 100755 node_modules/node-sass/src/libsass/script/tap-runner create mode 100755 node_modules/node-sass/src/libsass/script/test-leaks.pl create mode 100644 node_modules/node-sass/src/libsass/src/GNUmakefile.am create mode 100644 node_modules/node-sass/src/libsass/src/ast.cpp create mode 100644 node_modules/node-sass/src/libsass/src/ast.hpp create mode 100644 node_modules/node-sass/src/libsass/src/ast_def_macros.hpp create mode 100644 node_modules/node-sass/src/libsass/src/ast_fwd_decl.cpp create mode 100644 node_modules/node-sass/src/libsass/src/ast_fwd_decl.hpp create mode 100644 node_modules/node-sass/src/libsass/src/b64/cencode.h create mode 100644 node_modules/node-sass/src/libsass/src/b64/encode.h create mode 100644 node_modules/node-sass/src/libsass/src/backtrace.cpp create mode 100644 node_modules/node-sass/src/libsass/src/backtrace.hpp create mode 100644 node_modules/node-sass/src/libsass/src/base64vlq.cpp create mode 100644 node_modules/node-sass/src/libsass/src/base64vlq.hpp create mode 100644 node_modules/node-sass/src/libsass/src/bind.cpp create mode 100644 node_modules/node-sass/src/libsass/src/bind.hpp create mode 100644 node_modules/node-sass/src/libsass/src/c99func.c create mode 100644 node_modules/node-sass/src/libsass/src/cencode.c create mode 100644 node_modules/node-sass/src/libsass/src/check_nesting.cpp create mode 100644 node_modules/node-sass/src/libsass/src/check_nesting.hpp create mode 100644 node_modules/node-sass/src/libsass/src/color_maps.cpp create mode 100644 node_modules/node-sass/src/libsass/src/color_maps.hpp create mode 100644 node_modules/node-sass/src/libsass/src/constants.cpp create mode 100644 node_modules/node-sass/src/libsass/src/constants.hpp create mode 100644 node_modules/node-sass/src/libsass/src/context.cpp create mode 100644 node_modules/node-sass/src/libsass/src/context.hpp create mode 100644 node_modules/node-sass/src/libsass/src/cssize.cpp create mode 100644 node_modules/node-sass/src/libsass/src/cssize.hpp create mode 100644 node_modules/node-sass/src/libsass/src/debug.hpp create mode 100644 node_modules/node-sass/src/libsass/src/debugger.hpp create mode 100644 node_modules/node-sass/src/libsass/src/emitter.cpp create mode 100644 node_modules/node-sass/src/libsass/src/emitter.hpp create mode 100644 node_modules/node-sass/src/libsass/src/environment.cpp create mode 100644 node_modules/node-sass/src/libsass/src/environment.hpp create mode 100644 node_modules/node-sass/src/libsass/src/error_handling.cpp create mode 100644 node_modules/node-sass/src/libsass/src/error_handling.hpp create mode 100644 node_modules/node-sass/src/libsass/src/eval.cpp create mode 100644 node_modules/node-sass/src/libsass/src/eval.hpp create mode 100644 node_modules/node-sass/src/libsass/src/expand.cpp create mode 100644 node_modules/node-sass/src/libsass/src/expand.hpp create mode 100644 node_modules/node-sass/src/libsass/src/extend.cpp create mode 100644 node_modules/node-sass/src/libsass/src/extend.hpp create mode 100644 node_modules/node-sass/src/libsass/src/file.cpp create mode 100644 node_modules/node-sass/src/libsass/src/file.hpp create mode 100644 node_modules/node-sass/src/libsass/src/functions.cpp create mode 100644 node_modules/node-sass/src/libsass/src/functions.hpp create mode 100644 node_modules/node-sass/src/libsass/src/inspect.cpp create mode 100644 node_modules/node-sass/src/libsass/src/inspect.hpp create mode 100644 node_modules/node-sass/src/libsass/src/json.cpp create mode 100644 node_modules/node-sass/src/libsass/src/json.hpp create mode 100644 node_modules/node-sass/src/libsass/src/kwd_arg_macros.hpp create mode 100644 node_modules/node-sass/src/libsass/src/lexer.cpp create mode 100644 node_modules/node-sass/src/libsass/src/lexer.hpp create mode 100644 node_modules/node-sass/src/libsass/src/listize.cpp create mode 100644 node_modules/node-sass/src/libsass/src/listize.hpp create mode 100644 node_modules/node-sass/src/libsass/src/mapping.hpp create mode 100644 node_modules/node-sass/src/libsass/src/memory/SharedPtr.cpp create mode 100644 node_modules/node-sass/src/libsass/src/memory/SharedPtr.hpp create mode 100644 node_modules/node-sass/src/libsass/src/node.cpp create mode 100644 node_modules/node-sass/src/libsass/src/node.hpp create mode 100644 node_modules/node-sass/src/libsass/src/operation.hpp create mode 100644 node_modules/node-sass/src/libsass/src/operators.cpp create mode 100644 node_modules/node-sass/src/libsass/src/operators.hpp create mode 100644 node_modules/node-sass/src/libsass/src/output.cpp create mode 100644 node_modules/node-sass/src/libsass/src/output.hpp create mode 100644 node_modules/node-sass/src/libsass/src/parser.cpp create mode 100644 node_modules/node-sass/src/libsass/src/parser.hpp create mode 100644 node_modules/node-sass/src/libsass/src/paths.hpp create mode 100644 node_modules/node-sass/src/libsass/src/plugins.cpp create mode 100644 node_modules/node-sass/src/libsass/src/plugins.hpp create mode 100644 node_modules/node-sass/src/libsass/src/position.cpp create mode 100644 node_modules/node-sass/src/libsass/src/position.hpp create mode 100644 node_modules/node-sass/src/libsass/src/prelexer.cpp create mode 100644 node_modules/node-sass/src/libsass/src/prelexer.hpp create mode 100644 node_modules/node-sass/src/libsass/src/remove_placeholders.cpp create mode 100644 node_modules/node-sass/src/libsass/src/remove_placeholders.hpp create mode 100644 node_modules/node-sass/src/libsass/src/sass.cpp create mode 100644 node_modules/node-sass/src/libsass/src/sass.hpp create mode 100644 node_modules/node-sass/src/libsass/src/sass2scss.cpp create mode 100644 node_modules/node-sass/src/libsass/src/sass_context.cpp create mode 100644 node_modules/node-sass/src/libsass/src/sass_context.hpp create mode 100644 node_modules/node-sass/src/libsass/src/sass_functions.cpp create mode 100644 node_modules/node-sass/src/libsass/src/sass_functions.hpp create mode 100644 node_modules/node-sass/src/libsass/src/sass_util.cpp create mode 100644 node_modules/node-sass/src/libsass/src/sass_util.hpp create mode 100644 node_modules/node-sass/src/libsass/src/sass_values.cpp create mode 100644 node_modules/node-sass/src/libsass/src/sass_values.hpp create mode 100644 node_modules/node-sass/src/libsass/src/source_map.cpp create mode 100644 node_modules/node-sass/src/libsass/src/source_map.hpp create mode 100644 node_modules/node-sass/src/libsass/src/subset_map.cpp create mode 100644 node_modules/node-sass/src/libsass/src/subset_map.hpp create mode 100644 node_modules/node-sass/src/libsass/src/support/libsass.pc.in create mode 100644 node_modules/node-sass/src/libsass/src/to_c.cpp create mode 100644 node_modules/node-sass/src/libsass/src/to_c.hpp create mode 100644 node_modules/node-sass/src/libsass/src/to_value.cpp create mode 100644 node_modules/node-sass/src/libsass/src/to_value.hpp create mode 100644 node_modules/node-sass/src/libsass/src/units.cpp create mode 100644 node_modules/node-sass/src/libsass/src/units.hpp create mode 100644 node_modules/node-sass/src/libsass/src/utf8.h create mode 100644 node_modules/node-sass/src/libsass/src/utf8/checked.h create mode 100644 node_modules/node-sass/src/libsass/src/utf8/core.h create mode 100644 node_modules/node-sass/src/libsass/src/utf8/unchecked.h create mode 100644 node_modules/node-sass/src/libsass/src/utf8_string.cpp create mode 100644 node_modules/node-sass/src/libsass/src/utf8_string.hpp create mode 100644 node_modules/node-sass/src/libsass/src/util.cpp create mode 100644 node_modules/node-sass/src/libsass/src/util.hpp create mode 100644 node_modules/node-sass/src/libsass/src/values.cpp create mode 100644 node_modules/node-sass/src/libsass/src/values.hpp create mode 100644 node_modules/node-sass/src/libsass/test/test_node.cpp create mode 100644 node_modules/node-sass/src/libsass/test/test_paths.cpp create mode 100644 node_modules/node-sass/src/libsass/test/test_selector_difference.cpp create mode 100644 node_modules/node-sass/src/libsass/test/test_specificity.cpp create mode 100644 node_modules/node-sass/src/libsass/test/test_subset_map.cpp create mode 100644 node_modules/node-sass/src/libsass/test/test_superselector.cpp create mode 100644 node_modules/node-sass/src/libsass/test/test_unification.cpp create mode 100755 node_modules/node-sass/src/libsass/version.sh create mode 100644 node_modules/node-sass/src/libsass/win/libsass.sln create mode 100644 node_modules/node-sass/src/libsass/win/libsass.sln.DotSettings create mode 100644 node_modules/node-sass/src/libsass/win/libsass.targets create mode 100644 node_modules/node-sass/src/libsass/win/libsass.vcxproj create mode 100644 node_modules/node-sass/src/libsass/win/libsass.vcxproj.filters create mode 100644 node_modules/node-sass/src/sass_context_wrapper.cpp create mode 100644 node_modules/node-sass/src/sass_context_wrapper.h create mode 100644 node_modules/node-sass/src/sass_types/boolean.cpp create mode 100644 node_modules/node-sass/src/sass_types/boolean.h create mode 100644 node_modules/node-sass/src/sass_types/color.cpp create mode 100644 node_modules/node-sass/src/sass_types/color.h create mode 100644 node_modules/node-sass/src/sass_types/error.cpp create mode 100644 node_modules/node-sass/src/sass_types/error.h create mode 100644 node_modules/node-sass/src/sass_types/factory.cpp create mode 100644 node_modules/node-sass/src/sass_types/factory.h create mode 100644 node_modules/node-sass/src/sass_types/list.cpp create mode 100644 node_modules/node-sass/src/sass_types/list.h create mode 100644 node_modules/node-sass/src/sass_types/map.cpp create mode 100644 node_modules/node-sass/src/sass_types/map.h create mode 100644 node_modules/node-sass/src/sass_types/null.cpp create mode 100644 node_modules/node-sass/src/sass_types/null.h create mode 100644 node_modules/node-sass/src/sass_types/number.cpp create mode 100644 node_modules/node-sass/src/sass_types/number.h create mode 100644 node_modules/node-sass/src/sass_types/sass_value_wrapper.h create mode 100644 node_modules/node-sass/src/sass_types/string.cpp create mode 100644 node_modules/node-sass/src/sass_types/string.h create mode 100644 node_modules/node-sass/src/sass_types/value.h create mode 100644 node_modules/node-sass/test/.eslintrc create mode 100644 node_modules/node-sass/test/api.js create mode 100644 node_modules/node-sass/test/binding.js create mode 100644 node_modules/node-sass/test/cli.js create mode 100644 node_modules/node-sass/test/downloadoptions.js create mode 100644 node_modules/node-sass/test/errors.js create mode 100644 node_modules/node-sass/test/fixtures/compressed/expected.css create mode 100644 node_modules/node-sass/test/fixtures/compressed/index.scss create mode 100644 node_modules/node-sass/test/fixtures/custom-functions/setter-expected.css create mode 100644 node_modules/node-sass/test/fixtures/custom-functions/setter.scss create mode 100644 node_modules/node-sass/test/fixtures/custom-functions/string-conversion-expected.css create mode 100644 node_modules/node-sass/test/fixtures/custom-functions/string-conversion.scss create mode 100644 node_modules/node-sass/test/fixtures/cwd-include-path/expected.css create mode 100644 node_modules/node-sass/test/fixtures/cwd-include-path/outside.scss create mode 100644 node_modules/node-sass/test/fixtures/cwd-include-path/root/index.scss create mode 100644 node_modules/node-sass/test/fixtures/depth-first/_common.scss create mode 100644 node_modules/node-sass/test/fixtures/depth-first/_struct.scss create mode 100644 node_modules/node-sass/test/fixtures/depth-first/_vars.scss create mode 100644 node_modules/node-sass/test/fixtures/depth-first/a.scss create mode 100644 node_modules/node-sass/test/fixtures/depth-first/a1.scss create mode 100644 node_modules/node-sass/test/fixtures/depth-first/b.scss create mode 100644 node_modules/node-sass/test/fixtures/depth-first/b1.scss create mode 100644 node_modules/node-sass/test/fixtures/depth-first/expected.css create mode 100644 node_modules/node-sass/test/fixtures/depth-first/index.scss create mode 100644 node_modules/node-sass/test/fixtures/extras/my_custom_arrays_of_importers.js create mode 100644 node_modules/node-sass/test/fixtures/extras/my_custom_functions_setter.js create mode 100644 node_modules/node-sass/test/fixtures/extras/my_custom_functions_string_conversion.js create mode 100644 node_modules/node-sass/test/fixtures/extras/my_custom_importer_data.js create mode 100644 node_modules/node-sass/test/fixtures/extras/my_custom_importer_data_cb.js create mode 100644 node_modules/node-sass/test/fixtures/extras/my_custom_importer_error.js create mode 100644 node_modules/node-sass/test/fixtures/extras/my_custom_importer_file.js create mode 100644 node_modules/node-sass/test/fixtures/extras/my_custom_importer_file_and_data.js create mode 100644 node_modules/node-sass/test/fixtures/extras/my_custom_importer_file_and_data_cb.js create mode 100644 node_modules/node-sass/test/fixtures/extras/my_custom_importer_file_cb.js create mode 100644 node_modules/node-sass/test/fixtures/follow/foo/bar/index.scss create mode 100644 node_modules/node-sass/test/fixtures/include-files/bar.scss create mode 100644 node_modules/node-sass/test/fixtures/include-files/chained-imports-with-custom-importer.scss create mode 100644 node_modules/node-sass/test/fixtures/include-files/expected-importer.css create mode 100644 node_modules/node-sass/test/fixtures/include-files/file-not-processed-by-loader.scss create mode 100644 node_modules/node-sass/test/fixtures/include-files/file-processed-by-loader.scss create mode 100644 node_modules/node-sass/test/fixtures/include-files/foo.scss create mode 100644 node_modules/node-sass/test/fixtures/include-files/index.scss create mode 100644 node_modules/node-sass/test/fixtures/include-path/expected.css create mode 100644 node_modules/node-sass/test/fixtures/include-path/functions/colorBlue.scss create mode 100644 node_modules/node-sass/test/fixtures/include-path/index.scss create mode 100644 node_modules/node-sass/test/fixtures/indent/expected.css create mode 100644 node_modules/node-sass/test/fixtures/indent/index.sass create mode 100644 node_modules/node-sass/test/fixtures/input-directory/sass/_skipped.scss create mode 100644 node_modules/node-sass/test/fixtures/input-directory/sass/nested/three.scss create mode 100644 node_modules/node-sass/test/fixtures/input-directory/sass/one.scss create mode 100644 node_modules/node-sass/test/fixtures/input-directory/sass/two.scss create mode 100644 node_modules/node-sass/test/fixtures/invalid/index.scss create mode 100644 node_modules/node-sass/test/fixtures/output-directory/index.scss create mode 100644 node_modules/node-sass/test/fixtures/precision/expected.css create mode 100644 node_modules/node-sass/test/fixtures/precision/index.scss create mode 100644 node_modules/node-sass/test/fixtures/sass-path/expected-orange.css create mode 100644 node_modules/node-sass/test/fixtures/sass-path/expected-red.css create mode 100644 node_modules/node-sass/test/fixtures/sass-path/index.scss create mode 100644 node_modules/node-sass/test/fixtures/sass-path/orange/colors.scss create mode 100644 node_modules/node-sass/test/fixtures/sass-path/red/colors.scss create mode 100644 node_modules/node-sass/test/fixtures/simple/expected.css create mode 100644 node_modules/node-sass/test/fixtures/simple/index.scss create mode 100644 node_modules/node-sass/test/fixtures/source-comments/expected.css create mode 100644 node_modules/node-sass/test/fixtures/source-comments/index.scss create mode 100644 node_modules/node-sass/test/fixtures/source-map-embed/expected.css create mode 100644 node_modules/node-sass/test/fixtures/source-map-embed/index.scss create mode 100644 node_modules/node-sass/test/fixtures/source-map/expected.css create mode 100644 node_modules/node-sass/test/fixtures/source-map/expected.map create mode 100644 node_modules/node-sass/test/fixtures/source-map/index.scss create mode 100644 node_modules/node-sass/test/fixtures/watcher/main/one.scss create mode 100644 node_modules/node-sass/test/fixtures/watcher/main/partials/_one.scss create mode 100644 node_modules/node-sass/test/fixtures/watcher/main/partials/_three.scss create mode 100644 node_modules/node-sass/test/fixtures/watcher/main/partials/_two.scss create mode 100644 node_modules/node-sass/test/fixtures/watcher/main/three.scss create mode 100644 node_modules/node-sass/test/fixtures/watcher/main/two.scss create mode 100644 node_modules/node-sass/test/fixtures/watcher/sibling/partials/_three.scss create mode 100644 node_modules/node-sass/test/fixtures/watcher/sibling/three.scss create mode 100644 node_modules/node-sass/test/fixtures/watching-dir-01/index.scss create mode 100644 node_modules/node-sass/test/fixtures/watching-dir-02/foo.scss create mode 100644 node_modules/node-sass/test/fixtures/watching-dir-02/index.scss create mode 100644 node_modules/node-sass/test/fixtures/watching/bar.sass create mode 100644 node_modules/node-sass/test/fixtures/watching/index.sass create mode 100644 node_modules/node-sass/test/fixtures/watching/index.scss create mode 100644 node_modules/node-sass/test/fixtures/watching/white.scss create mode 100644 node_modules/node-sass/test/lowlevel.js create mode 100644 node_modules/node-sass/test/runtime.js create mode 100644 node_modules/node-sass/test/scripts/util/proxy.js create mode 100644 node_modules/node-sass/test/spec.js create mode 100644 node_modules/node-sass/test/types.js create mode 100644 node_modules/node-sass/test/useragent.js create mode 100644 node_modules/node-sass/test/watcher.js create mode 100644 node_modules/node-sass/vendor/linux-x64-72/binding.node create mode 100644 node_modules/nopt/.npmignore create mode 100644 node_modules/nopt/.travis.yml create mode 100644 node_modules/nopt/LICENSE create mode 100644 node_modules/nopt/README.md create mode 100755 node_modules/nopt/examples/my-program.js create mode 100644 node_modules/nopt/package.json create mode 100644 node_modules/nopt/test/basic.js create mode 100644 node_modules/normalize-package-data/AUTHORS create mode 100644 node_modules/normalize-package-data/LICENSE create mode 100644 node_modules/normalize-package-data/README.md create mode 120000 node_modules/normalize-package-data/node_modules/.bin/semver create mode 100644 node_modules/normalize-package-data/node_modules/semver/CHANGELOG.md create mode 100644 node_modules/normalize-package-data/node_modules/semver/LICENSE create mode 100644 node_modules/normalize-package-data/node_modules/semver/README.md create mode 100644 node_modules/normalize-package-data/node_modules/semver/package.json create mode 100644 node_modules/normalize-package-data/node_modules/semver/range.bnf create mode 100644 node_modules/normalize-package-data/node_modules/semver/semver.js create mode 100644 node_modules/normalize-package-data/package.json create mode 100644 node_modules/normalize-path/LICENSE create mode 100644 node_modules/normalize-path/README.md create mode 100644 node_modules/normalize-path/index.js create mode 100644 node_modules/normalize-path/package.json create mode 100644 node_modules/now-and-later/LICENSE create mode 100644 node_modules/now-and-later/README.md create mode 100644 node_modules/now-and-later/index.js create mode 100644 node_modules/now-and-later/package.json create mode 100644 node_modules/npmlog/CHANGELOG.md create mode 100644 node_modules/npmlog/LICENSE create mode 100644 node_modules/npmlog/README.md create mode 100644 node_modules/npmlog/log.js create mode 100644 node_modules/npmlog/package.json create mode 100644 node_modules/number-is-nan/index.js create mode 100644 node_modules/number-is-nan/license create mode 100644 node_modules/number-is-nan/package.json create mode 100644 node_modules/number-is-nan/readme.md create mode 100644 node_modules/oauth-sign/LICENSE create mode 100644 node_modules/oauth-sign/README.md create mode 100644 node_modules/oauth-sign/index.js create mode 100644 node_modules/oauth-sign/package.json create mode 100644 node_modules/object-assign/index.js create mode 100644 node_modules/object-assign/license create mode 100644 node_modules/object-assign/package.json create mode 100644 node_modules/object-assign/readme.md create mode 100644 node_modules/object-copy/LICENSE create mode 100644 node_modules/object-copy/index.js create mode 100644 node_modules/object-copy/package.json create mode 100644 node_modules/object-keys/.editorconfig create mode 100644 node_modules/object-keys/.eslintrc create mode 100644 node_modules/object-keys/.travis.yml create mode 100644 node_modules/object-keys/CHANGELOG.md create mode 100644 node_modules/object-keys/LICENSE create mode 100644 node_modules/object-keys/README.md create mode 100644 node_modules/object-keys/implementation.js create mode 100644 node_modules/object-keys/index.js create mode 100644 node_modules/object-keys/isArguments.js create mode 100644 node_modules/object-keys/package.json create mode 100644 node_modules/object-keys/test/index.js create mode 100644 node_modules/object-visit/LICENSE create mode 100644 node_modules/object-visit/README.md create mode 100644 node_modules/object-visit/index.js create mode 100644 node_modules/object-visit/package.json create mode 100644 node_modules/object.assign/.editorconfig create mode 100644 node_modules/object.assign/.eslintignore create mode 100644 node_modules/object.assign/.eslintrc create mode 100644 node_modules/object.assign/.github/FUNDING.yml create mode 100644 node_modules/object.assign/.github/workflows/rebase.yml create mode 100644 node_modules/object.assign/.github/workflows/require-allow-edits.yml create mode 100644 node_modules/object.assign/.nycrc create mode 100644 node_modules/object.assign/CHANGELOG.md create mode 100644 node_modules/object.assign/LICENSE create mode 100644 node_modules/object.assign/README.md create mode 100644 node_modules/object.assign/auto.js create mode 100644 node_modules/object.assign/dist/browser.js create mode 100644 node_modules/object.assign/hasSymbols.js create mode 100644 node_modules/object.assign/implementation.js create mode 100644 node_modules/object.assign/index.js create mode 100644 node_modules/object.assign/package.json create mode 100644 node_modules/object.assign/polyfill.js create mode 100644 node_modules/object.assign/shim.js create mode 100644 node_modules/object.assign/test/index.js create mode 100644 node_modules/object.assign/test/native.js create mode 100644 node_modules/object.assign/test/ses-compat.js create mode 100644 node_modules/object.assign/test/shimmed.js create mode 100644 node_modules/object.assign/test/tests.js create mode 100644 node_modules/object.defaults/LICENSE create mode 100644 node_modules/object.defaults/README.md create mode 100644 node_modules/object.defaults/immutable.js create mode 100644 node_modules/object.defaults/index.js create mode 100644 node_modules/object.defaults/mutable.js create mode 100644 node_modules/object.defaults/package.json create mode 100644 node_modules/object.map/LICENSE create mode 100644 node_modules/object.map/README.md create mode 100644 node_modules/object.map/index.js create mode 100644 node_modules/object.map/package.json create mode 100644 node_modules/object.pick/LICENSE create mode 100644 node_modules/object.pick/README.md create mode 100644 node_modules/object.pick/index.js create mode 100644 node_modules/object.pick/package.json create mode 100644 node_modules/object.reduce/LICENSE create mode 100644 node_modules/object.reduce/README.md create mode 100644 node_modules/object.reduce/index.js create mode 100644 node_modules/object.reduce/package.json create mode 100644 node_modules/once/LICENSE create mode 100644 node_modules/once/README.md create mode 100644 node_modules/once/once.js create mode 100644 node_modules/once/package.json create mode 100644 node_modules/ordered-read-streams/LICENSE create mode 100644 node_modules/ordered-read-streams/README.md create mode 100644 node_modules/ordered-read-streams/index.js create mode 100644 node_modules/ordered-read-streams/package.json create mode 100644 node_modules/os-homedir/index.js create mode 100644 node_modules/os-homedir/license create mode 100644 node_modules/os-homedir/package.json create mode 100644 node_modules/os-homedir/readme.md create mode 100644 node_modules/os-locale/index.js create mode 100644 node_modules/os-locale/license create mode 100644 node_modules/os-locale/package.json create mode 100644 node_modules/os-locale/readme.md create mode 100644 node_modules/os-tmpdir/index.js create mode 100644 node_modules/os-tmpdir/license create mode 100644 node_modules/os-tmpdir/package.json create mode 100644 node_modules/os-tmpdir/readme.md create mode 100644 node_modules/osenv/LICENSE create mode 100644 node_modules/osenv/README.md create mode 100644 node_modules/osenv/osenv.js create mode 100644 node_modules/osenv/package.json create mode 100644 node_modules/p-limit/index.d.ts create mode 100644 node_modules/p-limit/index.js create mode 100644 node_modules/p-limit/license create mode 100644 node_modules/p-limit/package.json create mode 100644 node_modules/p-limit/readme.md create mode 100644 node_modules/p-locate/index.js create mode 100644 node_modules/p-locate/license create mode 100644 node_modules/p-locate/package.json create mode 100644 node_modules/p-locate/readme.md create mode 100644 node_modules/p-try/index.d.ts create mode 100644 node_modules/p-try/index.js create mode 100644 node_modules/p-try/license create mode 100644 node_modules/p-try/package.json create mode 100644 node_modules/p-try/readme.md create mode 100644 node_modules/parse-filepath/LICENSE create mode 100644 node_modules/parse-filepath/README.md create mode 100644 node_modules/parse-filepath/index.js create mode 100644 node_modules/parse-filepath/package.json create mode 100644 node_modules/parse-json/index.js create mode 100644 node_modules/parse-json/license create mode 100644 node_modules/parse-json/package.json create mode 100644 node_modules/parse-json/readme.md create mode 100644 node_modules/parse-json/vendor/parse.js create mode 100644 node_modules/parse-json/vendor/unicode.js create mode 100644 node_modules/parse-node-version/LICENSE create mode 100644 node_modules/parse-node-version/README.md create mode 100644 node_modules/parse-node-version/index.js create mode 100644 node_modules/parse-node-version/package.json create mode 100644 node_modules/parse-passwd/LICENSE create mode 100644 node_modules/parse-passwd/README.md create mode 100644 node_modules/parse-passwd/index.js create mode 100644 node_modules/parse-passwd/package.json create mode 100644 node_modules/pascalcase/LICENSE create mode 100644 node_modules/pascalcase/README.md create mode 100644 node_modules/pascalcase/index.js create mode 100644 node_modules/pascalcase/package.json create mode 100644 node_modules/path-dirname/index.js create mode 100644 node_modules/path-dirname/license create mode 100644 node_modules/path-dirname/package.json create mode 100644 node_modules/path-dirname/readme.md create mode 100644 node_modules/path-exists/index.js create mode 100644 node_modules/path-exists/license create mode 100644 node_modules/path-exists/package.json create mode 100644 node_modules/path-exists/readme.md create mode 100644 node_modules/path-is-absolute/index.js create mode 100644 node_modules/path-is-absolute/license create mode 100644 node_modules/path-is-absolute/package.json create mode 100644 node_modules/path-is-absolute/readme.md create mode 100644 node_modules/path-parse/.travis.yml create mode 100644 node_modules/path-parse/LICENSE create mode 100644 node_modules/path-parse/README.md create mode 100644 node_modules/path-parse/index.js create mode 100644 node_modules/path-parse/package.json create mode 100644 node_modules/path-parse/test.js create mode 100644 node_modules/path-root-regex/LICENSE create mode 100644 node_modules/path-root-regex/README.md create mode 100644 node_modules/path-root-regex/index.js create mode 100644 node_modules/path-root-regex/package.json create mode 100644 node_modules/path-root/LICENSE create mode 100644 node_modules/path-root/README.md create mode 100644 node_modules/path-root/index.js create mode 100644 node_modules/path-root/package.json create mode 100644 node_modules/path-type/index.js create mode 100644 node_modules/path-type/license create mode 100644 node_modules/path-type/package.json create mode 100644 node_modules/path-type/readme.md create mode 100644 node_modules/performance-now/.npmignore create mode 100644 node_modules/performance-now/.tm_properties create mode 100644 node_modules/performance-now/.travis.yml create mode 100644 node_modules/performance-now/README.md create mode 100644 node_modules/performance-now/license.txt create mode 100644 node_modules/performance-now/package.json create mode 100644 node_modules/performance-now/src/index.d.ts create mode 100644 node_modules/performance-now/src/performance-now.coffee create mode 100644 node_modules/performance-now/test/mocha.opts create mode 100644 node_modules/performance-now/test/performance-now.coffee create mode 100644 node_modules/performance-now/test/scripts.coffee create mode 100755 node_modules/performance-now/test/scripts/delayed-call.coffee create mode 100755 node_modules/performance-now/test/scripts/delayed-require.coffee create mode 100755 node_modules/performance-now/test/scripts/difference.coffee create mode 100755 node_modules/performance-now/test/scripts/initial-value.coffee create mode 100644 node_modules/pify/index.js create mode 100644 node_modules/pify/license create mode 100644 node_modules/pify/package.json create mode 100644 node_modules/pify/readme.md create mode 100644 node_modules/pinkie-promise/index.js create mode 100644 node_modules/pinkie-promise/license create mode 100644 node_modules/pinkie-promise/package.json create mode 100644 node_modules/pinkie-promise/readme.md create mode 100644 node_modules/pinkie/index.js create mode 100644 node_modules/pinkie/license create mode 100644 node_modules/pinkie/package.json create mode 100644 node_modules/pinkie/readme.md create mode 100644 node_modules/plugin-error/LICENSE create mode 100644 node_modules/plugin-error/README.md create mode 100644 node_modules/plugin-error/index.d.ts create mode 100644 node_modules/plugin-error/index.js create mode 100644 node_modules/plugin-error/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/plugin-error/node_modules/extend-shallow/README.md create mode 100644 node_modules/plugin-error/node_modules/extend-shallow/index.js create mode 100644 node_modules/plugin-error/node_modules/extend-shallow/package.json create mode 100644 node_modules/plugin-error/node_modules/is-extendable/LICENSE create mode 100644 node_modules/plugin-error/node_modules/is-extendable/README.md create mode 100644 node_modules/plugin-error/node_modules/is-extendable/index.d.ts create mode 100644 node_modules/plugin-error/node_modules/is-extendable/index.js create mode 100644 node_modules/plugin-error/node_modules/is-extendable/package.json create mode 100644 node_modules/plugin-error/package.json create mode 100644 node_modules/posix-character-classes/LICENSE create mode 100644 node_modules/posix-character-classes/README.md create mode 100644 node_modules/posix-character-classes/index.js create mode 100644 node_modules/posix-character-classes/package.json create mode 100644 node_modules/pretty-hrtime/.jshintignore create mode 100644 node_modules/pretty-hrtime/.npmignore create mode 100644 node_modules/pretty-hrtime/LICENSE create mode 100644 node_modules/pretty-hrtime/README.md create mode 100644 node_modules/pretty-hrtime/index.js create mode 100644 node_modules/pretty-hrtime/package.json create mode 100644 node_modules/process-nextick-args/index.js create mode 100644 node_modules/process-nextick-args/license.md create mode 100644 node_modules/process-nextick-args/package.json create mode 100644 node_modules/process-nextick-args/readme.md create mode 100644 node_modules/pseudomap/LICENSE create mode 100644 node_modules/pseudomap/README.md create mode 100644 node_modules/pseudomap/map.js create mode 100644 node_modules/pseudomap/package.json create mode 100644 node_modules/pseudomap/pseudomap.js create mode 100644 node_modules/pseudomap/test/basic.js create mode 100644 node_modules/psl/LICENSE create mode 100644 node_modules/psl/README.md create mode 100644 node_modules/psl/browserstack-logo.svg create mode 100644 node_modules/psl/data/rules.json create mode 100644 node_modules/psl/dist/psl.js create mode 100644 node_modules/psl/dist/psl.min.js create mode 100644 node_modules/psl/index.js create mode 100644 node_modules/psl/package.json create mode 100644 node_modules/pump/.travis.yml create mode 100644 node_modules/pump/LICENSE create mode 100644 node_modules/pump/README.md create mode 100644 node_modules/pump/index.js create mode 100644 node_modules/pump/package.json create mode 100644 node_modules/pump/test-browser.js create mode 100644 node_modules/pump/test-node.js create mode 100644 node_modules/pumpify/.travis.yml create mode 100644 node_modules/pumpify/LICENSE create mode 100644 node_modules/pumpify/README.md create mode 100644 node_modules/pumpify/index.js create mode 100644 node_modules/pumpify/package.json create mode 100644 node_modules/pumpify/test.js create mode 100644 node_modules/punycode/LICENSE-MIT.txt create mode 100644 node_modules/punycode/README.md create mode 100644 node_modules/punycode/package.json create mode 100644 node_modules/punycode/punycode.es6.js create mode 100644 node_modules/punycode/punycode.js create mode 100644 node_modules/qs/.editorconfig create mode 100644 node_modules/qs/.eslintignore create mode 100644 node_modules/qs/.eslintrc create mode 100644 node_modules/qs/CHANGELOG.md create mode 100644 node_modules/qs/LICENSE create mode 100644 node_modules/qs/README.md create mode 100644 node_modules/qs/dist/qs.js create mode 100644 node_modules/qs/package.json create mode 100644 node_modules/qs/test/.eslintrc create mode 100644 node_modules/qs/test/index.js create mode 100644 node_modules/qs/test/parse.js create mode 100644 node_modules/qs/test/stringify.js create mode 100644 node_modules/qs/test/utils.js create mode 100644 node_modules/read-pkg-up/index.js create mode 100644 node_modules/read-pkg-up/license create mode 100644 node_modules/read-pkg-up/package.json create mode 100644 node_modules/read-pkg-up/readme.md create mode 100644 node_modules/read-pkg/index.js create mode 100644 node_modules/read-pkg/license create mode 100644 node_modules/read-pkg/package.json create mode 100644 node_modules/read-pkg/readme.md create mode 100644 node_modules/readable-stream/.travis.yml create mode 100644 node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/readable-stream/LICENSE create mode 100644 node_modules/readable-stream/README.md create mode 100644 node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/readable-stream/duplex.js create mode 100644 node_modules/readable-stream/node_modules/safe-buffer/LICENSE create mode 100644 node_modules/readable-stream/node_modules/safe-buffer/README.md create mode 100644 node_modules/readable-stream/node_modules/safe-buffer/index.d.ts create mode 100644 node_modules/readable-stream/node_modules/safe-buffer/index.js create mode 100644 node_modules/readable-stream/node_modules/safe-buffer/package.json create mode 100644 node_modules/readable-stream/package.json create mode 100644 node_modules/readable-stream/passthrough.js create mode 100644 node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/readable-stream/readable.js create mode 100644 node_modules/readable-stream/transform.js create mode 100644 node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/readable-stream/writable.js create mode 100644 node_modules/readdirp/LICENSE create mode 100644 node_modules/readdirp/README.md create mode 100644 node_modules/readdirp/package.json create mode 100644 node_modules/readdirp/readdirp.js create mode 100644 node_modules/readdirp/stream-api.js create mode 100644 node_modules/rechoir/.npmignore create mode 100644 node_modules/rechoir/.travis.yml create mode 100644 node_modules/rechoir/CHANGELOG create mode 100644 node_modules/rechoir/LICENSE create mode 100644 node_modules/rechoir/README.md create mode 100644 node_modules/rechoir/index.js create mode 100644 node_modules/rechoir/package.json create mode 100644 node_modules/redent/index.js create mode 100644 node_modules/redent/license create mode 120000 node_modules/redent/node_modules/.bin/strip-indent create mode 100644 node_modules/redent/package.json create mode 100644 node_modules/redent/readme.md create mode 100644 node_modules/regex-not/LICENSE create mode 100644 node_modules/regex-not/README.md create mode 100644 node_modules/regex-not/index.js create mode 100644 node_modules/regex-not/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/regex-not/node_modules/extend-shallow/README.md create mode 100644 node_modules/regex-not/node_modules/extend-shallow/index.js create mode 100644 node_modules/regex-not/node_modules/extend-shallow/package.json create mode 100644 node_modules/regex-not/node_modules/is-extendable/LICENSE create mode 100644 node_modules/regex-not/node_modules/is-extendable/README.md create mode 100644 node_modules/regex-not/node_modules/is-extendable/index.d.ts create mode 100644 node_modules/regex-not/node_modules/is-extendable/index.js create mode 100644 node_modules/regex-not/node_modules/is-extendable/package.json create mode 100644 node_modules/regex-not/package.json create mode 100644 node_modules/remove-bom-buffer/LICENSE create mode 100644 node_modules/remove-bom-buffer/README.md create mode 100644 node_modules/remove-bom-buffer/index.js create mode 100644 node_modules/remove-bom-buffer/package.json create mode 100644 node_modules/remove-bom-stream/LICENSE create mode 100644 node_modules/remove-bom-stream/README.md create mode 100644 node_modules/remove-bom-stream/index.js create mode 100644 node_modules/remove-bom-stream/node_modules/through2/LICENSE.md create mode 100644 node_modules/remove-bom-stream/node_modules/through2/README.md create mode 100644 node_modules/remove-bom-stream/node_modules/through2/package.json create mode 100644 node_modules/remove-bom-stream/node_modules/through2/through2.js create mode 100644 node_modules/remove-bom-stream/package.json create mode 100644 node_modules/remove-trailing-separator/history.md create mode 100644 node_modules/remove-trailing-separator/index.js create mode 100644 node_modules/remove-trailing-separator/license create mode 100644 node_modules/remove-trailing-separator/package.json create mode 100644 node_modules/remove-trailing-separator/readme.md create mode 100644 node_modules/repeat-element/LICENSE create mode 100644 node_modules/repeat-element/README.md create mode 100644 node_modules/repeat-element/index.js create mode 100644 node_modules/repeat-element/package.json create mode 100644 node_modules/repeat-string/LICENSE create mode 100644 node_modules/repeat-string/README.md create mode 100644 node_modules/repeat-string/index.js create mode 100644 node_modules/repeat-string/package.json create mode 100644 node_modules/repeating/index.js create mode 100644 node_modules/repeating/license create mode 100644 node_modules/repeating/package.json create mode 100644 node_modules/repeating/readme.md create mode 100644 node_modules/replace-ext/LICENSE create mode 100644 node_modules/replace-ext/README.md create mode 100644 node_modules/replace-ext/index.js create mode 100644 node_modules/replace-ext/package.json create mode 100644 node_modules/replace-homedir/LICENSE create mode 100644 node_modules/replace-homedir/README.md create mode 100644 node_modules/replace-homedir/index.js create mode 100644 node_modules/replace-homedir/package.json create mode 100644 node_modules/request/CHANGELOG.md create mode 100644 node_modules/request/LICENSE create mode 100644 node_modules/request/README.md create mode 100755 node_modules/request/index.js create mode 120000 node_modules/request/node_modules/.bin/uuid create mode 100644 node_modules/request/package.json create mode 100644 node_modules/request/request.js create mode 100644 node_modules/require-directory/.jshintrc create mode 100644 node_modules/require-directory/.npmignore create mode 100644 node_modules/require-directory/.travis.yml create mode 100644 node_modules/require-directory/LICENSE create mode 100644 node_modules/require-directory/README.markdown create mode 100644 node_modules/require-directory/index.js create mode 100644 node_modules/require-directory/package.json create mode 100644 node_modules/require-main-filename/.npmignore create mode 100644 node_modules/require-main-filename/.travis.yml create mode 100644 node_modules/require-main-filename/LICENSE.txt create mode 100644 node_modules/require-main-filename/README.md create mode 100644 node_modules/require-main-filename/index.js create mode 100644 node_modules/require-main-filename/package.json create mode 100644 node_modules/require-main-filename/test.js create mode 100644 node_modules/resolve-dir/LICENSE create mode 100644 node_modules/resolve-dir/README.md create mode 100644 node_modules/resolve-dir/index.js create mode 100644 node_modules/resolve-dir/package.json create mode 100644 node_modules/resolve-options/LICENSE create mode 100644 node_modules/resolve-options/README.md create mode 100644 node_modules/resolve-options/index.js create mode 100644 node_modules/resolve-options/package.json create mode 100644 node_modules/resolve-url/.jshintrc create mode 100644 node_modules/resolve-url/LICENSE create mode 100644 node_modules/resolve-url/bower.json create mode 100644 node_modules/resolve-url/changelog.md create mode 100644 node_modules/resolve-url/component.json create mode 100644 node_modules/resolve-url/package.json create mode 100644 node_modules/resolve-url/readme.md create mode 100644 node_modules/resolve-url/resolve-url.js create mode 100644 node_modules/resolve-url/test/resolve-url.js create mode 100644 node_modules/resolve/.editorconfig create mode 100644 node_modules/resolve/.eslintignore create mode 100644 node_modules/resolve/.eslintrc create mode 100644 node_modules/resolve/.github/workflows/node-4+.yml create mode 100644 node_modules/resolve/.github/workflows/node-iojs.yml create mode 100644 node_modules/resolve/.github/workflows/node-pretest.yml create mode 100644 node_modules/resolve/.github/workflows/node-zero.yml create mode 100644 node_modules/resolve/.github/workflows/rebase.yml create mode 100644 node_modules/resolve/.github/workflows/require-allow-edits.yml create mode 100644 node_modules/resolve/LICENSE create mode 100644 node_modules/resolve/appveyor.yml create mode 100644 node_modules/resolve/example/async.js create mode 100644 node_modules/resolve/example/sync.js create mode 100644 node_modules/resolve/index.js create mode 100644 node_modules/resolve/package.json create mode 100644 node_modules/resolve/readme.markdown create mode 100644 node_modules/resolve/test/.eslintrc create mode 100644 node_modules/resolve/test/core.js create mode 100644 node_modules/resolve/test/dotdot.js create mode 100644 node_modules/resolve/test/dotdot/abc/index.js create mode 100644 node_modules/resolve/test/dotdot/index.js create mode 100644 node_modules/resolve/test/faulty_basedir.js create mode 100644 node_modules/resolve/test/filter.js create mode 100644 node_modules/resolve/test/filter_sync.js create mode 100644 node_modules/resolve/test/mock.js create mode 100644 node_modules/resolve/test/mock_sync.js create mode 100644 node_modules/resolve/test/module_dir.js create mode 100644 node_modules/resolve/test/module_dir/xmodules/aaa/index.js create mode 100644 node_modules/resolve/test/module_dir/ymodules/aaa/index.js create mode 100644 node_modules/resolve/test/module_dir/zmodules/bbb/main.js create mode 100644 node_modules/resolve/test/module_dir/zmodules/bbb/package.json create mode 100644 node_modules/resolve/test/node-modules-paths.js create mode 100644 node_modules/resolve/test/node_path.js create mode 100644 node_modules/resolve/test/node_path/x/aaa/index.js create mode 100644 node_modules/resolve/test/node_path/x/ccc/index.js create mode 100644 node_modules/resolve/test/node_path/y/bbb/index.js create mode 100644 node_modules/resolve/test/node_path/y/ccc/index.js create mode 100644 node_modules/resolve/test/nonstring.js create mode 100644 node_modules/resolve/test/pathfilter.js create mode 100644 node_modules/resolve/test/pathfilter/deep_ref/main.js create mode 100644 node_modules/resolve/test/precedence.js create mode 100644 node_modules/resolve/test/precedence/aaa.js create mode 100644 node_modules/resolve/test/precedence/aaa/index.js create mode 100644 node_modules/resolve/test/precedence/aaa/main.js create mode 100644 node_modules/resolve/test/precedence/bbb.js create mode 100644 node_modules/resolve/test/precedence/bbb/main.js create mode 100644 node_modules/resolve/test/resolver.js create mode 100644 node_modules/resolve/test/resolver/baz/doom.js create mode 100644 node_modules/resolve/test/resolver/baz/package.json create mode 100644 node_modules/resolve/test/resolver/baz/quux.js create mode 100644 node_modules/resolve/test/resolver/browser_field/a.js create mode 100644 node_modules/resolve/test/resolver/browser_field/b.js create mode 100644 node_modules/resolve/test/resolver/browser_field/package.json create mode 100644 node_modules/resolve/test/resolver/cup.coffee create mode 100644 node_modules/resolve/test/resolver/dot_main/index.js create mode 100644 node_modules/resolve/test/resolver/dot_main/package.json create mode 100644 node_modules/resolve/test/resolver/dot_slash_main/index.js create mode 100644 node_modules/resolve/test/resolver/dot_slash_main/package.json create mode 100644 node_modules/resolve/test/resolver/foo.js create mode 100644 node_modules/resolve/test/resolver/incorrect_main/index.js create mode 100644 node_modules/resolve/test/resolver/incorrect_main/package.json create mode 100644 node_modules/resolve/test/resolver/invalid_main/package.json create mode 100644 node_modules/resolve/test/resolver/mug.coffee create mode 100644 node_modules/resolve/test/resolver/mug.js create mode 100644 node_modules/resolve/test/resolver/multirepo/lerna.json create mode 100644 node_modules/resolve/test/resolver/multirepo/package.json create mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js create mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json create mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js create mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json create mode 100644 node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js create mode 100644 node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json create mode 100644 node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js create mode 100644 node_modules/resolve/test/resolver/other_path/root.js create mode 100644 node_modules/resolve/test/resolver/quux/foo/index.js create mode 100644 node_modules/resolve/test/resolver/same_names/foo.js create mode 100644 node_modules/resolve/test/resolver/same_names/foo/index.js create mode 100644 node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js create mode 100644 node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep create mode 100644 node_modules/resolve/test/resolver/symlinked/package/bar.js create mode 100644 node_modules/resolve/test/resolver/symlinked/package/package.json create mode 100644 node_modules/resolve/test/resolver/without_basedir/main.js create mode 100644 node_modules/resolve/test/resolver_sync.js create mode 100644 node_modules/resolve/test/shadowed_core.js create mode 100644 node_modules/resolve/test/shadowed_core/node_modules/util/index.js create mode 100644 node_modules/resolve/test/subdirs.js create mode 100644 node_modules/resolve/test/symlinks.js create mode 100644 node_modules/ret/LICENSE create mode 100644 node_modules/ret/README.md create mode 100644 node_modules/ret/package.json create mode 100644 node_modules/rimraf/LICENSE create mode 100644 node_modules/rimraf/README.md create mode 100755 node_modules/rimraf/bin.js create mode 100644 node_modules/rimraf/package.json create mode 100644 node_modules/rimraf/rimraf.js create mode 100644 node_modules/safe-buffer/LICENSE create mode 100644 node_modules/safe-buffer/README.md create mode 100644 node_modules/safe-buffer/index.d.ts create mode 100644 node_modules/safe-buffer/index.js create mode 100644 node_modules/safe-buffer/package.json create mode 100644 node_modules/safe-regex/.travis.yml create mode 100644 node_modules/safe-regex/LICENSE create mode 100644 node_modules/safe-regex/example/safe.js create mode 100644 node_modules/safe-regex/index.js create mode 100644 node_modules/safe-regex/package.json create mode 100644 node_modules/safe-regex/readme.markdown create mode 100644 node_modules/safe-regex/test/regex.js create mode 100644 node_modules/safer-buffer/LICENSE create mode 100644 node_modules/safer-buffer/Porting-Buffer.md create mode 100644 node_modules/safer-buffer/Readme.md create mode 100644 node_modules/safer-buffer/dangerous.js create mode 100644 node_modules/safer-buffer/package.json create mode 100644 node_modules/safer-buffer/safer.js create mode 100644 node_modules/safer-buffer/tests.js create mode 100644 node_modules/sass-graph/CHANGELOG.md create mode 100644 node_modules/sass-graph/node_modules/ansi-regex/index.js create mode 100644 node_modules/sass-graph/node_modules/ansi-regex/license create mode 100644 node_modules/sass-graph/node_modules/ansi-regex/package.json create mode 100644 node_modules/sass-graph/node_modules/ansi-regex/readme.md create mode 100644 node_modules/sass-graph/node_modules/camelcase/index.d.ts create mode 100644 node_modules/sass-graph/node_modules/camelcase/index.js create mode 100644 node_modules/sass-graph/node_modules/camelcase/license create mode 100644 node_modules/sass-graph/node_modules/camelcase/package.json create mode 100644 node_modules/sass-graph/node_modules/camelcase/readme.md create mode 100644 node_modules/sass-graph/node_modules/cliui/CHANGELOG.md create mode 100644 node_modules/sass-graph/node_modules/cliui/LICENSE.txt create mode 100644 node_modules/sass-graph/node_modules/cliui/README.md create mode 100644 node_modules/sass-graph/node_modules/cliui/index.js create mode 100644 node_modules/sass-graph/node_modules/cliui/package.json create mode 100644 node_modules/sass-graph/node_modules/find-up/index.js create mode 100644 node_modules/sass-graph/node_modules/find-up/license create mode 100644 node_modules/sass-graph/node_modules/find-up/package.json create mode 100644 node_modules/sass-graph/node_modules/find-up/readme.md create mode 100644 node_modules/sass-graph/node_modules/get-caller-file/LICENSE.md create mode 100644 node_modules/sass-graph/node_modules/get-caller-file/README.md create mode 100644 node_modules/sass-graph/node_modules/get-caller-file/index.d.ts create mode 100644 node_modules/sass-graph/node_modules/get-caller-file/index.js create mode 100644 node_modules/sass-graph/node_modules/get-caller-file/index.js.map create mode 100644 node_modules/sass-graph/node_modules/get-caller-file/package.json create mode 100644 node_modules/sass-graph/node_modules/require-main-filename/CHANGELOG.md create mode 100644 node_modules/sass-graph/node_modules/require-main-filename/LICENSE.txt create mode 100644 node_modules/sass-graph/node_modules/require-main-filename/README.md create mode 100644 node_modules/sass-graph/node_modules/require-main-filename/index.js create mode 100644 node_modules/sass-graph/node_modules/require-main-filename/package.json create mode 100644 node_modules/sass-graph/node_modules/string-width/index.js create mode 100644 node_modules/sass-graph/node_modules/string-width/license create mode 100644 node_modules/sass-graph/node_modules/string-width/package.json create mode 100644 node_modules/sass-graph/node_modules/string-width/readme.md create mode 100644 node_modules/sass-graph/node_modules/strip-ansi/index.d.ts create mode 100644 node_modules/sass-graph/node_modules/strip-ansi/index.js create mode 100644 node_modules/sass-graph/node_modules/strip-ansi/license create mode 100644 node_modules/sass-graph/node_modules/strip-ansi/package.json create mode 100644 node_modules/sass-graph/node_modules/strip-ansi/readme.md create mode 100644 node_modules/sass-graph/node_modules/which-module/CHANGELOG.md create mode 100644 node_modules/sass-graph/node_modules/which-module/LICENSE create mode 100644 node_modules/sass-graph/node_modules/which-module/README.md create mode 100644 node_modules/sass-graph/node_modules/which-module/index.js create mode 100644 node_modules/sass-graph/node_modules/which-module/package.json create mode 100755 node_modules/sass-graph/node_modules/wrap-ansi/index.js create mode 100644 node_modules/sass-graph/node_modules/wrap-ansi/license create mode 100644 node_modules/sass-graph/node_modules/wrap-ansi/package.json create mode 100644 node_modules/sass-graph/node_modules/wrap-ansi/readme.md create mode 100644 node_modules/sass-graph/node_modules/y18n/CHANGELOG.md create mode 100644 node_modules/sass-graph/node_modules/y18n/LICENSE create mode 100644 node_modules/sass-graph/node_modules/y18n/README.md create mode 100644 node_modules/sass-graph/node_modules/y18n/index.js create mode 100644 node_modules/sass-graph/node_modules/y18n/package.json create mode 100644 node_modules/sass-graph/node_modules/yargs-parser/CHANGELOG.md create mode 100644 node_modules/sass-graph/node_modules/yargs-parser/LICENSE.txt create mode 100644 node_modules/sass-graph/node_modules/yargs-parser/README.md create mode 100644 node_modules/sass-graph/node_modules/yargs-parser/index.js create mode 100644 node_modules/sass-graph/node_modules/yargs-parser/package.json create mode 100644 node_modules/sass-graph/node_modules/yargs/CHANGELOG.md create mode 100644 node_modules/sass-graph/node_modules/yargs/LICENSE create mode 100644 node_modules/sass-graph/node_modules/yargs/README.md create mode 100644 node_modules/sass-graph/node_modules/yargs/index.js create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/be.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/de.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/en.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/es.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/fr.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/hi.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/hu.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/id.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/it.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/ja.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/ko.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/nb.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/nl.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/nn.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/pirate.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/pl.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/pt.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/pt_BR.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/ru.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/th.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/tr.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/zh_CN.json create mode 100644 node_modules/sass-graph/node_modules/yargs/locales/zh_TW.json create mode 100644 node_modules/sass-graph/node_modules/yargs/package.json create mode 100644 node_modules/sass-graph/node_modules/yargs/yargs.js create mode 100644 node_modules/sass-graph/package.json create mode 100644 node_modules/sass-graph/parse-imports.js create mode 100644 node_modules/sass-graph/readme.md create mode 100644 node_modules/sass-graph/sass-graph.js create mode 100644 node_modules/scss-tokenizer/LICENSE create mode 100644 node_modules/scss-tokenizer/README.md create mode 100644 node_modules/scss-tokenizer/index.js create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/README.md create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/build/assert-shim.js create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/build/mini-require.js create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/build/prefix-source-map.jsm create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/build/prefix-utils.jsm create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/build/suffix-browser.js create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/build/suffix-source-map.jsm create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/build/suffix-utils.jsm create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/build/test-prefix.js create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/build/test-suffix.js create mode 100644 node_modules/scss-tokenizer/node_modules/source-map/package.json create mode 100644 node_modules/scss-tokenizer/package.json create mode 100644 node_modules/semver-greatest-satisfied-range/LICENSE create mode 100644 node_modules/semver-greatest-satisfied-range/README.md create mode 100644 node_modules/semver-greatest-satisfied-range/index.js create mode 100644 node_modules/semver-greatest-satisfied-range/package.json create mode 100644 node_modules/semver/LICENSE create mode 100644 node_modules/semver/README.md create mode 100644 node_modules/semver/package.json create mode 100644 node_modules/semver/range.bnf create mode 100644 node_modules/semver/semver.js create mode 100644 node_modules/set-blocking/CHANGELOG.md create mode 100644 node_modules/set-blocking/LICENSE.txt create mode 100644 node_modules/set-blocking/README.md create mode 100644 node_modules/set-blocking/index.js create mode 100644 node_modules/set-blocking/package.json create mode 100644 node_modules/set-value/LICENSE create mode 100644 node_modules/set-value/README.md create mode 100644 node_modules/set-value/index.js create mode 100644 node_modules/set-value/package.json create mode 100644 node_modules/signal-exit/CHANGELOG.md create mode 100644 node_modules/signal-exit/LICENSE.txt create mode 100644 node_modules/signal-exit/README.md create mode 100644 node_modules/signal-exit/index.js create mode 100644 node_modules/signal-exit/package.json create mode 100644 node_modules/signal-exit/signals.js create mode 100644 node_modules/snapdragon-node/LICENSE create mode 100644 node_modules/snapdragon-node/README.md create mode 100644 node_modules/snapdragon-node/index.js create mode 100644 node_modules/snapdragon-node/node_modules/define-property/LICENSE create mode 100644 node_modules/snapdragon-node/node_modules/define-property/README.md create mode 100644 node_modules/snapdragon-node/node_modules/define-property/index.js create mode 100644 node_modules/snapdragon-node/node_modules/define-property/package.json create mode 100644 node_modules/snapdragon-node/package.json create mode 100644 node_modules/snapdragon-util/LICENSE create mode 100644 node_modules/snapdragon-util/README.md create mode 100644 node_modules/snapdragon-util/index.js create mode 100644 node_modules/snapdragon-util/package.json create mode 100644 node_modules/snapdragon/LICENSE create mode 100644 node_modules/snapdragon/README.md create mode 100644 node_modules/snapdragon/index.js create mode 100644 node_modules/snapdragon/node_modules/source-map/CHANGELOG.md create mode 100644 node_modules/snapdragon/node_modules/source-map/LICENSE create mode 100644 node_modules/snapdragon/node_modules/source-map/README.md create mode 100644 node_modules/snapdragon/node_modules/source-map/dist/source-map.debug.js create mode 100644 node_modules/snapdragon/node_modules/source-map/dist/source-map.js create mode 100644 node_modules/snapdragon/node_modules/source-map/dist/source-map.min.js create mode 100644 node_modules/snapdragon/node_modules/source-map/dist/source-map.min.js.map create mode 100644 node_modules/snapdragon/node_modules/source-map/package.json create mode 100644 node_modules/snapdragon/node_modules/source-map/source-map.js create mode 100644 node_modules/snapdragon/package.json create mode 100644 node_modules/source-map-resolve/LICENSE create mode 100644 node_modules/source-map-resolve/changelog.md create mode 120000 node_modules/source-map-resolve/node_modules/.bin/atob create mode 100644 node_modules/source-map-resolve/package.json create mode 100644 node_modules/source-map-resolve/readme.md create mode 100644 node_modules/source-map-resolve/source-map-resolve.js create mode 100644 node_modules/source-map-url/.jshintrc create mode 100644 node_modules/source-map-url/LICENSE create mode 100644 node_modules/source-map-url/bower.json create mode 100644 node_modules/source-map-url/changelog.md create mode 100644 node_modules/source-map-url/component.json create mode 100644 node_modules/source-map-url/package.json create mode 100644 node_modules/source-map-url/readme.md create mode 100644 node_modules/source-map-url/source-map-url.js create mode 100644 node_modules/source-map-url/test/source-map-url.js create mode 100644 node_modules/source-map-url/x-package.json5 create mode 100644 node_modules/source-map/CHANGELOG.md create mode 100644 node_modules/source-map/LICENSE create mode 100644 node_modules/source-map/README.md create mode 100644 node_modules/source-map/dist/source-map.debug.js create mode 100644 node_modules/source-map/dist/source-map.js create mode 100644 node_modules/source-map/dist/source-map.min.js create mode 100644 node_modules/source-map/dist/source-map.min.js.map create mode 100644 node_modules/source-map/package.json create mode 100644 node_modules/source-map/source-map.d.ts create mode 100644 node_modules/source-map/source-map.js create mode 100644 node_modules/sparkles/LICENSE create mode 100644 node_modules/sparkles/README.md create mode 100644 node_modules/sparkles/index.js create mode 100644 node_modules/sparkles/package.json create mode 100644 node_modules/spdx-correct/LICENSE create mode 100644 node_modules/spdx-correct/README.md create mode 100644 node_modules/spdx-correct/index.js create mode 100644 node_modules/spdx-correct/package.json create mode 100644 node_modules/spdx-exceptions/README.md create mode 100644 node_modules/spdx-exceptions/index.json create mode 100644 node_modules/spdx-exceptions/package.json create mode 100644 node_modules/spdx-expression-parse/AUTHORS create mode 100644 node_modules/spdx-expression-parse/LICENSE create mode 100644 node_modules/spdx-expression-parse/README.md create mode 100644 node_modules/spdx-expression-parse/index.js create mode 100644 node_modules/spdx-expression-parse/package.json create mode 100644 node_modules/spdx-expression-parse/parse.js create mode 100644 node_modules/spdx-expression-parse/scan.js create mode 100644 node_modules/spdx-license-ids/README.md create mode 100644 node_modules/spdx-license-ids/deprecated.json create mode 100644 node_modules/spdx-license-ids/index.json create mode 100644 node_modules/spdx-license-ids/package.json create mode 100644 node_modules/split-string/LICENSE create mode 100644 node_modules/split-string/README.md create mode 100644 node_modules/split-string/index.js create mode 100644 node_modules/split-string/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/split-string/node_modules/extend-shallow/README.md create mode 100644 node_modules/split-string/node_modules/extend-shallow/index.js create mode 100644 node_modules/split-string/node_modules/extend-shallow/package.json create mode 100644 node_modules/split-string/node_modules/is-extendable/LICENSE create mode 100644 node_modules/split-string/node_modules/is-extendable/README.md create mode 100644 node_modules/split-string/node_modules/is-extendable/index.d.ts create mode 100644 node_modules/split-string/node_modules/is-extendable/index.js create mode 100644 node_modules/split-string/node_modules/is-extendable/package.json create mode 100644 node_modules/split-string/package.json create mode 100644 node_modules/sshpk/.npmignore create mode 100644 node_modules/sshpk/.travis.yml create mode 100644 node_modules/sshpk/LICENSE create mode 100644 node_modules/sshpk/README.md create mode 100644 node_modules/sshpk/man/man1/sshpk-conv.1 create mode 100644 node_modules/sshpk/man/man1/sshpk-sign.1 create mode 100644 node_modules/sshpk/man/man1/sshpk-verify.1 create mode 100644 node_modules/sshpk/package.json create mode 100644 node_modules/stack-trace/.npmignore create mode 100644 node_modules/stack-trace/License create mode 100644 node_modules/stack-trace/Makefile create mode 100644 node_modules/stack-trace/Readme.md create mode 100644 node_modules/stack-trace/package.json create mode 100644 node_modules/static-extend/LICENSE create mode 100644 node_modules/static-extend/index.js create mode 100644 node_modules/static-extend/package.json create mode 100644 node_modules/stdout-stream/.travis.yml create mode 100644 node_modules/stdout-stream/LICENSE create mode 100644 node_modules/stdout-stream/README.md create mode 100644 node_modules/stdout-stream/index.js create mode 100644 node_modules/stdout-stream/package.json create mode 100644 node_modules/stdout-stream/test/fixtures/end.js create mode 100644 node_modules/stdout-stream/test/fixtures/hello-world.js create mode 100644 node_modules/stdout-stream/test/index.js create mode 100644 node_modules/stream-exhaust/README.md create mode 100644 node_modules/stream-exhaust/index.js create mode 100644 node_modules/stream-exhaust/package.json create mode 100644 node_modules/stream-exhaust/test.js create mode 100644 node_modules/stream-shift/.travis.yml create mode 100644 node_modules/stream-shift/LICENSE create mode 100644 node_modules/stream-shift/README.md create mode 100644 node_modules/stream-shift/index.js create mode 100644 node_modules/stream-shift/package.json create mode 100644 node_modules/stream-shift/test.js create mode 100644 node_modules/string-width/index.js create mode 100644 node_modules/string-width/license create mode 100644 node_modules/string-width/node_modules/is-fullwidth-code-point/index.js create mode 100644 node_modules/string-width/node_modules/is-fullwidth-code-point/license create mode 100644 node_modules/string-width/node_modules/is-fullwidth-code-point/package.json create mode 100644 node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md create mode 100644 node_modules/string-width/package.json create mode 100644 node_modules/string-width/readme.md create mode 100644 node_modules/string_decoder/.travis.yml create mode 100644 node_modules/string_decoder/LICENSE create mode 100644 node_modules/string_decoder/README.md create mode 100644 node_modules/string_decoder/node_modules/safe-buffer/LICENSE create mode 100644 node_modules/string_decoder/node_modules/safe-buffer/README.md create mode 100644 node_modules/string_decoder/node_modules/safe-buffer/index.d.ts create mode 100644 node_modules/string_decoder/node_modules/safe-buffer/index.js create mode 100644 node_modules/string_decoder/node_modules/safe-buffer/package.json create mode 100644 node_modules/string_decoder/package.json create mode 100644 node_modules/strip-ansi/index.js create mode 100644 node_modules/strip-ansi/license create mode 100644 node_modules/strip-ansi/package.json create mode 100644 node_modules/strip-ansi/readme.md create mode 100644 node_modules/strip-bom-string/LICENSE create mode 100644 node_modules/strip-bom-string/README.md create mode 100644 node_modules/strip-bom-string/index.js create mode 100644 node_modules/strip-bom-string/package.json create mode 100644 node_modules/strip-bom/index.js create mode 100644 node_modules/strip-bom/license create mode 100644 node_modules/strip-bom/package.json create mode 100644 node_modules/strip-bom/readme.md create mode 100755 node_modules/strip-indent/cli.js create mode 100644 node_modules/strip-indent/index.js create mode 100644 node_modules/strip-indent/license create mode 100644 node_modules/strip-indent/package.json create mode 100644 node_modules/strip-indent/readme.md create mode 100644 node_modules/supports-color/browser.js create mode 100644 node_modules/supports-color/index.js create mode 100644 node_modules/supports-color/license create mode 100644 node_modules/supports-color/package.json create mode 100644 node_modules/supports-color/readme.md create mode 100644 node_modules/sver-compat/.npmignore create mode 100644 node_modules/sver-compat/.travis.yml create mode 100644 node_modules/sver-compat/LICENSE create mode 100644 node_modules/sver-compat/README.md create mode 100644 node_modules/sver-compat/convert-range.js create mode 100644 node_modules/sver-compat/package.json create mode 100644 node_modules/sver-compat/sver.js create mode 100644 node_modules/tar/.nyc_output/0471d9cf-687f-4ae8-84a5-ce7468becd03.json create mode 100644 node_modules/tar/.nyc_output/12bca2bc-6a2b-4f45-abc7-8483922a524d.json create mode 100644 node_modules/tar/.nyc_output/37d58de4-deea-4808-bb77-d27685bd1501.json create mode 100644 node_modules/tar/.nyc_output/5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json create mode 100644 node_modules/tar/.nyc_output/5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json create mode 100644 node_modules/tar/.nyc_output/7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json create mode 100644 node_modules/tar/.nyc_output/9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json create mode 100644 node_modules/tar/.nyc_output/c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json create mode 100644 node_modules/tar/.nyc_output/ea0194cb-f599-402f-8876-84fb8251e8db.json create mode 100644 node_modules/tar/.nyc_output/eda6b7a3-5e15-440f-8619-e11a15a07f77.json create mode 100644 node_modules/tar/.nyc_output/fb518800-240c-42ff-811f-79e92708d9db.json create mode 100644 node_modules/tar/.nyc_output/fdecfc06-a944-4897-9530-e08f62883fc1.json create mode 100644 node_modules/tar/.nyc_output/processinfo/0471d9cf-687f-4ae8-84a5-ce7468becd03.json create mode 100644 node_modules/tar/.nyc_output/processinfo/12bca2bc-6a2b-4f45-abc7-8483922a524d.json create mode 100644 node_modules/tar/.nyc_output/processinfo/37d58de4-deea-4808-bb77-d27685bd1501.json create mode 100644 node_modules/tar/.nyc_output/processinfo/5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json create mode 100644 node_modules/tar/.nyc_output/processinfo/5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json create mode 100644 node_modules/tar/.nyc_output/processinfo/7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json create mode 100644 node_modules/tar/.nyc_output/processinfo/9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json create mode 100644 node_modules/tar/.nyc_output/processinfo/c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json create mode 100644 node_modules/tar/.nyc_output/processinfo/ea0194cb-f599-402f-8876-84fb8251e8db.json create mode 100644 node_modules/tar/.nyc_output/processinfo/eda6b7a3-5e15-440f-8619-e11a15a07f77.json create mode 100644 node_modules/tar/.nyc_output/processinfo/fb518800-240c-42ff-811f-79e92708d9db.json create mode 100644 node_modules/tar/.nyc_output/processinfo/fdecfc06-a944-4897-9530-e08f62883fc1.json create mode 100644 node_modules/tar/.nyc_output/processinfo/index.json create mode 100644 node_modules/tar/.travis.yml create mode 100644 node_modules/tar/LICENSE create mode 100644 node_modules/tar/README.md create mode 100644 node_modules/tar/coverage/lcov-report/base.css create mode 100644 node_modules/tar/coverage/lcov-report/index.html create mode 100644 node_modules/tar/coverage/lcov-report/prettify.css create mode 100644 node_modules/tar/coverage/lcov-report/prettify.js create mode 100644 node_modules/tar/coverage/lcov-report/sort-arrow-sprite.png create mode 100644 node_modules/tar/coverage/lcov-report/sorter.js create mode 100644 node_modules/tar/coverage/lcov-report/tar/index.html create mode 100644 node_modules/tar/coverage/lcov-report/tar/index.js.html create mode 100644 node_modules/tar/coverage/lcov.info create mode 100644 node_modules/tar/examples/extracter.js create mode 100644 node_modules/tar/examples/packer.js create mode 100644 node_modules/tar/examples/reader.js create mode 100644 node_modules/tar/package.json create mode 100644 node_modules/tar/tar.js create mode 100644 node_modules/tar/test/00-setup-fixtures.js create mode 100644 node_modules/tar/test/cb-never-called-1.0.1.tgz create mode 100644 node_modules/tar/test/dir-normalization.js create mode 100644 node_modules/tar/test/dir-normalization.tar create mode 100644 node_modules/tar/test/error-on-broken.js create mode 100644 node_modules/tar/test/extract-move.js create mode 100644 node_modules/tar/test/extract.js create mode 100644 node_modules/tar/test/fixtures.tgz create mode 100644 node_modules/tar/test/header.js create mode 100644 node_modules/tar/test/link-file-entry-collision.js create mode 100644 node_modules/tar/test/link-file-entry-collision/bad-link.hex create mode 100644 node_modules/tar/test/link-file-entry-collision/bad-link.tar create mode 100644 node_modules/tar/test/pack-no-proprietary.js create mode 100644 node_modules/tar/test/pack.js create mode 100644 node_modules/tar/test/parse-discard.js create mode 100644 node_modules/tar/test/parse.js create mode 100644 node_modules/tar/test/zz-cleanup.js create mode 100644 node_modules/through2-filter/LICENSE create mode 100644 node_modules/through2-filter/README.md create mode 100644 node_modules/through2-filter/index.js create mode 100644 node_modules/through2-filter/node_modules/through2/LICENSE.md create mode 100644 node_modules/through2-filter/node_modules/through2/README.md create mode 100644 node_modules/through2-filter/node_modules/through2/package.json create mode 100644 node_modules/through2-filter/node_modules/through2/through2.js create mode 100644 node_modules/through2-filter/package.json create mode 100644 node_modules/through2/LICENSE.md create mode 100644 node_modules/through2/README.md create mode 100644 node_modules/through2/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/through2/node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/through2/node_modules/readable-stream/LICENSE create mode 100644 node_modules/through2/node_modules/readable-stream/README.md create mode 100644 node_modules/through2/node_modules/readable-stream/errors-browser.js create mode 100644 node_modules/through2/node_modules/readable-stream/errors.js create mode 100644 node_modules/through2/node_modules/readable-stream/experimentalWarning.js create mode 100644 node_modules/through2/node_modules/readable-stream/package.json create mode 100644 node_modules/through2/node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/through2/node_modules/readable-stream/readable.js create mode 100644 node_modules/through2/node_modules/string_decoder/LICENSE create mode 100644 node_modules/through2/node_modules/string_decoder/README.md create mode 100644 node_modules/through2/node_modules/string_decoder/package.json create mode 100644 node_modules/through2/package.json create mode 100644 node_modules/through2/through2.js create mode 100644 node_modules/time-stamp/LICENSE create mode 100644 node_modules/time-stamp/README.md create mode 100644 node_modules/time-stamp/index.js create mode 100644 node_modules/time-stamp/package.json create mode 100644 node_modules/timers-ext/.editorconfig create mode 100644 node_modules/timers-ext/CHANGELOG.md create mode 100644 node_modules/timers-ext/CHANGES create mode 100644 node_modules/timers-ext/LICENSE create mode 100644 node_modules/timers-ext/README.md create mode 100644 node_modules/timers-ext/delay.js create mode 100644 node_modules/timers-ext/max-timeout.js create mode 100644 node_modules/timers-ext/once.js create mode 100644 node_modules/timers-ext/package.json create mode 100644 node_modules/timers-ext/promise/.eslintrc.json create mode 100644 node_modules/timers-ext/promise/sleep.js create mode 100644 node_modules/timers-ext/promise_/timeout.js create mode 100644 node_modules/timers-ext/test/.eslintrc.json create mode 100644 node_modules/timers-ext/test/delay.js create mode 100644 node_modules/timers-ext/test/max-timeout.js create mode 100644 node_modules/timers-ext/test/once.js create mode 100644 node_modules/timers-ext/test/promise/sleep.js create mode 100644 node_modules/timers-ext/test/promise_/.eslintrc.json create mode 100644 node_modules/timers-ext/test/promise_/timeout.js create mode 100644 node_modules/timers-ext/test/throttle.js create mode 100644 node_modules/timers-ext/test/valid-timeout.js create mode 100644 node_modules/timers-ext/throttle.js create mode 100644 node_modules/timers-ext/valid-timeout.js create mode 100644 node_modules/to-absolute-glob/LICENSE create mode 100644 node_modules/to-absolute-glob/index.js create mode 100644 node_modules/to-absolute-glob/package.json create mode 100644 node_modules/to-absolute-glob/readme.md create mode 100644 node_modules/to-object-path/LICENSE create mode 100644 node_modules/to-object-path/README.md create mode 100644 node_modules/to-object-path/index.js create mode 100644 node_modules/to-object-path/package.json create mode 100644 node_modules/to-regex-range/LICENSE create mode 100644 node_modules/to-regex-range/README.md create mode 100644 node_modules/to-regex-range/index.js create mode 100644 node_modules/to-regex-range/package.json create mode 100644 node_modules/to-regex/LICENSE create mode 100644 node_modules/to-regex/README.md create mode 100644 node_modules/to-regex/index.js create mode 100644 node_modules/to-regex/node_modules/define-property/CHANGELOG.md create mode 100644 node_modules/to-regex/node_modules/define-property/LICENSE create mode 100644 node_modules/to-regex/node_modules/define-property/README.md create mode 100644 node_modules/to-regex/node_modules/define-property/index.js create mode 100644 node_modules/to-regex/node_modules/define-property/package.json create mode 100644 node_modules/to-regex/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/to-regex/node_modules/extend-shallow/README.md create mode 100644 node_modules/to-regex/node_modules/extend-shallow/index.js create mode 100644 node_modules/to-regex/node_modules/extend-shallow/package.json create mode 100644 node_modules/to-regex/node_modules/is-extendable/LICENSE create mode 100644 node_modules/to-regex/node_modules/is-extendable/README.md create mode 100644 node_modules/to-regex/node_modules/is-extendable/index.d.ts create mode 100644 node_modules/to-regex/node_modules/is-extendable/index.js create mode 100644 node_modules/to-regex/node_modules/is-extendable/package.json create mode 100644 node_modules/to-regex/package.json create mode 100644 node_modules/to-through/LICENSE create mode 100644 node_modules/to-through/README.md create mode 100644 node_modules/to-through/index.js create mode 100644 node_modules/to-through/node_modules/through2/LICENSE.md create mode 100644 node_modules/to-through/node_modules/through2/README.md create mode 100644 node_modules/to-through/node_modules/through2/package.json create mode 100644 node_modules/to-through/node_modules/through2/through2.js create mode 100644 node_modules/to-through/package.json create mode 100644 node_modules/tough-cookie/LICENSE create mode 100644 node_modules/tough-cookie/README.md create mode 100644 node_modules/tough-cookie/package.json create mode 100644 node_modules/trim-newlines/index.js create mode 100644 node_modules/trim-newlines/license create mode 100644 node_modules/trim-newlines/package.json create mode 100644 node_modules/trim-newlines/readme.md create mode 100644 node_modules/true-case-path/LICENSE create mode 100644 node_modules/true-case-path/README.md create mode 100644 node_modules/true-case-path/index.js create mode 100644 node_modules/true-case-path/package.json create mode 100644 node_modules/tunnel-agent/LICENSE create mode 100644 node_modules/tunnel-agent/README.md create mode 100644 node_modules/tunnel-agent/index.js create mode 100644 node_modules/tunnel-agent/package.json create mode 100644 node_modules/tweetnacl/.npmignore create mode 100644 node_modules/tweetnacl/AUTHORS.md create mode 100644 node_modules/tweetnacl/CHANGELOG.md create mode 100644 node_modules/tweetnacl/LICENSE create mode 100644 node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md create mode 100644 node_modules/tweetnacl/README.md create mode 100644 node_modules/tweetnacl/nacl-fast.js create mode 100644 node_modules/tweetnacl/nacl-fast.min.js create mode 100644 node_modules/tweetnacl/nacl.d.ts create mode 100644 node_modules/tweetnacl/nacl.js create mode 100644 node_modules/tweetnacl/nacl.min.js create mode 100644 node_modules/tweetnacl/package.json create mode 100644 node_modules/type/.editorconfig create mode 100644 node_modules/type/CHANGELOG.md create mode 100644 node_modules/type/LICENSE create mode 100644 node_modules/type/README.md create mode 100644 node_modules/type/array-length/coerce.js create mode 100644 node_modules/type/array-length/ensure.js create mode 100644 node_modules/type/array-like/ensure.js create mode 100644 node_modules/type/array-like/is.js create mode 100644 node_modules/type/array/ensure.js create mode 100644 node_modules/type/array/is.js create mode 100644 node_modules/type/date/ensure.js create mode 100644 node_modules/type/date/is.js create mode 100644 node_modules/type/error/ensure.js create mode 100644 node_modules/type/error/is.js create mode 100644 node_modules/type/finite/coerce.js create mode 100644 node_modules/type/finite/ensure.js create mode 100644 node_modules/type/function/ensure.js create mode 100644 node_modules/type/function/is.js create mode 100644 node_modules/type/integer/coerce.js create mode 100644 node_modules/type/integer/ensure.js create mode 100644 node_modules/type/iterable/ensure.js create mode 100644 node_modules/type/iterable/is.js create mode 100644 node_modules/type/natural-number/coerce.js create mode 100644 node_modules/type/natural-number/ensure.js create mode 100644 node_modules/type/number/coerce.js create mode 100644 node_modules/type/number/ensure.js create mode 100644 node_modules/type/object/ensure.js create mode 100644 node_modules/type/object/is.js create mode 100644 node_modules/type/package.json create mode 100644 node_modules/type/plain-function/ensure.js create mode 100644 node_modules/type/plain-function/is.js create mode 100644 node_modules/type/plain-object/ensure.js create mode 100644 node_modules/type/plain-object/is.js create mode 100644 node_modules/type/promise/ensure.js create mode 100644 node_modules/type/promise/is.js create mode 100644 node_modules/type/prototype/is.js create mode 100644 node_modules/type/reg-exp/ensure.js create mode 100644 node_modules/type/reg-exp/is.js create mode 100644 node_modules/type/safe-integer/coerce.js create mode 100644 node_modules/type/safe-integer/ensure.js create mode 100644 node_modules/type/string/coerce.js create mode 100644 node_modules/type/string/ensure.js create mode 100644 node_modules/type/test/_lib/arrow-function-if-supported.js create mode 100644 node_modules/type/test/_lib/class-if-supported.js create mode 100644 node_modules/type/test/array-length/coerce.js create mode 100644 node_modules/type/test/array-length/ensure.js create mode 100644 node_modules/type/test/array-like/ensure.js create mode 100644 node_modules/type/test/array-like/is.js create mode 100644 node_modules/type/test/array/ensure.js create mode 100644 node_modules/type/test/array/is.js create mode 100644 node_modules/type/test/date/ensure.js create mode 100644 node_modules/type/test/date/is.js create mode 100644 node_modules/type/test/error/ensure.js create mode 100644 node_modules/type/test/error/is.js create mode 100644 node_modules/type/test/finite/coerce.js create mode 100644 node_modules/type/test/finite/ensure.js create mode 100644 node_modules/type/test/function/ensure.js create mode 100644 node_modules/type/test/function/is.js create mode 100644 node_modules/type/test/integer/coerce.js create mode 100644 node_modules/type/test/integer/ensure.js create mode 100644 node_modules/type/test/iterable/ensure.js create mode 100644 node_modules/type/test/iterable/is.js create mode 100644 node_modules/type/test/natural-number/coerce.js create mode 100644 node_modules/type/test/natural-number/ensure.js create mode 100644 node_modules/type/test/number/coerce.js create mode 100644 node_modules/type/test/number/ensure.js create mode 100644 node_modules/type/test/object/ensure.js create mode 100644 node_modules/type/test/object/is.js create mode 100644 node_modules/type/test/plain-function/ensure.js create mode 100644 node_modules/type/test/plain-function/is.js create mode 100644 node_modules/type/test/plain-object/ensure.js create mode 100644 node_modules/type/test/plain-object/is.js create mode 100644 node_modules/type/test/promise/ensure.js create mode 100644 node_modules/type/test/promise/is.js create mode 100644 node_modules/type/test/prototype/is.js create mode 100644 node_modules/type/test/reg-exp/ensure.js create mode 100644 node_modules/type/test/reg-exp/is.js create mode 100644 node_modules/type/test/safe-integer/coerce.js create mode 100644 node_modules/type/test/safe-integer/ensure.js create mode 100644 node_modules/type/test/string/coerce.js create mode 100644 node_modules/type/test/string/ensure.js create mode 100644 node_modules/type/test/thenable/ensure.js create mode 100644 node_modules/type/test/thenable/is.js create mode 100644 node_modules/type/test/time-value/coerce.js create mode 100644 node_modules/type/test/time-value/ensure.js create mode 100644 node_modules/type/test/value/ensure.js create mode 100644 node_modules/type/test/value/is.js create mode 100644 node_modules/type/thenable/ensure.js create mode 100644 node_modules/type/thenable/is.js create mode 100644 node_modules/type/time-value/coerce.js create mode 100644 node_modules/type/time-value/ensure.js create mode 100644 node_modules/type/value/ensure.js create mode 100644 node_modules/type/value/is.js create mode 100644 node_modules/typedarray/.travis.yml create mode 100644 node_modules/typedarray/LICENSE create mode 100644 node_modules/typedarray/example/tarray.js create mode 100644 node_modules/typedarray/index.js create mode 100644 node_modules/typedarray/package.json create mode 100644 node_modules/typedarray/readme.markdown create mode 100644 node_modules/typedarray/test/server/undef_globals.js create mode 100644 node_modules/typedarray/test/tarray.js create mode 100644 node_modules/unc-path-regex/LICENSE create mode 100644 node_modules/unc-path-regex/README.md create mode 100644 node_modules/unc-path-regex/index.js create mode 100644 node_modules/unc-path-regex/package.json create mode 100644 node_modules/undertaker-registry/LICENSE create mode 100644 node_modules/undertaker-registry/README.md create mode 100644 node_modules/undertaker-registry/index.js create mode 100644 node_modules/undertaker-registry/package.json create mode 100644 node_modules/undertaker/LICENSE create mode 100644 node_modules/undertaker/README.md create mode 100644 node_modules/undertaker/index.js create mode 100644 node_modules/undertaker/package.json create mode 100644 node_modules/union-value/LICENSE create mode 100644 node_modules/union-value/README.md create mode 100644 node_modules/union-value/index.js create mode 100644 node_modules/union-value/package.json create mode 100644 node_modules/unique-stream/LICENSE create mode 100644 node_modules/unique-stream/README.md create mode 100644 node_modules/unique-stream/index.js create mode 100644 node_modules/unique-stream/package.json create mode 100644 node_modules/unset-value/LICENSE create mode 100644 node_modules/unset-value/README.md create mode 100644 node_modules/unset-value/index.js create mode 100644 node_modules/unset-value/node_modules/has-value/LICENSE create mode 100644 node_modules/unset-value/node_modules/has-value/README.md create mode 100644 node_modules/unset-value/node_modules/has-value/index.js create mode 100644 node_modules/unset-value/node_modules/has-value/node_modules/isobject/LICENSE create mode 100644 node_modules/unset-value/node_modules/has-value/node_modules/isobject/README.md create mode 100644 node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js create mode 100644 node_modules/unset-value/node_modules/has-value/node_modules/isobject/package.json create mode 100644 node_modules/unset-value/node_modules/has-value/package.json create mode 100644 node_modules/unset-value/node_modules/has-values/LICENSE create mode 100644 node_modules/unset-value/node_modules/has-values/README.md create mode 100644 node_modules/unset-value/node_modules/has-values/index.js create mode 100644 node_modules/unset-value/node_modules/has-values/package.json create mode 100644 node_modules/unset-value/package.json create mode 100755 node_modules/upath/LICENSE create mode 100644 node_modules/upath/build/code/upath.js create mode 100644 node_modules/upath/package.json create mode 100644 node_modules/upath/readme.md create mode 100644 node_modules/upath/upath.d.ts create mode 100755 node_modules/uri-js/LICENSE create mode 100755 node_modules/uri-js/README.md create mode 100755 node_modules/uri-js/dist/es5/uri.all.d.ts create mode 100755 node_modules/uri-js/dist/es5/uri.all.js create mode 100755 node_modules/uri-js/dist/es5/uri.all.js.map create mode 100755 node_modules/uri-js/dist/es5/uri.all.min.d.ts create mode 100755 node_modules/uri-js/dist/es5/uri.all.min.js create mode 100755 node_modules/uri-js/dist/es5/uri.all.min.js.map create mode 100755 node_modules/uri-js/dist/esnext/index.d.ts create mode 100755 node_modules/uri-js/dist/esnext/index.js create mode 100755 node_modules/uri-js/dist/esnext/index.js.map create mode 100755 node_modules/uri-js/dist/esnext/regexps-iri.d.ts create mode 100755 node_modules/uri-js/dist/esnext/regexps-iri.js create mode 100755 node_modules/uri-js/dist/esnext/regexps-iri.js.map create mode 100755 node_modules/uri-js/dist/esnext/regexps-uri.d.ts create mode 100755 node_modules/uri-js/dist/esnext/regexps-uri.js create mode 100755 node_modules/uri-js/dist/esnext/regexps-uri.js.map create mode 100755 node_modules/uri-js/dist/esnext/schemes/http.d.ts create mode 100755 node_modules/uri-js/dist/esnext/schemes/http.js create mode 100755 node_modules/uri-js/dist/esnext/schemes/http.js.map create mode 100755 node_modules/uri-js/dist/esnext/schemes/https.d.ts create mode 100755 node_modules/uri-js/dist/esnext/schemes/https.js create mode 100755 node_modules/uri-js/dist/esnext/schemes/https.js.map create mode 100755 node_modules/uri-js/dist/esnext/schemes/mailto.d.ts create mode 100755 node_modules/uri-js/dist/esnext/schemes/mailto.js create mode 100755 node_modules/uri-js/dist/esnext/schemes/mailto.js.map create mode 100755 node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts create mode 100755 node_modules/uri-js/dist/esnext/schemes/urn-uuid.js create mode 100755 node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map create mode 100755 node_modules/uri-js/dist/esnext/schemes/urn.d.ts create mode 100755 node_modules/uri-js/dist/esnext/schemes/urn.js create mode 100755 node_modules/uri-js/dist/esnext/schemes/urn.js.map create mode 100755 node_modules/uri-js/dist/esnext/schemes/ws.d.ts create mode 100755 node_modules/uri-js/dist/esnext/schemes/ws.js create mode 100755 node_modules/uri-js/dist/esnext/schemes/ws.js.map create mode 100755 node_modules/uri-js/dist/esnext/schemes/wss.d.ts create mode 100755 node_modules/uri-js/dist/esnext/schemes/wss.js create mode 100755 node_modules/uri-js/dist/esnext/schemes/wss.js.map create mode 100755 node_modules/uri-js/dist/esnext/uri.d.ts create mode 100755 node_modules/uri-js/dist/esnext/uri.js create mode 100755 node_modules/uri-js/dist/esnext/uri.js.map create mode 100755 node_modules/uri-js/dist/esnext/util.d.ts create mode 100755 node_modules/uri-js/dist/esnext/util.js create mode 100755 node_modules/uri-js/dist/esnext/util.js.map create mode 100755 node_modules/uri-js/package.json create mode 100755 node_modules/uri-js/yarn.lock create mode 100644 node_modules/urix/.jshintrc create mode 100644 node_modules/urix/LICENSE create mode 100644 node_modules/urix/index.js create mode 100644 node_modules/urix/package.json create mode 100644 node_modules/urix/readme.md create mode 100644 node_modules/urix/test/index.js create mode 100644 node_modules/use/LICENSE create mode 100644 node_modules/use/README.md create mode 100644 node_modules/use/index.js create mode 100644 node_modules/use/package.json create mode 100644 node_modules/util-deprecate/History.md create mode 100644 node_modules/util-deprecate/LICENSE create mode 100644 node_modules/util-deprecate/README.md create mode 100644 node_modules/util-deprecate/browser.js create mode 100644 node_modules/util-deprecate/node.js create mode 100644 node_modules/util-deprecate/package.json create mode 100644 node_modules/uuid/AUTHORS create mode 100644 node_modules/uuid/CHANGELOG.md create mode 100644 node_modules/uuid/LICENSE.md create mode 100644 node_modules/uuid/README.md create mode 100644 node_modules/uuid/index.js create mode 100644 node_modules/uuid/package.json create mode 100644 node_modules/uuid/v1.js create mode 100644 node_modules/uuid/v3.js create mode 100644 node_modules/uuid/v4.js create mode 100644 node_modules/uuid/v5.js create mode 100644 node_modules/v8flags/LICENSE create mode 100644 node_modules/v8flags/README.md create mode 100644 node_modules/v8flags/config-path.js create mode 100644 node_modules/v8flags/index.js create mode 100644 node_modules/v8flags/package.json create mode 100644 node_modules/validate-npm-package-license/LICENSE create mode 100644 node_modules/validate-npm-package-license/README.md create mode 100644 node_modules/validate-npm-package-license/index.js create mode 100644 node_modules/validate-npm-package-license/package.json create mode 100644 node_modules/value-or-function/LICENSE create mode 100644 node_modules/value-or-function/README.md create mode 100644 node_modules/value-or-function/index.js create mode 100644 node_modules/value-or-function/package.json create mode 100644 node_modules/verror/.npmignore create mode 100644 node_modules/verror/CHANGES.md create mode 100644 node_modules/verror/CONTRIBUTING.md create mode 100644 node_modules/verror/LICENSE create mode 100644 node_modules/verror/README.md create mode 100644 node_modules/verror/node_modules/extsprintf/.gitmodules create mode 100644 node_modules/verror/node_modules/extsprintf/.npmignore create mode 100644 node_modules/verror/node_modules/extsprintf/CHANGES.md create mode 100644 node_modules/verror/node_modules/extsprintf/CONTRIBUTING.md create mode 100644 node_modules/verror/node_modules/extsprintf/LICENSE create mode 100644 node_modules/verror/node_modules/extsprintf/Makefile create mode 100644 node_modules/verror/node_modules/extsprintf/Makefile.targ create mode 100644 node_modules/verror/node_modules/extsprintf/README.md create mode 100644 node_modules/verror/node_modules/extsprintf/jsl.node.conf create mode 100644 node_modules/verror/node_modules/extsprintf/package.json create mode 100644 node_modules/verror/node_modules/extsprintf/test/tst.basic.js create mode 100644 node_modules/verror/node_modules/extsprintf/test/tst.invalid.js create mode 100644 node_modules/verror/package.json create mode 100644 node_modules/vinyl-fs/LICENSE create mode 100644 node_modules/vinyl-fs/README.md create mode 100644 node_modules/vinyl-fs/index.js create mode 100644 node_modules/vinyl-fs/node_modules/through2/LICENSE.md create mode 100644 node_modules/vinyl-fs/node_modules/through2/README.md create mode 100644 node_modules/vinyl-fs/node_modules/through2/package.json create mode 100644 node_modules/vinyl-fs/node_modules/through2/through2.js create mode 100644 node_modules/vinyl-fs/package.json create mode 100644 node_modules/vinyl-sourcemap/LICENSE create mode 100644 node_modules/vinyl-sourcemap/README.md create mode 100644 node_modules/vinyl-sourcemap/index.js create mode 100644 node_modules/vinyl-sourcemap/package.json create mode 100644 node_modules/vinyl-sourcemaps-apply/.jshintrc create mode 100644 node_modules/vinyl-sourcemaps-apply/.npmignore create mode 100644 node_modules/vinyl-sourcemaps-apply/README.md create mode 100644 node_modules/vinyl-sourcemaps-apply/index.js create mode 100644 node_modules/vinyl-sourcemaps-apply/node_modules/source-map/CHANGELOG.md create mode 100644 node_modules/vinyl-sourcemaps-apply/node_modules/source-map/LICENSE create mode 100644 node_modules/vinyl-sourcemaps-apply/node_modules/source-map/README.md create mode 100644 node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.debug.js create mode 100644 node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.js create mode 100644 node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.min.js create mode 100644 node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.min.js.map create mode 100644 node_modules/vinyl-sourcemaps-apply/node_modules/source-map/package.json create mode 100644 node_modules/vinyl-sourcemaps-apply/node_modules/source-map/source-map.js create mode 100644 node_modules/vinyl-sourcemaps-apply/package.json create mode 100644 node_modules/vinyl/LICENSE create mode 100644 node_modules/vinyl/README.md create mode 100644 node_modules/vinyl/index.js create mode 100644 node_modules/vinyl/package.json create mode 100644 node_modules/which-module/CHANGELOG.md create mode 100644 node_modules/which-module/LICENSE create mode 100644 node_modules/which-module/README.md create mode 100644 node_modules/which-module/index.js create mode 100644 node_modules/which-module/package.json create mode 100644 node_modules/which/CHANGELOG.md create mode 100644 node_modules/which/LICENSE create mode 100644 node_modules/which/README.md create mode 100644 node_modules/which/package.json create mode 100644 node_modules/which/which.js create mode 100644 node_modules/wide-align/LICENSE create mode 100644 node_modules/wide-align/README.md create mode 100644 node_modules/wide-align/align.js create mode 100644 node_modules/wide-align/node_modules/ansi-regex/index.js create mode 100644 node_modules/wide-align/node_modules/ansi-regex/license create mode 100644 node_modules/wide-align/node_modules/ansi-regex/package.json create mode 100644 node_modules/wide-align/node_modules/ansi-regex/readme.md create mode 100644 node_modules/wide-align/node_modules/string-width/index.js create mode 100644 node_modules/wide-align/node_modules/string-width/license create mode 100644 node_modules/wide-align/node_modules/string-width/package.json create mode 100644 node_modules/wide-align/node_modules/string-width/readme.md create mode 100644 node_modules/wide-align/node_modules/strip-ansi/index.js create mode 100644 node_modules/wide-align/node_modules/strip-ansi/license create mode 100644 node_modules/wide-align/node_modules/strip-ansi/package.json create mode 100644 node_modules/wide-align/node_modules/strip-ansi/readme.md create mode 100644 node_modules/wide-align/package.json create mode 100755 node_modules/wrap-ansi/index.js create mode 100644 node_modules/wrap-ansi/license create mode 100644 node_modules/wrap-ansi/package.json create mode 100644 node_modules/wrap-ansi/readme.md create mode 100644 node_modules/wrappy/LICENSE create mode 100644 node_modules/wrappy/README.md create mode 100644 node_modules/wrappy/package.json create mode 100644 node_modules/wrappy/wrappy.js create mode 100644 node_modules/xtend/.jshintrc create mode 100644 node_modules/xtend/LICENSE create mode 100644 node_modules/xtend/README.md create mode 100644 node_modules/xtend/immutable.js create mode 100644 node_modules/xtend/mutable.js create mode 100644 node_modules/xtend/package.json create mode 100644 node_modules/xtend/test.js create mode 100644 node_modules/y18n/CHANGELOG.md create mode 100644 node_modules/y18n/LICENSE create mode 100644 node_modules/y18n/README.md create mode 100644 node_modules/y18n/index.js create mode 100644 node_modules/y18n/package.json create mode 100644 node_modules/yallist/LICENSE create mode 100644 node_modules/yallist/README.md create mode 100644 node_modules/yallist/iterator.js create mode 100644 node_modules/yallist/package.json create mode 100644 node_modules/yallist/yallist.js create mode 100644 node_modules/yargs-parser/CHANGELOG.md create mode 100644 node_modules/yargs-parser/LICENSE.txt create mode 100644 node_modules/yargs-parser/README.md create mode 100644 node_modules/yargs-parser/index.js create mode 100644 node_modules/yargs-parser/package.json create mode 100644 node_modules/yargs/CHANGELOG.md create mode 100644 node_modules/yargs/LICENSE create mode 100644 node_modules/yargs/README.md create mode 100644 node_modules/yargs/completion.sh.hbs create mode 100644 node_modules/yargs/index.js create mode 100644 node_modules/yargs/locales/be.json create mode 100644 node_modules/yargs/locales/de.json create mode 100644 node_modules/yargs/locales/en.json create mode 100644 node_modules/yargs/locales/es.json create mode 100644 node_modules/yargs/locales/fr.json create mode 100644 node_modules/yargs/locales/hi.json create mode 100644 node_modules/yargs/locales/hu.json create mode 100644 node_modules/yargs/locales/id.json create mode 100644 node_modules/yargs/locales/it.json create mode 100644 node_modules/yargs/locales/ja.json create mode 100644 node_modules/yargs/locales/ko.json create mode 100644 node_modules/yargs/locales/nb.json create mode 100644 node_modules/yargs/locales/nl.json create mode 100644 node_modules/yargs/locales/pirate.json create mode 100644 node_modules/yargs/locales/pl.json create mode 100644 node_modules/yargs/locales/pt.json create mode 100644 node_modules/yargs/locales/pt_BR.json create mode 100644 node_modules/yargs/locales/ru.json create mode 100644 node_modules/yargs/locales/th.json create mode 100644 node_modules/yargs/locales/tr.json create mode 100644 node_modules/yargs/locales/zh_CN.json create mode 100644 node_modules/yargs/locales/zh_TW.json create mode 100644 node_modules/yargs/package.json create mode 100644 node_modules/yargs/yargs.js create mode 100644 package.json create mode 100644 yarn.lock diff --git a/css/layout.css b/css/layout.css new file mode 100644 index 00000000..123ca65e --- /dev/null +++ b/css/layout.css @@ -0,0 +1,2 @@ +*,:before,:after{box-sizing:border-box}html,body{margin:0;padding:0;font-family:'Open Sans',sans-serif}@media (max-width:780px){body.mobile-menu-opened{overflow:hidden}}ul.navigation>li:not(.active) a{color:#000}ul.navigation>li.active a{color:red} +/*# sourceMappingURL=layout.css.map */ diff --git a/css/layout.css.map b/css/layout.css.map new file mode 100644 index 00000000..6efd6262 --- /dev/null +++ b/css/layout.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["layout.scss"],"names":[],"mappings":"AAAA,C,CAAG,O,CAAU,M,CACT,qB,CAGJ,I,CAAM,I,CACF,Q,CACA,S,CACA,kC,CAGJ,yBACI,uB,CACI,iB,AAIR,qBAAuB,U,CACnB,U,CAGJ,yB,CACI,S","file":"layout.css","sourcesContent":["*, *:before, *:after {\n box-sizing: border-box;\n}\n\nhtml, body {\n margin: 0;\n padding: 0;\n font-family: 'Open Sans', sans-serif;\n}\n\n@media(max-width: 780px) {\n body.mobile-menu-opened {\n overflow: hidden;\n }\n}\n\nul.navigation > li:not(.active) a {\n color: black;\n}\n\nul.navigation > li.active a {\n color: red;\n}\n"]} \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 00000000..1a77f4ce --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,38 @@ +'use strict'; + +const gulp = require('gulp'), + sass = require('gulp-sass'), + csso = require('gulp-csso'), + sourcemaps = require('gulp-sourcemaps'), + merge = require('merge-stream'), + through2 = require('through2'), + scss = { + 'landing_page/mainpage/static/new-design/css/**/*.scss': 'landing_page/mainpage/static/new-design/css' + }; + +gulp.task('scss', () => { + return merge(Object.keys(scss).map(source => { + let destination = scss[source]; + + return gulp.src(source) + .pipe(sourcemaps.init()) + .pipe(sass().on('error', sass.logError)) + .pipe(csso({restructure: false, comments: 'exclamation'})) + .pipe(sourcemaps.write('.')) + .pipe(through2.obj(function(file, enc, cb) { + let date = new Date(); + + file.stat.atime = date; + file.stat.mtime = date; + + cb(null, file); + })) + .pipe(gulp.dest(destination)); + })); +}); + +gulp.task('scss:watch', gulp.series('scss', () => { + gulp.watch(Object.keys(scss), gulp.series('scss')); +})); + +gulp.task('default', gulp.series('scss:watch')); diff --git a/landing_page/mainpage/static/new-design/css/layout.css b/landing_page/mainpage/static/new-design/css/layout.css new file mode 100644 index 00000000..f781114c --- /dev/null +++ b/landing_page/mainpage/static/new-design/css/layout.css @@ -0,0 +1,44 @@ +*,:before,:after{box-sizing:border-box}html,body{margin:0;padding:0;font-family:'Montserrat',sans-serif}h2{font-style:normal;font-weight:800;font-size:30px;line-height:48px;color:#040306}@media (max-width:1200px){h2{font-size:24px;line-height:38px}}@media (max-width:750px){h2{font-size:22px;line-height:35px;margin:35px 0 20px}}.btn{display:block;border:1px solid #e1e1e2;font-family:'Montserrat',sans-serif;font-style:normal;font-weight:700;font-size:14px;line-height:17px;text-align:center;text-transform:uppercase;color:#000;background:#e2e2e3;border-radius:30px;padding:20px 36px;transition:box-shadow .2s}.btn:hover{box-shadow:1px 1px 9px 2px rgba(165,165,165,.36)}@media (max-width:1200px){.btn{padding:16px 28px}}@media (max-width:750px){.btn{padding:13px 23px;font-size:12px;line-height:14px}}.container{width:1100px;margin:0 auto}@media (max-width:1200px){.container{width:728px;margin:0 auto}}@media (max-width:750px){.container{width:100%;max-width:500px;padding:0 15px;margin:0 auto}}@media (max-width:750px){body.mobile-menu-opened{overflow:hidden}} +/*! HEADER START */ +.header_wrapper{box-shadow:0 2px 4px rgba(0,0,0,.12);position:relative;background:#fff;z-index:1000}.header_wrapper .projects_logo_wrapper{display:flex;flex-direction:row;justify-content:flex-start}.header_wrapper .projects_logo_wrapper .learn_python{padding:15px 50px;background:#262525;width:calc(100%/3)}.header_wrapper .projects_logo_wrapper .learn_python .logo a{display:block;text-decoration:none}.header_wrapper .projects_logo_wrapper .learn_python .logo a .logo_title{margin:0;font-family:'Ubuntu',sans-serif;font-style:normal;font-weight:400;font-size:26px;line-height:35px;letter-spacing:.105em;text-transform:uppercase;color:#fff}.header_wrapper .projects_logo_wrapper .learn_python .logo a .logo_title .blue{color:#2c91cb}.header_wrapper .projects_logo_wrapper .learn_python .logo a .logo_title .yellow{color:#f2c94c}.header_wrapper .projects_logo_wrapper .python_week{padding:15px 50px;background:#0f1686;width:calc(100%/3)}.header_wrapper .projects_logo_wrapper .python_week .logo a{display:block;width:115px;height:35px}.header_wrapper .projects_logo_wrapper .python_week .logo a img{display:block;width:100%;height:100%}.header_wrapper .projects_logo_wrapper .moscow_python{padding:15px 50px;background:#f8f9fa;width:calc(100%/3)}.header_wrapper .projects_logo_wrapper .moscow_python .logo a{display:block;width:158px;height:35px}.header_wrapper .projects_logo_wrapper .moscow_python .logo a img{display:block;width:100%;height:100%}.header_wrapper .projects_logo_wrapper .projects_list{transition:opacity .2s;opacity:0;pointer-events:none;display:flex;position:absolute;flex-direction:row;justify-content:flex-start;z-index:3000;min-height:453px}body.loading .header_wrapper .projects_logo_wrapper .projects_list{transition:none}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list{opacity:1;pointer-events:auto}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list h6{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:16px;color:#fff}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .descr{font-style:normal;font-weight:400;font-size:12px;line-height:16px;color:#fff}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .learn_python{padding:40px 50px;background:#262525;width:calc(100%/3)}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .learn_python .logo a{display:block;text-decoration:none}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .learn_python .logo a .logo_title{margin:33px 0 0;font-family:'Ubuntu',sans-serif;font-style:normal;font-weight:400;font-size:26px;line-height:35px;letter-spacing:.105em;text-transform:uppercase;color:#fff}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .learn_python .logo a .logo_title .blue{color:#2c91cb}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .learn_python .logo a .logo_title .yellow{color:#f2c94c}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .learn_python h4{margin:50px 0 20px;font-family:'Roboto',sans-serif;font-style:normal;font-weight:900;font-size:23px;line-height:31px;color:#fff}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .learn_python .date{font-family:'Ubuntu',sans-serif;font-style:normal;font-weight:400;font-size:24px;line-height:32px;color:#f2c94c}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .learn_python .date span{color:#fff}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .python_week{padding:40px 50px;background:#0f1686;width:calc(100%/3)}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .python_week .logo a{display:block;width:198px;height:61px;margin:20px 0 0;text-decoration:none}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .python_week .logo a img{display:block;width:100%;height:100%}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .python_week h4{margin:35px 0 20px;font-style:normal;font-weight:600;font-size:24px;line-height:32px;color:#fff}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .python_week .date{font-style:normal;font-weight:700;font-size:24px;line-height:32px;color:#fcd600}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .moscow_python{padding:40px 50px;background:#f8f9fa;width:calc(100%/3)}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .moscow_python h6{color:#252526}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .moscow_python .logo a{display:block;width:275px;height:61px;margin:20px 0 0;text-decoration:none}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .moscow_python .logo a img{display:block;width:100%;height:100%}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .moscow_python h4{font-family:'Roboto',sans-serif;font-style:normal;font-weight:700;font-size:24px;line-height:32px;color:#000}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .moscow_python .date{font-style:normal;font-weight:400;font-size:24px;line-height:32px;color:#33719c}body:not(.loading) .header_wrapper .projects_logo_wrapper:hover .projects_list .moscow_python .descr{color:#252526}.header_wrapper .main_menu_logo_wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.header_wrapper .main_menu_logo_wrapper .logo{margin-right:190px}.header_wrapper .main_menu_logo_wrapper .logo a{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start}.header_wrapper .main_menu_logo_wrapper .logo a img{display:block;margin-right:5px}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .mobile_menu_btn{display:none}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .main_menu ul.nav{list-style:none;padding:0;margin:0;display:flex;flex-direction:row;justify-content:flex-start}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .main_menu ul.nav>li:not(.active) a{color:#6d7b84}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .main_menu ul.nav>li.active a{color:#0063f9}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .main_menu ul.nav>li a{display:block;text-decoration:none;padding:34px 40px 24px;font-style:normal;font-weight:600;font-size:16px}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .main_menu ul.nav>li a:hover,.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .main_menu ul.nav>li a:focus{color:#0063f9}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper{display:none}@media (max-width:1200px){.header_wrapper .projects_logo_wrapper .learn_python{padding:15px 20px}.header_wrapper .projects_logo_wrapper .learn_python .logo a .logo_title{font-size:18px;line-height:25px}.header_wrapper .projects_logo_wrapper .python_week{padding:15px 20px}.header_wrapper .projects_logo_wrapper .python_week .logo a{width:109px;height:35px}.header_wrapper .projects_logo_wrapper .moscow_python{padding:15px 20px}.header_wrapper .projects_logo_wrapper .moscow_python .logo a{width:131px;height:30px}.header_wrapper .main_menu_logo_wrapper .logo{margin-right:100px}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .main_menu ul.nav>li a{padding:20px 21px 28px;font-size:14px}}@media (max-width:750px){.header_wrapper{position:sticky;top:0}.header_wrapper .projects_logo_wrapper{display:none}.header_wrapper .main_menu_logo_wrapper{padding:17px 0}.header_wrapper .main_menu_logo_wrapper .logo{position:relative;z-index:2000;margin-right:100px}.header_wrapper .main_menu_logo_wrapper .mobile_menu_bg{opacity:0;position:fixed;z-index:500;pointer-events:none;top:0;right:0;width:100%;height:100%;background-color:#131313;transition:opacity .2s}body.mobile-menu-opened .header_wrapper .main_menu_logo_wrapper .mobile_menu_bg{pointer-events:auto;opacity:.6}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper{position:fixed;top:0;left:0;z-index:1000;height:100vh;width:100%;pointer-events:none}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .mobile_menu_btn{display:flex;justify-content:center;flex-direction:column;align-items:center;position:fixed;top:10px;right:15px;background-color:transparent;width:50px;height:50px;border-radius:50%;pointer-events:auto;z-index:2000}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .mobile_menu_btn span{display:block;width:25px;height:3px;background-color:#000;margin:2px 0;transition:transform .2s,opacity .2s}body.mobile-menu-opened .header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .mobile_menu_btn span:nth-child(1){transform:rotate(45deg) translate(4.4px,4.4px)}body.mobile-menu-opened .header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .mobile_menu_btn span:nth-child(2){opacity:0}body.mobile-menu-opened .header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .mobile_menu_btn span:nth-child(3){transform:rotate(-45deg) translate(5.25px,-5.25px)}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block{background-color:#fff;opacity:0;pointer-events:none;transition:opacity .2s;position:relative;top:0;height:100%}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .main_menu ul.nav{display:flex;flex-direction:column;justify-content:stretch;list-style:none;margin:0;padding:38vw 0 0;position:absolute}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .main_menu ul.nav li a{padding:18px 20px;font-size:18px;line-height:22px;color:#6d7b84}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper{position:absolute;bottom:0;display:flex;flex-direction:column;justify-content:flex-start;width:100%}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper h6{margin:0 0 10px 20px;font-style:normal;font-weight:400;font-size:10px;line-height:14px;color:#252526}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .learn_python{padding:24px 20px;background:#262525;width:100%}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .learn_python .logo a{display:block;text-decoration:none}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .learn_python .logo a .logo_title{margin:0;font-family:'Ubuntu',sans-serif;font-style:normal;font-weight:400;font-size:20px;line-height:30px;letter-spacing:.105em;text-transform:uppercase;color:#fff}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .learn_python .logo a .logo_title .blue{color:#2c91cb}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .learn_python .logo a .logo_title .yellow{color:#f2c94c}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .python_week{padding:21px 20px;background:#0f1686;width:100%}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .python_week .logo a{display:block;width:127px;height:38px}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .python_week .logo a img{display:block;width:100%;height:100%}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .moscow_python{padding:21px 20px;background:#f8f9fa;width:100%}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .moscow_python .logo a{display:block;width:162px;height:37px}.header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block .mobile_projects_logo_wrapper .moscow_python .logo a img{display:block;width:100%;height:100%}body.mobile-menu-opened .header_wrapper .main_menu_logo_wrapper .main_menu_wrapper .main_menu_block{opacity:1;pointer-events:auto}} +/*! HEADER END */ +/*! SECTION PROJECTS START */ +.projects_wrapper .projects_list{display:flex;flex-direction:row;justify-content:flex-start;min-height:623px}.projects_wrapper .projects_list h6{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:16px;color:#fff}.projects_wrapper .projects_list .descr{font-style:normal;font-weight:400;font-size:12px;line-height:16px;color:#fff}.projects_wrapper .projects_list .learn_python{padding:40px 50px;background:#262525;width:calc(100%/3)}.projects_wrapper .projects_list .learn_python .logo a{display:block;text-decoration:none}.projects_wrapper .projects_list .learn_python .logo a .logo_title{margin:33px 0 0;font-family:'Ubuntu',sans-serif;font-style:normal;font-weight:400;font-size:26px;line-height:35px;letter-spacing:.105em;text-transform:uppercase;color:#fff}.projects_wrapper .projects_list .learn_python .logo a .logo_title .blue{color:#2c91cb}.projects_wrapper .projects_list .learn_python .logo a .logo_title .yellow{color:#f2c94c}.projects_wrapper .projects_list .learn_python h4{margin:50px 0 20px;font-family:'Roboto',sans-serif;font-style:normal;font-weight:900;font-size:23px;line-height:31px;color:#fff}.projects_wrapper .projects_list .learn_python .date{font-family:'Ubuntu',sans-serif;font-style:normal;font-weight:400;font-size:24px;line-height:32px;color:#f2c94c}.projects_wrapper .projects_list .learn_python .date span{color:#fff}.projects_wrapper .projects_list .python_week{padding:40px 50px;background:#0f1686;width:calc(100%/3)}.projects_wrapper .projects_list .python_week .logo a{display:block;width:198px;height:61px;margin:20px 0 0;text-decoration:none}.projects_wrapper .projects_list .python_week .logo a img{display:block;width:100%;height:100%}.projects_wrapper .projects_list .python_week h4{margin:35px 0 20px;font-style:normal;font-weight:600;font-size:24px;line-height:32px;color:#fff}.projects_wrapper .projects_list .python_week .date{font-style:normal;font-weight:700;font-size:24px;line-height:32px;color:#fcd600}.projects_wrapper .projects_list .moscow_python{padding:40px 50px;background:#f8f9fa;width:calc(100%/3)}.projects_wrapper .projects_list .moscow_python h6{color:#252526}.projects_wrapper .projects_list .moscow_python .logo a{display:block;width:275px;height:61px;margin:20px 0 0;text-decoration:none}.projects_wrapper .projects_list .moscow_python .logo a img{display:block;width:100%;height:100%}.projects_wrapper .projects_list .moscow_python h4{font-family:'Roboto',sans-serif;font-style:normal;font-weight:700;font-size:24px;line-height:32px;color:#000}.projects_wrapper .projects_list .moscow_python .date{font-style:normal;font-weight:400;font-size:24px;line-height:32px;color:#33719c}.projects_wrapper .projects_list .moscow_python .descr{color:#252526}@media (max-width:1200px){.projects_wrapper .projects_list{min-height:452px}.projects_wrapper .projects_list h6{font-size:10px;line-height:14px}.projects_wrapper .projects_list .descr{font-size:10px;line-height:14px}.projects_wrapper .projects_list .learn_python{padding:46px 20px}.projects_wrapper .projects_list .learn_python .logo a .logo_title{margin:29px 0 0;font-size:22px;line-height:30px}.projects_wrapper .projects_list .learn_python h4{margin:37px 0 15px;font-size:14px;line-height:19px}.projects_wrapper .projects_list .learn_python .date{font-size:15px;line-height:20px}.projects_wrapper .projects_list .python_week{padding:46px 20px}.projects_wrapper .projects_list .python_week .logo a{width:155px;height:49px;margin:20px 0 0}.projects_wrapper .projects_list .python_week h4{margin:26px 0 16px;font-size:14px;line-height:19px}.projects_wrapper .projects_list .python_week .date{font-size:15px;line-height:20px}.projects_wrapper .projects_list .moscow_python{padding:46px 20px}.projects_wrapper .projects_list .moscow_python .logo a{display:block;width:162px;height:37px;margin:20px 0 0;text-decoration:none}.projects_wrapper .projects_list .moscow_python h4{font-size:14px;line-height:19px;margin:34px 0 16px}.projects_wrapper .projects_list .moscow_python .date{font-size:15px;line-height:20px}}@media (max-width:750px){.projects_wrapper .projects_list{display:block;flex-direction:unset;flex-wrap:unset;justify-content:unset;align-items:unset;position:relative}.projects_wrapper .projects_list .project_item{width:275px;height:475px}.projects_wrapper .projects_list h6{font-size:10px;line-height:14px}.projects_wrapper .projects_list .descr{font-size:10px;line-height:14px}.projects_wrapper .projects_list .learn_python{padding:46px 20px}.projects_wrapper .projects_list .learn_python .logo a .logo_title{margin:29px 0 0;font-size:22px;line-height:30px}.projects_wrapper .projects_list .learn_python h4{margin:37px 0 15px;font-size:14px;line-height:19px}.projects_wrapper .projects_list .learn_python .date{font-size:15px;line-height:20px}.projects_wrapper .projects_list .python_week{padding:46px 20px}.projects_wrapper .projects_list .python_week .logo a{width:155px;height:49px;margin:20px 0 0}.projects_wrapper .projects_list .python_week h4{margin:26px 0 16px;font-size:14px;line-height:19px}.projects_wrapper .projects_list .python_week .date{font-size:15px;line-height:20px}.projects_wrapper .projects_list .moscow_python{padding:46px 20px}.projects_wrapper .projects_list .moscow_python .logo a{display:block;width:162px;height:37px;margin:20px 0 0;text-decoration:none}.projects_wrapper .projects_list .moscow_python h4{font-size:14px;line-height:19px;margin:34px 0 16px}.projects_wrapper .projects_list .moscow_python .date{font-size:15px;line-height:20px}.projects_wrapper .projects_list ul.slick-dots{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center;align-items:center;position:absolute;bottom:100px;left:50%;transform:translate(-50%,0);margin:0;padding:0;list-style:none}.projects_wrapper .projects_list ul.slick-dots>li{margin:0;padding:5px}.projects_wrapper .projects_list ul.slick-dots>li button{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center;align-items:center;width:16px;height:16px;background-color:#0063f9;border-radius:50%;border:0;font-size:0;line-height:0;margin:0;padding:0;outline:0;box-shadow:none;cursor:pointer}.projects_wrapper .projects_list ul.slick-dots>li button:before{transition:transform .2s;content:'';display:block;width:8px;height:8px;background-color:#81a4ff;border-radius:50%;transform:scale(0)}.projects_wrapper .projects_list ul.slick-dots>li.slick-active button:before{transform:scale(1)}} +/*! SECTION PROJECTS END */ +/*! SECTION DISTRIBUTION FORM START */ +.distribution_form_wrapper{padding-top:110px}.distribution_form_wrapper .distribution{position:relative;z-index:5}.distribution_form_wrapper .distribution .distribution_form{position:absolute;z-index:5;bottom:0;left:93px;width:914px;background:#fff;padding:43px 22px;border-radius:10px;border:2px solid #fcfdfe;display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start}.distribution_form_wrapper .distribution .distribution_form .distribution_item{margin-right:25px}.distribution_form_wrapper .distribution .distribution_form .distribution_item img{display:block;width:120px;height:108px}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper p{margin:0 0 30px;max-width:430px;font-style:normal;font-weight:700;font-size:18px;line-height:26px;color:#040306}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper p span{color:#f7f0fe}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper form .forma{display:flex;flex-direction:row;justify-content:flex-start}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper form .forma input{padding:22px 19px;display:block;width:388px;background:#f8f9fa;border-top:1px solid #edeff1;border-bottom:1px solid #edeff1;border-left:1px solid #edeff1;border-right:none;box-sizing:border-box;border-radius:6px 0 0 6px}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper form .forma input::placeholder{font-family:'Montserrat',sans-serif;font-style:normal;font-weight:600;font-size:14px;line-height:17px;color:#6d7b84}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper form .forma .btn_distr{display:block;padding:22px 36px;font-family:'Montserrat',sans-serif;font-style:normal;font-weight:700;font-size:14px;line-height:17px;text-transform:uppercase;color:#000;background:#fff;border-radius:0 6px 6px 0;border-top:1px solid #edeff1;border-bottom:1px solid #edeff1;border-right:1px solid #edeff1;border-left:none;cursor:pointer}.distribution_form_wrapper .distribution .distribution_form:after{content:'';display:block;position:absolute;z-index:0;background-image:url(../img/decor.png);background-repeat:no-repeat;top:100%;left:25%;width:384px;height:72px}@media (max-width:1200px){.distribution_form_wrapper{padding-top:110px}.distribution_form_wrapper .distribution{position:relative;z-index:5}.distribution_form_wrapper .distribution .distribution_form{position:absolute;z-index:5;bottom:0;left:93px;width:606px;background:#fff;padding:26px 20px}.distribution_form_wrapper .distribution .distribution_form .distribution_item{margin-right:21px}.distribution_form_wrapper .distribution .distribution_form .distribution_item img{width:87px;height:87px}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper p{margin:0 0 13px;max-width:331px;font-size:14px;line-height:20px}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper form .forma input{padding:22px 19px;width:278px}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper form .forma input::placeholder{font-size:12px;line-height:14px}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper form .forma .btn_distr{padding:20px 18px;font-size:12px;line-height:14px}.distribution_form_wrapper .distribution .distribution_form:after{content:'';display:block;position:absolute;z-index:0;background-image:url(../img/decor.png);background-repeat:no-repeat;top:100%;left:25%;width:384px;height:72px}}@media (max-width:750px){.distribution_form_wrapper{padding-top:50px;width:100%}.distribution_form_wrapper .distribution{position:relative;z-index:5}.distribution_form_wrapper .distribution .distribution_form{position:absolute;z-index:5;bottom:-10px;left:0;width:100%;background:#fff;padding:20px 15px;display:block}.distribution_form_wrapper .distribution .distribution_form .distribution_item{margin-right:21px}.distribution_form_wrapper .distribution .distribution_form .distribution_item img{position:absolute;width:40px;height:40px}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper p{margin:0 0 13px 60px;max-width:unset;font-size:12px;line-height:17px}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper form .forma input{padding:12px 10px;width:100%}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper form .forma input::placeholder{font-size:10px;line-height:12px}.distribution_form_wrapper .distribution .distribution_form .distribution_item .form_wrapper form .forma .btn_distr{padding:12px 18px;font-size:10px;line-height:12px}.distribution_form_wrapper .distribution .distribution_form:after{content:'';display:block;position:absolute;z-index:0;background-image:url(../img/decor.png);background-repeat:no-repeat;background-position:bottom;top:100%;left:5px;width:100%;height:42px}} +/*! SECTION DISTRIBUTION FORM END */ +/*! SECTION POSTS START */ +.posts_wrapper .posts_list{padding:0 0 60px;border-bottom:3px solid #f4f4f4;display:flex;flex-direction:row;justify-content:space-between;align-items:flex-start}.posts_wrapper .posts_list .posts_item h1{font-size:26px;line-height:42px;margin:0}.posts_wrapper .posts_list .posts_item h4{margin:0 0 15px;font-style:normal;font-weight:700;font-size:14px;line-height:21px;color:#000}.posts_wrapper .posts_list .posts_item ul.tags{list-style:none;margin:0;padding:0}.posts_wrapper .posts_list .posts_item ul.tags li a{display:block;text-decoration:none;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#404b59;margin-bottom:11px}.posts_wrapper .posts_list .posts_item ul.tags li a:hover,.posts_wrapper .posts_list .posts_item ul.tags li a:focus{color:#0063f9}.posts_wrapper .posts_list .posts_item .sponsor_wrapper{padding:40px 0 0}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_title{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;margin-bottom:20px}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_title .title{max-width:98px;font-style:normal;font-weight:700;font-size:14px;line-height:17px;color:#000;margin-right:10px}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_title .heart .fa{color:#f64a4a;font-size:22px}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_list .sponsor_item{margin-bottom:10px}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_list .sponsor_item img{display:block;width:148px;height:76px}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_list .sponsor_item .sponsor_name{margin:0;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#404b59}.posts_wrapper .posts_list .posts_item .articles{padding:35px 0 0}.posts_wrapper .posts_list .posts_item .articles article{margin:0 0 35px}.posts_wrapper .posts_list .posts_item .articles article a{display:block;text-decoration:none}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content .avatar{margin-right:10px}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content .avatar img{display:block;width:32px;height:32px}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content .user_info .name{font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#000}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content .user_info .name .job{color:#a7aeb3;font-weight:400;margin-left:5px;font-size:13px}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content .user_info .date{font-style:normal;font-weight:500;font-size:10px;line-height:14px;color:#a7aeb3}.posts_wrapper .posts_list .posts_item .articles article a .article_title{font-style:normal;font-weight:700;font-size:20px;line-height:24px;color:#000;margin:10px 0 0}.posts_wrapper .posts_list .posts_item .articles article ul.article_tags{list-style:none;margin:0 -5px;padding:0;display:flex;flex-direction:row;justify-content:flex-start}.posts_wrapper .posts_list .posts_item .articles article ul.article_tags li a{margin:0 5px;display:block;text-decoration:none;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#000}.posts_wrapper .posts_list .posts_item .articles article ul.article_tags li a:hover,.posts_wrapper .posts_list .posts_item .articles article ul.article_tags li a:focus{color:#0063f9}.posts_wrapper .posts_list .posts_item .articles article .article_descr{margin:10px 0 0;max-width:510px;font-style:normal;font-weight:400;font-size:12px;line-height:14px;color:#04202f}.posts_wrapper .posts_list .posts_item .articles .bonus_mobile{display:none}.posts_wrapper .posts_list .posts_item .bonus a{display:block;width:260px;height:365px;text-decoration:none}.posts_wrapper .posts_list .posts_item .bonus a img{display:block;width:100%;height:100%}@media (max-width:1200px){.posts_wrapper .posts_list{display:grid;grid-template-columns:160px auto;grid-template-rows:auto auto;grid-gap:20px}.posts_wrapper .posts_list .posts_item.sec_col{grid-row:1/span2;grid-column:2/3}.posts_wrapper .posts_list .posts_item .sponsor_wrapper{padding:20px 0 0}.posts_wrapper .posts_list .posts_item .bonus a{width:148px;height:203px}}@media (max-width:750px){.posts_wrapper .posts_list{padding:0 0 40px;display:block;flex-direction:unset;justify-content:unset;align-items:unset}.posts_wrapper .posts_list .posts_item h1{margin:20px 0 0;font-size:20px;line-height:32px}.posts_wrapper .posts_list .posts_item h4{margin:0 0 11px;font-size:14px;line-height:21px}.posts_wrapper .posts_list .posts_item ul.tags{list-style:none;margin:0;padding:0;display:flex;flex-direction:row;justify-content:flex-start;flex-wrap:wrap}.posts_wrapper .posts_list .posts_item ul.tags li a{font-size:12px;line-height:18px;margin-bottom:11px;margin-right:2px}.posts_wrapper .posts_list .posts_item .sponsor_wrapper{padding:40px 0 0}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_title{margin-bottom:16px}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_title .title{max-width:unset}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_title .heart .fa{color:#f64a4a;font-size:17px}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_list{display:flex;flex-direction:row;overflow-x:auto;scroll-snap-type:x mandatory}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_list .sponsor_item{margin-bottom:10px;scroll-snap-align:start}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_list .sponsor_item img{display:block;width:148px;height:76px}.posts_wrapper .posts_list .posts_item .sponsor_wrapper .sponsor_list .sponsor_item .sponsor_name{margin:0;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#404b59}.posts_wrapper .posts_list .posts_item .articles{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}.posts_wrapper .posts_list .posts_item .articles article{margin:0 0 25px}.posts_wrapper .posts_list .posts_item .articles article a{display:block;text-decoration:none}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content .avatar{margin-right:10px}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content .avatar img{width:29px;height:29px}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content .user_info .name{font-size:10px;line-height:15px}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content .user_info .name .job{margin-left:3px;font-size:12px}.posts_wrapper .posts_list .posts_item .articles article a .user_info_content .user_info .date{font-size:8px;line-height:11px}.posts_wrapper .posts_list .posts_item .articles article a .article_title{font-size:16px;line-height:19px;margin:6px 0 0}.posts_wrapper .posts_list .posts_item .articles article .article_descr{margin:10px 0 0;max-width:510px;font-style:normal;font-weight:400;font-size:12px;line-height:14px;color:#04202f}.posts_wrapper .posts_list .posts_item .articles .bonus_mobile{display:block;width:100%;margin:0 0 25px}.posts_wrapper .posts_list .posts_item .articles .bonus_mobile a{display:block;width:100%;height:170px;text-decoration:none}.posts_wrapper .posts_list .posts_item .articles .bonus_mobile a img{display:block;width:100%;height:100%;object-fit:cover;object-position:center}.posts_wrapper .posts_list .posts_item .articles article{order:3}.posts_wrapper .posts_list .posts_item .articles article:nth-child(-n+5){order:1}.posts_wrapper .posts_list .posts_item .articles .bonus_mobile{order:2}.posts_wrapper .posts_list .posts_item .bonus{display:none}} +/*! SECTION POSTS END */ +/*! SECTION BADGES START */ +.badges_wrapper .badges_list{border-bottom:3px solid #f4f4f4;padding:30px 0;display:flex;flex-direction:row;justify-content:flex-start}.badges_wrapper .badges_list .badges_item{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.badges_wrapper .badges_list .badges_item img{display:block;width:74px;height:74px;margin-right:10px}.badges_wrapper .badges_list .badges_item p{margin:0;font-style:normal;font-weight:500;font-size:14px;line-height:21px;color:#404b59}.badges_wrapper .badges_list .badges_item+.badges_item{margin-left:100px}@media (max-width:1200px){.badges_wrapper .badges_list .badges_item img{width:56px;height:56px}.badges_wrapper .badges_list .badges_item p{font-size:12px;line-height:18px}.badges_wrapper .badges_list .badges_item+.badges_item{margin-left:26px}}@media (max-width:750px){.badges_wrapper .badges_list{padding:30px 0;display:grid;grid-template-rows:1fr 1fr;grid-template-columns:1fr 1fr;grid-gap:25px}.badges_wrapper .badges_list .badges_item img{width:35px;height:35px}.badges_wrapper .badges_list .badges_item p{font-size:12px;line-height:18px}.badges_wrapper .badges_list .badges_item+.badges_item{margin-left:0}} +/*! SECTION BADGES END */ +/*! SECTION EVENTS START */ +.events_wrapper{padding:40px 0 120px}.events_wrapper .events_list{display:flex;flex-direction:row;justify-content:flex-start;flex-wrap:wrap;margin:0 -10px}.events_wrapper .events_list .events_item{margin:0 10px 20px;width:calc(100%/2 - 20px);padding:20px;border:1px solid #e7f0fe;border-radius:18px}.events_wrapper .events_list .events_item .event_info{display:flex;flex-direction:row;justify-content:flex-start;position:relative}.events_wrapper .events_list .events_item .event_info .event_logo{width:111px;height:44px}.events_wrapper .events_list .events_item .event_info .event_logo img{display:block;width:100%;height:100%}.events_wrapper .events_list .events_item .event_info .event_date{margin:0 14px;padding:0 14px;border-right:1px solid #0063f9;border-left:1px solid #0063f9}.events_wrapper .events_list .events_item .event_info .event_date .date{margin:0;font-style:normal;font-weight:400;font-size:26px;line-height:31px;text-align:center;color:#04202f}.events_wrapper .events_list .events_item .event_info .event_date .month{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:14px;text-align:center;color:#04202f}.events_wrapper .events_list .events_item .event_info .event_location .place{margin:8px 0;font-style:normal;font-weight:400;font-size:12px;line-height:14px;color:#04202f}.events_wrapper .events_list .events_item .event_info .event_location .day{font-style:normal;font-weight:400;font-size:12px;line-height:14px;color:#04202f}.events_wrapper .events_list .events_item .event_info .price{position:absolute;right:-21px;top:7px;display:block;padding:4px 15px;width:84px;background:#023d8c;border:1px solid #05337e;border-radius:25px 0 0 25px;font-style:normal;font-weight:600;font-size:14px;line-height:17px;color:#fff}.events_wrapper .events_list .events_item .event_title{margin:20px 0 0;font-style:normal;font-weight:600;font-size:18px;line-height:26px;color:#04202f}.events_wrapper .events_list .events_item .event_descr{margin:0 0 20px;font-style:normal;font-weight:400;font-size:12px;line-height:14px;color:#04202f}.events_wrapper .events_list .events_item .event_detail{display:inline-block;text-decoration:none;background:#04202f;border:1px solid #010815;border-radius:23px;padding:10px 20px;font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:14px;line-height:17px;color:#fff;transition:box-shadow .2s}.events_wrapper .events_list .events_item .event_detail:hover{box-shadow:1px 1px 9px 2px rgba(7,62,99,.66)}@media (max-width:1200px){.events_wrapper{padding:40px 0 90px}.events_wrapper .events_list .events_item .event_info{display:grid;grid-template-columns:auto auto;grid-template-rows:auto auto;grid-row-gap:15px}.events_wrapper .events_list .events_item .event_info .event_date{grid-column:1/2;grid-row:2/3;margin:0 14px 0 0;padding:0;border-left:none}.events_wrapper .events_list .events_item .event_info .event_location{grid-column:2/3;grid-row:2/3}}@media (max-width:750px){.events_wrapper{padding:20px 0 55px}.events_wrapper .events_list{display:block;flex-direction:unset;justify-content:unset;flex-wrap:unset;margin:0}.events_wrapper .events_list .events_item{margin:0 0 20px;width:100%;padding:20px;border:1px solid #e7f0fe;border-radius:18px}.events_wrapper .events_list .events_item .event_info{display:grid;grid-template-columns:auto auto;grid-template-rows:auto auto;grid-row-gap:15px}.events_wrapper .events_list .events_item .event_info .event_date{grid-column:1/2;grid-row:2/3;margin:0 14px 0 0;padding:0;border-left:none}.events_wrapper .events_list .events_item .event_info .event_location{grid-column:2/3;grid-row:2/3}} +/*! SECTION EVENTS END */ +/*! SECTION SEARCH START */ +.search_wrapper{padding:35px 0}.search_wrapper .search_block{position:relative}.search_wrapper .search_block input{display:block;padding:23px 20px;width:100%;background:#fff;border:2px solid #e7f0fe;border-radius:8px}.search_wrapper .search_block input::placeholder{font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:14px;line-height:17px;color:#a7aeb3}.search_wrapper .search_block button{padding:23px 45px;border:0;outline:0;background:0 0;cursor:pointer;width:45px;height:100%;position:absolute;top:0;right:0}.search_wrapper .search_block button img{display:block;width:20px;height:20px}@media (max-width:750px){.search_wrapper{padding:17px 0 23px}.search_wrapper .search_block{position:relative}.search_wrapper .search_block input{display:block;padding:18px 40px}.search_wrapper .search_block input::placeholder{font-size:12px;line-height:14px}} +/*! SECTION SEARCH END */ +/*! SECTION EVENTS PAGE SEARCH START */ +.events_page_search_wrapper{padding:35px 0}.events_page_search_wrapper .form_wrapper form .forma{display:flex;flex-direction:row;justify-content:space-between;margin:0 -10px}.events_page_search_wrapper .form_wrapper form .forma .form-group{display:flex;flex-direction:row;justify-content:stretch;margin:0 10px}.events_page_search_wrapper .form_wrapper form .forma .form-group .search_block{position:relative;width:606px}.events_page_search_wrapper .form_wrapper form .forma .form-group .search_block input{display:block;padding:23px 20px;width:100%;background:#fff;border:2px solid #e7f0fe;border-radius:8px}.events_page_search_wrapper .form_wrapper form .forma .form-group .search_block input::placeholder{font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:14px;line-height:17px;color:#a7aeb3}.events_page_search_wrapper .form_wrapper form .forma .form-group .search_block button{padding:23px 45px;border:0;outline:0;background:0 0;cursor:pointer;width:45px;height:100%;position:absolute;top:0;right:0}.events_page_search_wrapper .form_wrapper form .forma .form-group .search_block button img{display:block;width:20px;height:20px}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper{width:260px;background:#fff}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper select{display:block;width:100%}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2{display:block;width:100%;height:100%;border:2px solid #e7f0fe;border-radius:8px}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2 .select2-selection{border:0;background-color:#fff;outline:0}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2 .select2-selection__rendered{padding:17px 20px;font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:14px;line-height:28px;color:#04202f}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2 .select2-selection__arrow{top:30%;right:25px}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2 .select2-selection__placeholder{font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:14px;line-height:17px;color:#04202f}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2-container .select2-dropdown{border:0}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2-container .select2-dropdown .select2-results{border:2px solid #e7f0fe;box-shadow:0 0 27px rgba(0,2,4,.09);background-color:#fff;padding:15px;margin-top:-5px;border-radius:0 0 8px 8px}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2-container .select2-dropdown .select2-results .select2-results__option{font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:14px;line-height:17px;color:#04202f}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2-container .select2-dropdown .select2-results .select2-results__option--highlighted[aria-selected]{color:#0063f9;background-color:#fff}.events_page_search_wrapper .form_wrapper form .forma .form-group .filter{display:flex;flex-direction:row;justify-content:flex-start;border:2px solid #e7f0fe;border-radius:8px;margin-right:20px}.events_page_search_wrapper .form_wrapper form .forma .form-group .filter .filter_item label{transition:background-color .2s,color .2s;display:block;margin:0;padding:22px 8px;font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:14px;line-height:normal;color:#04202f;cursor:pointer}.events_page_search_wrapper .form_wrapper form .forma .form-group .filter .filter_item input[type=radio]{display:none}.events_page_search_wrapper .form_wrapper form .forma .form-group .filter .filter_item input[type=radio]:checked+label{color:#0063f9;background:rgba(0,0,255,.025)}.events_page_search_wrapper .form_wrapper form .forma .form-group .filter .filter_item:first-child label{padding-left:20px}.events_page_search_wrapper .form_wrapper form .forma .form-group .filter .filter_item:last-child label{padding-right:20px}@media (max-width:1200px){.events_page_search_wrapper{padding:20px 0 30px}.events_page_search_wrapper .form_wrapper form .forma{display:block;flex-direction:unset;justify-content:unset;margin:0}.events_page_search_wrapper .form_wrapper form .forma .form-group{margin:0 10px 20px}.events_page_search_wrapper .form_wrapper form .forma .form-group .search_block{width:100%}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper{width:514px}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2-selection__rendered{font-size:12px;line-height:26px}}@media (max-width:750px){.events_page_search_wrapper{padding:17px 0 23px}.events_page_search_wrapper .form_wrapper form .forma{display:block;flex-direction:unset;justify-content:unset;margin:0}.events_page_search_wrapper .form_wrapper form .forma .form-group{margin:0 0 15px}.events_page_search_wrapper .form_wrapper form .forma .form-group .search_block{width:100%}.events_page_search_wrapper .form_wrapper form .forma .form-group .search_block input{padding:19px 15px}.events_page_search_wrapper .form_wrapper form .forma .form-group .search_block input::placeholder{font-size:12px;line-height:14px}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper{width:100%}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2 .select2-selection__rendered{padding:17px 10px;font-size:12px;line-height:23px}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2 .select2-selection__arrow{top:30%;right:10px}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2 .select2-selection__placeholder{font-size:12px;line-height:23px}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2-container .select2-dropdown{border:0}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2-container .select2-dropdown .select2-results{padding:10px;margin-top:-5px}.events_page_search_wrapper .form_wrapper form .forma .form-group .select_wrapper .select2-container .select2-dropdown .select2-results .select2-results__option{font-size:12px;line-height:14px}.events_page_search_wrapper .form_wrapper form .forma .form-group .filter{margin-right:10px}.events_page_search_wrapper .form_wrapper form .forma .form-group .filter .filter_item label{padding:21px 7px;font-size:12px}.events_page_search_wrapper .form_wrapper form .forma .form-group .filter .filter_item:first-child label{padding-left:10px}.events_page_search_wrapper .form_wrapper form .forma .form-group .filter .filter_item:last-child label{padding-right:10px}} +/*! SECTION EVENTS PAGE SEARCH END */ +/*! SECTION EVENTS PAGE EVENTS START */ +.events_page_events_wrapper .events_list{padding:0 0 60px;border-bottom:3px solid #f4f4f4;display:flex;flex-direction:row;justify-content:space-between;align-items:flex-start}.events_page_events_wrapper .events_list .events_item h1{font-size:26px;line-height:42px;margin:0 0 30px}.events_page_events_wrapper .events_list .events_item h4{margin:0 0 15px;font-style:normal;font-weight:700;font-size:14px;line-height:21px;color:#000}.events_page_events_wrapper .events_list .events_item ul.tags{list-style:none;margin:0;padding:0}.events_page_events_wrapper .events_list .events_item ul.tags li a{display:block;text-decoration:none;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#404b59;margin-bottom:11px}.events_page_events_wrapper .events_list .events_item ul.tags li a:hover,.events_page_events_wrapper .events_list .events_item ul.tags li a:focus{color:#0063f9}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper{padding:40px 0 0}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_title{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;margin-bottom:20px}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_title .title{max-width:98px;font-style:normal;font-weight:700;font-size:14px;line-height:17px;color:#000;margin-right:10px}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_title .heart .fa{color:#f64a4a;font-size:22px}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_list .sponsor_item{margin-bottom:10px}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_list .sponsor_item img{display:block;width:148px;height:76px}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_list .sponsor_item .sponsor_name{margin:0;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#404b59}.events_page_events_wrapper .events_list .events_item .articles article{margin:0 0 35px}.events_page_events_wrapper .events_list .events_item .articles article .event{border:1px solid #e7f0fe;border-radius:18px}.events_page_events_wrapper .events_list .events_item .articles article .event .image_wrapper{width:100%}.events_page_events_wrapper .events_list .events_item .articles article .event .image_wrapper img{display:block;border-radius:18px 18px 0 0;width:100%}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper{padding:20px}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info{display:flex;flex-direction:row;justify-content:flex-start;position:relative}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info .event_logo{width:111px;height:44px}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info .event_logo img{display:block;width:100%;height:100%}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info .event_date{margin:0 14px;padding:0 14px;border-right:1px solid #0063f9;border-left:1px solid #0063f9}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info .event_date .date{margin:0;font-style:normal;font-weight:400;font-size:26px;line-height:31px;text-align:center;color:#04202f}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info .event_date .month{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:14px;text-align:center;color:#04202f}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info .event_location .place{margin:8px 0;font-style:normal;font-weight:400;font-size:12px;line-height:14px;color:#04202f}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info .event_location .day{font-style:normal;font-weight:400;font-size:12px;line-height:14px;color:#04202f}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info .price{position:absolute;right:-21px;top:7px;display:block;padding:4px 15px;width:84px;background:#023d8c;border:1px solid #05337e;border-radius:25px 0 0 25px;font-style:normal;font-weight:600;font-size:14px;line-height:17px;color:#fff}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_title{margin:20px 0 0;font-style:normal;font-weight:600;font-size:18px;line-height:26px;color:#04202f}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_descr{max-width:540px;margin:0 0 20px;font-style:normal;font-weight:400;font-size:12px;line-height:14px;color:#04202f}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_detail{display:inline-block;text-decoration:none;background:#04202f;border:1px solid #010815;border-radius:23px;padding:10px 20px;font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:14px;line-height:17px;color:#fff;transition:box-shadow .2s}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_detail:hover{box-shadow:1px 1px 9px 2px rgba(7,62,99,.66)}.events_page_events_wrapper .events_list .events_item .articles .bonus_mobile{display:none}.events_page_events_wrapper .events_list .events_item .bonus a{display:block;width:260px;height:365px;text-decoration:none}.events_page_events_wrapper .events_list .events_item .bonus a img{display:block;width:100%;height:100%}@media (max-width:1200px){.events_page_events_wrapper .events_list{display:grid;grid-template-columns:160px auto;grid-template-rows:auto auto;grid-gap:20px}.events_page_events_wrapper .events_list .events_item.sec_col{grid-row:1/span2;grid-column:2/3}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper{padding:20px 0 0}.events_page_events_wrapper .events_list .events_item .bonus a{width:148px;height:203px}}@media (max-width:750px){.events_page_events_wrapper .events_list{padding:0 0 40px;display:block;flex-direction:unset;justify-content:unset;align-items:unset}.events_page_events_wrapper .events_list .events_item h1{margin-top:20px;font-size:20px;line-height:32px}.events_page_events_wrapper .events_list .events_item h4{margin:0 0 11px;font-size:14px;line-height:21px}.events_page_events_wrapper .events_list .events_item ul.tags{list-style:none;margin:0;padding:0;display:flex;flex-direction:row;justify-content:flex-start;flex-wrap:wrap}.events_page_events_wrapper .events_list .events_item ul.tags li a{font-size:12px;line-height:18px;margin-bottom:11px;margin-right:2px}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper{padding:40px 0 0}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_title{margin-bottom:16px}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_title .title{max-width:unset}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_title .heart .fa{color:#f64a4a;font-size:17px}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_list{display:flex;flex-direction:row;overflow-x:auto;scroll-snap-type:x mandatory}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_list .sponsor_item{margin-bottom:10px;scroll-snap-align:start}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_list .sponsor_item img{display:block;width:148px;height:76px}.events_page_events_wrapper .events_list .events_item .sponsor_wrapper .sponsor_list .sponsor_item .sponsor_name{margin:0;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#404b59}.events_page_events_wrapper .events_list .events_item .articles{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}.events_page_events_wrapper .events_list .events_item .articles article{margin:0 0 25px}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info{display:grid;grid-template-columns:auto auto;grid-template-rows:auto auto;grid-row-gap:15px}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info .event_date{grid-column:1/2;grid-row:2/3;margin:0 14px 0 0;padding:0;border-left:none}.events_page_events_wrapper .events_list .events_item .articles article .event .content_wrapper .event_info .event_location{grid-column:2/3;grid-row:2/3}.events_page_events_wrapper .events_list .events_item .articles .bonus_mobile{display:block;width:100%;margin:0 0 25px}.events_page_events_wrapper .events_list .events_item .articles .bonus_mobile a{display:block;width:100%;height:170px;text-decoration:none}.events_page_events_wrapper .events_list .events_item .articles .bonus_mobile a img{display:block;width:100%;height:100%;object-fit:cover;object-position:center}.events_page_events_wrapper .events_list .events_item .articles article{order:3}.events_page_events_wrapper .events_list .events_item .articles article:nth-child(-n+3){order:1}.events_page_events_wrapper .events_list .events_item .articles .bonus_mobile{order:2}.events_page_events_wrapper .events_list .events_item .bonus{display:none}} +/*! SECTION EVENTS PAGE EVENTS END */ +/*! SECTION EVENTS PAGE LAST POSTS START */ +.events_page_posts{padding:35px 0 120px}.events_page_posts .posts_list{display:flex;flex-direction:row;justify-content:flex-start;flex-wrap:wrap;margin:0 -10px 35px}.events_page_posts .posts_list .posts_item{background:#fff;border:1px solid #e7f0fe;border-radius:6px;margin:0 10px 20px;padding:20px;width:calc(100%/2 - 20px)}.events_page_posts .posts_list .posts_item a{display:block;text-decoration:none}.events_page_posts .posts_list .posts_item a .user_info_content{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.events_page_posts .posts_list .posts_item a .user_info_content .avatar{margin-right:10px}.events_page_posts .posts_list .posts_item a .user_info_content .avatar img{display:block;width:32px;height:32px}.events_page_posts .posts_list .posts_item a .user_info_content .user_info .name{font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#000}.events_page_posts .posts_list .posts_item a .user_info_content .user_info .name .job{color:#a7aeb3;font-weight:400;margin-left:5px;font-size:13px}.events_page_posts .posts_list .posts_item a .user_info_content .user_info .date{font-style:normal;font-weight:500;font-size:10px;line-height:14px;color:#a7aeb3}.events_page_posts .posts_list .posts_item a .article_title{font-style:normal;font-weight:700;font-size:20px;line-height:24px;color:#000;margin:10px 0 0}.events_page_posts .posts_list .posts_item ul.article_tags{list-style:none;margin:0 -5px;padding:0;display:flex;flex-direction:row;justify-content:flex-start}.events_page_posts .posts_list .posts_item ul.article_tags li a{margin:0 5px;display:block;text-decoration:none;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#000}.events_page_posts .posts_list .posts_item ul.article_tags li a:hover,.events_page_posts .posts_list .posts_item ul.article_tags li a:focus{color:#0063f9}.events_page_posts .posts_list .posts_item .article_descr{margin:10px 0 0;max-width:510px;font-style:normal;font-weight:400;font-size:12px;line-height:14px;color:#04202f}@media (max-width:1200px){.events_page_posts{padding:20px 0 90px}}@media (max-width:750px){.events_page_posts{padding:15px 0 55px}.events_page_posts .posts_list{display:block;flex-direction:unset;justify-content:unset;flex-wrap:unset;margin:0 0 20px}.events_page_posts .posts_list .posts_item{margin:0 0 20px;padding:15px;width:100%}.events_page_posts .posts_list .posts_item a .article_title{font-size:18px;line-height:22px}} +/*! SECTION EVENTS PAGE LAST POSTS END */ +/*! SECTION POST PREVIEW CAROUSEL START */ +.post_preview_carousel_wrapper{position:relative}.post_preview_carousel_wrapper .post_preview_carousel img{display:block;height:296px;width:100%}.post_preview_carousel_wrapper .post_preview_carousel .carousel_item .carousel_content_wrapper{position:absolute;top:56px;max-width:635px}.post_preview_carousel_wrapper .post_preview_carousel .carousel_item .carousel_content_wrapper .title{margin:0 0 20px 0;font-style:normal;font-weight:600;font-size:26px;line-height:42px;color:#fff;position:relative}.post_preview_carousel_wrapper .post_preview_carousel .carousel_item .carousel_content_wrapper .descr{font-style:normal;font-weight:500;font-size:16px;line-height:26px;color:#fff}.post_preview_carousel_wrapper .slick-arrow{border:0;outline:0;width:202px;background:0 0;position:absolute;top:70px;cursor:pointer;padding:15px 0}.post_preview_carousel_wrapper .slick-arrow span{font-family:'Montserrat',sans-serif;font-style:normal;font-weight:400;font-size:16px;line-height:26px;color:#fff}.post_preview_carousel_wrapper .slick-arrow .fa{color:#fff;font-size:14px}.post_preview_carousel_wrapper .slick-arrow.slick-next{right:17vw}@media (max-width:1200px){.post_preview_carousel_wrapper .post_preview_carousel img{height:231px}.post_preview_carousel_wrapper .post_preview_carousel .carousel_item .carousel_content_wrapper{top:35px;max-width:450px}.post_preview_carousel_wrapper .post_preview_carousel .carousel_item .carousel_content_wrapper .title{margin:0 0 15px 0;font-size:22px;line-height:35px}.post_preview_carousel_wrapper .post_preview_carousel .carousel_item .carousel_content_wrapper .descr{font-size:14px;line-height:22px}.post_preview_carousel_wrapper .slick-arrow{width:120px;top:40px;padding:10px 0;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.post_preview_carousel_wrapper .slick-arrow span{font-size:14px;line-height:22px}.post_preview_carousel_wrapper .slick-arrow .fa{font-size:12px}.post_preview_carousel_wrapper .slick-arrow.slick-next{right:20vw}}@media (max-width:750px){.post_preview_carousel_wrapper .post_preview_carousel img{height:282px}.post_preview_carousel_wrapper .post_preview_carousel .carousel_item .carousel_content_wrapper{top:25px;max-width:335px}.post_preview_carousel_wrapper .post_preview_carousel .carousel_item .carousel_content_wrapper .title{margin:0 0 10px 0;font-size:20px;line-height:32px}.post_preview_carousel_wrapper .post_preview_carousel .carousel_item .carousel_content_wrapper .descr{font-size:14px;line-height:22px}.post_preview_carousel_wrapper .slick-arrow{width:170px;top:unset;bottom:45px;padding:10px 0;display:block;flex-direction:row;justify-content:flex-start;align-items:center}.post_preview_carousel_wrapper .slick-arrow span{font-size:14px;line-height:22px}.post_preview_carousel_wrapper .slick-arrow .fa{font-size:12px}.post_preview_carousel_wrapper .slick-arrow.slick-next{right:22px}} +/*! SECTION POST PREVIEW CAROUSEL END */ +/*! SECTION SINGLE POST CONTENT START */ +.single_post_content_wrapper{padding:40px 0 80px;position:relative}.single_post_content_wrapper .single_post_content{display:flex;flex-direction:row;justify-content:space-between;align-items:flex-start;margin:0 -50px}.single_post_content_wrapper .single_post_content .single_post{margin:0 50px}.single_post_content_wrapper .single_post_content .single_post .mobile_posted{display:none}.single_post_content_wrapper .single_post_content .single_post ul.article_tags{list-style:none;margin:0 -5px;padding:0;display:flex;flex-direction:row;justify-content:flex-start}.single_post_content_wrapper .single_post_content .single_post ul.article_tags li a{margin:0 5px;display:block;text-decoration:none;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#000}.single_post_content_wrapper .single_post_content .single_post ul.article_tags li a:hover,.single_post_content_wrapper .single_post_content .single_post ul.article_tags li a:focus{color:#0063f9}.single_post_content_wrapper .single_post_content .single_post .single_post_text p{font-style:normal;font-weight:500;font-size:14px;line-height:20px;color:#242424}.single_post_content_wrapper .single_post_content .single_post .single_post_text h3{font-style:normal;font-weight:800;font-size:20px;line-height:28px;letter-spacing:.015em;color:#010519}.single_post_content_wrapper .single_post_content .single_post .single_post_text h4{font-style:normal;font-weight:500;font-size:18px;line-height:25px;color:#010519}.single_post_content_wrapper .single_post_content .single_post .single_post_text pre{background:#242424;padding:35px 25px}.single_post_content_wrapper .single_post_content .single_post .single_post_text pre code{font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#fff}.single_post_content_wrapper .single_post_content .single_post .single_post_text img{display:block;width:100%}.single_post_content_wrapper .single_post_content .single_post .single_post_text ul{list-style:none;margin:0;padding:0}.single_post_content_wrapper .single_post_content .single_post .single_post_text ul li{font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:14px;line-height:20px;color:#242424;position:relative;margin:0 0 20px 40px}.single_post_content_wrapper .single_post_content .single_post .single_post_text ul li:before{content:'';display:block;position:absolute;top:9px;left:-40px;width:23px;height:1px;background:#445764}.single_post_content_wrapper .single_post_content .user_info_wrapper{margin:-165px 50px 0}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info{padding:20px;background:#fff}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;margin-bottom:15px}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .personal_info{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .personal_info img{display:block}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .personal_info .user_name{font-style:normal;font-weight:700;font-size:16px;line-height:21px;color:#000;margin:0 15px}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .btn.subscribe{background:#0063f9;padding:10px 20px;font-style:normal;font-weight:700;font-size:10px;line-height:12px;text-align:center;text-transform:uppercase;color:#fff}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .btn.subscribe:hover{box-shadow:1px 1px 9px 2px rgba(0,99,249,.36)}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info dl{margin:0;padding:0}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info dl dt{font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#a7aeb3}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info dl dd{margin:0 0 10px;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#1c7ff8}.single_post_content_wrapper .single_post_content .user_info_wrapper .posted{padding:30px 20px 10px;background:#f8f9fa}.single_post_content_wrapper .single_post_content .user_info_wrapper .posted dl{margin:0;padding:0}.single_post_content_wrapper .single_post_content .user_info_wrapper .posted dl dt{font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:14px;line-height:21px;color:#a7aeb3}.single_post_content_wrapper .single_post_content .user_info_wrapper .posted dl dd{margin:0 0 20px;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:14px;line-height:21px;color:#1c7ff8}.single_post_content_wrapper .single_post_content .user_info_wrapper .share{padding:40px 20px}.single_post_content_wrapper .single_post_content .user_info_wrapper .share h2{margin:0;font-style:normal;font-weight:700;font-size:14px;line-height:21px;color:#000}.single_post_content_wrapper .single_post_content .user_info_wrapper .share p{margin:0;font-style:normal;font-weight:500;font-size:10px;line-height:14px;color:#242424}.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media{margin-top:20px}.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media a{text-decoration:none;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;padding:7px 0}.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media a .fa{width:25px;height:25px;border-radius:50%;background:#c4c4c4;color:#fff;font-size:14px;line-height:24px;text-align:center;margin-right:10px;transition:color .2s}.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media a .name{font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#000;margin-right:5px;transition:color .2s}.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media a .qty{font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#a7aeb3}.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media a:hover .fa,.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media a:focus .fa{color:#1c7ff8}.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media a:hover .name,.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media a:focus .name{color:#1c7ff8}.single_post_content_wrapper .single_post_content .user_info_wrapper .similar_posts{padding:25px 20px;background:#f8f9fa}.single_post_content_wrapper .single_post_content .user_info_wrapper .similar_posts h2{margin:0 0 10px;font-style:normal;font-weight:700;font-size:18px;line-height:27px;color:#000}.single_post_content_wrapper .single_post_content .user_info_wrapper .similar_posts ul{list-style:none;margin:0;padding:0}.single_post_content_wrapper .single_post_content .user_info_wrapper .similar_posts ul li a{display:block;padding:10px 0;text-decoration:none;font-style:normal;font-weight:500;font-size:16px;line-height:22px;color:#05f}@media (max-width:1200px){.single_post_content_wrapper{padding:25px 0 55px}.single_post_content_wrapper .single_post_content{margin:0 -10px}.single_post_content_wrapper .single_post_content .single_post{margin:0 10px;width:70%}.single_post_content_wrapper .single_post_content .user_info_wrapper{margin:-135px 10px 0;width:30%}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info{padding:20px 15px;background:#fff}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper{display:block;flex-direction:unset;justify-content:unset;align-items:unset}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .personal_info{margin-bottom:15px}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .personal_info img{display:block}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .personal_info .user_name{font-style:normal;font-weight:700;font-size:12px;line-height:16px;color:#000;margin:0 0 0 10px}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .btn.subscribe{padding:8px 15px;font-size:8px;line-height:10px}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info dl{margin:0;padding:0}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info dl dt{font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#a7aeb3}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info dl dd{margin:0 0 10px;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#1c7ff8}.single_post_content_wrapper .single_post_content .user_info_wrapper .posted{padding:30px 20px 10px;background:#f8f9fa}.single_post_content_wrapper .single_post_content .user_info_wrapper .posted dl{margin:0;padding:0}.single_post_content_wrapper .single_post_content .user_info_wrapper .posted dl dt{font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:14px;line-height:21px;color:#a7aeb3}.single_post_content_wrapper .single_post_content .user_info_wrapper .posted dl dd{margin:0 0 20px;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:14px;line-height:21px;color:#1c7ff8}.single_post_content_wrapper .single_post_content .user_info_wrapper .share{padding:40px 20px}.single_post_content_wrapper .single_post_content .user_info_wrapper .share h2{margin:0;font-style:normal;font-weight:700;font-size:14px;line-height:21px;color:#000}.single_post_content_wrapper .single_post_content .user_info_wrapper .share p{margin:0;font-style:normal;font-weight:500;font-size:10px;line-height:14px;color:#242424}.single_post_content_wrapper .single_post_content .user_info_wrapper .similar_posts{display:none}}@media (max-width:750px){.single_post_content_wrapper{padding:56px 0 0}.single_post_content_wrapper .single_post_content{display:block;flex-direction:unset;justify-content:unset;align-items:unset;margin:0}.single_post_content_wrapper .single_post_content .single_post{margin:0;width:100%}.single_post_content_wrapper .single_post_content .single_post .mobile_posted{display:block;padding:15px;background:#f8f9fa;border-radius:3px;margin-top:-92px}.single_post_content_wrapper .single_post_content .single_post .mobile_posted dl{margin:0;padding:0;display:flex;flex-direction:row;justify-content:flex-start}.single_post_content_wrapper .single_post_content .single_post .mobile_posted dl div{width:calc(100%/2)}.single_post_content_wrapper .single_post_content .single_post .mobile_posted dl dt{font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:14px;line-height:21px;color:#a7aeb3}.single_post_content_wrapper .single_post_content .single_post .mobile_posted dl dd{margin:0;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:14px;line-height:21px;color:#1c7ff8}.single_post_content_wrapper .single_post_content .single_post ul.article_tags{list-style:none;margin:20px -5px;padding:0;display:flex;flex-direction:row;justify-content:flex-start}.single_post_content_wrapper .single_post_content .single_post ul.article_tags li a{margin:0 5px;display:block;text-decoration:none;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#000}.single_post_content_wrapper .single_post_content .single_post ul.article_tags li a:hover,.single_post_content_wrapper .single_post_content .single_post ul.article_tags li a:focus{color:#0063f9}.single_post_content_wrapper .single_post_content .single_post .single_post_text p{font-style:normal;font-weight:500;font-size:14px;line-height:20px;color:#242424}.single_post_content_wrapper .single_post_content .single_post .single_post_text h3{font-style:normal;font-weight:800;font-size:20px;line-height:28px;letter-spacing:.015em;color:#010519}.single_post_content_wrapper .single_post_content .single_post .single_post_text h4{font-style:normal;font-weight:500;font-size:18px;line-height:25px;color:#010519}.single_post_content_wrapper .single_post_content .single_post .single_post_text pre{background:#242424;padding:35px 25px}.single_post_content_wrapper .single_post_content .single_post .single_post_text pre code{font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#fff}.single_post_content_wrapper .single_post_content .single_post .single_post_text img{display:block;width:100%}.single_post_content_wrapper .single_post_content .single_post .single_post_text ul{list-style:none;margin:0;padding:0}.single_post_content_wrapper .single_post_content .single_post .single_post_text ul li{font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:14px;line-height:20px;color:#242424;position:relative;margin:0 0 20px 40px}.single_post_content_wrapper .single_post_content .single_post .single_post_text ul li:before{content:'';display:block;position:absolute;top:9px;left:-40px;width:23px;height:1px;background:#445764}.single_post_content_wrapper .single_post_content .user_info_wrapper{margin:25px 0 0;width:100%;display:flex;flex-direction:column-reverse}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info{padding:20px;background:#fff}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;margin-bottom:15px}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .personal_info{display:flex;flex-direction:row;justify-content:space-between;align-items:center;margin:0}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .personal_info img{display:block}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .personal_info .user_name{font-style:normal;font-weight:700;font-size:12px;line-height:16px;color:#000;margin:0 40px 0 10px}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info .personal_info_wrapper .btn.subscribe{padding:8px 15px;font-size:8px;line-height:10px}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info dl{margin:0;padding:0;display:flex;flex-direction:row}.single_post_content_wrapper .single_post_content .user_info_wrapper .user_info dl div{width:calc(100%/3)}.single_post_content_wrapper .single_post_content .user_info_wrapper .posted{display:none}.single_post_content_wrapper .single_post_content .user_info_wrapper .share{background:#f8f9fa;padding:15px 20px}.single_post_content_wrapper .single_post_content .user_info_wrapper .share h2{margin:0;font-size:14px;line-height:21px}.single_post_content_wrapper .single_post_content .user_info_wrapper .share p{margin:0;font-size:10px;line-height:14px}.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media{display:flex;flex-direction:row;justify-content:flex-start;flex-wrap:wrap;margin-top:20px}.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media a{display:flex;width:calc(100%/2);flex-direction:row;justify-content:flex-start;align-items:center;padding:10px 7px}.single_post_content_wrapper .single_post_content .user_info_wrapper .share .social_media a .name{font-size:12px;line-height:18px;margin-right:5px}} +/*! SECTION SINGLE POST CONTENT END */ +/*! SECTION POSTS CAROUSEL START */ +.posts_carousel_wrapper .posts_carousel{padding:100px 0 60px;border-top:3px solid #f4f4f4;border-bottom:3px solid #f4f4f4}.posts_carousel_wrapper .posts_carousel .posts_item{background:#fff;border:1px solid #e7f0fe;border-radius:6px;margin:0 10px 20px;padding:20px;width:calc(100%/2 - 20px)}.posts_carousel_wrapper .posts_carousel .posts_item a{display:block;text-decoration:none}.posts_carousel_wrapper .posts_carousel .posts_item a .user_info_content{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.posts_carousel_wrapper .posts_carousel .posts_item a .user_info_content .avatar{margin-right:10px}.posts_carousel_wrapper .posts_carousel .posts_item a .user_info_content .avatar img{display:block;width:32px;height:32px}.posts_carousel_wrapper .posts_carousel .posts_item a .user_info_content .user_info .name{font-style:normal;font-weight:700;font-size:12px;line-height:18px;color:#000}.posts_carousel_wrapper .posts_carousel .posts_item a .user_info_content .user_info .name .job{color:#a7aeb3;font-weight:400;margin-left:5px;font-size:13px}.posts_carousel_wrapper .posts_carousel .posts_item a .user_info_content .user_info .date{font-style:normal;font-weight:500;font-size:10px;line-height:14px;color:#a7aeb3}.posts_carousel_wrapper .posts_carousel .posts_item a .article_title{font-style:normal;font-weight:700;font-size:20px;line-height:24px;color:#000;margin:10px 0 0}.posts_carousel_wrapper .posts_carousel .posts_item ul.article_tags{list-style:none;margin:0 -5px;padding:0;display:flex;flex-direction:row;justify-content:flex-start}.posts_carousel_wrapper .posts_carousel .posts_item ul.article_tags li a{margin:0 5px;display:block;text-decoration:none;font-family:'Anonymous Pro',sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:18px;color:#000}.posts_carousel_wrapper .posts_carousel .posts_item ul.article_tags li a:hover,.posts_carousel_wrapper .posts_carousel .posts_item ul.article_tags li a:focus{color:#0063f9}.posts_carousel_wrapper .posts_carousel .posts_item .article_descr{margin:10px 0 0;max-width:510px;font-style:normal;font-weight:400;font-size:12px;line-height:14px;color:#04202f}.posts_carousel_wrapper .posts_carousel .slick-arrow{border:0;outline:0;width:202px;background:0 0;position:absolute;top:45px;cursor:pointer;padding:15px 0}.posts_carousel_wrapper .posts_carousel .slick-arrow span{font-family:'Montserrat',sans-serif;font-style:normal;font-weight:500;font-size:16px;line-height:normal;color:#04202f}.posts_carousel_wrapper .posts_carousel .slick-arrow .fa{color:#04202f;font-size:14px}.posts_carousel_wrapper .posts_carousel .slick-arrow.slick-prev{left:0}.posts_carousel_wrapper .posts_carousel .slick-arrow.slick-next{right:0}@media (max-width:1200px){.posts_carousel_wrapper .posts_carousel{padding:70px 0 30px}.posts_carousel_wrapper .posts_carousel .slick-arrow{top:25px;padding:10px 0}.posts_carousel_wrapper .posts_carousel .slick-arrow span{font-size:14px}.posts_carousel_wrapper .posts_carousel .slick-arrow .fa{color:#04202f;font-size:12px}}@media (max-width:750px){.posts_carousel_wrapper .posts_carousel{padding:60px 0 40px}.posts_carousel_wrapper .posts_carousel .slick-arrow{top:unset;padding:10px 0}.posts_carousel_wrapper .posts_carousel .slick-arrow span{font-size:14px}.posts_carousel_wrapper .posts_carousel .slick-arrow .fa{color:#04202f;font-size:12px}.posts_carousel_wrapper .posts_carousel .slick-arrow.slick-prev{left:0;bottom:20px}.posts_carousel_wrapper .posts_carousel .slick-arrow.slick-next{right:0;top:20px}} +/*! SECTION POSTS CAROUSEL END */ +/*! FOOTER START */ +.footer_wrapper{padding:34px 0 64px;background:#04202f}.footer_wrapper .bottom_menu_logo_wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.footer_wrapper .bottom_menu_logo_wrapper .logo{margin-right:190px}.footer_wrapper .bottom_menu_logo_wrapper .logo a{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start}.footer_wrapper .bottom_menu_logo_wrapper .logo a img{display:block;margin-right:5px}.footer_wrapper .bottom_menu_logo_wrapper .bottom_menu ul.footer_nav{list-style:none;padding:0;margin:0;display:flex;flex-direction:row;justify-content:flex-start}.footer_wrapper .bottom_menu_logo_wrapper .bottom_menu ul.footer_nav>li a{display:block;text-decoration:none;padding:34px 40px 24px;font-style:normal;font-weight:600;font-size:16px;color:#fff}.footer_wrapper .bottom_menu_logo_wrapper .bottom_menu ul.footer_nav>li a:hover,.footer_wrapper .bottom_menu_logo_wrapper .bottom_menu ul.footer_nav>li a:focus{color:#0063f9}@media (max-width:1200px){.footer_wrapper{padding:34px 0 54px}.footer_wrapper .bottom_menu_logo_wrapper .logo{margin-right:100px}.footer_wrapper .bottom_menu_logo_wrapper .bottom_menu ul.footer_nav>li a{padding:24px 20px 14px;font-size:14px}}@media (max-width:750px){.footer_wrapper{padding:30px 0 50px 13px}.footer_wrapper .bottom_menu_logo_wrapper{align-items:flex-start}.footer_wrapper .bottom_menu_logo_wrapper .logo{padding-top:10px;margin-right:46px}.footer_wrapper .bottom_menu_logo_wrapper .bottom_menu ul.footer_nav{display:block;flex-direction:unset;justify-content:unset}.footer_wrapper .bottom_menu_logo_wrapper .bottom_menu ul.footer_nav>li a{padding:10px;font-size:14px}} +/*! FOOTER END */ +/*# sourceMappingURL=layout.css.map */ diff --git a/landing_page/mainpage/static/new-design/css/layout.css.map b/landing_page/mainpage/static/new-design/css/layout.css.map new file mode 100644 index 00000000..9dabc70d --- /dev/null +++ b/landing_page/mainpage/static/new-design/css/layout.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["layout.scss"],"names":[],"mappings":"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gB,iB,CAnVhB,wE,CAyV4B,c,CACA,gB,CA1V5B,mD,CAiWgB,iB,CAjWhB,2D,CAqWwB,W,CACA,W,CAtWxB,qD,CA4WgB,iB,CA5WhB,6D,CAgXwB,W,CACA,W,CAjXxB,6C,CA0XgB,kB,CA1XhB,kG,CAmYoC,sB,CACA,gB,AAUhC,yBA9YJ,e,CA+YQ,e,CACA,K,CAhZR,sC,CAkZY,Y,CAlZZ,uC,CAsZY,c,CAtZZ,6C,CAyZgB,iB,CACA,Y,CACA,kB,CA3ZhB,uD,CA+ZgB,S,CACA,c,CACA,W,CACA,mB,CACA,K,CACA,O,CACA,U,CACA,W,CACA,wB,CACA,sB,CAEA,+E,CACI,mB,CACA,U,CA5apB,0D,CAibgB,c,CACA,K,CACA,M,CACA,Y,CACA,Y,CACA,U,CACA,mB,CAvbhB,2E,CA0boB,Y,CACA,sB,CACA,qB,CACA,kB,CACA,c,CACA,Q,CACA,U,CACA,4B,CACA,U,CACA,W,CACA,iB,CACA,mB,CACA,Y,CAtcpB,gF,CAycwB,a,CACA,U,CACA,U,CACA,qB,CACA,Y,CACA,oC,CAGJ,qH,CAGY,8C,CAHZ,qH,CAQY,S,CARZ,qH,CAYY,kD,CA7dhC,2E,CAoeoB,qB,CACA,S,CACA,mB,CACA,sB,CACA,iB,CACA,K,CACA,W,CA1epB,6F,CA8e4B,Y,CACA,qB,CACA,uB,CACA,e,CACA,Q,CACA,gB,CACA,iB,CApf5B,kG,CAwfoC,iB,CACA,c,CACA,gB,CACA,a,CA3fpC,yG,CAkgBwB,iB,CACA,Q,CACA,Y,CACA,qB,CACA,0B,CACA,U,CAvgBxB,4G,CA0gB4B,oB,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA/gB5B,uH,CAmhB4B,iB,CACA,kB,CACA,U,CArhB5B,+H,CAyhBoC,a,CACA,oB,CA1hBpC,2I,CA6hBwC,Q,CACA,+B,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,qB,CACA,wB,CACA,U,CAriBxC,iJ,CAwiB4C,a,CAxiB5C,mJ,CA4iB4C,a,CA5iB5C,sH,CAojB4B,iB,CACA,kB,CACA,U,CAtjB5B,8H,CA0jBoC,a,CACA,W,CACA,W,CA5jBpC,kI,CA+jBwC,a,CACA,U,CACA,W,CAjkBxC,wH,CAwkB4B,iB,CACA,kB,CACA,U,CA1kB5B,gI,CA8kBoC,a,CACA,W,CACA,W,CAhlBpC,oI,CAmlBwC,a,CACA,U,CACA,W,CAOpB,mG,CACI,S,CACA,qB;;;AAUxB,gC,CAEQ,Y,CACA,kB,CACA,0B,CACA,gB,CALR,mC,CAQY,Q,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CAbZ,uC,CAiBY,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CArBZ,8C,CAyBY,iB,CACA,kB,CACA,kB,CA3BZ,sD,CA+BoB,a,CACA,oB,CAhCpB,kE,CAmCwB,e,CACA,+B,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,qB,CACA,wB,CACA,U,CA3CxB,wE,CA8C4B,a,CA9C5B,0E,CAkD4B,a,CAlD5B,iD,CAyDgB,kB,CACA,+B,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CA/DhB,oD,CAmEgB,+B,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAxEhB,yD,CA2EoB,U,CA3EpB,6C,CAiFY,iB,CACA,kB,CACA,kB,CAnFZ,qD,CAuFoB,a,CACA,W,CACA,W,CACA,e,CACA,oB,CA3FpB,yD,CA8FwB,a,CACA,U,CACA,W,CAhGxB,gD,CAsGgB,kB,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CA3GhB,mD,CA+GgB,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAnHhB,+C,CAwHY,iB,CACA,kB,CACA,kB,CA1HZ,kD,CA6HgB,a,CA7HhB,uD,CAkIoB,a,CACA,W,CACA,W,CACA,e,CACA,oB,CAtIpB,2D,CAyIwB,a,CACA,U,CACA,W,CA3IxB,kD,CAiJgB,+B,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CAtJhB,qD,CA0JgB,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA9JhB,sD,CAkKgB,a,CAKZ,0BAvKJ,gC,CAyKY,gB,CAzKZ,mC,CA4KgB,c,CACA,gB,CA7KhB,uC,CAiLgB,c,CACA,gB,CAlLhB,8C,CAsLgB,iB,CAtLhB,kE,CA2L4B,e,CACA,c,CACA,gB,CA7L5B,iD,CAmMoB,kB,CACA,c,CACA,gB,CArMpB,oD,CAyMoB,c,CACA,gB,CA1MpB,6C,CA+MgB,iB,CA/MhB,qD,CAmNwB,W,CACA,W,CACA,e,CArNxB,gD,CA0NoB,kB,CACA,c,CACA,gB,CA5NpB,mD,CAgOoB,c,CACA,gB,CAjOpB,+C,CAsOgB,iB,CAtOhB,uD,CA0OwB,a,CACA,W,CACA,W,CACA,e,CACA,oB,CA9OxB,kD,CAmPoB,c,CACA,gB,CACA,kB,CArPpB,qD,CAyPoB,c,CACA,kB,AAMhB,yBAhQJ,gC,CAkQY,a,CACA,oB,CACA,e,CACA,qB,CACA,iB,CACA,iB,CAvQZ,8C,CA+QgB,W,CACA,Y,CAhRhB,mC,CAqRgB,c,CACA,gB,CAtRhB,uC,CA0RgB,c,CACA,gB,CA3RhB,8C,CA+RgB,iB,CA/RhB,kE,CAoS4B,e,CACA,c,CACA,gB,CAtS5B,iD,CA4SoB,kB,CACA,c,CACA,gB,CA9SpB,oD,CAkToB,c,CACA,gB,CAnTpB,6C,CAwTgB,iB,CAxThB,qD,CA4TwB,W,CACA,W,CACA,e,CA9TxB,gD,CAmUoB,kB,CACA,c,CACA,gB,CArUpB,mD,CAyUoB,c,CACA,gB,CA1UpB,+C,CA+UgB,iB,CA/UhB,uD,CAmVwB,a,CACA,W,CACA,W,CACA,e,CACA,oB,CAvVxB,kD,CA4VoB,c,CACA,gB,CACA,kB,CA9VpB,qD,CAkWoB,c,CACA,gB,CAnWpB,8C,CAwWgB,Y,CACA,kB,CACA,gB,CACA,sB,CACA,kB,CACA,iB,CACA,Y,CACA,Q,CACA,2B,CACA,Q,CACA,S,CACA,e,CAnXhB,iD,CAsXoB,Q,CACA,W,CAvXpB,wD,CA0XwB,Y,CACA,kB,CACA,gB,CACA,sB,CACA,kB,CACA,U,CACA,W,CACA,wB,CACA,iB,CACA,Q,CACA,W,CACA,a,CACA,Q,CACA,S,CACA,S,CACA,e,CACA,c,CA1YxB,+D,CA6Y4B,wB,CACA,U,CACA,a,CACA,S,CACA,U,CACA,wB,CACA,iB,CACA,kB,CApZ5B,4E,CAyZwB,oB;;;AAUxB,0B,CACI,iB,CADJ,wC,CAIQ,iB,CACA,S,CALR,2D,CAQY,iB,CACA,S,CACA,Q,CACA,S,CACA,W,CACA,e,CACA,iB,CACA,kB,CACA,wB,CACA,Y,CACA,kB,CACA,0B,CACA,sB,CApBZ,8E,CAuBgB,iB,CAvBhB,kF,CA0BoB,a,CACA,W,CACA,Y,CA5BpB,8F,CAiCwB,e,CACA,e,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAvCxB,mG,CA0C4B,a,CA1C5B,wG,CAgD4B,Y,CACA,kB,CACA,0B,CAlD5B,8G,CAqDgC,iB,CACA,a,CACA,W,CACA,kB,CACA,4B,CACA,+B,CACA,6B,CACA,iB,CACA,qB,CACA,yB,CA9DhC,2H,CAiEoC,mC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAtEpC,mH,CA2EgC,a,CACA,iB,CACA,mC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,wB,CACA,U,CACA,e,CACA,yB,CACA,4B,CACA,+B,CACA,8B,CACA,gB,CACA,c,CA1FhC,iE,CAkGgB,U,CACA,a,CACA,iB,CACA,S,CACA,sC,CACA,2B,CACA,Q,CACA,Q,CACA,W,CACA,W,CAKZ,0BAhHJ,0B,CAiHQ,iB,CAjHR,wC,CAoHY,iB,CACA,S,CArHZ,2D,CAwHgB,iB,CACA,S,CACA,Q,CACA,S,CACA,W,CACA,e,CACA,iB,CA9HhB,8E,CAiIoB,iB,CAjIpB,kF,CAoIwB,U,CACA,W,CArIxB,8F,CA0I4B,e,CACA,e,CACA,c,CACA,gB,CA7I5B,8G,CAmJoC,iB,CACA,W,CApJpC,2H,CAuJwC,c,CACA,gB,CAxJxC,mH,CA6JoC,iB,CACA,c,CACA,gB,CA/JpC,iE,CAuKoB,U,CACA,a,CACA,iB,CACA,S,CACA,sC,CACA,2B,CACA,Q,CACA,Q,CACA,W,CACA,a,AAMhB,yBAtLJ,0B,CAuLQ,gB,CACA,U,CAxLR,wC,CA2LY,iB,CACA,S,CA5LZ,2D,CA+LgB,iB,CACA,S,CACA,Y,CACA,M,CACA,U,CACA,e,CACA,iB,CACA,a,CAtMhB,8E,CAyMoB,iB,CAzMpB,kF,CA4MwB,iB,CACA,U,CACA,W,CA9MxB,8F,CAmN4B,oB,CACA,e,CACA,c,CACA,gB,CAtN5B,8G,CA4NoC,iB,CACA,U,CA7NpC,2H,CAgOwC,c,CACA,gB,CAjOxC,mH,CAsOoC,iB,CACA,c,CACA,gB,CAxOpC,iE,CAgPoB,U,CACA,a,CACA,iB,CACA,S,CACA,sC,CACA,2B,CACA,0B,CACA,Q,CACA,Q,CACA,U,CACA,a;;;AASpB,0B,CAEQ,gB,CACA,+B,CACA,Y,CACA,kB,CACA,6B,CACA,sB,CAPR,yC,CAWgB,c,CACA,gB,CACA,Q,CAbhB,yC,CAiBgB,e,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CAtBhB,8C,CA0BgB,e,CACA,Q,CACA,S,CA5BhB,mD,CAgCwB,a,CACA,oB,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CACA,kB,CAxCxB,yD,CAAA,yD,CA2C4B,a,CA3C5B,uD,CAkDgB,gB,CAlDhB,sE,CAqDoB,Y,CACA,kB,CACA,0B,CACA,kB,CACA,kB,CAzDpB,6E,CA4DwB,c,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CACA,iB,CAlExB,iF,CAuE4B,a,CACA,c,CAxE5B,mF,CA+EwB,kB,CA/ExB,uF,CAkF4B,a,CACA,W,CACA,W,CApF5B,iG,CAwF4B,Q,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA9F5B,gD,CAqGgB,gB,CArGhB,wD,CAwGoB,e,CAxGpB,0D,CA2GwB,a,CACA,oB,CA5GxB,6E,CA+G4B,Y,CACA,kB,CACA,0B,CACA,kB,CAlH5B,qF,CAqHgC,iB,CArHhC,yF,CAwHoC,a,CACA,U,CACA,W,CA1HpC,8F,CAgIoC,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CApIpC,mG,CAuIwC,a,CACA,e,CACA,e,CACA,c,CA1IxC,8F,CA+IoC,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAnJpC,yE,CAyJ4B,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CACA,e,CA9J5B,wE,CAmKwB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A,wB,CACA,iB,CA3B5B,kG,CA8BgC,mC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAnChC,sF,CAwC4B,iB,CACA,Q,CACA,S,CACA,c,CACA,c,CACA,U,CACA,W,CACA,iB,CACA,K,CACA,O,CAjD5B,0F,CAoDgC,a,CACA,U,CACA,W,CAtDhC,iF,CA4DwB,W,CACA,e,CA7DxB,wF,CAgE4B,a,CACA,U,CAjE5B,0F,CAqE4B,a,CACA,U,CACA,W,CACA,wB,CACA,iB,CAzE5B,6G,CA4EgC,Q,CACA,qB,CACA,S,CA9EhC,uH,CAkFgC,iB,CACA,mC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAxFhC,oH,CA4FgC,O,CACA,U,CA7FhC,0H,CAiGgC,mC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAtGhC,sH,CA4GgC,Q,CA5GhC,uI,CA+GoC,wB,CACA,mC,CACA,qB,CACA,Y,CACA,e,CACA,yB,CApHpC,gK,CAuHwC,mC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA5HxC,4L,CA+H4C,a,CACA,qB,CAhI5C,yE,CAyIwB,Y,CACA,kB,CACA,0B,CACA,wB,CACA,iB,CACA,iB,CA9IxB,4F,CAkJgC,yC,CACA,a,CACA,Q,CACA,gB,CACA,mC,CACA,iB,CACA,e,CACA,c,CACA,kB,CACA,a,CACA,c,CA5JhC,wG,CAgKgC,Y,CAhKhC,sH,CAmKoC,a,CACA,6B,CApKpC,wG,CAyKgC,iB,CAzKhC,uG,CA6KgC,kB,CAS5B,0BAtLJ,2B,CAuLQ,mB,CAvLR,qD,CA4LoB,a,CACA,oB,CACA,qB,CACA,Q,CA/LpB,iE,CAkMwB,kB,CAlMxB,+E,CAqM4B,U,CArM5B,iF,CAyM4B,W,CAzM5B,8G,CA4MgC,c,CACA,kB,AAS5B,yBAtNJ,2B,CAuNQ,mB,CAvNR,qD,CA2NoB,a,CACA,oB,CACA,qB,CACA,Q,CA9NpB,iE,CAiOwB,e,CAjOxB,+E,CAoO4B,U,CApO5B,qF,CAuOgC,iB,CAvOhC,kG,CA0OoC,c,CACA,gB,CA3OpC,iF,CAiP4B,U,CAjP5B,uH,CAqPoC,iB,CACA,c,CACA,gB,CAvPpC,oH,CA2PoC,O,CACA,U,CA5PpC,0H,CAgQoC,c,CACA,gB,CAjQpC,sH,CAuQoC,Q,CAvQpC,uI,CA0QwC,Y,CACA,e,CA3QxC,gK,CA8Q4C,c,CACA,gB,CA/Q5C,yE,CAuR4B,iB,CAvR5B,4F,CA2RoC,gB,CACA,c,CA5RpC,wG,CAgSoC,iB,CAhSpC,uG,CAoSoC,oB;;;AAapC,wC,CAEQ,gB,CACA,+B,CACA,Y,CACA,kB,CACA,6B,CACA,sB,CAPR,wD,CAWgB,c,CACA,gB,CACA,e,CAbhB,wD,CAiBgB,e,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CAtBhB,6D,CA0BgB,e,CACA,Q,CACA,S,CA5BhB,kE,CAgCwB,a,CACA,oB,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CACA,kB,CAxCxB,wE,CAAA,wE,CA2C4B,a,CA3C5B,sE,CAkDgB,gB,CAlDhB,qF,CAqDoB,Y,CACA,kB,CACA,0B,CACA,kB,CACA,kB,CAzDpB,4F,CA4DwB,c,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CACA,iB,CAlExB,gG,CAuE4B,a,CACA,c,CAxE5B,kG,CA+EwB,kB,CA/ExB,sG,CAkF4B,a,CACA,W,CACA,W,CApF5B,gH,CAwF4B,Q,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA9F5B,uE,CAsGoB,e,CAtGpB,8E,CAyGwB,wB,CACA,kB,CA1GxB,6F,CA6G4B,U,CA7G5B,iG,CAiHgC,a,CACA,2B,CACA,U,CAnHhC,+F,CAwH4B,Y,CAxH5B,2G,CA2HgC,Y,CACA,kB,CACA,0B,CACA,iB,CA9HhC,uH,CAiIoC,W,CACA,W,CAlIpC,2H,CAqIwC,a,CACA,U,CACA,W,CAvIxC,uH,CA4IoC,a,CACA,c,CACA,8B,CACA,6B,CA/IpC,6H,CAkJwC,Q,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,iB,CACA,a,CAxJxC,8H,CA4JwC,Q,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,iB,CACA,a,CAlKxC,kI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APZ,8F,CAYgB,iB,CACA,Q,CACA,e,CAdhB,qG,CAiBoB,iB,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CACA,iB,CAvBpB,qG,CA2BoB,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CA/BpB,2C,CAsCQ,Q,CACA,S,CACA,W,CACA,c,CACA,iB,CACA,Q,CACA,c,CACA,c,CA7CR,gD,CAgDY,mC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CArDZ,+C,CAyDY,U,CACA,c,CA1DZ,sD,CA8DY,U,CAIR,0BAlEJ,yD,CAqEgB,Y,CArEhB,8F,CA0EoB,Q,CACA,e,CA3EpB,qG,CA8EwB,iB,CACA,c,CACA,gB,CAhFxB,qG,CAoFwB,c,CACA,gB,CArFxB,2C,CA4FY,W,CACA,Q,CACA,c,CACA,Y,CACA,kB,CACA,0B,CACA,kB,CAlGZ,gD,CAqGgB,c,CACA,gB,CAtGhB,+C,CA0GgB,c,CA1GhB,sD,CA8GgB,Y,AAKZ,yBAnHJ,yD,CAsHgB,Y,CAtHhB,8F,CA2HoB,Q,CACA,e,CA5HpB,qG,CA+HwB,iB,CACA,c,CACA,gB,CAjIxB,qG,CAqIwB,c,CACA,gB,CAtIxB,2C,CA6IY,W,CACA,S,CACA,W,CACA,c,CACA,a,CACA,kB,CACA,0B,CACA,kB,CApJZ,gD,CAuJgB,c,CACA,gB,CAxJhB,+C,CA4JgB,c,CA5JhB,sD,CAgKgB,Y;;;AAQhB,4B,CACI,mB,CACA,iB,CAFJ,iD,CAKQ,Y,CACA,kB,CACA,6B,CACA,sB,CACA,c,CATR,8D,CAYY,a,CAZZ,6E,CAegB,Y,CAfhB,8E,CAmBgB,e,CACA,a,CACA,S,CACA,Y,CACA,kB,CACA,0B,CAxBhB,mF,CA4BwB,Y,CACA,a,CACA,oB,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CApCxB,yF,CAAA,yF,CAuC4B,a,CAvC5B,kF,CA+CoB,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAnDpB,mF,CAuDoB,iB,CACA,e,CACA,c,CACA,gB,CACA,qB,CACA,a,CA5DpB,mF,CAgEoB,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CApEpB,oF,CAwEoB,kB,CACA,iB,CAzEpB,yF,CA4EwB,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CAjFxB,oF,CAsFoB,a,CACA,U,CAvFpB,mF,CA2FoB,e,CACA,Q,CACA,S,CA7FpB,sF,CAgGwB,mC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CACA,iB,CACA,oB,CAvGxB,6F,CA0G4B,U,CACA,a,CACA,iB,CACA,O,CACA,U,CACA,U,CACA,U,CACA,kB,CAjH5B,oE,CA0HY,oB,CA1HZ,+E,CA6HgB,Y,CACA,e,CA9HhB,sG,CAiIoB,Y,CACA,kB,CACA,0B,CACA,kB,CACA,kB,CArIpB,qH,CAwIwB,Y,CACA,kB,CACA,0B,CACA,kB,CA3IxB,yH,CA+I4B,a,CA/I5B,gI,CAmJ4B,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CACA,a,CAxJ5B,qH,CA6JwB,kB,CACA,iB,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,iB,CACA,wB,CACA,U,CArKxB,2H,CAwK4B,6C,CAxK5B,kF,CA8KoB,Q,CACA,S,CA/KpB,qF,CAkLwB,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAvLxB,qF,CA2LwB,e,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAjMxB,4E,CAuMgB,sB,CACA,kB,CAxMhB,+E,CA2MoB,Q,CACA,S,CA5MpB,kF,CA+MwB,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CApNxB,kF,CAwNwB,e,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA9NxB,2E,CAoOgB,iB,CApOhB,8E,CAuOoB,Q,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CA5OpB,6E,CAgPoB,Q,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CArPpB,yF,CAyPoB,e,CAzPpB,2F,CA4PwB,oB,CACA,Y,CACA,kB,CACA,0B,CACA,kB,CACA,a,CAjQxB,+F,CAoQ4B,U,CACA,W,CACA,iB,CACA,kB,CACA,U,CACA,c,CACA,gB,CACA,iB,CACA,iB,CACA,oB,CA7Q5B,iG,CAiR4B,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CACA,gB,CACA,oB,CAxR5B,gG,CA4R4B,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAjS5B,qG,CAAA,qG,CAsSgC,a,CAtShC,uG,CAAA,uG,CA0SgC,a,CA1ShC,mF,CAkTgB,iB,CACA,kB,CAnThB,sF,CAsToB,e,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CA3TpB,sF,CA+ToB,e,CACA,Q,CACA,S,CAjUpB,2F,CAqU4B,a,CACA,c,CACA,oB,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CAQxB,0BApVJ,4B,CAqVQ,mB,CArVR,iD,CAwVY,c,CAxVZ,8D,CA2VgB,a,CACA,S,CA5VhB,oE,CAgWgB,oB,CACA,S,CAjWhB,+E,CAoWoB,iB,CACA,e,CArWpB,sG,CAwWwB,a,CACA,oB,CACA,qB,CACA,iB,CA3WxB,qH,CA8W4B,kB,CA9W5B,yH,CAiXgC,a,CAjXhC,gI,CAqXgC,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CACA,iB,CA1XhC,qH,CA+X4B,gB,CACA,a,CACA,gB,CAjY5B,kF,CAsYwB,Q,CACA,S,CAvYxB,qF,CA0Y4B,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA/Y5B,qF,CAmZ4B,e,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAzZ5B,4E,CA+ZoB,sB,CACA,kB,CAhapB,+E,CAmawB,Q,CACA,S,CApaxB,kF,CAua4B,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA5a5B,kF,CAgb4B,e,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAtb5B,2E,CA4boB,iB,CA5bpB,8E,CA+bwB,Q,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CApcxB,6E,CAwcwB,Q,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA7cxB,mF,CAkdoB,c,AAMhB,yBAxdJ,4B,CAydQ,gB,CAzdR,iD,CA4dY,a,CACA,oB,CACA,qB,CACA,iB,CACA,Q,CAheZ,8D,CAmegB,Q,CACA,U,CApehB,6E,CAueoB,a,CACA,Y,CACA,kB,CACA,iB,CACA,gB,CA3epB,gF,CA8ewB,Q,CACA,S,CACA,Y,CACA,kB,CACA,0B,CAlfxB,oF,CAqf4B,kB,CArf5B,mF,CAyf4B,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA9f5B,mF,CAkgB4B,Q,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAxgB5B,8E,CA8gBoB,e,CACA,gB,CACA,S,CACA,Y,CACA,kB,CACA,0B,CAnhBpB,mF,CAuhB4B,Y,CACA,a,CACA,oB,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CA/hB5B,yF,CAAA,yF,CAkiBgC,a,CAliBhC,kF,CA0iBwB,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA9iBxB,mF,CAkjBwB,iB,CACA,e,CACA,c,CACA,gB,CACA,qB,CACA,a,CAvjBxB,mF,CA2jBwB,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CA/jBxB,oF,CAmkBwB,kB,CACA,iB,CApkBxB,yF,CAukB4B,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CA5kB5B,oF,CAilBwB,a,CACA,U,CAllBxB,mF,CAslBwB,e,CACA,Q,CACA,S,CAxlBxB,sF,CA2lB4B,mC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CACA,iB,CACA,oB,CAlmB5B,6F,CAqmBgC,U,CACA,a,CACA,iB,CACA,O,CACA,U,CACA,U,CACA,U,CACA,kB,CA5mBhC,oE,CAqnBgB,e,CACA,U,CACA,Y,CACA,6B,CAxnBhB,+E,CA2nBoB,Y,CACA,e,CA5nBpB,sG,CA+nBwB,Y,CACA,kB,CACA,0B,CACA,kB,CACA,kB,CAnoBxB,qH,CAsoB4B,Y,CACA,kB,CACA,6B,CACA,kB,CACA,Q,CA1oB5B,yH,CA8oBgC,a,CA9oBhC,gI,CAkpBgC,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CACA,oB,CAvpBhC,qH,CA4pB4B,gB,CACA,a,CACA,gB,CA9pB5B,kF,CAmqBwB,Q,CACA,S,CACA,Y,CACA,kB,CAtqBxB,sF,CAyqB4B,kB,CAzqB5B,4E,CA+qBoB,Y,CA/qBpB,2E,CAmrBoB,kB,CACA,iB,CAprBpB,8E,CAurBwB,Q,CACA,c,CACA,gB,CAzrBxB,6E,CA6rBwB,Q,CACA,c,CACA,gB,CA/rBxB,yF,CAmsBwB,Y,CACA,kB,CACA,0B,CACA,c,CACA,e,CAvsBxB,2F,CA0sB4B,Y,CACA,kB,CACA,kB,CACA,0B,CACA,kB,CACA,gB,CA/sB5B,iG,CAktBgC,c,CACA,gB,CACA,kB;;;AAYhC,uC,CAEQ,oB,CACA,4B,CACA,+B,CAJR,mD,CAOY,e,CACA,wB,CACA,iB,CACA,kB,CACA,Y,CACA,yB,CAZZ,qD,CAegB,a,CACA,oB,CAhBhB,wE,CAmBoB,Y,CACA,kB,CACA,0B,CACA,kB,CAtBpB,gF,CAyBwB,iB,CAzBxB,oF,CA4B4B,a,CACA,U,CACA,W,CA9B5B,yF,CAoC4B,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CAxC5B,8F,CA2CgC,a,CACA,e,CACA,e,CACA,c,CA9ChC,yF,CAmD4B,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAvD5B,oE,CA6DoB,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CACA,e,CAlEpB,mE,CAuEgB,e,CACA,a,CACA,S,CACA,Y,CACA,kB,CACA,0B,CA5EhB,wE,CAgFwB,Y,CACA,a,CACA,oB,CACA,sC,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,U,CAxFxB,8E,CAAA,8E,CA2F4B,a,CA3F5B,kE,CAkGgB,e,CACA,e,CACA,iB,CACA,e,CACA,c,CACA,gB,CACA,a,CAxGhB,oD,CA6GY,Q,CACA,S,CACA,W,CACA,c,CACA,iB,CACA,Q,CACA,c,CACA,c,CApHZ,yD,CAuHgB,mC,CACA,iB,CACA,e,CACA,c,CACA,kB,CACA,a,CA5HhB,wD,CAgIgB,a,CACA,c,CAjIhB,+D,CAqIgB,M,CArIhB,+D,CAyIgB,O,CAKZ,0BA9IJ,uC,CAgJY,mB,CAhJZ,oD,CAmJgB,Q,CACA,c,CApJhB,yD,CAuJoB,c,CAvJpB,wD,CA2JoB,a,CACA,gB,AAMhB,yBAlKJ,uC,CAoKY,mB,CApKZ,oD,CAuKgB,S,CACA,c,CAxKhB,yD,CA2KoB,c,CA3KpB,wD,CA+KoB,a,CACA,c,CAhLpB,+D,CAoLoB,M,CACA,W,CArLpB,+D,CAyLoB,O,CACA,U;;;AASpB,e,CACI,mB,CACA,kB,CAFJ,yC,CAKQ,Y,CACA,kB,CACA,0B,CACA,kB,CARR,+C,CAWY,kB,CAXZ,iD,CAcgB,Y,CACA,kB,CACA,0B,CACA,sB,CAjBhB,qD,CAoBoB,a,CACA,gB,CArBpB,oE,CA4BgB,e,CACA,S,CACA,Q,CACA,Y,CACA,kB,CACA,0B,CAjChB,yE,CAqCwB,a,CACA,oB,CACA,sB,CACA,iB,CACA,e,CACA,c,CACA,U,CA3CxB,+E,CAAA,+E,CA8C4B,a,CAQxB,0BAtDJ,e,CAuDQ,mB,CAvDR,+C,CA2DgB,kB,CA3DhB,yE,CAkE4B,sB,CACA,gB,AAQxB,yBA3EJ,e,CA4EQ,wB,CA5ER,yC,CA+EY,sB,CA/EZ,+C,CAkFgB,gB,CACA,iB,CAnFhB,oE,CAwFoB,a,CACA,oB,CACA,qB,CA1FpB,yE,CA8F4B,Y,CACA,gB","file":"layout.css","sourcesContent":["*, *:before, *:after {\n box-sizing: border-box;\n}\n\nhtml, body {\n margin: 0;\n padding: 0;\n font-family: 'Montserrat', sans-serif;\n}\n\nh2 {\n font-style: normal;\n font-weight: 800;\n font-size: 30px;\n line-height: 48px;\n color: #040306;\n\n @media (max-width: 1200px) {\n font-size: 24px;\n line-height: 38px;\n }\n\n @media (max-width: 750px) {\n font-size: 22px;\n line-height: 35px;\n margin: 35px 0 20px;\n }\n}\n\n.btn {\n display: block;\n border: 1px solid #e1e1e2;\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 17px;\n text-align: center;\n text-transform: uppercase;\n color: #000000;\n background: #e2e2e3;\n border-radius: 30px;\n padding: 20px 36px;\n transition: box-shadow 0.2s;\n\n &:hover {\n box-shadow: 1px 1px 9px 2px rgba(165, 165, 165, 0.36);\n }\n\n @media (max-width: 1200px) {\n padding: 16px 28px;\n }\n\n @media (max-width: 750px) {\n padding: 13px 23px;\n font-size: 12px;\n line-height: 14px;\n }\n}\n\n.container {\n width: 1100px;\n margin: 0 auto;\n\n @media(max-width: 1200px) {\n width: 728px;\n margin: 0 auto;\n }\n\n @media(max-width: 750px) {\n width: 100%;\n max-width: 500px;\n padding: 0 15px;\n margin: 0 auto;\n }\n}\n\n@media(max-width: 750px) {\n body.mobile-menu-opened {\n overflow: hidden;\n }\n}\n\n/*! HEADER START */\n.header_wrapper {\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n position: relative;\n background: #ffffff;\n z-index: 1000;\n\n .projects_logo_wrapper {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n .learn_python {\n padding: 15px 50px;\n background: #262525;\n width: calc(100% / 3);\n\n .logo {\n a {\n display: block;\n text-decoration: none;\n\n .logo_title {\n margin: 0;\n font-family: 'Ubuntu', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 26px;\n line-height: 35px;\n letter-spacing: 0.105em;\n text-transform: uppercase;\n color: #ffffff;\n\n & .blue {\n color: #2c91cb;\n }\n\n & .yellow {\n color: #f2c94c;\n }\n }\n }\n }\n }\n\n .python_week {\n padding: 15px 50px;\n background: #0f1686;\n width: calc(100% / 3);\n\n .logo {\n a {\n display: block;\n width: 115px;\n height: 35px;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n\n .moscow_python {\n padding: 15px 50px;\n background: #f8f9fa;\n width: calc(100% / 3);\n\n .logo {\n a {\n display: block;\n width: 158px;\n height: 35px;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n\n .projects_list {\n transition: opacity 0.2s;\n opacity: 0;\n pointer-events: none;\n display: flex;\n position: absolute;\n flex-direction: row;\n justify-content: flex-start;\n z-index: 3000;\n min-height: 453px;\n\n body.loading & {\n transition: none;\n }\n }\n\n body:not(.loading) &:hover {\n .projects_list {\n opacity: 1;\n pointer-events: auto;\n\n h6 {\n margin: 0;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 16px;\n color: #ffffff;\n }\n\n .descr {\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 16px;\n color: #ffffff;\n }\n\n .learn_python {\n padding: 40px 50px;\n background: #262525;\n width: calc(100% / 3);\n\n .logo {\n a {\n display: block;\n text-decoration: none;\n\n .logo_title {\n margin: 33px 0 0;\n font-family: 'Ubuntu', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 26px;\n line-height: 35px;\n letter-spacing: 0.105em;\n text-transform: uppercase;\n color: #ffffff;\n\n & .blue {\n color: #2c91cb;\n }\n\n & .yellow {\n color: #f2c94c;\n }\n }\n }\n }\n\n h4 {\n margin: 50px 0 20px;\n font-family: 'Roboto', sans-serif;\n font-style: normal;\n font-weight: 900;\n font-size: 23px;\n line-height: 31px;\n color: #ffffff;\n }\n\n .date {\n font-family: 'Ubuntu', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 24px;\n line-height: 32px;\n color: #f2c94c;\n\n & span {\n color: #ffffff;\n }\n }\n }\n\n .python_week {\n padding: 40px 50px;\n background: #0f1686;\n width: calc(100% / 3);\n\n .logo {\n a {\n display: block;\n width: 198px;\n height: 61px;\n margin: 20px 0 0;\n text-decoration: none;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n }\n\n h4 {\n margin: 35px 0 20px;\n font-style: normal;\n font-weight: 600;\n font-size: 24px;\n line-height: 32px;\n color: #ffffff;\n }\n\n .date {\n font-style: normal;\n font-weight: bold;\n font-size: 24px;\n line-height: 32px;\n color: #fcd600;\n }\n }\n\n .moscow_python {\n padding: 40px 50px;\n background: #f8f9fa;\n width: calc(100% / 3);\n\n h6 {\n color: #252526;\n }\n\n .logo {\n a {\n display: block;\n width: 275px;\n height: 61px;\n margin: 20px 0 0;\n text-decoration: none;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n }\n\n h4 {\n font-family: 'Roboto', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 24px;\n line-height: 32px;\n color: #000000;\n }\n\n .date {\n font-style: normal;\n font-weight: normal;\n font-size: 24px;\n line-height: 32px;\n color: #33719c;\n }\n\n .descr {\n color: #252526;\n }\n }\n }\n }\n }\n\n .main_menu_logo_wrapper {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n\n .logo {\n margin-right: 190px;\n\n a {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n\n img {\n display: block;\n margin-right: 5px;\n }\n }\n }\n\n .main_menu_wrapper {\n .mobile_menu_btn {\n display: none;\n }\n\n .main_menu_block {\n .main_menu {\n ul.nav {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n & > li:not(.active) a {\n color: #6d7b84;\n }\n\n & > li.active a {\n color: #0063f9;\n }\n\n > li {\n a {\n display: block;\n text-decoration: none;\n padding: 34px 40px 24px;\n font-style: normal;\n font-weight: 600;\n font-size: 16px;\n\n &:hover, &:focus {\n color: #0063f9;\n }\n }\n }\n }\n }\n\n .mobile_projects_logo_wrapper {\n display: none;\n }\n }\n }\n }\n\n @media (max-width: 1200px) {\n .projects_logo_wrapper {\n .learn_python {\n padding: 15px 20px;\n\n .logo {\n a {\n\n .logo_title {\n font-size: 18px;\n line-height: 25px;\n }\n }\n }\n }\n\n .python_week {\n padding: 15px 20px;\n\n .logo {\n a {\n width: 109px;\n height: 35px;\n }\n }\n }\n\n .moscow_python {\n padding: 15px 20px;\n\n .logo {\n a {\n width: 131px;\n height: 30px;\n }\n }\n }\n }\n\n .main_menu_logo_wrapper {\n\n .logo {\n margin-right: 100px;\n }\n\n .main_menu_wrapper {\n .main_menu_block {\n .main_menu {\n ul.nav {\n > li {\n a {\n padding: 20px 21px 28px;\n font-size: 14px;\n }\n }\n }\n }\n }\n }\n }\n }\n\n @media (max-width: 750px) {\n position: sticky;\n top: 0;\n .projects_logo_wrapper {\n display: none;\n }\n\n .main_menu_logo_wrapper {\n padding: 17px 0;\n\n .logo {\n position: relative;\n z-index: 2000;\n margin-right: 100px;\n }\n\n .mobile_menu_bg {\n opacity: 0;\n position: fixed;\n z-index: 500;\n pointer-events: none;\n top: 0;\n right: 0;\n width: 100%;\n height: 100%;\n background-color: #131313;\n transition: opacity 0.2s;\n\n body.mobile-menu-opened & {\n pointer-events: auto;\n opacity: 0.6;\n }\n }\n\n .main_menu_wrapper {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1000;\n height: 100vh;\n width: 100%;\n pointer-events: none;\n\n .mobile_menu_btn {\n display: flex;\n justify-content: center;\n flex-direction: column;\n align-items: center;\n position: fixed;\n top: 10px;\n right: 15px;\n background-color: transparent;\n width: 50px;\n height: 50px;\n border-radius: 50%;\n pointer-events: auto;\n z-index: 2000;\n\n span {\n display: block;\n width: 25px;\n height: 3px;\n background-color: #000000;\n margin: 2px 0;\n transition: transform 0.2s, opacity 0.2s;\n }\n\n body.mobile-menu-opened & {\n span {\n &:nth-child(1) {\n transform: rotate(45deg) translate(4.4px, 4.4px);\n\n }\n\n &:nth-child(2) {\n opacity: 0;\n }\n\n &:nth-child(3) {\n transform: rotate(-45deg) translate(5.25px, -5.25px);\n }\n }\n }\n }\n\n .main_menu_block {\n background-color: #ffffff;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s;\n position: relative;\n top: 0;\n height: 100%;\n\n .main_menu {\n ul.nav {\n display: flex;\n flex-direction: column;\n justify-content: stretch;\n list-style: none;\n margin: 0;\n padding: 38vw 0 0;\n position: absolute;\n\n li {\n a {\n padding: 18px 20px;\n font-size: 18px;\n line-height: 22px;\n color: #6d7b84;\n }\n }\n }\n }\n\n .mobile_projects_logo_wrapper {\n position: absolute;\n bottom: 0;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n width: 100%;\n\n h6 {\n margin: 0 0 10px 20px;\n font-style: normal;\n font-weight: normal;\n font-size: 10px;\n line-height: 14px;\n color: #252526;\n }\n\n .learn_python {\n padding: 24px 20px;\n background: #262525;\n width: 100%;\n\n .logo {\n a {\n display: block;\n text-decoration: none;\n\n .logo_title {\n margin: 0;\n font-family: 'Ubuntu', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 20px;\n line-height: 30px;\n letter-spacing: 0.105em;\n text-transform: uppercase;\n color: #ffffff;\n\n & .blue {\n color: #2c91cb;\n }\n\n & .yellow {\n color: #f2c94c;\n }\n }\n }\n }\n }\n\n .python_week {\n padding: 21px 20px;\n background: #0f1686;\n width: 100%;\n\n .logo {\n a {\n display: block;\n width: 127px;\n height: 38px;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n\n .moscow_python {\n padding: 21px 20px;\n background: #f8f9fa;\n width: 100%;\n\n .logo {\n a {\n display: block;\n width: 162px;\n height: 37px;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n }\n\n body.mobile-menu-opened & {\n opacity: 1;\n pointer-events: auto;\n }\n }\n }\n }\n }\n}\n/*! HEADER END */\n\n/*! SECTION PROJECTS START */\n.projects_wrapper {\n .projects_list {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n min-height: 623px;\n\n h6 {\n margin: 0;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 16px;\n color: #ffffff;\n }\n\n .descr {\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 16px;\n color: #ffffff;\n }\n\n .learn_python {\n padding: 40px 50px;\n background: #262525;\n width: calc(100% / 3);\n\n .logo {\n a {\n display: block;\n text-decoration: none;\n\n .logo_title {\n margin: 33px 0 0;\n font-family: 'Ubuntu', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 26px;\n line-height: 35px;\n letter-spacing: 0.105em;\n text-transform: uppercase;\n color: #ffffff;\n\n & .blue {\n color: #2c91cb;\n }\n\n & .yellow {\n color: #f2c94c;\n }\n }\n }\n }\n\n h4 {\n margin: 50px 0 20px;\n font-family: 'Roboto', sans-serif;\n font-style: normal;\n font-weight: 900;\n font-size: 23px;\n line-height: 31px;\n color: #ffffff;\n }\n\n .date {\n font-family: 'Ubuntu', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 24px;\n line-height: 32px;\n color: #f2c94c;\n\n & span {\n color: #ffffff;\n }\n }\n }\n\n .python_week {\n padding: 40px 50px;\n background: #0f1686;\n width: calc(100% / 3);\n\n .logo {\n a {\n display: block;\n width: 198px;\n height: 61px;\n margin: 20px 0 0;\n text-decoration: none;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n }\n\n h4 {\n margin: 35px 0 20px;\n font-style: normal;\n font-weight: 600;\n font-size: 24px;\n line-height: 32px;\n color: #ffffff;\n }\n\n .date {\n font-style: normal;\n font-weight: bold;\n font-size: 24px;\n line-height: 32px;\n color: #fcd600;\n }\n }\n\n .moscow_python {\n padding: 40px 50px;\n background: #f8f9fa;\n width: calc(100% / 3);\n\n h6 {\n color: #252526;\n }\n\n .logo {\n a {\n display: block;\n width: 275px;\n height: 61px;\n margin: 20px 0 0;\n text-decoration: none;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n }\n\n h4 {\n font-family: 'Roboto', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 24px;\n line-height: 32px;\n color: #000000;\n }\n\n .date {\n font-style: normal;\n font-weight: normal;\n font-size: 24px;\n line-height: 32px;\n color: #33719c;\n }\n\n .descr {\n color: #252526;\n }\n }\n }\n\n @media (max-width: 1200px) {\n .projects_list {\n min-height: 452px;\n\n h6 {\n font-size: 10px;\n line-height: 14px;\n }\n\n .descr {\n font-size: 10px;\n line-height: 14px;\n }\n\n .learn_python {\n padding: 46px 20px;\n\n .logo {\n a {\n .logo_title {\n margin: 29px 0 0;\n font-size: 22px;\n line-height: 30px;\n }\n }\n }\n\n h4 {\n margin: 37px 0 15px;\n font-size: 14px;\n line-height: 19px;\n }\n\n .date {\n font-size: 15px;\n line-height: 20px;\n }\n }\n\n .python_week {\n padding: 46px 20px;\n\n .logo {\n a {\n width: 155px;\n height: 49px;\n margin: 20px 0 0;\n }\n }\n\n h4 {\n margin: 26px 0 16px;\n font-size: 14px;\n line-height: 19px;\n }\n\n .date {\n font-size: 15px;\n line-height: 20px;\n }\n }\n\n .moscow_python {\n padding: 46px 20px;\n\n .logo {\n a {\n display: block;\n width: 162px;\n height: 37px;\n margin: 20px 0 0;\n text-decoration: none;\n }\n }\n\n h4 {\n font-size: 14px;\n line-height: 19px;\n margin: 34px 0 16px;\n }\n\n .date {\n font-size: 15px;\n line-height: 20px;\n }\n }\n }\n }\n\n @media (max-width: 750px) {\n .projects_list {\n display: block;\n flex-direction: unset;\n flex-wrap: unset;\n justify-content: unset;\n align-items: unset;\n position: relative;\n //display: flex;\n //min-height: 468px;\n //overflow-x: auto;\n //scroll-snap-type: x mandatory;\n\n .project_item {\n //width: 75vw;\n width: 275px;\n height: 475px;\n //scroll-snap-align: start;\n }\n\n h6 {\n font-size: 10px;\n line-height: 14px;\n }\n\n .descr {\n font-size: 10px;\n line-height: 14px;\n }\n\n .learn_python {\n padding: 46px 20px;\n\n .logo {\n a {\n .logo_title {\n margin: 29px 0 0;\n font-size: 22px;\n line-height: 30px;\n }\n }\n }\n\n h4 {\n margin: 37px 0 15px;\n font-size: 14px;\n line-height: 19px;\n }\n\n .date {\n font-size: 15px;\n line-height: 20px;\n }\n }\n\n .python_week {\n padding: 46px 20px;\n\n .logo {\n a {\n width: 155px;\n height: 49px;\n margin: 20px 0 0;\n }\n }\n\n h4 {\n margin: 26px 0 16px;\n font-size: 14px;\n line-height: 19px;\n }\n\n .date {\n font-size: 15px;\n line-height: 20px;\n }\n }\n\n .moscow_python {\n padding: 46px 20px;\n\n .logo {\n a {\n display: block;\n width: 162px;\n height: 37px;\n margin: 20px 0 0;\n text-decoration: none;\n }\n }\n\n h4 {\n font-size: 14px;\n line-height: 19px;\n margin: 34px 0 16px;\n }\n\n .date {\n font-size: 15px;\n line-height: 20px;\n }\n }\n\n ul.slick-dots {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n position: absolute;\n bottom: 100px;\n left: 50%;\n transform: translate(-50%, 0);\n margin: 0;\n padding: 0;\n list-style: none;\n\n > li {\n margin: 0;\n padding: 5px;\n\n button {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n width: 16px;\n height: 16px;\n background-color: #0063f9;\n border-radius: 50%;\n border: none;\n font-size: 0;\n line-height: 0;\n margin: 0;\n padding: 0;\n outline: none;\n box-shadow: none;\n cursor: pointer;\n\n &:before {\n transition: transform 0.2s;\n content: '';\n display: block;\n width: 8px;\n height: 8px;\n background-color: #81a4ff;\n border-radius: 50%;\n transform: scale(0);\n }\n }\n\n &.slick-active button:before {\n transform: scale(1);\n }\n }\n }\n }\n }\n}\n/*! SECTION PROJECTS END */\n\n/*! SECTION DISTRIBUTION FORM START */\n.distribution_form_wrapper {\n padding-top: 110px;\n\n .distribution {\n position: relative;\n z-index: 5;\n\n .distribution_form {\n position: absolute;\n z-index: 5;\n bottom: 0;\n left: 93px;\n width: 914px;\n background: #ffffff;\n padding: 43px 22px;\n border-radius: 10px;\n border: 2px solid #fcfdfe;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n\n .distribution_item {\n margin-right: 25px;\n\n img {\n display: block;\n width: 120px;\n height: 108px;\n }\n\n .form_wrapper {\n p {\n margin: 0 0 30px;\n max-width: 430px;\n font-style: normal;\n font-weight: bold;\n font-size: 18px;\n line-height: 26px;\n color: #040306;\n\n span {\n color: #f7f0fe;\n }\n }\n\n form {\n .forma {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n input {\n padding: 22px 19px;\n display: block;\n width: 388px;\n background: #f8f9fa;\n border-top: 1px solid #edeff1;\n border-bottom: 1px solid #edeff1;\n border-left: 1px solid #edeff1;\n border-right: none;\n box-sizing: border-box;\n border-radius: 6px 0 0 6px;\n\n &::placeholder {\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 600;\n font-size: 14px;\n line-height: 17px;\n color: #6d7b84;\n }\n }\n\n .btn_distr {\n display: block;\n padding: 22px 36px;\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 17px;\n text-transform: uppercase;\n color: #000000;\n background: #ffffff;\n border-radius: 0 6px 6px 0;\n border-top: 1px solid #edeff1;\n border-bottom: 1px solid #edeff1;\n border-right: 1px solid #edeff1;\n border-left: none;\n cursor: pointer;\n }\n }\n }\n }\n }\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n z-index: 0;\n background-image: url(../img/decor.png);\n background-repeat: no-repeat;\n top: 100%;\n left: 25%;\n width: 384px;\n height: 72px;\n }\n }\n }\n\n @media (max-width: 1200px) {\n padding-top: 110px;\n\n .distribution {\n position: relative;\n z-index: 5;\n\n .distribution_form {\n position: absolute;\n z-index: 5;\n bottom: 0;\n left: 93px;\n width: 606px;\n background: #ffffff;\n padding: 26px 20px;\n\n .distribution_item {\n margin-right: 21px;\n\n img {\n width: 87px;\n height: 87px;\n }\n\n .form_wrapper {\n p {\n margin: 0 0 13px;\n max-width: 331px;\n font-size: 14px;\n line-height: 20px;\n }\n\n form {\n .forma {\n input {\n padding: 22px 19px;\n width: 278px;\n\n &::placeholder {\n font-size: 12px;\n line-height: 14px;\n }\n }\n\n .btn_distr {\n padding: 20px 18px;\n font-size: 12px;\n line-height: 14px;\n }\n }\n }\n }\n }\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n z-index: 0;\n background-image: url(../img/decor.png);\n background-repeat: no-repeat;\n top: 100%;\n left: 25%;\n width: 384px;\n height: 72px;\n }\n }\n }\n }\n\n @media (max-width: 750px) {\n padding-top: 50px;\n width: 100%;\n\n .distribution {\n position: relative;\n z-index: 5;\n\n .distribution_form {\n position: absolute;\n z-index: 5;\n bottom: -10px;\n left: 0;\n width: 100%;\n background: #ffffff;\n padding: 20px 15px;\n display: block;\n\n .distribution_item {\n margin-right: 21px;\n\n img {\n position: absolute;\n width: 40px;\n height: 40px;\n }\n\n .form_wrapper {\n p {\n margin: 0 0 13px 60px;\n max-width: unset;\n font-size: 12px;\n line-height: 17px;\n }\n\n form {\n .forma {\n input {\n padding: 12px 10px;\n width: 100%;\n\n &::placeholder {\n font-size: 10px;\n line-height: 12px;\n }\n }\n\n .btn_distr {\n padding: 12px 18px;\n font-size: 10px;\n line-height: 12px;\n }\n }\n }\n }\n }\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n z-index: 0;\n background-image: url(../img/decor.png);\n background-repeat: no-repeat;\n background-position: bottom;\n top: 100%;\n left: 5px;\n width: 100%;\n height: 42px;\n }\n }\n }\n }\n}\n/*! SECTION DISTRIBUTION FORM END */\n\n/*! SECTION POSTS START */\n.posts_wrapper {\n .posts_list {\n padding: 0 0 60px;\n border-bottom: 3px solid #f4f4f4;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: flex-start;\n\n .posts_item {\n h1 {\n font-size: 26px;\n line-height: 42px;\n margin: 0;\n }\n\n h4 {\n margin: 0 0 15px;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 21px;\n color: #000000;\n }\n\n ul.tags {\n list-style: none;\n margin: 0;\n padding: 0;\n\n li {\n a {\n display: block;\n text-decoration: none;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #404b59;\n margin-bottom: 11px;\n\n &:hover, &:focus {\n color: #0063f9;\n }\n }\n }\n }\n\n .sponsor_wrapper {\n padding: 40px 0 0;\n\n .sponsor_title {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin-bottom: 20px;\n\n .title {\n max-width: 98px;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 17px;\n color: #000000;\n margin-right: 10px;\n }\n\n .heart {\n .fa {\n color: #f64a4a;\n font-size: 22px;\n }\n }\n }\n\n .sponsor_list {\n .sponsor_item {\n margin-bottom: 10px;\n\n img {\n display: block;\n width: 148px;\n height: 76px;\n }\n\n .sponsor_name {\n margin: 0;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #404b59;\n }\n }\n }\n }\n\n .articles {\n padding: 35px 0 0;\n\n article {\n margin: 0 0 35px;\n\n a {\n display: block;\n text-decoration: none;\n\n .user_info_content {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n\n .avatar {\n margin-right: 10px;\n\n img {\n display: block;\n width: 32px;\n height: 32px;\n }\n }\n\n .user_info {\n .name {\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #000000;\n\n .job {\n color: #a7aeb3;\n font-weight: normal;\n margin-left: 5px;\n font-size: 13px;\n }\n }\n\n .date {\n font-style: normal;\n font-weight: 500;\n font-size: 10px;\n line-height: 14px;\n color: #a7aeb3;\n }\n }\n }\n\n .article_title {\n font-style: normal;\n font-weight: bold;\n font-size: 20px;\n line-height: 24px;\n color: #000000;\n margin: 10px 0 0;\n }\n }\n\n ul.article_tags {\n list-style: none;\n margin: 0 -5px;\n padding: 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n li {\n a {\n margin: 0 5px;\n display: block;\n text-decoration: none;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #000000;\n\n &:hover, &:focus {\n color: #0063f9;\n }\n }\n }\n }\n\n .article_descr {\n margin: 10px 0 0;\n max-width: 510px;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n color: #04202f;\n }\n }\n\n .bonus_mobile {\n display: none;\n }\n }\n\n .bonus {\n a {\n display: block;\n width: 260px;\n height: 365px;\n text-decoration: none;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n }\n\n @media (max-width: 1200px) {\n .posts_list {\n display: grid;\n grid-template-columns: 160px auto;\n grid-template-rows: auto auto;\n grid-gap: 20px;\n\n .posts_item {\n &.sec_col {\n grid-row: 1/span2;\n grid-column: 2/3;\n }\n\n .sponsor_wrapper {\n padding: 20px 0 0;\n }\n\n .bonus {\n a {\n width: 148px;\n height: 203px;\n }\n }\n }\n }\n }\n\n @media (max-width: 750px) {\n .posts_list {\n padding: 0 0 40px;\n display: block;\n flex-direction: unset;\n justify-content: unset;\n align-items: unset;\n\n .posts_item {\n h1 {\n margin: 20px 0 0;\n font-size: 20px;\n line-height: 32px;\n }\n\n h4 {\n margin: 0 0 11px;\n font-size: 14px;\n line-height: 21px;\n }\n\n ul.tags {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n flex-wrap: wrap;\n\n li {\n a {\n font-size: 12px;\n line-height: 18px;\n margin-bottom: 11px;\n margin-right: 2px;\n }\n }\n }\n\n .sponsor_wrapper {\n padding: 40px 0 0;\n\n .sponsor_title {\n margin-bottom: 16px;\n\n .title {\n max-width: unset;\n }\n\n .heart {\n\n .fa {\n color: #f64a4a;\n font-size: 17px;\n }\n }\n }\n\n .sponsor_list {\n display: flex;\n flex-direction: row;\n overflow-x: auto;\n scroll-snap-type: x mandatory;\n\n .sponsor_item {\n margin-bottom: 10px;\n scroll-snap-align: start;\n\n img {\n display: block;\n width: 148px;\n height: 76px;\n }\n\n .sponsor_name {\n margin: 0;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #404b59;\n }\n }\n }\n }\n\n .articles {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n\n article {\n margin: 0 0 25px;\n\n a {\n display: block;\n text-decoration: none;\n\n .user_info_content {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n\n .avatar {\n margin-right: 10px;\n\n img {\n width: 29px;\n height: 29px;\n }\n }\n\n .user_info {\n .name {\n font-size: 10px;\n line-height: 15px;\n\n .job {\n margin-left: 3px;\n font-size: 12px;\n }\n }\n\n .date {\n font-size: 8px;\n line-height: 11px;\n }\n }\n }\n\n .article_title {\n font-size: 16px;\n line-height: 19px;\n margin: 6px 0 0;\n }\n }\n\n .article_descr {\n margin: 10px 0 0;\n max-width: 510px;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n color: #04202f;\n }\n }\n\n .bonus_mobile {\n display: block;\n width: 100%;\n margin: 0 0 25px;\n\n a {\n display: block;\n width: 100%;\n height: 170px;\n text-decoration: none;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n object-position: center;\n }\n }\n }\n\n & article {\n order: 3;\n }\n\n & article:nth-child(-n + 5) {\n order: 1;\n }\n\n & .bonus_mobile {\n order: 2;\n }\n }\n\n .bonus {\n display: none;\n }\n }\n }\n }\n}\n/*! SECTION POSTS END */\n\n/*! SECTION BADGES START */\n.badges_wrapper {\n .badges_list {\n border-bottom: 3px solid #f4f4f4;\n padding: 30px 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n .badges_item {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n\n img {\n display: block;\n width: 74px;\n height: 74px;\n margin-right: 10px;\n }\n\n p {\n margin: 0;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 21px;\n color: #404b59;\n }\n }\n\n .badges_item + .badges_item {\n margin-left: 100px;\n }\n }\n\n @media (max-width: 1200px) {\n .badges_list {\n .badges_item {\n\n img {\n width: 56px;\n height: 56px;\n }\n\n p {\n font-size: 12px;\n line-height: 18px;\n }\n }\n\n .badges_item + .badges_item {\n margin-left: 26px;\n }\n }\n }\n\n @media (max-width: 750px) {\n .badges_list {\n padding: 30px 0;\n display: grid;\n grid-template-rows: 1fr 1fr;\n grid-template-columns: 1fr 1fr;\n grid-gap: 25px;\n\n .badges_item {\n\n\n img {\n width: 35px;\n height: 35px;\n }\n\n p {\n font-size: 12px;\n line-height: 18px;\n }\n }\n\n .badges_item + .badges_item {\n margin-left: 0;\n }\n }\n }\n}\n/*! SECTION BADGES END */\n\n/*! SECTION EVENTS START */\n.events_wrapper {\n padding: 40px 0 120px;\n\n .events_list {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n flex-wrap: wrap;\n margin: 0 -10px;\n\n .events_item {\n margin: 0 10px 20px;\n width: calc(100% / 2 - 20px);\n padding: 20px;\n border: 1px solid #e7f0fe;\n border-radius: 18px;\n\n .event_info {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n position: relative;\n\n .event_logo {\n width: 111px;\n height: 44px;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n\n .event_date {\n margin: 0 14px;\n padding: 0 14px;\n border-right: 1px solid #0063f9;\n border-left: 1px solid #0063f9;\n\n .date {\n margin: 0;\n font-style: normal;\n font-weight: normal;\n font-size: 26px;\n line-height: 31px;\n text-align: center;\n color: #04202f;\n }\n\n .month {\n margin: 0;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n text-align: center;\n color: #04202f;\n }\n }\n\n .event_location {\n .place {\n margin: 8px 0;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n color: #04202f;\n }\n\n .day {\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n color: #04202f;\n }\n }\n\n .price {\n position: absolute;\n right: -21px;\n top: 7px;\n display: block;\n padding: 4px 15px;\n width: 84px;\n background: #023d8c;\n border: 1px solid #05337e;\n border-radius: 25px 0 0 25px;\n font-style: normal;\n font-weight: 600;\n font-size: 14px;\n line-height: 17px;\n color: #ffffff;\n\n }\n }\n\n .event_title {\n margin: 20px 0 0;\n font-style: normal;\n font-weight: 600;\n font-size: 18px;\n line-height: 26px;\n color: #04202f;\n }\n\n .event_descr {\n margin: 0 0 20px;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n color: #04202f;\n }\n\n .event_detail {\n display: inline-block;\n text-decoration: none;\n background: #04202f;\n border: 1px solid #010815;\n border-radius: 23px;\n padding: 10px 20px;\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 17px;\n color: #ffffff;\n transition: box-shadow 0.2s;\n\n &:hover {\n box-shadow: 1px 1px 9px 2px rgba(7, 62, 99, 0.66);\n }\n }\n }\n }\n\n @media (max-width: 1200px) {\n padding: 40px 0 90px;\n\n .events_list {\n .events_item {\n .event_info {\n display: grid;\n grid-template-columns: auto auto;\n grid-template-rows: auto auto;\n grid-row-gap: 15px;\n\n .event_date {\n grid-column: 1/2;\n grid-row: 2/3;\n margin: 0 14px 0 0;\n padding: 0;\n border-left: none;\n }\n\n .event_location {\n grid-column: 2/3;\n grid-row: 2/3;\n }\n }\n }\n }\n }\n\n @media (max-width: 750px) {\n padding: 20px 0 55px;\n\n .events_list {\n display: block;\n flex-direction: unset;\n justify-content: unset;\n flex-wrap: unset;\n margin: 0;\n\n .events_item {\n margin: 0 0 20px;\n width: 100%;\n padding: 20px;\n border: 1px solid #e7f0fe;\n border-radius: 18px;\n\n .event_info {\n display: grid;\n grid-template-columns: auto auto;\n grid-template-rows: auto auto;\n grid-row-gap: 15px;\n\n .event_date {\n grid-column: 1/2;\n grid-row: 2/3;\n margin: 0 14px 0 0;\n padding: 0;\n border-left: none;\n }\n\n .event_location {\n grid-column: 2/3;\n grid-row: 2/3;\n }\n }\n }\n }\n }\n}\n/*! SECTION EVENTS END */\n\n/*! SECTION SEARCH START */\n.search_wrapper {\n padding: 35px 0;\n\n .search_block {\n position: relative;\n\n input {\n display: block;\n padding: 23px 20px;\n width: 100%;\n background: #ffffff;\n border: 2px solid #e7f0fe;\n border-radius: 8px;\n\n &::placeholder {\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 17px;\n color: #a7aeb3;\n }\n }\n\n button {\n padding: 23px 45px;\n border: none;\n outline: none;\n background: transparent;\n cursor: pointer;\n width: 45px;\n height: 100%;\n position: absolute;\n top: 0;\n right: 0;\n\n img {\n display: block;\n width: 20px;\n height: 20px;\n }\n }\n }\n\n @media (max-width: 750px) {\n padding: 17px 0 23px;\n .search_block {\n position: relative;\n\n input {\n display: block;\n padding: 18px 40px;\n\n &::placeholder {\n font-size: 12px;\n line-height: 14px;\n }\n }\n }\n }\n}\n/*! SECTION SEARCH END */\n\n/*! SECTION EVENTS PAGE SEARCH START */\n.events_page_search_wrapper {\n padding: 35px 0;\n\n .form_wrapper {\n form {\n .forma {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n margin: 0 -10px;\n\n .form-group {\n display: flex;\n flex-direction: row;\n justify-content: stretch;\n margin: 0 10px;\n\n .search_block {\n position: relative;\n width: 606px;\n\n input {\n display: block;\n padding: 23px 20px;\n width: 100%;\n background: #ffffff;\n border: 2px solid #e7f0fe;\n border-radius: 8px;\n\n &::placeholder {\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 17px;\n color: #a7aeb3;\n }\n }\n\n button {\n padding: 23px 45px;\n border: none;\n outline: none;\n background: transparent;\n cursor: pointer;\n width: 45px;\n height: 100%;\n position: absolute;\n top: 0;\n right: 0;\n\n img {\n display: block;\n width: 20px;\n height: 20px;\n }\n }\n }\n\n .select_wrapper {\n width: 260px;\n background: #ffffff;\n\n select {\n display: block;\n width: 100%;\n }\n\n .select2 {\n display: block;\n width: 100%;\n height: 100%;\n border: 2px solid #e7f0fe;\n border-radius: 8px;\n\n .select2-selection {\n border: none;\n background-color: #ffffff;\n outline: none;\n }\n\n .select2-selection__rendered {\n padding: 17px 20px;\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 28px;\n color: #04202f;\n }\n\n .select2-selection__arrow {\n top: 30%;\n right: 25px;\n }\n\n .select2-selection__placeholder {\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 17px;\n color: #04202f;\n }\n }\n\n .select2-container {\n .select2-dropdown {\n border: none;\n\n .select2-results {\n border: 2px solid #e7f0fe;\n box-shadow: 0 0 27px rgba(0, 2, 4, 0.09);\n background-color: #ffffff;\n padding: 15px;\n margin-top: -5px;\n border-radius: 0 0 8px 8px;\n\n .select2-results__option {\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 17px;\n color: #04202f;\n\n &--highlighted[aria-selected] {\n color: #0063f9;\n background-color: #ffffff;\n }\n }\n }\n }\n }\n }\n\n .filter {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n border: 2px solid #e7f0fe;\n border-radius: 8px;\n margin-right: 20px;\n\n .filter_item {\n label {\n transition: background-color 0.2s, color 0.2s;\n display: block;\n margin: 0;\n padding: 22px 8px;\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: normal;\n color: #04202f;\n cursor: pointer;\n }\n\n input[type=\"radio\"] {\n display: none;\n\n &:checked + label {\n color: #0063f9;\n background: rgba(0, 0, 255, 0.025);\n }\n }\n\n &:first-child label {\n padding-left: 20px;\n }\n\n &:last-child label {\n padding-right: 20px;\n }\n }\n }\n }\n }\n }\n }\n\n @media (max-width: 1200px) {\n padding: 20px 0 30px;\n\n .form_wrapper {\n form {\n .forma {\n display: block;\n flex-direction: unset;\n justify-content: unset;\n margin: 0;\n\n .form-group {\n margin: 0 10px 20px;\n\n .search_block {\n width: 100%;\n }\n\n .select_wrapper {\n width: 514px;\n\n .select2-selection__rendered {\n font-size: 12px;\n line-height: 26px;\n }\n }\n }\n }\n }\n }\n }\n\n @media (max-width: 750px) {\n padding: 17px 0 23px;\n .form_wrapper {\n form {\n .forma {\n display: block;\n flex-direction: unset;\n justify-content: unset;\n margin: 0;\n\n .form-group {\n margin: 0 0 15px;\n\n .search_block {\n width: 100%;\n\n input {\n padding: 19px 15px;\n\n &::placeholder {\n font-size: 12px;\n line-height: 14px;\n }\n }\n }\n\n .select_wrapper {\n width: 100%;\n\n .select2 {\n .select2-selection__rendered {\n padding: 17px 10px;\n font-size: 12px;\n line-height: 23px;\n }\n\n .select2-selection__arrow {\n top: 30%;\n right: 10px;\n }\n\n .select2-selection__placeholder {\n font-size: 12px;\n line-height: 23px;\n }\n }\n\n .select2-container {\n .select2-dropdown {\n border: none;\n\n .select2-results {\n padding: 10px;\n margin-top: -5px;\n\n .select2-results__option {\n font-size: 12px;\n line-height: 14px;\n }\n }\n }\n }\n }\n\n .filter {\n margin-right: 10px;\n\n .filter_item {\n label {\n padding: 21px 7px;\n font-size: 12px;\n }\n\n &:first-child label {\n padding-left: 10px;\n }\n\n &:last-child label {\n padding-right: 10px;\n }\n }\n }\n }\n }\n }\n }\n }\n}\n/*! SECTION EVENTS PAGE SEARCH END */\n\n/*! SECTION EVENTS PAGE EVENTS START */\n.events_page_events_wrapper {\n .events_list {\n padding: 0 0 60px;\n border-bottom: 3px solid #f4f4f4;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: flex-start;\n\n .events_item {\n h1 {\n font-size: 26px;\n line-height: 42px;\n margin: 0 0 30px;\n }\n\n h4 {\n margin: 0 0 15px;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 21px;\n color: #000000;\n }\n\n ul.tags {\n list-style: none;\n margin: 0;\n padding: 0;\n\n li {\n a {\n display: block;\n text-decoration: none;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #404b59;\n margin-bottom: 11px;\n\n &:hover, &:focus {\n color: #0063f9;\n }\n }\n }\n }\n\n .sponsor_wrapper {\n padding: 40px 0 0;\n\n .sponsor_title {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin-bottom: 20px;\n\n .title {\n max-width: 98px;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 17px;\n color: #000000;\n margin-right: 10px;\n }\n\n .heart {\n .fa {\n color: #f64a4a;\n font-size: 22px;\n }\n }\n }\n\n .sponsor_list {\n .sponsor_item {\n margin-bottom: 10px;\n\n img {\n display: block;\n width: 148px;\n height: 76px;\n }\n\n .sponsor_name {\n margin: 0;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #404b59;\n }\n }\n }\n }\n\n .articles {\n article {\n margin: 0 0 35px;\n\n .event {\n border: 1px solid #e7f0fe;\n border-radius: 18px;\n\n .image_wrapper {\n width: 100%;\n\n\n img {\n display: block;\n border-radius: 18px 18px 0 0;\n width: 100%;\n }\n }\n\n .content_wrapper {\n padding: 20px;\n\n .event_info {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n position: relative;\n\n .event_logo {\n width: 111px;\n height: 44px;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n\n .event_date {\n margin: 0 14px;\n padding: 0 14px;\n border-right: 1px solid #0063f9;\n border-left: 1px solid #0063f9;\n\n .date {\n margin: 0;\n font-style: normal;\n font-weight: normal;\n font-size: 26px;\n line-height: 31px;\n text-align: center;\n color: #04202f;\n }\n\n .month {\n margin: 0;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n text-align: center;\n color: #04202f;\n }\n }\n\n .event_location {\n .place {\n margin: 8px 0;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n color: #04202f;\n }\n\n .day {\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n color: #04202f;\n }\n }\n\n .price {\n position: absolute;\n right: -21px;\n top: 7px;\n display: block;\n padding: 4px 15px;\n width: 84px;\n background: #023d8c;\n border: 1px solid #05337e;\n border-radius: 25px 0 0 25px;\n font-style: normal;\n font-weight: 600;\n font-size: 14px;\n line-height: 17px;\n color: #ffffff;\n\n }\n }\n\n .event_title {\n margin: 20px 0 0;\n font-style: normal;\n font-weight: 600;\n font-size: 18px;\n line-height: 26px;\n color: #04202f;\n }\n\n .event_descr {\n max-width: 540px;\n margin: 0 0 20px;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n color: #04202f;\n }\n\n .event_detail {\n display: inline-block;\n text-decoration: none;\n background: #04202f;\n border: 1px solid #010815;\n border-radius: 23px;\n padding: 10px 20px;\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 17px;\n color: #ffffff;\n transition: box-shadow 0.2s;\n\n &:hover {\n box-shadow: 1px 1px 9px 2px rgba(7, 62, 99, 0.66);\n }\n }\n }\n }\n }\n\n .bonus_mobile {\n display: none;\n }\n }\n\n .bonus {\n a {\n display: block;\n width: 260px;\n height: 365px;\n text-decoration: none;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n }\n\n @media (max-width: 1200px) {\n .events_list {\n display: grid;\n grid-template-columns: 160px auto;\n grid-template-rows: auto auto;\n grid-gap: 20px;\n\n .events_item {\n &.sec_col {\n grid-row: 1/span2;\n grid-column: 2/3;\n }\n\n .sponsor_wrapper {\n padding: 20px 0 0;\n }\n\n .bonus {\n a {\n width: 148px;\n height: 203px;\n }\n }\n }\n }\n }\n\n @media (max-width: 750px) {\n .events_list {\n padding: 0 0 40px;\n display: block;\n flex-direction: unset;\n justify-content: unset;\n align-items: unset;\n\n .events_item {\n h1 {\n margin-top: 20px;\n font-size: 20px;\n line-height: 32px;\n }\n\n h4 {\n margin: 0 0 11px;\n font-size: 14px;\n line-height: 21px;\n }\n\n ul.tags {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n flex-wrap: wrap;\n\n li {\n a {\n font-size: 12px;\n line-height: 18px;\n margin-bottom: 11px;\n margin-right: 2px;\n }\n }\n }\n\n .sponsor_wrapper {\n padding: 40px 0 0;\n\n .sponsor_title {\n margin-bottom: 16px;\n\n .title {\n max-width: unset;\n }\n\n .heart {\n\n .fa {\n color: #f64a4a;\n font-size: 17px;\n }\n }\n }\n\n .sponsor_list {\n display: flex;\n flex-direction: row;\n overflow-x: auto;\n scroll-snap-type: x mandatory;\n\n .sponsor_item {\n margin-bottom: 10px;\n scroll-snap-align: start;\n\n img {\n display: block;\n width: 148px;\n height: 76px;\n }\n\n .sponsor_name {\n margin: 0;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #404b59;\n }\n }\n }\n }\n\n .articles {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n\n article {\n margin: 0 0 25px;\n\n .event {\n .content_wrapper {\n .event_info {\n display: grid;\n grid-template-columns: auto auto;\n grid-template-rows: auto auto;\n grid-row-gap: 15px;\n\n .event_date {\n grid-column: 1/2;\n grid-row: 2/3;\n margin: 0 14px 0 0;\n padding: 0;\n border-left: none;\n }\n\n .event_location {\n grid-column: 2/3;\n grid-row: 2/3;\n }\n }\n }\n\n }\n }\n\n .bonus_mobile {\n display: block;\n width: 100%;\n margin: 0 0 25px;\n\n a {\n display: block;\n width: 100%;\n height: 170px;\n text-decoration: none;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n object-position: center;\n }\n }\n }\n\n & article {\n order: 3;\n }\n\n & article:nth-child(-n + 3) {\n order: 1;\n }\n\n & .bonus_mobile {\n order: 2;\n }\n }\n\n .bonus {\n display: none;\n }\n }\n }\n }\n}\n/*! SECTION EVENTS PAGE EVENTS END */\n\n/*! SECTION EVENTS PAGE LAST POSTS START */\n.events_page_posts {\n padding: 35px 0 120px;\n\n .posts_list {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n flex-wrap: wrap;\n margin: 0 -10px 35px;\n\n .posts_item {\n background: #ffffff;\n border: 1px solid #e7f0fe;\n border-radius: 6px;\n margin: 0 10px 20px;\n padding: 20px;\n width: calc(100% / 2 - 20px);\n\n a {\n display: block;\n text-decoration: none;\n\n .user_info_content {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n\n .avatar {\n margin-right: 10px;\n\n img {\n display: block;\n width: 32px;\n height: 32px;\n }\n }\n\n .user_info {\n .name {\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #000000;\n\n .job {\n color: #a7aeb3;\n font-weight: normal;\n margin-left: 5px;\n font-size: 13px;\n }\n }\n\n .date {\n font-style: normal;\n font-weight: 500;\n font-size: 10px;\n line-height: 14px;\n color: #a7aeb3;\n }\n }\n }\n\n .article_title {\n font-style: normal;\n font-weight: bold;\n font-size: 20px;\n line-height: 24px;\n color: #000000;\n margin: 10px 0 0;\n }\n }\n\n ul.article_tags {\n list-style: none;\n margin: 0 -5px;\n padding: 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n li {\n a {\n margin: 0 5px;\n display: block;\n text-decoration: none;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #000000;\n\n &:hover, &:focus {\n color: #0063f9;\n }\n }\n }\n }\n\n .article_descr {\n margin: 10px 0 0;\n max-width: 510px;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n color: #04202f;\n }\n }\n }\n\n @media (max-width: 1200px) {\n padding: 20px 0 90px;\n }\n\n @media (max-width: 750px) {\n padding: 15px 0 55px;\n .posts_list {\n display: block;\n flex-direction: unset;\n justify-content: unset;\n flex-wrap: unset;\n margin: 0 0 20px;\n\n .posts_item {\n margin: 0 0 20px;\n padding: 15px;\n width: 100%;\n\n a {\n .article_title {\n font-size: 18px;\n line-height: 22px;\n }\n }\n }\n }\n }\n}\n/*! SECTION EVENTS PAGE LAST POSTS END */\n\n/*! SECTION POST PREVIEW CAROUSEL START */\n.post_preview_carousel_wrapper {\n position: relative;\n\n .post_preview_carousel {\n img {\n display: block;\n height: 296px;\n width: 100%;\n }\n\n .carousel_item {\n .carousel_content_wrapper {\n position: absolute;\n top: 56px;\n max-width: 635px;\n\n .title {\n margin: 0 0 20px 0;\n font-style: normal;\n font-weight: 600;\n font-size: 26px;\n line-height: 42px;\n color: #ffffff;\n position: relative;\n }\n\n .descr {\n font-style: normal;\n font-weight: 500;\n font-size: 16px;\n line-height: 26px;\n color: #ffffff;\n }\n }\n }\n }\n\n .slick-arrow {\n border: none;\n outline: none;\n width: 202px;\n background: transparent;\n position: absolute;\n top: 70px;\n cursor: pointer;\n padding: 15px 0;\n\n span {\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 400;\n font-size: 16px;\n line-height: 26px;\n color: #ffffff;\n }\n\n .fa {\n color: #ffffff;\n font-size: 14px;\n }\n\n &.slick-next {\n right: 17vw;\n }\n }\n\n @media (max-width: 1200px) {\n .post_preview_carousel {\n img {\n height: 231px;\n }\n\n .carousel_item {\n .carousel_content_wrapper {\n top: 35px;\n max-width: 450px;\n\n .title {\n margin: 0 0 15px 0;\n font-size: 22px;\n line-height: 35px;\n }\n\n .descr {\n font-size: 14px;\n line-height: 22px;\n }\n }\n }\n }\n\n .slick-arrow {\n width: 120px;\n top: 40px;\n padding: 10px 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n\n span {\n font-size: 14px;\n line-height: 22px;\n }\n\n .fa {\n font-size: 12px;\n }\n\n &.slick-next {\n right: 20vw;\n }\n }\n }\n\n @media (max-width: 750px) {\n .post_preview_carousel {\n img {\n height: 282px;\n }\n\n .carousel_item {\n .carousel_content_wrapper {\n top: 25px;\n max-width: 335px;\n\n .title {\n margin: 0 0 10px 0;\n font-size: 20px;\n line-height: 32px;\n }\n\n .descr {\n font-size: 14px;\n line-height: 22px;\n }\n }\n }\n }\n\n .slick-arrow {\n width: 170px;\n top: unset;\n bottom: 45px;\n padding: 10px 0;\n display: block;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n\n span {\n font-size: 14px;\n line-height: 22px;\n }\n\n .fa {\n font-size: 12px;\n }\n\n &.slick-next {\n right: 22px;\n }\n }\n }\n}\n/*! SECTION POST PREVIEW CAROUSEL END */\n\n/*! SECTION SINGLE POST CONTENT START */\n.single_post_content_wrapper {\n padding: 40px 0 80px;\n position: relative;\n\n .single_post_content {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: flex-start;\n margin: 0 -50px;\n\n .single_post {\n margin: 0 50px;\n\n .mobile_posted {\n display: none;\n }\n\n ul.article_tags {\n list-style: none;\n margin: 0 -5px;\n padding: 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n li {\n a {\n margin: 0 5px;\n display: block;\n text-decoration: none;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #000000;\n\n &:hover, &:focus {\n color: #0063f9;\n }\n }\n }\n }\n\n .single_post_text {\n p {\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n color: #242424;\n }\n\n h3 {\n font-style: normal;\n font-weight: 800;\n font-size: 20px;\n line-height: 28px;\n letter-spacing: 0.015em;\n color: #010519;\n }\n\n h4 {\n font-style: normal;\n font-weight: 500;\n font-size: 18px;\n line-height: 25px;\n color: #010519;\n }\n\n pre {\n background: #242424;\n padding: 35px 25px;\n\n code {\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #ffffff;\n }\n }\n\n img {\n display: block;\n width: 100%;\n }\n\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n\n li {\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n color: #242424;\n position: relative;\n margin: 0 0 20px 40px;\n\n &:before {\n content: '';\n display: block;\n position: absolute;\n top: 9px;\n left: -40px;\n width: 23px;\n height: 1px;\n background: #445764;\n }\n }\n }\n\n }\n }\n\n .user_info_wrapper {\n margin: -165px 50px 0;\n\n .user_info {\n padding: 20px;\n background: #ffffff;\n\n .personal_info_wrapper {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin-bottom: 15px;\n\n .personal_info {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n\n\n img {\n display: block;\n }\n\n .user_name {\n font-style: normal;\n font-weight: bold;\n font-size: 16px;\n line-height: 21px;\n color: #000000;\n margin: 0 15px;\n }\n }\n\n .btn.subscribe {\n background: #0063f9;\n padding: 10px 20px;\n font-style: normal;\n font-weight: bold;\n font-size: 10px;\n line-height: 12px;\n text-align: center;\n text-transform: uppercase;\n color: #ffffff;\n\n &:hover {\n box-shadow: 1px 1px 9px 2px rgba(0, 99, 249, 0.36);\n }\n }\n }\n\n dl {\n margin: 0;\n padding: 0;\n\n dt {\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #a7aeb3;\n }\n\n dd {\n margin: 0 0 10px;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #1c7ff8;\n }\n }\n }\n\n .posted {\n padding: 30px 20px 10px;\n background: #f8f9fa;\n\n dl {\n margin: 0;\n padding: 0;\n\n dt {\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 21px;\n color: #a7aeb3;\n }\n\n dd {\n margin: 0 0 20px;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 21px;\n color: #1c7ff8;\n }\n }\n }\n\n .share {\n padding: 40px 20px;\n\n h2 {\n margin: 0;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 21px;\n color: #000000;\n }\n\n p {\n margin: 0;\n font-style: normal;\n font-weight: 500;\n font-size: 10px;\n line-height: 14px;\n color: #242424;\n }\n\n .social_media {\n margin-top: 20px;\n\n a {\n text-decoration: none;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n padding: 7px 0;\n\n .fa {\n width: 25px;\n height: 25px;\n border-radius: 50%;\n background: #c4c4c4;\n color: #ffffff;\n font-size: 14px;\n line-height: 24px;\n text-align: center;\n margin-right: 10px;\n transition: color 0.2s;\n }\n\n .name {\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #000000;\n margin-right: 5px;\n transition: color 0.2s;\n }\n\n .qty {\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #a7aeb3;\n }\n\n &:hover, &:focus {\n .fa {\n color: #1c7ff8;\n }\n\n .name {\n color: #1c7ff8;\n }\n }\n }\n }\n }\n\n .similar_posts {\n padding: 25px 20px;\n background: #f8f9fa;\n\n h2 {\n margin: 0 0 10px;\n font-style: normal;\n font-weight: bold;\n font-size: 18px;\n line-height: 27px;\n color: #000000;\n }\n\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n\n li {\n a {\n display: block;\n padding: 10px 0;\n text-decoration: none;\n font-style: normal;\n font-weight: 500;\n font-size: 16px;\n line-height: 22px;\n color: #0055ff;\n }\n }\n }\n }\n }\n }\n\n @media (max-width: 1200px) {\n padding: 25px 0 55px;\n\n .single_post_content {\n margin: 0 -10px;\n\n .single_post {\n margin: 0 10px;\n width: 70%;\n }\n\n .user_info_wrapper {\n margin: -135px 10px 0;\n width: 30%;\n\n .user_info {\n padding: 20px 15px;\n background: #ffffff;\n\n .personal_info_wrapper {\n display: block;\n flex-direction: unset;\n justify-content: unset;\n align-items: unset;\n\n .personal_info {\n margin-bottom: 15px;\n\n img {\n display: block;\n }\n\n .user_name {\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 16px;\n color: #000000;\n margin: 0 0 0 10px;\n }\n }\n\n .btn.subscribe {\n padding: 8px 15px;\n font-size: 8px;\n line-height: 10px;\n }\n }\n\n dl {\n margin: 0;\n padding: 0;\n\n dt {\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #a7aeb3;\n }\n\n dd {\n margin: 0 0 10px;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #1c7ff8;\n }\n }\n }\n\n .posted {\n padding: 30px 20px 10px;\n background: #f8f9fa;\n\n dl {\n margin: 0;\n padding: 0;\n\n dt {\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 21px;\n color: #a7aeb3;\n }\n\n dd {\n margin: 0 0 20px;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 21px;\n color: #1c7ff8;\n }\n }\n }\n\n .share {\n padding: 40px 20px;\n\n h2 {\n margin: 0;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 21px;\n color: #000000;\n }\n\n p {\n margin: 0;\n font-style: normal;\n font-weight: 500;\n font-size: 10px;\n line-height: 14px;\n color: #242424;\n }\n }\n\n .similar_posts {\n display: none;\n }\n }\n }\n }\n\n @media (max-width: 750px) {\n padding: 56px 0 0;\n\n .single_post_content {\n display: block;\n flex-direction: unset;\n justify-content: unset;\n align-items: unset;\n margin: 0;\n\n .single_post {\n margin: 0;\n width: 100%;\n\n .mobile_posted {\n display: block;\n padding: 15px;\n background: #f8f9fa;\n border-radius: 3px;\n margin-top: -92px;\n\n dl {\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n div {\n width: calc(100% / 2);\n }\n\n dt {\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 21px;\n color: #a7aeb3;\n }\n\n dd {\n margin: 0;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 21px;\n color: #1c7ff8;\n }\n }\n }\n\n ul.article_tags {\n list-style: none;\n margin: 20px -5px;\n padding: 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n li {\n a {\n margin: 0 5px;\n display: block;\n text-decoration: none;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #000000;\n\n &:hover, &:focus {\n color: #0063f9;\n }\n }\n }\n }\n\n .single_post_text {\n p {\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n color: #242424;\n }\n\n h3 {\n font-style: normal;\n font-weight: 800;\n font-size: 20px;\n line-height: 28px;\n letter-spacing: 0.015em;\n color: #010519;\n }\n\n h4 {\n font-style: normal;\n font-weight: 500;\n font-size: 18px;\n line-height: 25px;\n color: #010519;\n }\n\n pre {\n background: #242424;\n padding: 35px 25px;\n\n code {\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #ffffff;\n }\n }\n\n img {\n display: block;\n width: 100%;\n }\n\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n\n li {\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n color: #242424;\n position: relative;\n margin: 0 0 20px 40px;\n\n &:before {\n content: '';\n display: block;\n position: absolute;\n top: 9px;\n left: -40px;\n width: 23px;\n height: 1px;\n background: #445764;\n }\n }\n }\n\n }\n }\n\n .user_info_wrapper {\n margin: 25px 0 0;\n width: 100%;\n display: flex;\n flex-direction: column-reverse;\n\n .user_info {\n padding: 20px;\n background: #ffffff;\n\n .personal_info_wrapper {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin-bottom: 15px;\n\n .personal_info {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n margin: 0;\n\n\n img {\n display: block;\n }\n\n .user_name {\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 16px;\n color: #000000;\n margin: 0 40px 0 10px;\n }\n }\n\n .btn.subscribe {\n padding: 8px 15px;\n font-size: 8px;\n line-height: 10px;\n }\n }\n\n dl {\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: row;\n\n div {\n width: calc(100% / 3);\n }\n }\n }\n\n .posted {\n display: none;\n }\n\n .share {\n background: #f8f9fa;\n padding: 15px 20px;\n\n h2 {\n margin: 0;\n font-size: 14px;\n line-height: 21px;\n }\n\n p {\n margin: 0;\n font-size: 10px;\n line-height: 14px;\n }\n\n .social_media {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n flex-wrap: wrap;\n margin-top: 20px;\n\n a {\n display: flex;\n width: calc(100% / 2);\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n padding: 10px 7px;\n\n .name {\n font-size: 12px;\n line-height: 18px;\n margin-right: 5px;\n }\n }\n }\n }\n }\n }\n }\n}\n/*! SECTION SINGLE POST CONTENT END */\n\n/*! SECTION POSTS CAROUSEL START */\n.posts_carousel_wrapper {\n .posts_carousel {\n padding: 100px 0 60px;\n border-top: 3px solid #f4f4f4;\n border-bottom: 3px solid #f4f4f4;\n\n .posts_item {\n background: #ffffff;\n border: 1px solid #e7f0fe;\n border-radius: 6px;\n margin: 0 10px 20px;\n padding: 20px;\n width: calc(100% / 2 - 20px);\n\n a {\n display: block;\n text-decoration: none;\n\n .user_info_content {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n\n .avatar {\n margin-right: 10px;\n\n img {\n display: block;\n width: 32px;\n height: 32px;\n }\n }\n\n .user_info {\n .name {\n font-style: normal;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n color: #000000;\n\n .job {\n color: #a7aeb3;\n font-weight: normal;\n margin-left: 5px;\n font-size: 13px;\n }\n }\n\n .date {\n font-style: normal;\n font-weight: 500;\n font-size: 10px;\n line-height: 14px;\n color: #a7aeb3;\n }\n }\n }\n\n .article_title {\n font-style: normal;\n font-weight: bold;\n font-size: 20px;\n line-height: 24px;\n color: #000000;\n margin: 10px 0 0;\n }\n }\n\n ul.article_tags {\n list-style: none;\n margin: 0 -5px;\n padding: 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n li {\n a {\n margin: 0 5px;\n display: block;\n text-decoration: none;\n font-family: 'Anonymous Pro', sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: #000000;\n\n &:hover, &:focus {\n color: #0063f9;\n }\n }\n }\n }\n\n .article_descr {\n margin: 10px 0 0;\n max-width: 510px;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 14px;\n color: #04202f;\n }\n }\n\n .slick-arrow {\n border: none;\n outline: none;\n width: 202px;\n background: transparent;\n position: absolute;\n top: 45px;\n cursor: pointer;\n padding: 15px 0;\n\n span {\n font-family: 'Montserrat', sans-serif;\n font-style: normal;\n font-weight: 500;\n font-size: 16px;\n line-height: normal;\n color: #04202f;\n }\n\n .fa {\n color: #04202f;\n font-size: 14px;\n }\n\n &.slick-prev {\n left: 0;\n }\n\n &.slick-next {\n right: 0;\n }\n }\n }\n\n @media (max-width: 1200px) {\n .posts_carousel {\n padding: 70px 0 30px;\n\n .slick-arrow {\n top: 25px;\n padding: 10px 0;\n\n span {\n font-size: 14px;\n }\n\n .fa {\n color: #04202f;\n font-size: 12px;\n }\n }\n }\n }\n\n @media (max-width: 750px) {\n .posts_carousel {\n padding: 60px 0 40px;\n\n .slick-arrow {\n top: unset;\n padding: 10px 0;\n\n span {\n font-size: 14px;\n }\n\n .fa {\n color: #04202f;\n font-size: 12px;\n }\n\n &.slick-prev {\n left: 0;\n bottom: 20px;\n }\n\n &.slick-next {\n right: 0;\n top: 20px\n }\n }\n }\n }\n}\n/*! SECTION POSTS CAROUSEL END */\n\n/*! FOOTER START */\n.footer_wrapper {\n padding: 34px 0 64px;\n background: #04202f;\n\n .bottom_menu_logo_wrapper {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n\n .logo {\n margin-right: 190px;\n\n a {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n\n img {\n display: block;\n margin-right: 5px;\n }\n }\n }\n\n .bottom_menu {\n ul.footer_nav {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n > li {\n a {\n display: block;\n text-decoration: none;\n padding: 34px 40px 24px;\n font-style: normal;\n font-weight: 600;\n font-size: 16px;\n color: #ffffff;\n\n &:hover, &:focus {\n color: #0063f9;\n }\n }\n }\n }\n }\n }\n\n @media (max-width: 1200px) {\n padding: 34px 0 54px;\n\n .bottom_menu_logo_wrapper {\n .logo {\n margin-right: 100px;\n }\n\n .bottom_menu {\n ul.footer_nav {\n > li {\n a {\n padding: 24px 20px 14px;\n font-size: 14px;\n }\n }\n }\n }\n }\n }\n\n @media (max-width: 750px) {\n padding: 30px 0 50px 13px;\n\n .bottom_menu_logo_wrapper {\n align-items: flex-start;\n\n .logo {\n padding-top: 10px;\n margin-right: 46px;\n }\n\n .bottom_menu {\n ul.footer_nav {\n display: block;\n flex-direction: unset;\n justify-content: unset;\n\n > li {\n a {\n padding: 10px;\n font-size: 14px;\n }\n }\n }\n }\n }\n }\n}\n/*! FOOTER END */\n"]} \ No newline at end of file diff --git a/landing_page/mainpage/static/new-design/css/layout.scss b/landing_page/mainpage/static/new-design/css/layout.scss new file mode 100644 index 00000000..5613e5b1 --- /dev/null +++ b/landing_page/mainpage/static/new-design/css/layout.scss @@ -0,0 +1,4299 @@ +*, *:before, *:after { + box-sizing: border-box; +} + +html, body { + margin: 0; + padding: 0; + font-family: 'Montserrat', sans-serif; +} + +h2 { + font-style: normal; + font-weight: 800; + font-size: 30px; + line-height: 48px; + color: #040306; + + @media (max-width: 1200px) { + font-size: 24px; + line-height: 38px; + } + + @media (max-width: 750px) { + font-size: 22px; + line-height: 35px; + margin: 35px 0 20px; + } +} + +.btn { + display: block; + border: 1px solid #e1e1e2; + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 17px; + text-align: center; + text-transform: uppercase; + color: #000000; + background: #e2e2e3; + border-radius: 30px; + padding: 20px 36px; + transition: box-shadow 0.2s; + + &:hover { + box-shadow: 1px 1px 9px 2px rgba(165, 165, 165, 0.36); + } + + @media (max-width: 1200px) { + padding: 16px 28px; + } + + @media (max-width: 750px) { + padding: 13px 23px; + font-size: 12px; + line-height: 14px; + } +} + +.container { + width: 1100px; + margin: 0 auto; + + @media(max-width: 1200px) { + width: 728px; + margin: 0 auto; + } + + @media(max-width: 750px) { + width: 100%; + max-width: 500px; + padding: 0 15px; + margin: 0 auto; + } +} + +@media(max-width: 750px) { + body.mobile-menu-opened { + overflow: hidden; + } +} + +/*! HEADER START */ +.header_wrapper { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12); + position: relative; + background: #ffffff; + z-index: 1000; + + .projects_logo_wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + + .learn_python { + padding: 15px 50px; + background: #262525; + width: calc(100% / 3); + + .logo { + a { + display: block; + text-decoration: none; + + .logo_title { + margin: 0; + font-family: 'Ubuntu', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 26px; + line-height: 35px; + letter-spacing: 0.105em; + text-transform: uppercase; + color: #ffffff; + + & .blue { + color: #2c91cb; + } + + & .yellow { + color: #f2c94c; + } + } + } + } + } + + .python_week { + padding: 15px 50px; + background: #0f1686; + width: calc(100% / 3); + + .logo { + a { + display: block; + width: 115px; + height: 35px; + + img { + display: block; + width: 100%; + height: 100%; + } + } + } + } + + .moscow_python { + padding: 15px 50px; + background: #f8f9fa; + width: calc(100% / 3); + + .logo { + a { + display: block; + width: 158px; + height: 35px; + + img { + display: block; + width: 100%; + height: 100%; + } + } + } + } + + .projects_list { + transition: opacity 0.2s; + opacity: 0; + pointer-events: none; + display: flex; + position: absolute; + flex-direction: row; + justify-content: flex-start; + z-index: 3000; + min-height: 453px; + + body.loading & { + transition: none; + } + } + + body:not(.loading) &:hover { + .projects_list { + opacity: 1; + pointer-events: auto; + + h6 { + margin: 0; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 16px; + color: #ffffff; + } + + .descr { + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 16px; + color: #ffffff; + } + + .learn_python { + padding: 40px 50px; + background: #262525; + width: calc(100% / 3); + + .logo { + a { + display: block; + text-decoration: none; + + .logo_title { + margin: 33px 0 0; + font-family: 'Ubuntu', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 26px; + line-height: 35px; + letter-spacing: 0.105em; + text-transform: uppercase; + color: #ffffff; + + & .blue { + color: #2c91cb; + } + + & .yellow { + color: #f2c94c; + } + } + } + } + + h4 { + margin: 50px 0 20px; + font-family: 'Roboto', sans-serif; + font-style: normal; + font-weight: 900; + font-size: 23px; + line-height: 31px; + color: #ffffff; + } + + .date { + font-family: 'Ubuntu', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 24px; + line-height: 32px; + color: #f2c94c; + + & span { + color: #ffffff; + } + } + } + + .python_week { + padding: 40px 50px; + background: #0f1686; + width: calc(100% / 3); + + .logo { + a { + display: block; + width: 198px; + height: 61px; + margin: 20px 0 0; + text-decoration: none; + + img { + display: block; + width: 100%; + height: 100%; + } + } + } + + h4 { + margin: 35px 0 20px; + font-style: normal; + font-weight: 600; + font-size: 24px; + line-height: 32px; + color: #ffffff; + } + + .date { + font-style: normal; + font-weight: bold; + font-size: 24px; + line-height: 32px; + color: #fcd600; + } + } + + .moscow_python { + padding: 40px 50px; + background: #f8f9fa; + width: calc(100% / 3); + + h6 { + color: #252526; + } + + .logo { + a { + display: block; + width: 275px; + height: 61px; + margin: 20px 0 0; + text-decoration: none; + + img { + display: block; + width: 100%; + height: 100%; + } + } + } + + h4 { + font-family: 'Roboto', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 24px; + line-height: 32px; + color: #000000; + } + + .date { + font-style: normal; + font-weight: normal; + font-size: 24px; + line-height: 32px; + color: #33719c; + } + + .descr { + color: #252526; + } + } + } + } + } + + .main_menu_logo_wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + .logo { + margin-right: 190px; + + a { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + + img { + display: block; + margin-right: 5px; + } + } + } + + .main_menu_wrapper { + .mobile_menu_btn { + display: none; + } + + .main_menu_block { + .main_menu { + ul.nav { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + + & > li:not(.active) a { + color: #6d7b84; + } + + & > li.active a { + color: #0063f9; + } + + > li { + a { + display: block; + text-decoration: none; + padding: 34px 40px 24px; + font-style: normal; + font-weight: 600; + font-size: 16px; + + &:hover, &:focus { + color: #0063f9; + } + } + } + } + } + + .mobile_projects_logo_wrapper { + display: none; + } + } + } + } + + @media (max-width: 1200px) { + .projects_logo_wrapper { + .learn_python { + padding: 15px 20px; + + .logo { + a { + + .logo_title { + font-size: 18px; + line-height: 25px; + } + } + } + } + + .python_week { + padding: 15px 20px; + + .logo { + a { + width: 109px; + height: 35px; + } + } + } + + .moscow_python { + padding: 15px 20px; + + .logo { + a { + width: 131px; + height: 30px; + } + } + } + } + + .main_menu_logo_wrapper { + + .logo { + margin-right: 100px; + } + + .main_menu_wrapper { + .main_menu_block { + .main_menu { + ul.nav { + > li { + a { + padding: 20px 21px 28px; + font-size: 14px; + } + } + } + } + } + } + } + } + + @media (max-width: 750px) { + position: sticky; + top: 0; + .projects_logo_wrapper { + display: none; + } + + .main_menu_logo_wrapper { + padding: 17px 0; + + .logo { + position: relative; + z-index: 2000; + margin-right: 100px; + } + + .mobile_menu_bg { + opacity: 0; + position: fixed; + z-index: 500; + pointer-events: none; + top: 0; + right: 0; + width: 100%; + height: 100%; + background-color: #131313; + transition: opacity 0.2s; + + body.mobile-menu-opened & { + pointer-events: auto; + opacity: 0.6; + } + } + + .main_menu_wrapper { + position: fixed; + top: 0; + left: 0; + z-index: 1000; + height: 100vh; + width: 100%; + pointer-events: none; + + .mobile_menu_btn { + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + position: fixed; + top: 10px; + right: 15px; + background-color: transparent; + width: 50px; + height: 50px; + border-radius: 50%; + pointer-events: auto; + z-index: 2000; + + span { + display: block; + width: 25px; + height: 3px; + background-color: #000000; + margin: 2px 0; + transition: transform 0.2s, opacity 0.2s; + } + + body.mobile-menu-opened & { + span { + &:nth-child(1) { + transform: rotate(45deg) translate(4.4px, 4.4px); + + } + + &:nth-child(2) { + opacity: 0; + } + + &:nth-child(3) { + transform: rotate(-45deg) translate(5.25px, -5.25px); + } + } + } + } + + .main_menu_block { + background-color: #ffffff; + opacity: 0; + pointer-events: none; + transition: opacity 0.2s; + position: relative; + top: 0; + height: 100%; + + .main_menu { + ul.nav { + display: flex; + flex-direction: column; + justify-content: stretch; + list-style: none; + margin: 0; + padding: 38vw 0 0; + position: absolute; + + li { + a { + padding: 18px 20px; + font-size: 18px; + line-height: 22px; + color: #6d7b84; + } + } + } + } + + .mobile_projects_logo_wrapper { + position: absolute; + bottom: 0; + display: flex; + flex-direction: column; + justify-content: flex-start; + width: 100%; + + h6 { + margin: 0 0 10px 20px; + font-style: normal; + font-weight: normal; + font-size: 10px; + line-height: 14px; + color: #252526; + } + + .learn_python { + padding: 24px 20px; + background: #262525; + width: 100%; + + .logo { + a { + display: block; + text-decoration: none; + + .logo_title { + margin: 0; + font-family: 'Ubuntu', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 20px; + line-height: 30px; + letter-spacing: 0.105em; + text-transform: uppercase; + color: #ffffff; + + & .blue { + color: #2c91cb; + } + + & .yellow { + color: #f2c94c; + } + } + } + } + } + + .python_week { + padding: 21px 20px; + background: #0f1686; + width: 100%; + + .logo { + a { + display: block; + width: 127px; + height: 38px; + + img { + display: block; + width: 100%; + height: 100%; + } + } + } + } + + .moscow_python { + padding: 21px 20px; + background: #f8f9fa; + width: 100%; + + .logo { + a { + display: block; + width: 162px; + height: 37px; + + img { + display: block; + width: 100%; + height: 100%; + } + } + } + } + } + + body.mobile-menu-opened & { + opacity: 1; + pointer-events: auto; + } + } + } + } + } +} +/*! HEADER END */ + +/*! SECTION PROJECTS START */ +.projects_wrapper { + .projects_list { + display: flex; + flex-direction: row; + justify-content: flex-start; + min-height: 623px; + + h6 { + margin: 0; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 16px; + color: #ffffff; + } + + .descr { + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 16px; + color: #ffffff; + } + + .learn_python { + padding: 40px 50px; + background: #262525; + width: calc(100% / 3); + + .logo { + a { + display: block; + text-decoration: none; + + .logo_title { + margin: 33px 0 0; + font-family: 'Ubuntu', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 26px; + line-height: 35px; + letter-spacing: 0.105em; + text-transform: uppercase; + color: #ffffff; + + & .blue { + color: #2c91cb; + } + + & .yellow { + color: #f2c94c; + } + } + } + } + + h4 { + margin: 50px 0 20px; + font-family: 'Roboto', sans-serif; + font-style: normal; + font-weight: 900; + font-size: 23px; + line-height: 31px; + color: #ffffff; + } + + .date { + font-family: 'Ubuntu', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 24px; + line-height: 32px; + color: #f2c94c; + + & span { + color: #ffffff; + } + } + } + + .python_week { + padding: 40px 50px; + background: #0f1686; + width: calc(100% / 3); + + .logo { + a { + display: block; + width: 198px; + height: 61px; + margin: 20px 0 0; + text-decoration: none; + + img { + display: block; + width: 100%; + height: 100%; + } + } + } + + h4 { + margin: 35px 0 20px; + font-style: normal; + font-weight: 600; + font-size: 24px; + line-height: 32px; + color: #ffffff; + } + + .date { + font-style: normal; + font-weight: bold; + font-size: 24px; + line-height: 32px; + color: #fcd600; + } + } + + .moscow_python { + padding: 40px 50px; + background: #f8f9fa; + width: calc(100% / 3); + + h6 { + color: #252526; + } + + .logo { + a { + display: block; + width: 275px; + height: 61px; + margin: 20px 0 0; + text-decoration: none; + + img { + display: block; + width: 100%; + height: 100%; + } + } + } + + h4 { + font-family: 'Roboto', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 24px; + line-height: 32px; + color: #000000; + } + + .date { + font-style: normal; + font-weight: normal; + font-size: 24px; + line-height: 32px; + color: #33719c; + } + + .descr { + color: #252526; + } + } + } + + @media (max-width: 1200px) { + .projects_list { + min-height: 452px; + + h6 { + font-size: 10px; + line-height: 14px; + } + + .descr { + font-size: 10px; + line-height: 14px; + } + + .learn_python { + padding: 46px 20px; + + .logo { + a { + .logo_title { + margin: 29px 0 0; + font-size: 22px; + line-height: 30px; + } + } + } + + h4 { + margin: 37px 0 15px; + font-size: 14px; + line-height: 19px; + } + + .date { + font-size: 15px; + line-height: 20px; + } + } + + .python_week { + padding: 46px 20px; + + .logo { + a { + width: 155px; + height: 49px; + margin: 20px 0 0; + } + } + + h4 { + margin: 26px 0 16px; + font-size: 14px; + line-height: 19px; + } + + .date { + font-size: 15px; + line-height: 20px; + } + } + + .moscow_python { + padding: 46px 20px; + + .logo { + a { + display: block; + width: 162px; + height: 37px; + margin: 20px 0 0; + text-decoration: none; + } + } + + h4 { + font-size: 14px; + line-height: 19px; + margin: 34px 0 16px; + } + + .date { + font-size: 15px; + line-height: 20px; + } + } + } + } + + @media (max-width: 750px) { + .projects_list { + display: block; + flex-direction: unset; + flex-wrap: unset; + justify-content: unset; + align-items: unset; + position: relative; + //display: flex; + //min-height: 468px; + //overflow-x: auto; + //scroll-snap-type: x mandatory; + + .project_item { + //width: 75vw; + width: 275px; + height: 475px; + //scroll-snap-align: start; + } + + h6 { + font-size: 10px; + line-height: 14px; + } + + .descr { + font-size: 10px; + line-height: 14px; + } + + .learn_python { + padding: 46px 20px; + + .logo { + a { + .logo_title { + margin: 29px 0 0; + font-size: 22px; + line-height: 30px; + } + } + } + + h4 { + margin: 37px 0 15px; + font-size: 14px; + line-height: 19px; + } + + .date { + font-size: 15px; + line-height: 20px; + } + } + + .python_week { + padding: 46px 20px; + + .logo { + a { + width: 155px; + height: 49px; + margin: 20px 0 0; + } + } + + h4 { + margin: 26px 0 16px; + font-size: 14px; + line-height: 19px; + } + + .date { + font-size: 15px; + line-height: 20px; + } + } + + .moscow_python { + padding: 46px 20px; + + .logo { + a { + display: block; + width: 162px; + height: 37px; + margin: 20px 0 0; + text-decoration: none; + } + } + + h4 { + font-size: 14px; + line-height: 19px; + margin: 34px 0 16px; + } + + .date { + font-size: 15px; + line-height: 20px; + } + } + + ul.slick-dots { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + position: absolute; + bottom: 100px; + left: 50%; + transform: translate(-50%, 0); + margin: 0; + padding: 0; + list-style: none; + + > li { + margin: 0; + padding: 5px; + + button { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + width: 16px; + height: 16px; + background-color: #0063f9; + border-radius: 50%; + border: none; + font-size: 0; + line-height: 0; + margin: 0; + padding: 0; + outline: none; + box-shadow: none; + cursor: pointer; + + &:before { + transition: transform 0.2s; + content: ''; + display: block; + width: 8px; + height: 8px; + background-color: #81a4ff; + border-radius: 50%; + transform: scale(0); + } + } + + &.slick-active button:before { + transform: scale(1); + } + } + } + } + } +} +/*! SECTION PROJECTS END */ + +/*! SECTION DISTRIBUTION FORM START */ +.distribution_form_wrapper { + padding-top: 110px; + + .distribution { + position: relative; + z-index: 5; + + .distribution_form { + position: absolute; + z-index: 5; + bottom: 0; + left: 93px; + width: 914px; + background: #ffffff; + padding: 43px 22px; + border-radius: 10px; + border: 2px solid #fcfdfe; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + + .distribution_item { + margin-right: 25px; + + img { + display: block; + width: 120px; + height: 108px; + } + + .form_wrapper { + p { + margin: 0 0 30px; + max-width: 430px; + font-style: normal; + font-weight: bold; + font-size: 18px; + line-height: 26px; + color: #040306; + + span { + color: #f7f0fe; + } + } + + form { + .forma { + display: flex; + flex-direction: row; + justify-content: flex-start; + + input { + padding: 22px 19px; + display: block; + width: 388px; + background: #f8f9fa; + border-top: 1px solid #edeff1; + border-bottom: 1px solid #edeff1; + border-left: 1px solid #edeff1; + border-right: none; + box-sizing: border-box; + border-radius: 6px 0 0 6px; + + &::placeholder { + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 600; + font-size: 14px; + line-height: 17px; + color: #6d7b84; + } + } + + .btn_distr { + display: block; + padding: 22px 36px; + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 17px; + text-transform: uppercase; + color: #000000; + background: #ffffff; + border-radius: 0 6px 6px 0; + border-top: 1px solid #edeff1; + border-bottom: 1px solid #edeff1; + border-right: 1px solid #edeff1; + border-left: none; + cursor: pointer; + } + } + } + } + } + + &:after { + content: ''; + display: block; + position: absolute; + z-index: 0; + background-image: url(../img/decor.png); + background-repeat: no-repeat; + top: 100%; + left: 25%; + width: 384px; + height: 72px; + } + } + } + + @media (max-width: 1200px) { + padding-top: 110px; + + .distribution { + position: relative; + z-index: 5; + + .distribution_form { + position: absolute; + z-index: 5; + bottom: 0; + left: 93px; + width: 606px; + background: #ffffff; + padding: 26px 20px; + + .distribution_item { + margin-right: 21px; + + img { + width: 87px; + height: 87px; + } + + .form_wrapper { + p { + margin: 0 0 13px; + max-width: 331px; + font-size: 14px; + line-height: 20px; + } + + form { + .forma { + input { + padding: 22px 19px; + width: 278px; + + &::placeholder { + font-size: 12px; + line-height: 14px; + } + } + + .btn_distr { + padding: 20px 18px; + font-size: 12px; + line-height: 14px; + } + } + } + } + } + + &:after { + content: ''; + display: block; + position: absolute; + z-index: 0; + background-image: url(../img/decor.png); + background-repeat: no-repeat; + top: 100%; + left: 25%; + width: 384px; + height: 72px; + } + } + } + } + + @media (max-width: 750px) { + padding-top: 50px; + width: 100%; + + .distribution { + position: relative; + z-index: 5; + + .distribution_form { + position: absolute; + z-index: 5; + bottom: -10px; + left: 0; + width: 100%; + background: #ffffff; + padding: 20px 15px; + display: block; + + .distribution_item { + margin-right: 21px; + + img { + position: absolute; + width: 40px; + height: 40px; + } + + .form_wrapper { + p { + margin: 0 0 13px 60px; + max-width: unset; + font-size: 12px; + line-height: 17px; + } + + form { + .forma { + input { + padding: 12px 10px; + width: 100%; + + &::placeholder { + font-size: 10px; + line-height: 12px; + } + } + + .btn_distr { + padding: 12px 18px; + font-size: 10px; + line-height: 12px; + } + } + } + } + } + + &:after { + content: ''; + display: block; + position: absolute; + z-index: 0; + background-image: url(../img/decor.png); + background-repeat: no-repeat; + background-position: bottom; + top: 100%; + left: 5px; + width: 100%; + height: 42px; + } + } + } + } +} +/*! SECTION DISTRIBUTION FORM END */ + +/*! SECTION POSTS START */ +.posts_wrapper { + .posts_list { + padding: 0 0 60px; + border-bottom: 3px solid #f4f4f4; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; + + .posts_item { + h1 { + font-size: 26px; + line-height: 42px; + margin: 0; + } + + h4 { + margin: 0 0 15px; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #000000; + } + + ul.tags { + list-style: none; + margin: 0; + padding: 0; + + li { + a { + display: block; + text-decoration: none; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #404b59; + margin-bottom: 11px; + + &:hover, &:focus { + color: #0063f9; + } + } + } + } + + .sponsor_wrapper { + padding: 40px 0 0; + + .sponsor_title { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-bottom: 20px; + + .title { + max-width: 98px; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 17px; + color: #000000; + margin-right: 10px; + } + + .heart { + .fa { + color: #f64a4a; + font-size: 22px; + } + } + } + + .sponsor_list { + .sponsor_item { + margin-bottom: 10px; + + img { + display: block; + width: 148px; + height: 76px; + } + + .sponsor_name { + margin: 0; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #404b59; + } + } + } + } + + .articles { + padding: 35px 0 0; + + article { + margin: 0 0 35px; + + a { + display: block; + text-decoration: none; + + .user_info_content { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + .avatar { + margin-right: 10px; + + img { + display: block; + width: 32px; + height: 32px; + } + } + + .user_info { + .name { + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #000000; + + .job { + color: #a7aeb3; + font-weight: normal; + margin-left: 5px; + font-size: 13px; + } + } + + .date { + font-style: normal; + font-weight: 500; + font-size: 10px; + line-height: 14px; + color: #a7aeb3; + } + } + } + + .article_title { + font-style: normal; + font-weight: bold; + font-size: 20px; + line-height: 24px; + color: #000000; + margin: 10px 0 0; + } + } + + ul.article_tags { + list-style: none; + margin: 0 -5px; + padding: 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + + li { + a { + margin: 0 5px; + display: block; + text-decoration: none; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #000000; + + &:hover, &:focus { + color: #0063f9; + } + } + } + } + + .article_descr { + margin: 10px 0 0; + max-width: 510px; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + color: #04202f; + } + } + + .bonus_mobile { + display: none; + } + } + + .bonus { + a { + display: block; + width: 260px; + height: 365px; + text-decoration: none; + + img { + display: block; + width: 100%; + height: 100%; + } + } + } + } + } + + @media (max-width: 1200px) { + .posts_list { + display: grid; + grid-template-columns: 160px auto; + grid-template-rows: auto auto; + grid-gap: 20px; + + .posts_item { + &.sec_col { + grid-row: 1/span2; + grid-column: 2/3; + } + + .sponsor_wrapper { + padding: 20px 0 0; + } + + .bonus { + a { + width: 148px; + height: 203px; + } + } + } + } + } + + @media (max-width: 750px) { + .posts_list { + padding: 0 0 40px; + display: block; + flex-direction: unset; + justify-content: unset; + align-items: unset; + + .posts_item { + h1 { + margin: 20px 0 0; + font-size: 20px; + line-height: 32px; + } + + h4 { + margin: 0 0 11px; + font-size: 14px; + line-height: 21px; + } + + ul.tags { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + flex-wrap: wrap; + + li { + a { + font-size: 12px; + line-height: 18px; + margin-bottom: 11px; + margin-right: 2px; + } + } + } + + .sponsor_wrapper { + padding: 40px 0 0; + + .sponsor_title { + margin-bottom: 16px; + + .title { + max-width: unset; + } + + .heart { + + .fa { + color: #f64a4a; + font-size: 17px; + } + } + } + + .sponsor_list { + display: flex; + flex-direction: row; + overflow-x: auto; + scroll-snap-type: x mandatory; + + .sponsor_item { + margin-bottom: 10px; + scroll-snap-align: start; + + img { + display: block; + width: 148px; + height: 76px; + } + + .sponsor_name { + margin: 0; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #404b59; + } + } + } + } + + .articles { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + + article { + margin: 0 0 25px; + + a { + display: block; + text-decoration: none; + + .user_info_content { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + .avatar { + margin-right: 10px; + + img { + width: 29px; + height: 29px; + } + } + + .user_info { + .name { + font-size: 10px; + line-height: 15px; + + .job { + margin-left: 3px; + font-size: 12px; + } + } + + .date { + font-size: 8px; + line-height: 11px; + } + } + } + + .article_title { + font-size: 16px; + line-height: 19px; + margin: 6px 0 0; + } + } + + .article_descr { + margin: 10px 0 0; + max-width: 510px; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + color: #04202f; + } + } + + .bonus_mobile { + display: block; + width: 100%; + margin: 0 0 25px; + + a { + display: block; + width: 100%; + height: 170px; + text-decoration: none; + + img { + display: block; + width: 100%; + height: 100%; + object-fit: cover; + object-position: center; + } + } + } + + & article { + order: 3; + } + + & article:nth-child(-n + 5) { + order: 1; + } + + & .bonus_mobile { + order: 2; + } + } + + .bonus { + display: none; + } + } + } + } +} +/*! SECTION POSTS END */ + +/*! SECTION BADGES START */ +.badges_wrapper { + .badges_list { + border-bottom: 3px solid #f4f4f4; + padding: 30px 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + + .badges_item { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + img { + display: block; + width: 74px; + height: 74px; + margin-right: 10px; + } + + p { + margin: 0; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 21px; + color: #404b59; + } + } + + .badges_item + .badges_item { + margin-left: 100px; + } + } + + @media (max-width: 1200px) { + .badges_list { + .badges_item { + + img { + width: 56px; + height: 56px; + } + + p { + font-size: 12px; + line-height: 18px; + } + } + + .badges_item + .badges_item { + margin-left: 26px; + } + } + } + + @media (max-width: 750px) { + .badges_list { + padding: 30px 0; + display: grid; + grid-template-rows: 1fr 1fr; + grid-template-columns: 1fr 1fr; + grid-gap: 25px; + + .badges_item { + + + img { + width: 35px; + height: 35px; + } + + p { + font-size: 12px; + line-height: 18px; + } + } + + .badges_item + .badges_item { + margin-left: 0; + } + } + } +} +/*! SECTION BADGES END */ + +/*! SECTION EVENTS START */ +.events_wrapper { + padding: 40px 0 120px; + + .events_list { + display: flex; + flex-direction: row; + justify-content: flex-start; + flex-wrap: wrap; + margin: 0 -10px; + + .events_item { + margin: 0 10px 20px; + width: calc(100% / 2 - 20px); + padding: 20px; + border: 1px solid #e7f0fe; + border-radius: 18px; + + .event_info { + display: flex; + flex-direction: row; + justify-content: flex-start; + position: relative; + + .event_logo { + width: 111px; + height: 44px; + + img { + display: block; + width: 100%; + height: 100%; + } + } + + .event_date { + margin: 0 14px; + padding: 0 14px; + border-right: 1px solid #0063f9; + border-left: 1px solid #0063f9; + + .date { + margin: 0; + font-style: normal; + font-weight: normal; + font-size: 26px; + line-height: 31px; + text-align: center; + color: #04202f; + } + + .month { + margin: 0; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + text-align: center; + color: #04202f; + } + } + + .event_location { + .place { + margin: 8px 0; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + color: #04202f; + } + + .day { + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + color: #04202f; + } + } + + .price { + position: absolute; + right: -21px; + top: 7px; + display: block; + padding: 4px 15px; + width: 84px; + background: #023d8c; + border: 1px solid #05337e; + border-radius: 25px 0 0 25px; + font-style: normal; + font-weight: 600; + font-size: 14px; + line-height: 17px; + color: #ffffff; + + } + } + + .event_title { + margin: 20px 0 0; + font-style: normal; + font-weight: 600; + font-size: 18px; + line-height: 26px; + color: #04202f; + } + + .event_descr { + margin: 0 0 20px; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + color: #04202f; + } + + .event_detail { + display: inline-block; + text-decoration: none; + background: #04202f; + border: 1px solid #010815; + border-radius: 23px; + padding: 10px 20px; + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 17px; + color: #ffffff; + transition: box-shadow 0.2s; + + &:hover { + box-shadow: 1px 1px 9px 2px rgba(7, 62, 99, 0.66); + } + } + } + } + + @media (max-width: 1200px) { + padding: 40px 0 90px; + + .events_list { + .events_item { + .event_info { + display: grid; + grid-template-columns: auto auto; + grid-template-rows: auto auto; + grid-row-gap: 15px; + + .event_date { + grid-column: 1/2; + grid-row: 2/3; + margin: 0 14px 0 0; + padding: 0; + border-left: none; + } + + .event_location { + grid-column: 2/3; + grid-row: 2/3; + } + } + } + } + } + + @media (max-width: 750px) { + padding: 20px 0 55px; + + .events_list { + display: block; + flex-direction: unset; + justify-content: unset; + flex-wrap: unset; + margin: 0; + + .events_item { + margin: 0 0 20px; + width: 100%; + padding: 20px; + border: 1px solid #e7f0fe; + border-radius: 18px; + + .event_info { + display: grid; + grid-template-columns: auto auto; + grid-template-rows: auto auto; + grid-row-gap: 15px; + + .event_date { + grid-column: 1/2; + grid-row: 2/3; + margin: 0 14px 0 0; + padding: 0; + border-left: none; + } + + .event_location { + grid-column: 2/3; + grid-row: 2/3; + } + } + } + } + } +} +/*! SECTION EVENTS END */ + +/*! SECTION SEARCH START */ +.search_wrapper { + padding: 35px 0; + + .search_block { + position: relative; + + input { + display: block; + padding: 23px 20px; + width: 100%; + background: #ffffff; + border: 2px solid #e7f0fe; + border-radius: 8px; + + &::placeholder { + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 17px; + color: #a7aeb3; + } + } + + button { + padding: 23px 45px; + border: none; + outline: none; + background: transparent; + cursor: pointer; + width: 45px; + height: 100%; + position: absolute; + top: 0; + right: 0; + + img { + display: block; + width: 20px; + height: 20px; + } + } + } + + @media (max-width: 750px) { + padding: 17px 0 23px; + .search_block { + position: relative; + + input { + display: block; + padding: 18px 40px; + + &::placeholder { + font-size: 12px; + line-height: 14px; + } + } + } + } +} +/*! SECTION SEARCH END */ + +/*! SECTION EVENTS PAGE SEARCH START */ +.events_page_search_wrapper { + padding: 35px 0; + + .form_wrapper { + form { + .forma { + display: flex; + flex-direction: row; + justify-content: space-between; + margin: 0 -10px; + + .form-group { + display: flex; + flex-direction: row; + justify-content: stretch; + margin: 0 10px; + + .search_block { + position: relative; + width: 606px; + + input { + display: block; + padding: 23px 20px; + width: 100%; + background: #ffffff; + border: 2px solid #e7f0fe; + border-radius: 8px; + + &::placeholder { + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 17px; + color: #a7aeb3; + } + } + + button { + padding: 23px 45px; + border: none; + outline: none; + background: transparent; + cursor: pointer; + width: 45px; + height: 100%; + position: absolute; + top: 0; + right: 0; + + img { + display: block; + width: 20px; + height: 20px; + } + } + } + + .select_wrapper { + width: 260px; + background: #ffffff; + + select { + display: block; + width: 100%; + } + + .select2 { + display: block; + width: 100%; + height: 100%; + border: 2px solid #e7f0fe; + border-radius: 8px; + + .select2-selection { + border: none; + background-color: #ffffff; + outline: none; + } + + .select2-selection__rendered { + padding: 17px 20px; + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 28px; + color: #04202f; + } + + .select2-selection__arrow { + top: 30%; + right: 25px; + } + + .select2-selection__placeholder { + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 17px; + color: #04202f; + } + } + + .select2-container { + .select2-dropdown { + border: none; + + .select2-results { + border: 2px solid #e7f0fe; + box-shadow: 0 0 27px rgba(0, 2, 4, 0.09); + background-color: #ffffff; + padding: 15px; + margin-top: -5px; + border-radius: 0 0 8px 8px; + + .select2-results__option { + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 17px; + color: #04202f; + + &--highlighted[aria-selected] { + color: #0063f9; + background-color: #ffffff; + } + } + } + } + } + } + + .filter { + display: flex; + flex-direction: row; + justify-content: flex-start; + border: 2px solid #e7f0fe; + border-radius: 8px; + margin-right: 20px; + + .filter_item { + label { + transition: background-color 0.2s, color 0.2s; + display: block; + margin: 0; + padding: 22px 8px; + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: normal; + color: #04202f; + cursor: pointer; + } + + input[type="radio"] { + display: none; + + &:checked + label { + color: #0063f9; + background: rgba(0, 0, 255, 0.025); + } + } + + &:first-child label { + padding-left: 20px; + } + + &:last-child label { + padding-right: 20px; + } + } + } + } + } + } + } + + @media (max-width: 1200px) { + padding: 20px 0 30px; + + .form_wrapper { + form { + .forma { + display: block; + flex-direction: unset; + justify-content: unset; + margin: 0; + + .form-group { + margin: 0 10px 20px; + + .search_block { + width: 100%; + } + + .select_wrapper { + width: 514px; + + .select2-selection__rendered { + font-size: 12px; + line-height: 26px; + } + } + } + } + } + } + } + + @media (max-width: 750px) { + padding: 17px 0 23px; + .form_wrapper { + form { + .forma { + display: block; + flex-direction: unset; + justify-content: unset; + margin: 0; + + .form-group { + margin: 0 0 15px; + + .search_block { + width: 100%; + + input { + padding: 19px 15px; + + &::placeholder { + font-size: 12px; + line-height: 14px; + } + } + } + + .select_wrapper { + width: 100%; + + .select2 { + .select2-selection__rendered { + padding: 17px 10px; + font-size: 12px; + line-height: 23px; + } + + .select2-selection__arrow { + top: 30%; + right: 10px; + } + + .select2-selection__placeholder { + font-size: 12px; + line-height: 23px; + } + } + + .select2-container { + .select2-dropdown { + border: none; + + .select2-results { + padding: 10px; + margin-top: -5px; + + .select2-results__option { + font-size: 12px; + line-height: 14px; + } + } + } + } + } + + .filter { + margin-right: 10px; + + .filter_item { + label { + padding: 21px 7px; + font-size: 12px; + } + + &:first-child label { + padding-left: 10px; + } + + &:last-child label { + padding-right: 10px; + } + } + } + } + } + } + } + } +} +/*! SECTION EVENTS PAGE SEARCH END */ + +/*! SECTION EVENTS PAGE EVENTS START */ +.events_page_events_wrapper { + .events_list { + padding: 0 0 60px; + border-bottom: 3px solid #f4f4f4; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; + + .events_item { + h1 { + font-size: 26px; + line-height: 42px; + margin: 0 0 30px; + } + + h4 { + margin: 0 0 15px; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #000000; + } + + ul.tags { + list-style: none; + margin: 0; + padding: 0; + + li { + a { + display: block; + text-decoration: none; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #404b59; + margin-bottom: 11px; + + &:hover, &:focus { + color: #0063f9; + } + } + } + } + + .sponsor_wrapper { + padding: 40px 0 0; + + .sponsor_title { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-bottom: 20px; + + .title { + max-width: 98px; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 17px; + color: #000000; + margin-right: 10px; + } + + .heart { + .fa { + color: #f64a4a; + font-size: 22px; + } + } + } + + .sponsor_list { + .sponsor_item { + margin-bottom: 10px; + + img { + display: block; + width: 148px; + height: 76px; + } + + .sponsor_name { + margin: 0; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #404b59; + } + } + } + } + + .articles { + article { + margin: 0 0 35px; + + .event { + border: 1px solid #e7f0fe; + border-radius: 18px; + + .image_wrapper { + width: 100%; + + + img { + display: block; + border-radius: 18px 18px 0 0; + width: 100%; + } + } + + .content_wrapper { + padding: 20px; + + .event_info { + display: flex; + flex-direction: row; + justify-content: flex-start; + position: relative; + + .event_logo { + width: 111px; + height: 44px; + + img { + display: block; + width: 100%; + height: 100%; + } + } + + .event_date { + margin: 0 14px; + padding: 0 14px; + border-right: 1px solid #0063f9; + border-left: 1px solid #0063f9; + + .date { + margin: 0; + font-style: normal; + font-weight: normal; + font-size: 26px; + line-height: 31px; + text-align: center; + color: #04202f; + } + + .month { + margin: 0; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + text-align: center; + color: #04202f; + } + } + + .event_location { + .place { + margin: 8px 0; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + color: #04202f; + } + + .day { + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + color: #04202f; + } + } + + .price { + position: absolute; + right: -21px; + top: 7px; + display: block; + padding: 4px 15px; + width: 84px; + background: #023d8c; + border: 1px solid #05337e; + border-radius: 25px 0 0 25px; + font-style: normal; + font-weight: 600; + font-size: 14px; + line-height: 17px; + color: #ffffff; + + } + } + + .event_title { + margin: 20px 0 0; + font-style: normal; + font-weight: 600; + font-size: 18px; + line-height: 26px; + color: #04202f; + } + + .event_descr { + max-width: 540px; + margin: 0 0 20px; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + color: #04202f; + } + + .event_detail { + display: inline-block; + text-decoration: none; + background: #04202f; + border: 1px solid #010815; + border-radius: 23px; + padding: 10px 20px; + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 17px; + color: #ffffff; + transition: box-shadow 0.2s; + + &:hover { + box-shadow: 1px 1px 9px 2px rgba(7, 62, 99, 0.66); + } + } + } + } + } + + .bonus_mobile { + display: none; + } + } + + .bonus { + a { + display: block; + width: 260px; + height: 365px; + text-decoration: none; + + img { + display: block; + width: 100%; + height: 100%; + } + } + } + } + } + + @media (max-width: 1200px) { + .events_list { + display: grid; + grid-template-columns: 160px auto; + grid-template-rows: auto auto; + grid-gap: 20px; + + .events_item { + &.sec_col { + grid-row: 1/span2; + grid-column: 2/3; + } + + .sponsor_wrapper { + padding: 20px 0 0; + } + + .bonus { + a { + width: 148px; + height: 203px; + } + } + } + } + } + + @media (max-width: 750px) { + .events_list { + padding: 0 0 40px; + display: block; + flex-direction: unset; + justify-content: unset; + align-items: unset; + + .events_item { + h1 { + margin-top: 20px; + font-size: 20px; + line-height: 32px; + } + + h4 { + margin: 0 0 11px; + font-size: 14px; + line-height: 21px; + } + + ul.tags { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + flex-wrap: wrap; + + li { + a { + font-size: 12px; + line-height: 18px; + margin-bottom: 11px; + margin-right: 2px; + } + } + } + + .sponsor_wrapper { + padding: 40px 0 0; + + .sponsor_title { + margin-bottom: 16px; + + .title { + max-width: unset; + } + + .heart { + + .fa { + color: #f64a4a; + font-size: 17px; + } + } + } + + .sponsor_list { + display: flex; + flex-direction: row; + overflow-x: auto; + scroll-snap-type: x mandatory; + + .sponsor_item { + margin-bottom: 10px; + scroll-snap-align: start; + + img { + display: block; + width: 148px; + height: 76px; + } + + .sponsor_name { + margin: 0; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #404b59; + } + } + } + } + + .articles { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + + article { + margin: 0 0 25px; + + .event { + .content_wrapper { + .event_info { + display: grid; + grid-template-columns: auto auto; + grid-template-rows: auto auto; + grid-row-gap: 15px; + + .event_date { + grid-column: 1/2; + grid-row: 2/3; + margin: 0 14px 0 0; + padding: 0; + border-left: none; + } + + .event_location { + grid-column: 2/3; + grid-row: 2/3; + } + } + } + + } + } + + .bonus_mobile { + display: block; + width: 100%; + margin: 0 0 25px; + + a { + display: block; + width: 100%; + height: 170px; + text-decoration: none; + + img { + display: block; + width: 100%; + height: 100%; + object-fit: cover; + object-position: center; + } + } + } + + & article { + order: 3; + } + + & article:nth-child(-n + 3) { + order: 1; + } + + & .bonus_mobile { + order: 2; + } + } + + .bonus { + display: none; + } + } + } + } +} +/*! SECTION EVENTS PAGE EVENTS END */ + +/*! SECTION EVENTS PAGE LAST POSTS START */ +.events_page_posts { + padding: 35px 0 120px; + + .posts_list { + display: flex; + flex-direction: row; + justify-content: flex-start; + flex-wrap: wrap; + margin: 0 -10px 35px; + + .posts_item { + background: #ffffff; + border: 1px solid #e7f0fe; + border-radius: 6px; + margin: 0 10px 20px; + padding: 20px; + width: calc(100% / 2 - 20px); + + a { + display: block; + text-decoration: none; + + .user_info_content { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + .avatar { + margin-right: 10px; + + img { + display: block; + width: 32px; + height: 32px; + } + } + + .user_info { + .name { + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #000000; + + .job { + color: #a7aeb3; + font-weight: normal; + margin-left: 5px; + font-size: 13px; + } + } + + .date { + font-style: normal; + font-weight: 500; + font-size: 10px; + line-height: 14px; + color: #a7aeb3; + } + } + } + + .article_title { + font-style: normal; + font-weight: bold; + font-size: 20px; + line-height: 24px; + color: #000000; + margin: 10px 0 0; + } + } + + ul.article_tags { + list-style: none; + margin: 0 -5px; + padding: 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + + li { + a { + margin: 0 5px; + display: block; + text-decoration: none; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #000000; + + &:hover, &:focus { + color: #0063f9; + } + } + } + } + + .article_descr { + margin: 10px 0 0; + max-width: 510px; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + color: #04202f; + } + } + } + + @media (max-width: 1200px) { + padding: 20px 0 90px; + } + + @media (max-width: 750px) { + padding: 15px 0 55px; + .posts_list { + display: block; + flex-direction: unset; + justify-content: unset; + flex-wrap: unset; + margin: 0 0 20px; + + .posts_item { + margin: 0 0 20px; + padding: 15px; + width: 100%; + + a { + .article_title { + font-size: 18px; + line-height: 22px; + } + } + } + } + } +} +/*! SECTION EVENTS PAGE LAST POSTS END */ + +/*! SECTION POST PREVIEW CAROUSEL START */ +.post_preview_carousel_wrapper { + position: relative; + + .post_preview_carousel { + img { + display: block; + height: 296px; + width: 100%; + } + + .carousel_item { + .carousel_content_wrapper { + position: absolute; + top: 56px; + max-width: 635px; + + .title { + margin: 0 0 20px 0; + font-style: normal; + font-weight: 600; + font-size: 26px; + line-height: 42px; + color: #ffffff; + position: relative; + } + + .descr { + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 26px; + color: #ffffff; + } + } + } + } + + .slick-arrow { + border: none; + outline: none; + width: 202px; + background: transparent; + position: absolute; + top: 70px; + cursor: pointer; + padding: 15px 0; + + span { + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 400; + font-size: 16px; + line-height: 26px; + color: #ffffff; + } + + .fa { + color: #ffffff; + font-size: 14px; + } + + &.slick-next { + right: 17vw; + } + } + + @media (max-width: 1200px) { + .post_preview_carousel { + img { + height: 231px; + } + + .carousel_item { + .carousel_content_wrapper { + top: 35px; + max-width: 450px; + + .title { + margin: 0 0 15px 0; + font-size: 22px; + line-height: 35px; + } + + .descr { + font-size: 14px; + line-height: 22px; + } + } + } + } + + .slick-arrow { + width: 120px; + top: 40px; + padding: 10px 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + span { + font-size: 14px; + line-height: 22px; + } + + .fa { + font-size: 12px; + } + + &.slick-next { + right: 20vw; + } + } + } + + @media (max-width: 750px) { + .post_preview_carousel { + img { + height: 282px; + } + + .carousel_item { + .carousel_content_wrapper { + top: 25px; + max-width: 335px; + + .title { + margin: 0 0 10px 0; + font-size: 20px; + line-height: 32px; + } + + .descr { + font-size: 14px; + line-height: 22px; + } + } + } + } + + .slick-arrow { + width: 170px; + top: unset; + bottom: 45px; + padding: 10px 0; + display: block; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + span { + font-size: 14px; + line-height: 22px; + } + + .fa { + font-size: 12px; + } + + &.slick-next { + right: 22px; + } + } + } +} +/*! SECTION POST PREVIEW CAROUSEL END */ + +/*! SECTION SINGLE POST CONTENT START */ +.single_post_content_wrapper { + padding: 40px 0 80px; + position: relative; + + .single_post_content { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; + margin: 0 -50px; + + .single_post { + margin: 0 50px; + + .mobile_posted { + display: none; + } + + ul.article_tags { + list-style: none; + margin: 0 -5px; + padding: 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + + li { + a { + margin: 0 5px; + display: block; + text-decoration: none; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #000000; + + &:hover, &:focus { + color: #0063f9; + } + } + } + } + + .single_post_text { + p { + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 20px; + color: #242424; + } + + h3 { + font-style: normal; + font-weight: 800; + font-size: 20px; + line-height: 28px; + letter-spacing: 0.015em; + color: #010519; + } + + h4 { + font-style: normal; + font-weight: 500; + font-size: 18px; + line-height: 25px; + color: #010519; + } + + pre { + background: #242424; + padding: 35px 25px; + + code { + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #ffffff; + } + } + + img { + display: block; + width: 100%; + } + + ul { + list-style: none; + margin: 0; + padding: 0; + + li { + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 20px; + color: #242424; + position: relative; + margin: 0 0 20px 40px; + + &:before { + content: ''; + display: block; + position: absolute; + top: 9px; + left: -40px; + width: 23px; + height: 1px; + background: #445764; + } + } + } + + } + } + + .user_info_wrapper { + margin: -165px 50px 0; + + .user_info { + padding: 20px; + background: #ffffff; + + .personal_info_wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-bottom: 15px; + + .personal_info { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + + img { + display: block; + } + + .user_name { + font-style: normal; + font-weight: bold; + font-size: 16px; + line-height: 21px; + color: #000000; + margin: 0 15px; + } + } + + .btn.subscribe { + background: #0063f9; + padding: 10px 20px; + font-style: normal; + font-weight: bold; + font-size: 10px; + line-height: 12px; + text-align: center; + text-transform: uppercase; + color: #ffffff; + + &:hover { + box-shadow: 1px 1px 9px 2px rgba(0, 99, 249, 0.36); + } + } + } + + dl { + margin: 0; + padding: 0; + + dt { + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #a7aeb3; + } + + dd { + margin: 0 0 10px; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #1c7ff8; + } + } + } + + .posted { + padding: 30px 20px 10px; + background: #f8f9fa; + + dl { + margin: 0; + padding: 0; + + dt { + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #a7aeb3; + } + + dd { + margin: 0 0 20px; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #1c7ff8; + } + } + } + + .share { + padding: 40px 20px; + + h2 { + margin: 0; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #000000; + } + + p { + margin: 0; + font-style: normal; + font-weight: 500; + font-size: 10px; + line-height: 14px; + color: #242424; + } + + .social_media { + margin-top: 20px; + + a { + text-decoration: none; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + padding: 7px 0; + + .fa { + width: 25px; + height: 25px; + border-radius: 50%; + background: #c4c4c4; + color: #ffffff; + font-size: 14px; + line-height: 24px; + text-align: center; + margin-right: 10px; + transition: color 0.2s; + } + + .name { + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #000000; + margin-right: 5px; + transition: color 0.2s; + } + + .qty { + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #a7aeb3; + } + + &:hover, &:focus { + .fa { + color: #1c7ff8; + } + + .name { + color: #1c7ff8; + } + } + } + } + } + + .similar_posts { + padding: 25px 20px; + background: #f8f9fa; + + h2 { + margin: 0 0 10px; + font-style: normal; + font-weight: bold; + font-size: 18px; + line-height: 27px; + color: #000000; + } + + ul { + list-style: none; + margin: 0; + padding: 0; + + li { + a { + display: block; + padding: 10px 0; + text-decoration: none; + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 22px; + color: #0055ff; + } + } + } + } + } + } + + @media (max-width: 1200px) { + padding: 25px 0 55px; + + .single_post_content { + margin: 0 -10px; + + .single_post { + margin: 0 10px; + width: 70%; + } + + .user_info_wrapper { + margin: -135px 10px 0; + width: 30%; + + .user_info { + padding: 20px 15px; + background: #ffffff; + + .personal_info_wrapper { + display: block; + flex-direction: unset; + justify-content: unset; + align-items: unset; + + .personal_info { + margin-bottom: 15px; + + img { + display: block; + } + + .user_name { + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 16px; + color: #000000; + margin: 0 0 0 10px; + } + } + + .btn.subscribe { + padding: 8px 15px; + font-size: 8px; + line-height: 10px; + } + } + + dl { + margin: 0; + padding: 0; + + dt { + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #a7aeb3; + } + + dd { + margin: 0 0 10px; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #1c7ff8; + } + } + } + + .posted { + padding: 30px 20px 10px; + background: #f8f9fa; + + dl { + margin: 0; + padding: 0; + + dt { + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #a7aeb3; + } + + dd { + margin: 0 0 20px; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #1c7ff8; + } + } + } + + .share { + padding: 40px 20px; + + h2 { + margin: 0; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #000000; + } + + p { + margin: 0; + font-style: normal; + font-weight: 500; + font-size: 10px; + line-height: 14px; + color: #242424; + } + } + + .similar_posts { + display: none; + } + } + } + } + + @media (max-width: 750px) { + padding: 56px 0 0; + + .single_post_content { + display: block; + flex-direction: unset; + justify-content: unset; + align-items: unset; + margin: 0; + + .single_post { + margin: 0; + width: 100%; + + .mobile_posted { + display: block; + padding: 15px; + background: #f8f9fa; + border-radius: 3px; + margin-top: -92px; + + dl { + margin: 0; + padding: 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + + div { + width: calc(100% / 2); + } + + dt { + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #a7aeb3; + } + + dd { + margin: 0; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #1c7ff8; + } + } + } + + ul.article_tags { + list-style: none; + margin: 20px -5px; + padding: 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + + li { + a { + margin: 0 5px; + display: block; + text-decoration: none; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #000000; + + &:hover, &:focus { + color: #0063f9; + } + } + } + } + + .single_post_text { + p { + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 20px; + color: #242424; + } + + h3 { + font-style: normal; + font-weight: 800; + font-size: 20px; + line-height: 28px; + letter-spacing: 0.015em; + color: #010519; + } + + h4 { + font-style: normal; + font-weight: 500; + font-size: 18px; + line-height: 25px; + color: #010519; + } + + pre { + background: #242424; + padding: 35px 25px; + + code { + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #ffffff; + } + } + + img { + display: block; + width: 100%; + } + + ul { + list-style: none; + margin: 0; + padding: 0; + + li { + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 20px; + color: #242424; + position: relative; + margin: 0 0 20px 40px; + + &:before { + content: ''; + display: block; + position: absolute; + top: 9px; + left: -40px; + width: 23px; + height: 1px; + background: #445764; + } + } + } + + } + } + + .user_info_wrapper { + margin: 25px 0 0; + width: 100%; + display: flex; + flex-direction: column-reverse; + + .user_info { + padding: 20px; + background: #ffffff; + + .personal_info_wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-bottom: 15px; + + .personal_info { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin: 0; + + + img { + display: block; + } + + .user_name { + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 16px; + color: #000000; + margin: 0 40px 0 10px; + } + } + + .btn.subscribe { + padding: 8px 15px; + font-size: 8px; + line-height: 10px; + } + } + + dl { + margin: 0; + padding: 0; + display: flex; + flex-direction: row; + + div { + width: calc(100% / 3); + } + } + } + + .posted { + display: none; + } + + .share { + background: #f8f9fa; + padding: 15px 20px; + + h2 { + margin: 0; + font-size: 14px; + line-height: 21px; + } + + p { + margin: 0; + font-size: 10px; + line-height: 14px; + } + + .social_media { + display: flex; + flex-direction: row; + justify-content: flex-start; + flex-wrap: wrap; + margin-top: 20px; + + a { + display: flex; + width: calc(100% / 2); + flex-direction: row; + justify-content: flex-start; + align-items: center; + padding: 10px 7px; + + .name { + font-size: 12px; + line-height: 18px; + margin-right: 5px; + } + } + } + } + } + } + } +} +/*! SECTION SINGLE POST CONTENT END */ + +/*! SECTION POSTS CAROUSEL START */ +.posts_carousel_wrapper { + .posts_carousel { + padding: 100px 0 60px; + border-top: 3px solid #f4f4f4; + border-bottom: 3px solid #f4f4f4; + + .posts_item { + background: #ffffff; + border: 1px solid #e7f0fe; + border-radius: 6px; + margin: 0 10px 20px; + padding: 20px; + width: calc(100% / 2 - 20px); + + a { + display: block; + text-decoration: none; + + .user_info_content { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + .avatar { + margin-right: 10px; + + img { + display: block; + width: 32px; + height: 32px; + } + } + + .user_info { + .name { + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 18px; + color: #000000; + + .job { + color: #a7aeb3; + font-weight: normal; + margin-left: 5px; + font-size: 13px; + } + } + + .date { + font-style: normal; + font-weight: 500; + font-size: 10px; + line-height: 14px; + color: #a7aeb3; + } + } + } + + .article_title { + font-style: normal; + font-weight: bold; + font-size: 20px; + line-height: 24px; + color: #000000; + margin: 10px 0 0; + } + } + + ul.article_tags { + list-style: none; + margin: 0 -5px; + padding: 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + + li { + a { + margin: 0 5px; + display: block; + text-decoration: none; + font-family: 'Anonymous Pro', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 18px; + color: #000000; + + &:hover, &:focus { + color: #0063f9; + } + } + } + } + + .article_descr { + margin: 10px 0 0; + max-width: 510px; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 14px; + color: #04202f; + } + } + + .slick-arrow { + border: none; + outline: none; + width: 202px; + background: transparent; + position: absolute; + top: 45px; + cursor: pointer; + padding: 15px 0; + + span { + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: normal; + color: #04202f; + } + + .fa { + color: #04202f; + font-size: 14px; + } + + &.slick-prev { + left: 0; + } + + &.slick-next { + right: 0; + } + } + } + + @media (max-width: 1200px) { + .posts_carousel { + padding: 70px 0 30px; + + .slick-arrow { + top: 25px; + padding: 10px 0; + + span { + font-size: 14px; + } + + .fa { + color: #04202f; + font-size: 12px; + } + } + } + } + + @media (max-width: 750px) { + .posts_carousel { + padding: 60px 0 40px; + + .slick-arrow { + top: unset; + padding: 10px 0; + + span { + font-size: 14px; + } + + .fa { + color: #04202f; + font-size: 12px; + } + + &.slick-prev { + left: 0; + bottom: 20px; + } + + &.slick-next { + right: 0; + top: 20px + } + } + } + } +} +/*! SECTION POSTS CAROUSEL END */ + +/*! FOOTER START */ +.footer_wrapper { + padding: 34px 0 64px; + background: #04202f; + + .bottom_menu_logo_wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + .logo { + margin-right: 190px; + + a { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + + img { + display: block; + margin-right: 5px; + } + } + } + + .bottom_menu { + ul.footer_nav { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: row; + justify-content: flex-start; + + > li { + a { + display: block; + text-decoration: none; + padding: 34px 40px 24px; + font-style: normal; + font-weight: 600; + font-size: 16px; + color: #ffffff; + + &:hover, &:focus { + color: #0063f9; + } + } + } + } + } + } + + @media (max-width: 1200px) { + padding: 34px 0 54px; + + .bottom_menu_logo_wrapper { + .logo { + margin-right: 100px; + } + + .bottom_menu { + ul.footer_nav { + > li { + a { + padding: 24px 20px 14px; + font-size: 14px; + } + } + } + } + } + } + + @media (max-width: 750px) { + padding: 30px 0 50px 13px; + + .bottom_menu_logo_wrapper { + align-items: flex-start; + + .logo { + padding-top: 10px; + margin-right: 46px; + } + + .bottom_menu { + ul.footer_nav { + display: block; + flex-direction: unset; + justify-content: unset; + + > li { + a { + padding: 10px; + font-size: 14px; + } + } + } + } + } + } +} +/*! FOOTER END */ diff --git a/landing_page/mainpage/static/new-design/img/PythonRu.png b/landing_page/mainpage/static/new-design/img/PythonRu.png new file mode 100644 index 0000000000000000000000000000000000000000..0f507096db7c9aee66a582a84d3ca40a1c5a1ef2 GIT binary patch literal 1054 zcmV+(1mXLMP)-k6GS-y;RF^Zz??wl1P&*N)6oS=Dk~+GosP~+2bGhKE@;ronjOzd zisk1RTmQXz(a!GdtY&9t$D=&K?xN?2aO-I2@FXMSCpD6oEyg@LjzpWh>zuU>d~cz@^kO@C zoE{5&r{{q&WB8ux#}M1~l*u*msNLyq+SLu>Rsws0tAmfpx7DR)!7ajw{wX zZ=&-lnn5#8iu?j7@Lm}cv*$5311s7F`HOQ51h2>>W0}CeCgYP|4_{NA(h5_mIiO@Nz(78Ny(tr`8Gv!6* zVzGQNebzS#@TJZs23#opXIPEP8s8|gNnq}zMmCZ<FDRS3c;tP8c04vLn{t#~z}I0S#6w(i;Cnk)2?VZ|61@=?-Xaz(}+$ zI{d?t!i(55c^>@~iW$!${2TY+@X(4h-O_K-VTp%SV~Xm<3>}uJ%L8MSIiU8F&Wbjr zG5mNNY^FT5)2K>gBKT>_K#`xrufjx3_8^K3b$Q?jzJaQ~=GW0d8jx;c?nzUu=7l_2 z=Cr_`C(_R{dIA4mAHIn(e=_=>(R0`TE2H1=;~!O{>C0B}QHaKTM*eN$4*r+DAJ`-O Y1!(BLyI#hjXaE2J07*qoM6N<$f?O-_kN^Mx literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/PythonRu_white.png b/landing_page/mainpage/static/new-design/img/PythonRu_white.png new file mode 100644 index 0000000000000000000000000000000000000000..a07fec722267d971eadb08eddbecd34b5d7ac769 GIT binary patch literal 1110 zcmV-c1gZOpP)qCQ>ynm(-jEA$M~E2c{*)r54ohcm$C!EhCu;yjSp>#^y-HV^2BevTdJpz>QI7@0zQ+PbGlT zTlmUT>nx|!e}VC)Q%9eL;fZ4^GxiKAv4hW7eYgZvA}TAxt0O5Bhh7EmGnKW_R?^3> zc{b*Glrd0vnQv<26MCU5Ki{p4kt$uQV`4J{`dGzOl+*Ame35F8sf1XM*r8V)QnVXm z)`0J}M&Go_m>-}S_KYJ7f2K&^EPSE5U%+XQ8Fe4>jc^BgxCevAOVg_q&9_9i2m1%c zjEliyZCRTnR>*h*cS4U8ji-mFctV$4Jbn{Fse97KGeR!|YsKeb)q7UjNSM!@wU(>e zB4f;D&6v1tGZal_fTB!r|3OkiS*^@ewJmM*mIho~+9!ryV+Y;0@J2S-xNkt;;4_!4 zvAGK~!=aENEN(a^Bq0mBeNb&rGH@U?j`NGh z^b6Cw0?SE9FDaSD`x;}#Nj@9$GvsS>F$NosmzG}^nQuyFW@+CTV|L3- zX>Y-5;Jn5YWNiiwEYHU)+>g*BxDd3?NMki)tid7AC%6<~v#dvod3HmebvgXd=_T$H zp(QIbXkhcSQDGz>uGrz4k?sm?nUNMcAC;D>+*)`aRr?f%25gy;cF^xEyi3(SxZSyR zM*4~zO$`_r^$f1q!rVkErwhnEkB>s3qB+mFmxyCC(!5K5fh%@6CL2>^FM9t^=A3aT z4h*4;0r!q{l8x3R4r6xH8>`<&hKaf`2KT>0Jy`ft)xIv)P~jbZk^v9Iff5L71J!-a zKZJ{n13BegOkLiUV^j$P`G%4>csJ1hSGitsFe5D=d-xlJ{&j=BFj0M6*=7FZ89*5~ czQMro50esJ`^Z3r3;+NC07*qoM6N<$f^($vb^rhX literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/avatar.png b/landing_page/mainpage/static/new-design/img/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..66761a8482f5b01f47fd62b07e67b74d293f371c GIT binary patch literal 2682 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 literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/best.png b/landing_page/mainpage/static/new-design/img/best.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d843cf0438a0fa6c66063805a0364f964cb6ed GIT binary patch literal 3763 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 literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/bonus.jpg b/landing_page/mainpage/static/new-design/img/bonus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..313d5a84be83cf5376ad13f1159a1fcc46728584 GIT binary patch literal 6693 zcmeI0XH-*JyT?!Hh)5eix}t!H;0OeUF5Q3uL8K&NMiHq25d#qd0i;(cf`SyKDF{dj zp#&HRWt84~Nf2ohNTfxD@G|$k>%Di~b=SJ%ykG7I_g-i159is>Ilt%m?`NNV4kr#5 z0A4c_hzS5<0s&W!I&e4*7y_Vwv;FDh-*f>29sUOJae(fESeQY4023dGnGbZ>4oCq2 zi1nYof&XkECT12^Hg*oqV_ZiDI9`AW#LUdZ!pzFb!g6FCbaWqJ;bY}LeMz59!0I-; zw9ikgMkI5as8OeiZOHJR&kGIwm$HHSKA7#rDXFTi z!PVmH>KodK?H!$6zrX)5G(0joHa;;qMItYLT>7-Uvbsk5ytTcvyGQ@>^-nGk!2GX} z{S)kea2*8!#KgkF%)rbhCUjPnBt!cX?LWx=8d%uhBKsHEe{oF#$C*J#$z$dN^Z>@(Qaa@0qawc)$jR!) zl%5_7$k{E11Z!{vhsg^k4r7x`5EFTavq`CGg&GL|I`L7sf)T}laaqGY zSQb4-?7YQBEskpzpIG5VuUn06cXQiW(%Ll-fl03##Bq0qTxx$M;>7CP!G7-oh*vpY zp$hW!_g@R`naiaFb;Z?Vv7}=NQS>9i_1(^4Y-NU3_)LP8^j5Cf1VvQ z)H1100Ta3k7_|nPJQdZFu&=HcV>~>;Evslfxr{VBMNxVxR+{w)?3%72>Udrw%PPhx zxuDic>?yE)3^)hmF@^l~LA#jTABk%ba6t1b@^@3JT;~OwCD9qyh?*&QP?pgEZp9k~ zpPB9Vst!t@6h&0SpL;ELcDu?x2|vZ2s0}V#m*NfP^2kJGOsTeTqO&?0qN0_WhuwH~ zgK~$lIed;!TSYyg!`%sdonT2 z;<57J=U$Gu^*{rq-?v1Hr?^51L&jp=UVSMw z{K{X_v*p73~%LYhwrjT}21@+Qp)M z&H6ejrMPYVeR)l`**J9IQ}qbJgRIBDI#_y@q0lloyRk14+YG?g~>$9Ubt z1M385TJAS#9#I6^mS{nf%~-&O?_v4Dj#ua3OH|LU2@TKF)s65!x1PdMnpB{pICyuG zN>62_s7=`HxJ~E^NVPv&itmqoXX+Ml?&1JJKq#BW#vKedZ{c3oq%2V$uVk|Ceo{I$ zvhBek;$oY~GkbLj;n1YW)AXX1%9ckT#%bXhz0~5!kF+ZE zFCJ5~wD@i TLbPMq5k=Z=p4#?@1ks~Ml$K`U4(ZFo7|vQ@{VZ33+chL?Vc#8 zJ6usMu*_gqO*Zw;t|EHX=gqWHp2+wiAWR5i?W`!BM*FvZMyo^UjRpHkkM513lF5+1 zm*fMkHkGyHNz+2LXDu#`W1_cNGQ-l%ZP~@fPo312J1EktLSaR+m8V;MUFVp_Hn$Z` zO-BhgP`4Lb_-9C?vN%cqtVUzDBOgTpN*@oiB`zQLaQkd&m zWVQ^F#2I5c%D0IAm>95^Py@Bzyh$@|BBGs4#|RolMj5;BNvkZPy(5xx@9I8FtH4aC zvnJzu7jFH^j-aWN{c@>&SWxd<-CVa<^wJIrsm#uHq(ZmD`_;4*H#!QQcnI{IA8Z8A zC3!n9eQ+|sd$tlw!a$u<`{-fRm*Dg2;ojPUC94RY?RnPONqUkE&2^BVf>Mu}zTtS; zLvth`xG2+8Q+c(`n0IOx8hEDcnf=*x4I5@dl3vFoA+Um8(bn)7ZLwuV9gU25+wqou z#=d2Ao7>c4e0h|TkH=CJwJaMdM<1>yNZx3CtbQNLI$GGSlCL^O1Fq97yArgBk{4+% zp#@bnO|%;?g1Kv{a#8ss+6m^Ju>QCd3je^DCj^*ZZqW?U>ucg`#$7c(WvI`2ku$L( zA&QoZhd>OhwvlYfgO+M*<{R}QfY=g{?pVSf~kyZifnd4#LYO`TUz1U3bx%YQBya^$y4AELujXH!DBBMiVL&% zIak=P;3Y+!e^uN#8&NnSu_67$Ta9%wzC+dqlqA#C7~I#dKxdKl5-|b` zo9eexh{Oz-`eWA7-u}29C`?C}vEYDpY31&pc-Sr0-B|DSGHiG+7};}K+@-B0x`nSs z>X@sar1YSwgcZhVF*hzpgqqXjL6)#x%A?_;;uxph)nGi)+XseMW6ATx@v4=8#OzmV zU!4!O(?x@_CR>t6BRgb3M+y_PxwXn6C}9kvm?bNj~Bil`ll zz;?~r=Psmqe)Jup?LZAur32=v!slG#z6h&vRl<4m=qvU%=PJ8vdRDvP{e^_BZ|QSC zB>>_GVt;6@rfKUTz=zSLab&hFckKqu=*ntZ_pZa+u$#^w`MbWA09zD=-9YMzxCNy5Zvlbp$rJRrc2R5$xa^+!vW%nRrrlQ{y&gpbvN}B)~gvU#0*(uU}7P;C5?p zIe}agO55viE`Xsb*N42zcA#>$LlvY0N_t_DyIT5qdIo29Rhy7eifoEHurR#Pm*LM7 zGvCfopkd=t6+fZ1Y^learN?Ecl;*;GG#nO_dhOkS=Qhs?*9Pu1yme5{#@cR>u6tF z|CXLf?DU({PXBiO`NO5kOKX~xs(g42 zFj6jL2?x|XAKIU&S(J=Cl5@RKDGJ+oZ2+g}WLh^e*2h=U5`{vZnpe+KeO90I=p#TW zqUL1l#c$7x6UOsxhxRX((Jkg??}oVb7khj?Qdr#kqVQ?4^rpmRqMtlc+OdmCUva7% zshV{B9bihiI=gEVln~iCv zNST6px5Qb-z#YixH0D&AaO?bWdgf-Q{~ms7r)fFCGE}yq?p5z zR`@_0>q6>wv=Z9T@-2drj2aolk!`NHKy-!btnCN#3Zf%mT%B8xf~$FV;e3*K$jN}* zRuA~}bg!iaJ(MO)gcacnR$-=bI}*&-sRy{O_>3!6j+*1w$E-JrcD1!I+B=)-R2a3l zIWz#7a`NbVo)UgaLg_J;*fu9JuFCCg7`tUDDMCG)%cGioUSlyxNrDY(4jt8gZ!`dT zZTUvAGlS`%9IBsglS0}!o%zY?e%?u81PeyN$JvKPGdHGY){-GG&xbJ`BA6Gh*`^1d zrtU=(tiU6gRV#atVll&le%7Vl@J!oMrxMsL`}ZH$%rU>GoMX@32h+iC>3RmW;{@m< zvbPu=-}ZH{J;=9BS6~!8%hXRC!%uC-YQue;N~gN=S2crQH0(vIBHcE;a1yt1tb-fi zCWC1xeh8Uwu5kZEDM^@E+RNOI;M2yIyZWGg?Pz25%d5>|P-`7$4EWV~Q&ix|2E5BK zX++zS?68C2Ur%=P+%41Th`024ug?7{x>;3OWWKH6rx(&o&dz~;jcV-%s_Qo4-rXXq6;0(XcKXqO=YO=sUevx; zvAgJlnVFdQvI}vae;2&$mPh^;7NXLfXszlDtech5Q7hpHR TNj}=z(f}8v*xG&u4k!NsL$VZT literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/decor.png b/landing_page/mainpage/static/new-design/img/decor.png new file mode 100644 index 0000000000000000000000000000000000000000..f55185df099aa978bf865f84afac029636d30391 GIT binary patch literal 32654 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 N002ovPDHLkV1fqG+}QvC literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/drylabs.png b/landing_page/mainpage/static/new-design/img/drylabs.png new file mode 100644 index 0000000000000000000000000000000000000000..4eb1d5b96e30a8c21867d9789c36663be859fe5d GIT binary patch literal 2271 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 literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/emaillove.png b/landing_page/mainpage/static/new-design/img/emaillove.png new file mode 100644 index 0000000000000000000000000000000000000000..ad5299a9e88be40d9f131cf1813604133e9d58d3 GIT binary patch literal 3056 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 literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/event_logo.png b/landing_page/mainpage/static/new-design/img/event_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3b502a455375f1d0f22fe26003d84e6445f00d45 GIT binary patch literal 1097 zcmeAS@N?(olHy`uVBq!ia0vp^`9Q48!3HE3gqpGgDb50q$YKTtZeb8+WSBKa0w~B> z9OUlAu6gYl<-+~1T9GX~I zfk0?#Thp=qU+&p23DeBbFcA?E@wm~HwB2FT>^-&bjZfa0V_SVaFRtwUzKK6oX5X!T zH)rSfbKlRLiM026n)Nunz$Zv6yw1ESd6N7=!|v{M3Gwp=dh-%vY!2_JXe<24^Z1eE zv7^R4m=eJq75e)655Imjwb;8<;N!b@?+!hFoLo?Kdb|GY_wV07eDOk~rlzLl{jmTE zfv;7zHa0dVejhpFGGp%C+>HybglUOxoH=Wj(C+8YpBtE)i?_A6N55$(Uc7kmr0mzVQ9~_oBTsK7THr$zD~@v1;GW`A?rd-LP$&+VPaHM~}Ad+5BS%o7wH#w{Om= z3))d(^Wy2#r7WEa%&ULBdE;}8Q{$j2$LrUx6Eib4H!JQiWcl&=v+|;WucF^$?J~^K}o-3M2PIEe7of{Crk-~9()zz$^ zPusR_o0TJ=l$w&F@_B8o^j-}5-`!^Aw3Q%^U2*-^G{WBR;rCl^U}RIv1h?%%j^VlLN>3;~u+-Ov03 zUg%4OG#xvp;|@`?)!1JAAWm=g0g`sFj$9cizm7hW|_o%@?@ ztD^8i4oB{v-I--A9b0zp)I2`Lt!Y{O9l@UV-f9^Ej=Q=>^W~PzW)y8Wll*wm(w?J^ z|9gz5Wh*ir+3o6LZD%KTfA{X)zSq-a;(uJ-bi$BZ?OfKoKy6R!*>#2=?92U6FP}8c zC*i5^io=Hwi&ej!9RK#irMlBfNroE=E?w%bh!WcU_3p`K*LmJ}@0z48)3_jIQsxw8 zCa052o^RE5zstfaT{F2g$L&RCjjc!P@9_Js#swcgDG2=j{aZyYP(vy#MtT5C3@o8F$8k=cpMA_wN_}DJnDh598KF1~J=~HLCz~K7*&L KpUXO@geCysniV+! literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/evrone.png b/landing_page/mainpage/static/new-design/img/evrone.png new file mode 100644 index 0000000000000000000000000000000000000000..5dfe4f23048eb1c2702f8e5cd75da25895cdcfff GIT binary patch literal 2468 zcmcJR`#TeU8^<@1u@KGZG;+w0@W^SHLzY9*oRVXi$suw`nq)DDzNSLXiH!(DH6fPF zrYuu(R&vgmP-MvYyXSv+o*&+y`?^2ZeP7r8zV6rcxjrdqdn+-~BccERK+MM4(vcst z__71-=bxz#MLGN+5@zjo6951o`mcb1Cr@Shm%y8jRu+I4UB~A5iJ-sv1#n&Tc z<9kNyPj7y%0;ls9n7FW}saLY%gr&tsuhXs;mU-8o&-+D9{-k7EOa(db?}vbx`c9Vx z(_P6EZ8EOS>Z4v+UTv8aSQJg%gYlG0KP z9lt}4S{#-)kh2oCRTV1G3n5fjp8|ow2{xH0#lOuyiCOidA_@oEtkjm8aiATh%U30CgGKe3iLy3%UW>D3i!|d0llRn z4~`j1B}>SOORG5ptRDY5?P!l#9IofdQrOw*Rdsb|yh!=^l}p#cJeFm=J(Coi;U|$% z%Tpg{Vjre;b~jdLrJu_+)?BJ_|GBfZ?rD1Kr}L<=5ao&P^>z;J);z`arFS&K-%nLH zyo3p~zO?)DqjlMhk);hJh<+Au)eW0d*skuIAg;LGVC}!1z zMRRXRA34HaDc^8k4XErdG`by0;#-!6wJA+v*4lhjpAy|K76w$&B*mVgC zqP$>nE+i!;E+xHJMvuOW$(^6GX#iul|1Q%m1_xKaVEHA?|5;ga;S*UWRCn*b7n(BruuPuCQWA(N5!IErOBfC5rf_rjuPc|IRk3>m*Ope_rks?~6?!<4)^u92>+_m&(`SvzC(oA)i~JMEVGP{&drwKKP9y&FwB3pc!us^-DqZmA_bJ?cW@CUi8mBjPf{63Gi0Ub&~e z4A`~4^yNl7v$kZheUF@|7*uRqg~X_xIn2XbK)!nB=|kX#*%CTRD&%4Ucx{1G6isPU6av?w@M4;E|u? zaO{*60F{c3Fea(W)Q1$z7Mg*D{SM5Be-l0cZ(WR9S^e4=u1I=~x^d%lIV3U_p zTUTXD2TFI_w7W0^%}NfR2s;sD{90`dHsNi=9P% zxO!GW?Wr>+AX(Yg)%l?w__YXcBFtczs37TfDeDgw>oTW{{h0nZlRBPo)rd3ORrteL z3Wdl6oLV-Bc--NZOh4`@`nE^7r$>$xY+s1r3~5Rh`n^JhPCxKyQZb4uzdP0(9j`*g zzY8VCl^|p6iR^pZlMi>ZUOFND*bverd|c?m(+B}M=qIG*oE}0S;Tq$u)&;d0PJj{# z+R;@6V4x}&O1!JW7I?#d!<{>|k7zJ|jlL~Lr9y+v`6RQh6;<2wS^CQMiR2E2w#EUQ z6ECA@nsJw&pc_KOTza9x*QR?8KhyoX;wr#3=nO3h-k`Vu=zG6bWCU%GzA4p1kQA*R z0Ztl62cAqlJ8SzJ%Lwq7Mh8tO z4{9{VZt3MJDk=h3^vX6Z^XNW6sk&4B6%K8`W!)VE_R?FAInRk}E;2^x5@Cx^tk8|h zOa<^k-ImxbsFpU{PfBm5L;&xu9y%ZzBhxWtZ_afyc)w8tj8czm{J896vM@7~mKV$EqtrijV|COi+duQLa8GRy5H1)4AW#q&}L`|0l+Vcd+ zFaCfdEC^Je)k;TaWIWq-w!QGaWLuDkhK^wKjwCigcZD8Yj7c{AF4E5bQ~_*I_LeU! Ht`hzQw=j?o literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/itcanfly.png b/landing_page/mainpage/static/new-design/img/itcanfly.png new file mode 100644 index 0000000000000000000000000000000000000000..638c0c447bfad827b7896847eadfff917422ed8a GIT binary patch literal 2829 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�j`^%yBp$O^gwP7{pNr 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ۼ&8j1n!|$waU3cSkXC?-RQ6qW3qrtk4 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 literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/open.png b/landing_page/mainpage/static/new-design/img/open.png new file mode 100644 index 0000000000000000000000000000000000000000..3cbf6e11bafebbccdeed5f6eabdc78f76b50dd56 GIT binary patch literal 2074 zcmV+#2<7*QP)e;bAk}#t=fOKPY`p0IRCaPwjn35bAlx&Fg`)NCs?YI zT?4W->F$xlmu$^|BuGlH3M3?rG`xA;)7>M00tE^bC{Un4fdT~z6!>8vVBPrht_Jtc zA^2(!yE6cx`cU@U@Yj=D*dVNzC?d&~f8$r>Rh@CZrKWDr5!z|@-KIymZDUnIJ4UU>r>fb}SfOiqcn(Qjv4 zMf>IH3sn;i#v7rm^$_JcL{b$^?v{Tm_X_^_R)>ST1|I9^V{pRfl{$ih(Fv>>`J3MU zT@!@tFbTfD0}`FNm~-ajr~L8`l>e*YmYjVRuW7^C)(NZ$`6`M`PDpKXLY%N)@^N+} z^?>T(w$J-S63uuYp7ueyJ9zZ~kH6gnW#xm`xC5<`g8fm)svVgmwWH6P$jVPqWOC%3 zwaK+@n!?!=RGY77KT=j}{2FpbK19WtoGmV%bR)7rb@L`GAENXuM}Z~9MIT{VFj?f! z2uK#0WKPJQs8viZ4i{VPh%6;9IjqP5*%Fn8$;DwpR+Ynt9LUO+sI*Kj4zpxk@}Ojh z?1*ZO_EI&uI51h_6lgH03XvgM*${Q4s`#yQv@}gF4i}YU{3f+#N>(;ReRWSDE0c@E z`BoD$CM$iSc*<6XNYWrPlZ%5_If`moL{^hkof^_7N=cob2$ikL&4Y47$`M1dq`OEK zDUHIFB@~x#^?>p)N--$GJ>TAeb%4l`<7=)+5NX2i;@@oG8Ttgo3G83Rs(8Ojeak&lWZL5~KyaNT3UDS(8Mw>bGGX74tk& zi_0}De11?YB_ByEI!e+9lWONP6Vn=FKUD)tLkd!RrjJaAC~a~z9x;k-(#Et}eB6G; zy866()oSVCP9MB`B;{$Jk5km{m*0Z$Uf?h6C%OfJ_h6FqB#KQAbecjH%T+O}7TmI0 zYLQxa`+!>F;8m!adJ0mVqW{9}@H4idGY$N_2Scn*)T$;o<6EE}sAV!+X=38lVg&yq zNQ~Z8Tf6V0IkI-*a+@T#|3m*OFR#si;Le>1$BlFF8&P(k_165#?i_9KK1z zw28To;t?#pWVHZLKsTEnq~%+95mdgO@?Qg-xt^f|{=&};*Zc_j81Q-9XSGKEf<@q& ztfQ8 zw5xi7GEmEwd$ZE}OI*~$rSmYFChY%zjHC_pZ+sSD>EvSC3Hw*klpd0$V5#7dVHtRu zR1bPV=h|E(lin$eu0Ich^{MzVwo`XKkf77`u0M#JdxG=2;rt+yU$09$a{ZbQe zdj)3;fAozmDRZM<6u=Vb{exu?ThoeAO=@mNR2cFrv#C^Lj$FCa6#Aj_O>HlybgpTv=Q|oLXY@ z&Oj|bszsGfdT~z6ev)jK!E}U3jAdF4l2KW+C`z)asU7T07*qoM6N<$ Ef|eQNDF6Tf literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/python.png b/landing_page/mainpage/static/new-design/img/python.png new file mode 100644 index 0000000000000000000000000000000000000000..178f870c805a5bbdafe311795e2960664d3bc504 GIT binary patch literal 485 zcmV7rvtIK(EkxRKG1)Ufo_NrnIMV~_j z`#tbL6m-s*Ndr?T(!_o6K#2*~2{A71@6w>mLlZ#Myq2KS+1PGL6)$S!IK4PpIfKF%(gTS9^> z+RW}@t#}zBf4M##+x-e9K|CJZv0x#59-U42O}he?O2oxNi4#wGE%vTcCk)N7ATQNi z%pp?6h4)u}WrA!gPnhA+^ih#9F%ym8Hy|u(q4q4^jH##OJn8gra@wOVY)4dn^Rl&U zi|g}xU{6@SE(Q+QUxE+ou$J#Xl){AsUAp`G16wkQC!X5oUYSg$efWZLd9s^MTtBf( bkEOJ4r8{_Kb~iWq00000NkvXXu0mjf)$+r2 literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/python2.png b/landing_page/mainpage/static/new-design/img/python2.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1e9c74237b21ae36560162fb47845b346248a1 GIT binary patch literal 1398 zcmV-+1&R8JP)f_e1nbZCkQ#gk`v%P!IFe3 zu#7b69vMqc5j2uT%dVQQ%9I3BBmI_Uy8oF091e%W;cz${jweK+YW}%tW*)P-d4++x zLWNW#)b33isJ(#J9olPHp2b3)VLdv;+pQ6Vkr!%rd;pDoEP}!zjyDb zgzAki>1Weyvq(|>IsBXrbcY&#ulAkseTiCR4QtX8PNdx=@XNy%qV|A8f?TA`xooq3Hk^xY)vdz<2&X2#R{6HchEEJ!h-c5nNX`;b-QH8}grg*J6sE8`dn9k57;$fil3PG&s% zYDv%$sYbnP{T*_W|J7rwM5`m%8*ar=YJ~D>l4?G7gCpc5-xFm_w;%l^s@=4AQEIlV zDAvh_-M6k4|L?Pmcy0R8PR`MNx|c6`%s+dZh0BeJcR6=~T*>?Lwk*11_N5M{dp?P} zlX;G@XuOYeewHE^<9O>F7TCXflUicm8b7Hbk&0q08uGyS+V9EXJmhGj^!991QG>Wj zBHhEisBu-NC^NWWg`H3x)BPuncNl!esuJoCslA46A#V9Z-Ol%L{;wBURSLcdE;F}8 z#yv1ue9)(cv>d-lsn#@!6hlU+uM_Uh`zQ-xkr;W;ylk}0oCJB}juTa-%jpbEKDYh` z0#x8|Qn_)mVN>ib6|UE_q?k}kJX(^;t6<*Z3Gv0|G&`ZO@gkf5!E8C%c z`zJ~(KiN_JX<4&cumhsJba8L(c-jl)h3OipiCXZl)wIH8fv@$h_8#+-MXWm&`(BTI zn=To5i4PR}Q@wzUJ2LMcLsKTLER)3E?Q1%|yruE-qZG` zJaiBGl85=HG!{!Zhg&|_g59}$L3V08vqaHo&snfPBdWiFH)&+YGp}-M8hb>s&ohpv z;VN|oz4lpRc3yFK+^sj(=EHvXqHv7+cv)k5CE+r2OPo-aIH4@5c79YA@hS(-t465P z@YvhxMt+v}iQ)mvcqvH3^l!Y;q2jFBH`|>5@HEB>sX(Y4w6M>v)0UzL|5SEa!q6FNu76 zwo6XeKS7x4m-F)=MGe1Y9=F8nWE>8M!{Kl^9FB$g4m_36sr}}F<^TWy07*qoM6N<$ Ef`T)qUH||9 literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/python_week.png b/landing_page/mainpage/static/new-design/img/python_week.png new file mode 100644 index 0000000000000000000000000000000000000000..206a2c5931d2a6520de15d81bfa5132339eae84f GIT binary patch literal 9347 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 literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/right.png b/landing_page/mainpage/static/new-design/img/right.png new file mode 100644 index 0000000000000000000000000000000000000000..3921789f556b8eeec5005e48bf6001ae403d1ba9 GIT binary patch literal 268 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

26z^klt?vSTeg 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

T&GG`+dL_a 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

yxW3f?qEoG3%ZmT3U|xx}f_YxO&{s@Em-nzi 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%0AQ_xhuB27(_fx;4 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

nyd?$lHYnnPFrZB0O3!QZ$KAinHrH9_vhjO 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 BiMs#* literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/single_post_image.png b/landing_page/mainpage/static/new-design/img/single_post_image.png new file mode 100644 index 0000000000000000000000000000000000000000..c3e1ae7d38c61f2498e92316416ab7345f848e8b GIT binary patch literal 1542 zcmeAS@N?(olHy`uVBq!ia0y~yV5(+dV6^051B$%xd6o;LI14-?iy0WWg+Z8+Vb&Z8 zpde#$kh>GZx^prwfgF}}M_)$E)e-c?47+7a}x;TbZFuuLUD9E6|!>};(f5hvh zw*M4Z)64HOFia?6XK2v5$;`kp*_NTfV3aW$2%{-sG#8BK0(#_v-$5%`_fEg}^)Rs5 OX7F_Nb6Mw<&;$S@ADU1A literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/img/social.png b/landing_page/mainpage/static/new-design/img/social.png new file mode 100644 index 0000000000000000000000000000000000000000..e07f26955a8e58cfc7f5455ea01219f1ea99280f GIT binary patch literal 2824 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 literal 0 HcmV?d00001 diff --git a/landing_page/mainpage/static/new-design/js/script.js b/landing_page/mainpage/static/new-design/js/script.js new file mode 100644 index 00000000..07acc13b --- /dev/null +++ b/landing_page/mainpage/static/new-design/js/script.js @@ -0,0 +1,95 @@ +jQuery(function() { + 'use strict'; + let $body = jQuery('body'); + + // MOBILE CAROUSEL PROJECT LIST START + (() => { + let $carousel = jQuery('.projects_list'), + $slick = null; + + if ($carousel.length === 0) { + return; + } + + function slickToggle() { + if (window.innerWidth > 750 && $slick) { + $slick.slick('unslick'); + $slick = null; + } else if (window.innerWidth <= 750 && !$slick) { + $slick = $carousel.slick({ + dots: true, + infinite: true, + speed: 300, + slidesToShow: 1, + arrows: false, + variableWidth: true + }); + } + } + + jQuery(window).on('resize', function(e) { + slickToggle(); + }); + + slickToggle(); + })(); + // MOBILE CAROUSEL PROJECT LIST END + + // SECTION POSTS CAROUSEL START + jQuery('.posts_carousel').slick({ + infinite: true, + slidesToShow: 2, + slidesToScroll: 1, + responsive: [ + { + breakpoint: 750, + settings: { + slidesToShow: 1, + slidesToScroll: 1, + infinite: true + } + } + ], + prevArrow: '', + nextArrow: '' + }); + // SECTION POSTS CAROUSEL END + + // SECTION POST PREVIEW CAROUSEL START + jQuery('.post_preview_carousel').slick({ + infinite: true, + slidesToShow: 1, + slidesToScroll: 1, + prevArrow: false, + nextArrow: '' + }); + // SECTION POST PREVIEW CAROUSEL END + + // MOBILE MENU START + jQuery('.mobile_menu_btn').on('click', function(e) { + e.preventDefault(); + $body.toggleClass('mobile-menu-opened'); + }); + + jQuery('.mobile_menu_bg').on('click', function() { + $body.removeClass('mobile-menu-opened'); + }); + // MOBILE MENU END + + // SECTION SEARCH SELECT BLOCK START + jQuery('.select_wrapper select').each(function() { + let $this = jQuery(this); + + $this.select2({ + minimumResultsForSearch: Infinity, + placeholder: 'Поиск по городам', + dropdownParent: $this.closest('.select_wrapper'), + width: '100%' + }); + }); + // SECTION SEARCH SELECT BLOCK END + + setTimeout(() => { + $body.removeClass('loading'); + }, 1000); +}); diff --git a/landing_page/mainpage/templates/new-design/blog.html b/landing_page/mainpage/templates/new-design/blog.html new file mode 100644 index 00000000..eacdb8a9 --- /dev/null +++ b/landing_page/mainpage/templates/new-design/blog.html @@ -0,0 +1,183 @@ +{% load static %} +{% load l10n %} +{% include "new-design/include/header.html" %} + + +

+
+
+ + +
+
+
+ + + +
+
+
+
+

Тэги

+
+ + +
+
+

Блог

+
+ {% for article in articles %} + + {% endfor %} + +
+ + image + +
+
+ +
+
+
+ + image + +
+
+
+
+
+ + + +
+
+

Ближайшие мероприятия

+
+
+
+ +
+

25

+

Декабря

+
+
+
Москва
+
Пятница / 16:00
+
+
+ 5500 + +
+
+
+ Moscow Python Cong +
+
+ В целом, конечно, существующая теория однозначно фиксирует + необходимость приоритизации разума над эмоциями. Господа, + постоянное информационно-пропагандистское обеспечение нашей + деятельности обеспечивает актуальность поставленных обществом. +
+ Подробнее +
+
+
+ +
+

11

+

Января

+
+
+
Online
+
Пятница / 16:00
+
+
+ 5500 + +
+
+
+ Moscow Python Cong +
+
+ В целом, конечно, существующая теория однозначно фиксирует + необходимость приоритизации разума над эмоциями. Господа, + постоянное информационно-пропагандистское обеспечение нашей + деятельности обеспечивает актуальность поставленных обществом. +
+ Подробнее +
+
+ +
+
+ + +{% include "new-design/include/footer.html" %} diff --git a/landing_page/mainpage/templates/new-design/events.html b/landing_page/mainpage/templates/new-design/events.html new file mode 100644 index 00000000..8485be13 --- /dev/null +++ b/landing_page/mainpage/templates/new-design/events.html @@ -0,0 +1,268 @@ +{% load static %} +{% load l10n %} +{% include "new-design/include/header.html" %} + + +
+
+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+
+
+ + + +
+
+
+
+

Тэги

+ + +
+
+

Мероприятия

+
+ {% for article in articles %} +
+
+
+ event +
+
+
+ +
+

25

+

Декабря

+
+
+
Москва
+
Пятница / 16:00
+
+
+ 5500 + +
+
+
+ Moscow Python Cong +
+
+ В целом, конечно, существующая теория однозначно фиксирует + необходимость приоритизации разума над эмоциями. Господа, + постоянное информационно-пропагандистское обеспечение нашей + деятельности обеспечивает актуальность поставленных обществом. +
+ Подробнее +
+
+
+ {% endfor %} + +
+ + image + +
+
+ +
+
+
+ + image + +
+
+
+
+
+ + + +
+
+

Последние посты

+
+
+ + +
+ HR-аналитика и Python для чайников (есть котики) +
+
+ +
+ В своём стремлении улучшить пользовательский опыт мы упускаем, + что сделанные на базе интернет-аналитики выводы. +
+
+
+ + +
+ HR-аналитика и Python для чайников (есть котики) +
+
+ +
+ В своём стремлении улучшить пользовательский опыт мы упускаем, + что сделанные на базе интернет-аналитики выводы. +
+
+
+ + +
+ HR-аналитика и Python для чайников (есть котики) +
+
+ +
+ В своём стремлении улучшить пользовательский опыт мы упускаем, + что сделанные на базе интернет-аналитики выводы. +
+
+
+ + +
+ HR-аналитика и Python для чайников (есть котики) +
+
+ +
+ В своём стремлении улучшить пользовательский опыт мы упускаем, + что сделанные на базе интернет-аналитики выводы. +
+
+
+ +
+
+ + + + +{% include "new-design/include/footer.html" %} \ No newline at end of file diff --git a/landing_page/mainpage/templates/new-design/include/footer.html b/landing_page/mainpage/templates/new-design/include/footer.html new file mode 100644 index 00000000..223079e6 --- /dev/null +++ b/landing_page/mainpage/templates/new-design/include/footer.html @@ -0,0 +1,37 @@ +{% load static %} +{% load l10n %} + + + + + + + + + + + diff --git a/landing_page/mainpage/templates/new-design/include/header.html b/landing_page/mainpage/templates/new-design/include/header.html new file mode 100644 index 00000000..b544ed70 --- /dev/null +++ b/landing_page/mainpage/templates/new-design/include/header.html @@ -0,0 +1,171 @@ + + +{% load static %} +{% load l10n %} + + + + + + Document + + + + + + + + + + + + + + + +
+ {% if request.path != '/new' %} +
+ +
+ +
+
+ +
+
+
+
Наш проект
+ +

+ Курс программирования + на Python 3.8 для любого уровня + с упором на практику +

+

+ [5 — 7 ноября 2020] +

+

Место для краткого описания

+
+
+
Наш проект
+ +

+ Профессиональная + конференция для Python + разработчиков +

+

+ 14 — 18 сентября 2020 +

+

Место для краткого описания

+
+
+
Наш проект
+ +

+ Подкаст о Python. Актуальные события мира IT, тренды, подходы и тд. +

+

+ Каждую неделю +

+

Место для краткого описания

+
+
+
+ {% endif %} + +
+ +
+
+ + + diff --git a/landing_page/mainpage/templates/new-design/index.html b/landing_page/mainpage/templates/new-design/index.html new file mode 100644 index 00000000..e3d7429e --- /dev/null +++ b/landing_page/mainpage/templates/new-design/index.html @@ -0,0 +1,324 @@ +{% load static %} +{% load l10n %} +{% include "new-design/include/header.html" %} + + +
+
+
+
Наш проект
+ +

+ Курс программирования + на Python 3.8 для любого уровня + с упором на практику +

+

+ [5 — 7 ноября 2020] +

+

Место для краткого описания

+
+
+
Наш проект
+ +

+ Профессиональная + конференция для Python + разработчиков +

+

+ 14 — 18 сентября 2020 +

+

Место для краткого описания

+
+
+
Наш проект
+ +

+ Подкаст о Python. Актуальные события мира IT, тренды, подходы и тд. +

+

+ Каждую неделю +

+

Место для краткого описания

+
+
+
+ + + +
+
+
+
+
+ email +
+
+
+

+ Подпишитесь на рассылку с последними + новостями от PythonRu , причем без спама +

+
+
+ + +
+
+
+
+
+
+
+
+ + + +
+
+

Последние посты

+
+ +
+
+ {% for article in articles %} + + {% endfor %} + +
+ + image + +
+
+ +
+
+
+ + image + +
+
+
+
+
+ + + +
+
+
+
+ badge +

+ Открытое + сообщество +

+
+
+ badge +

+ Поддержка + от практиков +

+
+
+ badge +

+ Не а бы какие + ребата +

+
+
+ badge +

+ Не только + мемчики постим +

+
+
+
+
+ + + +
+
+

Ближайшие мероприятия

+
+
+
+ +
+

25

+

Декабря

+
+
+
Москва
+
Пятница / 16:00
+
+
+ 5500 + +
+
+
+ Moscow Python Cong +
+
+ В целом, конечно, существующая теория однозначно фиксирует + необходимость приоритизации разума над эмоциями. Господа, + постоянное информационно-пропагандистское обеспечение нашей + деятельности обеспечивает актуальность поставленных обществом. +
+ Подробнее +
+
+
+ +
+

11

+

Января

+
+
+
Online
+
Пятница / 16:00
+
+
+ 5500 + +
+
+
+ Moscow Python Cong +
+
+ В целом, конечно, существующая теория однозначно фиксирует + необходимость приоритизации разума над эмоциями. Господа, + постоянное информационно-пропагандистское обеспечение нашей + деятельности обеспечивает актуальность поставленных обществом. +
+ Подробнее +
+
+
+ +
+

18

+

Января

+
+
+
Online
+
Пятница / 16:00
+
+
+ 5500 + +
+
+
+ Moscow Python Cong +
+
+ В целом, конечно, существующая теория однозначно фиксирует + необходимость приоритизации разума над эмоциями. Господа, + постоянное информационно-пропагандистское обеспечение нашей + деятельности обеспечивает актуальность поставленных обществом. +
+ Подробнее +
+
+
+ +
+

4

+

Февраля

+
+
+
Тольятти
+
Пятница / 16:00
+
+
+ 5500 + +
+
+
+ Moscow Python Cong +
+
+ В целом, конечно, существующая теория однозначно фиксирует + необходимость приоритизации разума над эмоциями. Господа, + постоянное информационно-пропагандистское обеспечение нашей + деятельности обеспечивает актуальность поставленных обществом. +
+ Подробнее +
+
+ +
+
+ + +{% include "new-design/include/footer.html" %} diff --git a/landing_page/mainpage/templates/new-design/single_post.html b/landing_page/mainpage/templates/new-design/single_post.html new file mode 100644 index 00000000..5b9dc460 --- /dev/null +++ b/landing_page/mainpage/templates/new-design/single_post.html @@ -0,0 +1,405 @@ +{% load static %} +{% load l10n %} +{% include "new-design/include/header.html" %} + + +
+
+ + +
+
+ + + +
+
+
+
+
+
+
+
Posted
+
14.08.2019
+
+
+
Read time
+
5 min
+
+
+
+ +
+

+ Есть над чем задуматься: интерактивные прототипы, инициированные + исключительно синтетически, призваны к ответу. Современные технологии + достигли такого уровня, что существующая теория создаёт предпосылки для распределения + внутренних резервов и ресурсов. Как принято считать, сделанные на базе интернет-аналитики + выводы, инициированные исключительно синтетически, в равной степени предоставлены. +

+

+ Финансовый мир очнулся: курс ценных бумаг попахивает безумием +

+

+ Противоположная точка зрения подразумевает, что. +

+
<HelloWorld/>
+

+ Повседневная практика показывает, что высокотехнологичная концепция + общественного уклада играет определяющее значение для новых предложений. + Принимая во внимание показатели успешности, разбавленное изрядной долей эмпатии, + рациональное мышление играет важную роль в формировании глубокомысленных + рассуждений. Безусловно, базовый вектор развития позволяет выполнить важные + задания по разработке. +

+

+ Но элементы политического процесса формируют глобальную экономическую сеть и при этом - + объявлены нарушающими общечеловеческие нормы этики и морали. +

+

+ Являясь всего лишь частью общей картины, сделанные на базе интернет-аналитики выводы + в равной степени предоставлены сами себе. Сложно сказать, почему активно + развивающиеся страны третьего мира, которые представляют собой яркий пример + континентально-европейского типа политической культуры, будут преданы социально-демократической. +

+
    +
  • + Но действия представителей оппозиции, превозмогая сложившуюся непростую экономическую ситуацию, + объективно рассмотрены соответствующими инстанциями. Но. +
  • +
  • + Также как сплочённость команды профессионалов позволяет оценить значение соответствующих условий + активизации. Значимость этих проблем настолько очевидна, что. +
  • +
+

+ Идейные соображения высшего порядка, а также разбавленное изрядной долей эмпатии, + рациональное мышление в значительной степени обусловливает важность новых предложений. + Безусловно, высококачественный прототип будущего проекта прекрасно подходит для реализации + инновационных методов управления процессами. Реплицированные с зарубежных. +

+

+ С учётом сложившейся международной обстановки, перспективное планирование + способствует повышению качества поэтапного и последовательного развития общества. + А ещё интерактивные прототипы будут объединены в целые кластеры себе подобных. Стремящиеся + вытеснить традиционное производство, нанотехнологии будут объявлены нарушающими + общечеловеческие нормы этики и морали. Банальные, но неопровержимые выводы, а также явные + признаки победы институционализации лишь добавляют фракционных разногласий и смешаны с. +

+

+ Современная методология разработки оказалась чрезвычайно полезной +

+ image +

+ Лишь сторонники тоталитаризма в науке и по сей день остаются уделом либералов, + которые жаждут быть своевременно верифицированы. Каждый из нас понимает очевидную вещь: + экономическая повестка сегодняшнего дня представляет собой интересный эксперимент проверки + дальнейших направлений развития. Следует отметить, что базовый + вектор развития однозначно определяет каждого участника как способного принимать + собственные решения касаемо системы массового участия. Как уже неоднократно упомянуто, акционеры. +

+
+
+ +
+
+
+ + + + + + + +
+
+

Ближайшие мероприятия

+
+
+
+ +
+

25

+

Декабря

+
+
+
Москва
+
Пятница / 16:00
+
+
+ 5500 + +
+
+
+ Moscow Python Cong +
+
+ В целом, конечно, существующая теория однозначно фиксирует + необходимость приоритизации разума над эмоциями. Господа, + постоянное информационно-пропагандистское обеспечение нашей + деятельности обеспечивает актуальность поставленных обществом. +
+ Подробнее +
+
+
+ +
+

11

+

Января

+
+
+
Online
+
Пятница / 16:00
+
+
+ 5500 + +
+
+
+ Moscow Python Cong +
+
+ В целом, конечно, существующая теория однозначно фиксирует + необходимость приоритизации разума над эмоциями. Господа, + постоянное информационно-пропагандистское обеспечение нашей + деятельности обеспечивает актуальность поставленных обществом. +
+ Подробнее +
+
+ +
+
+ + +{% include "new-design/include/footer.html" %} \ No newline at end of file diff --git a/landing_page/mainpage/urls.py b/landing_page/mainpage/urls.py index d5712b47..e1c9e095 100644 --- a/landing_page/mainpage/urls.py +++ b/landing_page/mainpage/urls.py @@ -1,8 +1,15 @@ from django.urls import path -from . import views +from . import ( + views, + views_new_design, +) urlpatterns = [ path('', views.index, name='index'), - path('projects', views.projects, name='projects') + path('projects', views.projects, name='projects'), + path('new', views_new_design.index, name='new-index'), + path('new/blog', views_new_design.blog, name='new-blog'), + path('new/events', views_new_design.events, name='new-events'), + path('new/single_post', views_new_design.single_post, name='new-single_post'), ] diff --git a/landing_page/mainpage/views.py b/landing_page/mainpage/views.py index eca8a3c5..be63b80b 100644 --- a/landing_page/mainpage/views.py +++ b/landing_page/mainpage/views.py @@ -107,3 +107,10 @@ def projects(request): } return HttpResponse(template.render(context, request)) + +def mainPage(request): + '''Docstring testc''' + template = loader.get_template('new-design/index.html') + context = {} + + return HttpResponse(template.render(context, request)) diff --git a/landing_page/mainpage/views_new_design.py b/landing_page/mainpage/views_new_design.py new file mode 100644 index 00000000..420ca686 --- /dev/null +++ b/landing_page/mainpage/views_new_design.py @@ -0,0 +1,37 @@ +from django.shortcuts import render +from django.template import loader +from django.http import HttpResponse + +def index(request): + '''Docstring testc''' + template = loader.get_template('new-design/index.html') + context = { + 'articles': range(5), + } + + return HttpResponse(template.render(context, request)) + +def blog(request): + '''Docstring testc''' + template = loader.get_template('new-design/blog.html') + context = { + 'articles': range(15), + } + + return HttpResponse(template.render(context, request)) + +def events(request): + '''Docstring testc''' + template = loader.get_template('new-design/events.html') + context = { + 'articles': range(5), + } + + return HttpResponse(template.render(context, request)) + +def single_post(request): + '''Docstring testc''' + template = loader.get_template('new-design/single_post.html') + context = {} + + return HttpResponse(template.render(context, request)) diff --git a/media/feedbacks/cats4.jpg b/media/feedbacks/cats4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0325ce0e3b1f383c94edb2f15b04896e72050f69 GIT binary patch literal 197119 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%0AEV8T&5CJLdBjU9 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 E*BQmEJ=K2?3;t4Un!Rv;YC=B2Bt93q2A- zZwjdNCMrb)+spSqW1Mr|8{^*h#(isN@A1oAZLT@z+H0<||1SLf2w*oeh8qK@sHgy@ zlnd~8mE{K9z`*UAm8CHpVMK`l09Z^B{vn~%>;OP;2nKCsqAz;G!BLcf44?*F0MG-J z000lK@S7Ia#x?*-fEyWzhEo##gZ~r0&jBbU0RYqTrq@J8|3m-(ggCrzqA>sf)ip|L zh__F;7X>F!a8MNH=0EhW6wK`z_z$M0{Rg8d3{o)PKiKzQSnhw){0r;;gS~@8yeVn^ z;rXU_u=hWBfP#}FBYY^B20_6|k^VkW6g)%0z@Ug=e+vFV!Q8<<9^n80Ez3W2jE|Qe z1uIf83);rYfP%FE07e$y|H7XCg)u(2D0~6{2B9~j(f+=E7*Q!NX;CF8R72F%Co0GX zgOR`H;T7nC_7*h=4Zi6S5)A{uf*S#fO}g56TDa6GExVj$&p0A-)uKhj{yA z{6j-T{X_m&8vZ}b_Fp{w1OH{$6u?#S2f*#70AL^I2GD#a0cg3H0W{9Vlo+ai>kVXaF<=IsiR@H-I6)C}09G3wRIs2-pDZ0losh1AbCoWDHcSR9sa2RF|nFsbr~? zsWhl`sEnu(R8~|DRPI#1R3TImRB==fsM4sgR0UL}R5eshRGn0BsEAaPREt!fsCK9h zsm`fss9C7FsfDRQ)K{oAsP(ALscooTsC}u!sAH%Ts57basmrMAsN1REP>)j2Qh%i0 zqduVl&@j{R(1_8<(`e8b&{)zq(x7P2H1Ra4G`TcoGz~OeG{ZF0G#_d9Y0hZrX}M@c zY2|5Qw5GJSv|hAfwDGj*v<0+JY1?TBXs2mE(SD`sMVCaE zOIJnLMmI<|OSeJyot~bahaOC?PH#%@Kp#LKOP@|ppl_sqO+QJ$Mt{P70&VMt=YGt@D>VwhssVEDnv%y^kmnbDZhkuikvK4UK9Gsc&UQ;b`TKQFLfki4LI z!SaIlh3E^9E>v9Tx-foW@Hj@og0Mk9De5MAbL8c|9BW7l1ab_saserVpua-YgqePS6F|r zaj_||!P&go?ywcIwX;pJ9bCL{QSzeRMc0cl7jrMRTpYi+&wha&#BRXu!5+_E$ll35 z&wj$e#i7Ju$q~$v&hdnz*WID$hE;u z&kg2=a|dvzao2N`xxZfGyrgo;?$WJGg_n9SedM9x0r9|jf_NVBH1o{yobw9v>hb#U zrtmiKPVt`d3G(Uk`S7LkHS*2!o%4(G8}SG7XYqINFALBL$Ov2)h!Q9k7!=qSN#;ooOP+$jAbZe5PzPum%m;>pW5BiGB`H>^t5RW7Wl}TJ z^wJvAfzkx&2^ne`RT)2-LYZ+{YFRZ|e_4X;q#T_bR4zoWOm1GDMP5%nQodIHlLC(d zLgBtbhr+=X;1$O!SyzUy{83a@3{tF6e6Pf*WTtdqsY~flSw`7Qxlnlq!U{2l+=0A+ zd{dEC@lh#OSy1ItwNQPi+Nb(kOZ4GYg!>5>gTw zg6yyaSi&uFmdn?`*TSxKU#Gu*?Rw$$O)DjSf@S=e6gp>z(br0^_1Qvc zqp+xLUu|EU?~dP9zg)k4e*^yl|8D`N0VM&aftG>Qfq#SSgBpVwgWZEWLpVbMLk2=c zLT`mm-juzWbn|1FW>`+xSF}00Dx50ZCHw`3o8nB7BBUY`BR)myL>5N=h_Z`nxy5lS z&cCNZd)dvvJqt?$dir_X6*Y z-B-Miy?^|`{y|rQaKhb$wM3J|+9b9lbkh7o*u#=!+GPJ^atb5`pYkWwJN0dvVp?w6 zuXL~Uw;4(q`5AvRQJLgNYLAK^(?1S*JePGf>nWB48-rcLS>W2UMYB`0k8|8|h`B1c zC3#GF5qTf;5&19hK>TC;uL8e<*+Tuo#v-Ajl%i9DH({z+x45B1xFoIQ{E7dQg;JB! z_A*deZaIB@oW&3!EzEe)-btwn8IZK>^4?a}RDJN!C6zHoRk z*=g3<*9Gfp>sIKl?h)%L?7h_c=q1z3gqMF`#k@Lsee?DH8{ao;eQtg4`)~Bm3|t=| z51J2-3>gpg59C#jO!##G1J$ZF*FarN;R6VQpSNv+A3 zQ&*?nOdC!Q&A?|yXOXj$bGCB}^Um`h7rYm?7lRhRy^DPJ^Znf=x~0@*_T}6ap_Q@^ z(jOW>s(tMJWcZ1+YQ6e?&1-FMJ$(JwM#3iRX71MIt(tA+?VcUuorzti-HpAQdq4M+ zK6897I*>YO{i6GY^!3Kqjc@30e-G1-_>ZcORgU{kuAQuW5B~o1H1!AnkEdrEXT#_A z=UYFcelh&Y|1JHy>yP=LrN6;{|NeasNC42$(=%LPU}9!wVr8RTT%7FeoLs_}cqo^! zte~hMhAzRnBvdSQCx@rI5pG&DjHfkdIrV|f8PNZ{}pkzEarf@Zk! z`pzbyy^Px&lFfWNC^633!k`aS`&ON}n_)SQUlh zMJSNT#6-NNsfjcpKMNZLhgGBymr|A&rwli0% z^@F0jcpMBT9)-bT$oOTh7iAt8a>_!Ak|y%*4eKY!gVo26TR_0arQY~_IDWx_z??dO zAaLOdtD>TirUW9a0*mz5L{r3q2{PO!C`TdoM+j4hRbrO7;la)#P@ftPqOc7C5^>dt z5eGaT>z#;efvCwUdmBk$;gc{d*bol(#zq+y;kqz8#HB2-S|kz=gW+0$a-^N_jshVL zfN)J;UmjYbrXgX9A}iYc9SA3e1joUY5qKPg39&D|EHzlj0n9I2ri7)GY4IqOH;xO} zg(NH`FE3GA#}6bWn_^9|`r;(wA{e-Xh2wEu2r^+2?2X5Pco8_o=17z;Fu^d)S`$f8 zAr#hGK}>-Fv1miX#HFJ2To6-gAdWE&qET^xgLpI}2#YXWRvCswSOg+* zS+MRdakRwa3}zrs6Jto;0UM?$cBeI)@-Mgm2Z&hDNJPpau0k4DL6TksWh7$Ziy*{8 z5CK;~SRPr2;*Ij&A#gx@5~T6c4v8>awFL6O5NXxf6-mWSTwcnUF7ri< z6yYjX@7+@b!zuj>k4uAUbU()%uEj(Z$epkE$%*fi$p_MpKVmTika85%Sr`n606x0# z0#`)od0G5IDGq$}+X$s)DP8 z92h1q=L<6-2ps&?2=V($`qJ9@7E|sV2!iI$Z?Ej5cqXRly}6vN4||G!$v`a1n7?I;WN~G2SL~-il+kE3JpWq7jyT2}zL@WI z{Q;!4iWUxNVd65`Ch+EdRe9H+vB0Pj1!J?iABiDjX~nTOkn3=ep^=zo+n!M4Wj4%U zV8xEoj}aoQQfbIAxk5r^A8VS`-3@v01Wq7Mb8vN6>57V8nC%)c#3$xo8*5rQT8Sp> zAy&-I*0Kp;+o9J3>sgTJ_i3d)J3(+T8WI(?O;h-co{8{h%N$3FW=&jqO~qkq1qE*7 zO^fi0c*@4uWG1O^MSjAZ{y=sZoKb*@<7#(uj3Z=3hX`;o?L> z2k7w^r-=^0WaSD*BvPt~L>R=EQ*kd;q=2}0h*J>?m98=E^*^z;X*!RW_MUoiAdQWr z#MQwnh?I$P1b$&142C~$=8VGNv%?<9W)~$V<3tjcLc!SwXj0_yvHU`BiB$#RSnDoF zRy8=xot*)2!UcB(28Eha9GA!5C^H_%zQ zaV52;RUNOB+5>HqlRCFsOsj-~4%5h}eqR7aMHFoW7ZFk3H z7PJcsH{_=QE2{%H34<59fFnc`F5}Z9PnbrK8-31adjRzp{Oz{{I2;e@vkaLxSKwaxq}=c1bulsh!-ar$Pw#^) z0daxF6I6?@ArsWtKf(4!$F5L;kcqHesW$L8y)4#h}d&zL=B;z_M?V9rMCibo(ei z9S_R%hP7`N6tCimqZY^b0!#0>5n5&)OAB4Lw06S)*BbSie;a?G8tbpERPN|SFQBX% zK6|Ws<&aCjilZ)d3)#T;(=9cRT!Vu3k1s<%wTLIdc%LM=o^-1f9~5Wio-}oMfwR}z zBX$j`#rOOA#O3gV_-(U8j_x5T-5co}7cMLw2W^Cgm^{o6uQf4i6)Q2;DvXLn6boLB zU*79=t+@0pde^Lbgk!l8CDb)1@d{GJS{hoFulA$vM`7jM(9v6!Vt9nu{m1W`y!5~K zra2a93RG>8zAY|m-*8moaMve^iWBm!YNUG}inFuRj;sW-gJL;?=`suc*wNB|e}}EK zed?n}xA$ASf%#&?bVtK!(@}IBY|2Nq&@SZDru_BMnfLVLol~~6xfUTb%=VUn#hc2z zChjq+UWL)%=BTzVX08C2jFURlp;lz^Qdp}lOCL$Dj~Yj9Rx!nm#XXn8a~Rm#{EWV-)}`2p9CpG@ z4_4!e;lDvcV0C(<5!n-}$wP$|Oh6D$1S`F8oL46)Y!#f+{wU~PQ>{}gddC+R@y7OQ4 zV+UD@UzVE;~gY1aFU*jBk1N&lrod z?7x0p&ci|F>tVqmgf%^6uc9R*3ApF2@7~=y6=*ZdnL#gdbr)}qTSv<}-ZppQ?+&~| z|GV%}PTtemM-l?dKUEJx;Kqa;FXM$ez+@p|bhDR6qyt_^$nQE(?yd2DRa&NY9^A>m zlj9tWU!%&v0aEGNJ={G|sPqab3vqctc!@B9b-&~rnK;c3M%O>&%ej|~7A=u+(aS5x zPENco@zPF8+uQ1aP7mLH8n8Q6Q>ZXkxqnMBA~IYlnswQ)oMyA}_*WH!X?ZuMVyfe% ziuD*g#G6J@F^$^YogPKc;o&ZUwN}|g^sS@tONLx8Nui}wmN6z7ozD`1Z;BL)Q;`XZ;#n zcnkF%B#RxqOUp0mrW^7zK5sD=&$sauCyuQ{)WH~%6^`pZ75wx5>J33&m91onx@QK? zmI@kW0^OYg9Z%ZYM%*$RP2*m+6-1z$W44hck~7ELU-x!C`?lTs*ak9I-TQtZ(m^C=``)8-9#|uHZt8?E{D1tkwr0gJ!3p#;v*u&NmXgco<&;yy)G9 zRg&M@gE99OlE*ZX?-3=7yYZ{?5dq0~$LR+$c*E0ghcN`5D5O9PkD8*UTu*VcVDt$l zTw?QJspLvs+uM;vMYm_=Z?~hL8PA+NJ)Sy}KxKTEb2jgq?T|w~x5vJ|s@LYg43sh& zEN5I}yvs*-*TBz|MC1npc%xYe#t635Iox6EXV+A)yfi6L&8*NjXLe`LJ#aEDzIW$- z)siEhZ#dwl=t^a1EL%=6A5cKhc`l^b7LE>CSQ@W!y9Q}|bOqG;#dm|qsB*pPbBwyK z9FFk`eWu2JQ2+-AVB4?)f?418^!7#}*u;?|TcwUOIeW8MCoH#~n{ofjR(G1t?QmC) z@~L-YI}*LDdc=AVk4|>3s{11~uIp4)DuZLLBZqz%B0>_pC5Ectcubx= z=c$oe<3XYP2JiEgrAtt8P>IxNW^uLTKY(y>z{HHiOrMPk2PP?goS6+&a}DY)%-gk{ z*#3d|Q%!I8u63&;GQ*-cCR>AlY+`93a556JYduVUE1-(GXq+iO(zu+a^INN)kLPwZ z4=Go_YjAtBK;uo3Q39<;vUsLOIXwr*K9L45hM`6r81DedAeQ3xILStIPC(v6@A4Af zC;6)##f6gTGwuiwAnKFnyso}BzBLNqlJK~w@7Ztm~z;Gx{NsE~nC z^{NGq@1R+5&tR?gVA6^kyyf&bboD1aPlSbBJN;2hZ*5_@^$Y*Nu(q2&K5uJkEwMdP ztIKOUgs#thKYJ%=BfB$QsE#5%E*?hcPR{cH%%p~-yizspiqmt@e;Lac#$&;}7-RpG z1e~};2^Yw^_GW~fp2%D=3IjV~`-3`mSZKL1ym!#hVma*`P7Q(w1yIyQst>q2_76g9>)xZ zV|@Hg6*zt@?ZH8QaeVGojc0X^jUoqR(cO0~WA$chzRt?uwuWn8b#L=W{b=};FrGyW zKR!N>d2d*S&ZajC{s4!%`a0%)2PNluA zw|cZ8I6|me&-|indjC#Wm!k_WxboG|8_T!d7miND%`|O4b?2G8YSmQu?P`r1(T3ev z`tZJkGgD(N*$ePL&7^dB9+bs4S$ah&9OzG2vO=y892{EQsoHu`)ZJ0{K3k?~stMpg z+CDsvI2#jDFO7-S-jbgzY%f;uX#|Iy#$Jh80jafPR{X7B4(+vgloVFx+yQN*Y6cfP zo4Wr=m)6dAdU>&Zb~Q zf%O+Neo^?cf!&<1JR1QX&Vh2iu-*Xe2pASJJ`Hu=KCVuc`AU1uggb1Q`??7qfEfY- zyXHPF2OFke2Sr^^%dR>UdIbCl!~d`evL$wg6g!`kPM3#r97cw|p^uB9o3_*m&dO_9 zT>mvUw(_#tW60}h&Y0!xBB8A-wrC@!vDAw|jhQPEjXULM&A zk1Y_E%wKKvg)D#%5%)evKCC@*MblTa`4hOjus3iI&L&JPVhzqt%`(+4S8svO>L zX=~J?w2nO?te>0mCb-+oEv+1RqU?b-1W7|XxsvZcerpTF!qIE8|#%8fFab|nisEH4#`_^@4hvhTke{pDgw2vud4{BLvagDJw$OSOcKocq}~T8TUGQh&Vzdu9`AtdO`)vU3`{$G|)TG zQXyn?(u?t2hH!gzbdG6^3(NLa%ZIs{Bg9+bPE2<6fqr`KQT<0^DAIzz1(Yu5Myk2T z-+LzgVm1yHUJqJHN_fL^eV9dQn4Kjo`2i@>8!x%rKu9Ta5r;^qI=d`XW)s)*+{$Li zTSrYFuIk9zZVEfrsu2Rd?`%6f^7fpbY)mN+k2N<*92hz9o~;@7Xyyvq)%FPvMl{51 zevT+5Sli9YXtV{}`VLp$7&!uW>Q%An%(++ z7vWwu$W;R;3A>Zmjdbkg1)8Cj5~7a0&m9LFMc=T58L@=jy_;NxLSQk(UI$o9wXcbE z76;=!F)y_X7b|ufpG|!HG;B`Kx7s4{A@$`g{ct}b{UFb5vD56^E!%r(r26{IN3e$* z${*)uwlrBG{?UO;=WQZ=NuEhd2giG#3~2FpuSBA|V`gQV2H8#coY2asX`s)>OOy$aL13Md!-J-^Seb|DWH*E~g zd+&^mD?F??VvGOY+M9=8JNjyu-u{IUA|bBcdHiYyc1I)by=smA(hm#A)lyqe<`2DT z@}sAL*7dadEJOl65s#%Tp`TD0AF-F`Y-DYK3ZJ9SjYQVBs{P=zc2pukCyT*OhJQrEA`>GNAW9#)# zwpyBkr{4vNon!FOYOkm3_x)Ascp^;i^5Zp89w_e-EN11YQWhRqowF{HRpjOC&VaKH zZ|JV!=8k%fMsF_&{i;>_9=IF!r|o!4{;-i`%@Vx*3LV`6&5nZ1eUIW|T@Ebjy`yyR zFwHSOR(<|Ok?ESno#Xk+qrZTRj`r+EFgWWQsPs9X`2(s0ZH)_fKxWGSYI&nnO2r|HU6o?P0yveX-y85R)E-e3A) z)X(3h;Gt~k>FenEH`zMFKc+dIK7_~o1;~yb{xW*7xBK-NwDj89m&UkJk432HFF-%` z3(?IXPS`a%?em@ZM@Rk5`yCG-Y~DPpn@Ezn7#l_3;2etq7mvlgn|uI{`ey|<3Jy9+ z7*nh$fYVOnMzRX^D?4f?BO%(qo}}uOWLU5|s+=C({5A3lUK@7jQuO%3)yvlvYL97p zE;8+Cq`zBcB~!P~A1eP~GZBwZs=5R7+8qx*YwmcU>jVCv^UCR{W%7KvZd_;M5K>W% zFN*1%=Vzr7t`oFgDNfX!P=-&#AYdfcd!-r2&mD4z)khwIv)-v{b)07wtapTsO8*o= zGIcJCL@br9|9B~JeEHQ@kNWyDS*`Fl^kj$>&#=ApMQJ=#=OQeA$ev?xa;WfGgIG&eWKdvb$`sE^E$MTzp~NbHj{%fQ+TAT2i)E zE<1UXt;C=yI0#-V>9YXVCB87^b8m=ykbPnG5wr4IuxB8z_QUm+jqeH0Tf|}p*SwnF zuNIsNw=y48uHUL>{llM9INGVTdvt*MX0v|!sL}hI8xH#YAb#X{@2ZqX%q4T7cs2`` z0?c7x5N3&X&ijG28h$LqtWDG#3&+AKqfX&G|Gk+cHA$W*WF<&he>WIe>p=cs#EN*l zd*-|nPu-%H`C5iE)xE`)NtJBO6 zX-@m0h%Jr30EL&Cd3sxMAa_X9992=i9(leE6Ggmkqr^t?_=hu;3u}mDsoVWW5b|%MFNdC1oxQ3{ zUj)CFV0M(xVzu))@T`J={72VN$LF@dLAja)PDjV(`qXK%j^BI#{L&L{$|jUD9E-t$PClgz z3=AQIrV&LcpBUdHy1d_xxH3Jrt?XXo2R?`!&mSN=aHi+I9h1ADDR03Xr)FVkdb}*y zCDmD%v0|(fHMVp3_53pY>Vr)TOn@84-(648#}$*dpu>$O0$RJAKd;_(++!a`hy{5F*IW9bN(bKH-Af>)5UV#+uUu1U4>a_<1%~n@sF##@gVpVqBjzRhNg_%(|RZ-C7}=KS15r`2vv4Y z9I1cChK!GWyGh+Bo07qmw4B+#QTvY2q5G>JqjG3jI~MV?ee(t`=2fco;8^*%=k*4~pk0fWnUI*I62esXRA|Jq+|E{N z;*Fr0LSo#5teRLIa^_D173cxGO}RNcrgQuD+Tf3FyBz~y#?H$dx{NFV8OL6H>q9X13+NO?4HA z)v=KJHSF19inpvdTF1UQT#+8=UQa zqWJ9kiQ{d%SFx2f6S(wY{U^&cIr{ST@-$4D=FGYMrA-k+^BCD%SCiYk&M)@=sv3Nd zsn4WSy&3Ulv-w+JAEibj5C>64;LaB-Ldd3iASgSnm8gfjaBy(o)R@8}uZO6?8X3FI zuHZY|SE{~CWz@W5+;_2tLUPPbb_c%idTybA{-(=(w)R>Pc@k{X2vi(ZGs%tXH!$D1 zSfI6GQKtKKW_~;FYz1C*Z6M#!f#SwecHW4Dn6OP(P@88SJTr`2_ z>SCQb5&OFwCpU_Gr|f(i=_dTS+ETph3$1#EzM&Qsu4ebuHclOUFR%-FY}CfAy4Y1LkSHNUPCy-`Z%URlri{&P=0msa!hAyGLZ0f@&d`=Sslt>{AKn+$q_ zWEPGGN>$bY7{T641y&B-6A^Lkxvcn&ddn;Cv;-v@P9s=S%AZ}EWc1Pe@um6}h9+Z8 zYI>@B)JFQa`{5Fn4OI=zaO}Ax{_fk7)--d1>h;0T#YQ;3rcrTs01q4tPgM5xCNiD) z1B<*oZr&Qqym8lyJ)GOFT_xf?1Mao_IV^@O@N}?4n`30JXG^x~dsU6S@)N&6=Iu*R z207XHc~ClB1&1X`bBA3J@aq%x6~_+looZ$_8qb>$GD>SZx9)|=rVO_okz*THN*@*) z*tu4X)ibvzKiyb}6mXjlZ5hR@_C^#)pDGe&d&NyImS~u?N)VdQREFz^qjGFFrytZZ6Tj>@H z%UIe_kM4PY>4QndUc^;~MX_0kTyJp0sm zxbmn+#a$^U#Sw%cU_E$vP~JP59v;UJMEz}OgycZpYkbTt@9@Q^7Td1Xr0{7cNw3PC zPQkGLJo$sW%F%J7k`LoGst*oaI%3>8N`cT0_2x584k6VIa<1GiCs8~p^G3QYY3om3iG7OO1%)RZ9h|`2mD>fhaiW*P!b91Dbt0vG0a^#O`{{>t-DMm@6 zZ_ugNp|eJPTB>piuL?hRUrM)}@_6+`%5g%{b+E3%MjBO%pEfs8tHX}47G}|UAYT<9 zA^i>n(sn{i6lE{KwejmoQg`VRT$m}REMOHRx#hSi6X4hRBu0I+P~ee9sx%w?;JoT3 z*s@B^OZ-yzu8#Y6-v>IIpbCB!>7G*ijsrQZDI=C$&ChX<7>daC)lQnajgkUJXtkgv z$0xI*!;M=^PFywG{TGQlZ}^?M-QV_VP%EOm@py=+t1a{SR<+I z18i*DU8=h3`+nElBPpdwq}Bj09k@8&lvkNyC37p$0jcKiv&M=_v#EjS`JR$I7GoqF6jhSPQ@F5IAbax402 zMP6?1Nlg;7qqfm#WEzTnW z@(msOu8j>6LrLaT`$c!I2E3kbje7(sVH^yM`FVcD2r5$=QmW7MBQwPDoyu|J!A_X- zK~j&%okG5qgPZCvKpQ=Ku$3m|mzhT;97COP-$CWqypkHQwRstW$;^~x5ZR=c% zl#yLMUT)YLrjsbAQAez}B-?LR?9Fjw_QRHvyvNa{D;-b#tiH1SynQBS6*x+Gd}Cr`W`=H*K)R09$B4xi-Cvld4qNWKR6th>*Ou} z68Q^oTR=r4+b-(Xya}JU^s=^UrP$nVaX0|Iz+847h3k+i>R&2OH<<$B-Hk7Zr@r%mRkOn_ocLk;D z9r+P=uilVkyZmcIeUb9+ePe+$PNYS$xi;IlUN8HuA6zFi{MCZzxAurmmfoORr^Rp^ zT*p*fxqm%3e1#>BiF4`ERh~b=!ZLWR-?h2Vta9rE_~u)geP@4l&DJY~JAqkHI4^@M zT$hWtnp$l`g6IkcM{3f#t0;YX5u^AT*v397nz(49Rwb|Kn!Vyj8rhoY)+r_r6_54L zAHUMsGTHvaezu2J-TpE=Nz6z}7Gsnt?YEf<+* zu=Mjvf%kY`i>1!z%=rEn6U4z!(3qP8j*}Blu(=EKlv80uka^h0 z!7JmW0L9cO<=nB};zE-sle)d0#MPAEhpN!3lJ~Rp*QQPyh}I)u$7$QimGep+ncpIHE!(#f`+wL! z3u0sYpnb7yY$R;?`;dZ~7H^T?@iQi>9JA%++wyn#qWQTK(+FlScE5|fpF4Vf>2YIX zd_A+;>ekmEf6NOupVu$Eewre_U{lj_DG>m~PdR>ES1m6z(06#Ys@nPB>dOtKz`jFK zzlD)e6Ib$hPjrY~@9)0x(tT&&*7yBm%a!CWbCg+=nMmjrZ%6*l*17LFFO<{NdO3K9 zhuwMGSmR_2C@TPgbLT#Vw$BEp*FWvfWiF~i`)=yo>EE)Kf7*oSs*D-&fn>ksfJ5rH z2df@vyS-~y-8NB8KF{RQ_;lA>iE$A^$WVB&^h+mLC(q_xsNFZ1Rg7=7RpS-GrWq8P zGejL~Uq07xf;g?HEwF9!^VZiDqfN~V914epA1r)6S9np{DJ?Y((HOX9Uta#bvOIm+#5*mQ?u+AL|$Q)3O;a= zlF@tr?ReLgN}N-VkESrT>T&`1%H5xk2;tMafdL+0?2k(S=!D%W1boL>1* z99^eZuAdx)84j~?$SAbhkYhlupOZHs01s-Bl7eXgks^sv>C zN{m$J)GfFFz4qoAH0F`W?JE&EM9Xd0ux_gpCT+{uJ)OLGrWdnfGr0mUUED&JYaStP zo~<}m3hge3#s=oBM@9Bt?P^ZC_n}QpMJYqWQ|lf7OrZT{&tE`h&BMf!i+W@0X%OwS z9N89FbrhTf;)1W8mK{j7ag2KI7?7>Y)oLNy8uO?7({{r&E_6M*dUP^>QGH_lcxl;!{O}>pH{Q+jG^BZu>5^!T@C_(wf9%$o&P~l= zbN;V>LEn3k*&X#mB*k#&Nay+E#yz_xYluP;xZsF?{u__)MYhdgv9|KJ4}fD(J8t9w z*85AefJEIX_q}@3?l4+Yg=&EhuJ&lcO+D@E(=*bat?_F|UuXB?zC7DfiR_Fz5uuj$ z-9B>&jtQM!J}JQLSk=>p^^@EW&kOg|f-|e1PdCYbYB=nK8I2$I{NV{n$}%JcPMdkM`^OwzJ62CvinnMn{~^&WK($flJ-%B=4|bBqg9o|OkZi( z&*G9>wl(GV>!Z3=ntGtWPN5I4tWvOWamyB0!D{~<&E;BrK!*R7_S-&^(Z(0itGAx86~5R! zsy+Q<^X+@|jGKJdOZ5AQqFSz39-|)$borT`=6Yc-cY8_*ia;Y4*_*w|2OEv9{6Py=EgxPNJyB&h zxiKNt9X~!SApgkWTW4dGj-yv#$4AV!_f|o~R^WJ&gIoy8K`m1^f5UqBM0ou6^szck zd50>rno&GS#ZRo=;jzD)%qRLtS2b5K)Vgr932OdhF*;Z6sgcN_Yk)aExRlid4Od3N zmq&FybJ39Q_y&)=L{tY!op zH;h`2ruXp-Jk=KL?K@U@*mVC7HdSh{Sf6o2Muln8$QqP^AQfq`XkFDN)wCd!oD1-e zhXdweBE=Ycv5e(qira=XDyI$kzR{vq96i9f@y4Rju|{fmSF3}^XGAGNToP*Qr_MF>u!^01I-4Y8F4=vnhJB_j6g zbONz8q_we5bIq&|q*Q6u=Yiyj_nBZM9^`$nQ9~O*6i&fNjY#`i)irjC&mCyRn$&!X z)loP7d07J-YVgrJo%!jeP*rkytF=h0szmnIEgw;?0$?JaBauO7{F z)cl5gqgwDNx~i$3wNRy9+s$j@Hs|pa%QgM)uDwE}XYOyT6>{yb5W~+@AkQ9{$1evg zV4lb{F|P!eW(Jh)fRWoJwx5!Nw~b;!&qsxc9?$BKTkqCBel&?K-Bgd#kiPJfMJnL+ zTxO4tTq9s4>dVGbHELv@KjZTo?zzA*wVYt)PJ3z)~F7zE_q^h+Q`h;AbV#SpNtS4S`wW`BXzHul)yz>K27i(Uhy6414ZJrClP5tWN zd>R$!W=@J>08Cjd9yYqtMHX14@DK98Z$Z9)cfIdaWI(k7uPLAYJ6f7DGbmj?h#3pP zPVsxydoDW%v^I67BkF#5CFLTGMLmD=7Lm*im>H9glxQe3Wh8tOZPLa>- zQdF)(4XZOxBl7zDX`+6GY<66Bgv>1r0q$#dc_G-AaIp-^XyR)2n!7PsHxV`n11ffvreYh>5nd#l7M{Tk%+S znu`3Q%-_!|-S(w;oMzFNyJ&f{4iwJ9YGOdi)OyZ<>aw=MP9QCe>;)q*0gtdX~L zOY5tVzXGLwRyIYTYDeBwv5;w5RS6nMqntJ2Yu+Z>^-Qj?W7X7D<*ud~&?#I`W~$KWQR$iS8^^y3DZoUOL_m?;sU zpJ5sFT;yn|VT$o*PhI9#3a3ad;jSkx@*ZRMLsslFab-&@W2|h{vjNKxsrqEZ8t{lN zR$%cA7xbPaFHq3Y(G{B!lBp0JW?`*x*YLrZK+f>{R8JeRbG;nNM_Z-tCq47fT;N)=6@u{2&tW8; z?6(%Z>$WLe@A&*&fS9E6J5k8P2q4u_;x@*2WG_aWv`Ru`YMA6wHdL<^tsSuNQ)Rgx}u;O~OU zbCPhBEEp&qyf}3bFO+^QAWRrJ_qXtsQ~YFdN0m9(!|t1S*YiKR;`<7~^Gv~KVuw6? zFCUZwtS8*d`U1Gg?U9EcKTtmbGv;CpG|V4pg%nXDv5RR%PNcPBc~oiU)pwX6G|l!~ z{2QP3JlAYF>I0q0B8_T-9ol)bXe;Ug28t8~X$5O$K{<;{%jw44qr8{T-ZYzCgmB~A z{o$Hy@77N2yIh^{Zj#ngk!kv>BB@rf#Su+o z7(^Cl=)%vtV_E-tq*@wfZY;$ONx zJBF1j$rs+1s57}1^>TCqo=B73U)MDI#Q!^zB01*cXWnyF2`z&}zp99mTJB_rS;7c@ zAyuZu&M=J#MI_LH(vpC4wn(KAr=tR~@DUP|#l}2-AZO1E_k|74LZF(|-0*s0^qHr) z3zx0=#jz00#b(p^9&4adGc-Zyl>(bYPNvPg)hw#wwTR;SuU=z|QEb?aH!* zOT~=;0Wzc8kNu1;fsxLA3Azxt5=~kvfvQuD?#u7B&i$2&FKCb)P^Op?dna5x9z>f+ zX<{y#bHZJbBfWAHRa1R{E&{`YZA>(*h=*gg!l)xs)Fx9ql1V3kaWrZ-Q#I9^P{J7l z1cENo-fP`)zxE&sNg<4s|#;6ZjrB8 zgy$FbS3@TdCEtu2O2Sm(d+O!DI6fAF;<4VzsCT*A@-N-`xgP{z4emlhqHHKjTx`}h zo|wu$yyzw*IPl1D)iUl<;>adNTYlk8lVO5goK&V}!CW@}9akLlw6Yv#6(n)7>s2?tB8ax?S%$0Zh@xci>O0a;k| zcC*E%jl#IJ<1}f8r#@}>w`=*^`dh%iuosTG-1EjD9l@CZ*K+iqpXG$>Qll}l#BSX zP&rWq-BH@)8LbzrwOE~1S|*b?Q5Rb>^nL`P3W7Syh&7zn{^ct?{x7KS6Xm=dJ4$ zU->#Rp*-GNe``P*#pLFTUF~wPHMuQ}^?e;jl5{-Cqso+rV4hQej2(M6<&O(aFy z5l_{aqN*V0i7cz%W7*@DUo4-ZXVCe5%H-n87Sgd0c%+jVN9qd&Z|aXf!tS-?-6Y|o z+1roGg*_IhXQn#bZSD4U@m2FjO%fYou;0fEns@5+C z9UA7#`^Xx~KY^wb_K&;%w6dA4C8p03&uJ9&JpSpS%Kfv>DDm-A68NmV);5gwV7k`5a&b2H^gmEVN*P>w;`_LLzS`(#MA zJ2gT!CB+>smgaWOAw$mkz-%b5t*-urE64o8BFna;K2!jf`81pkP-rOiQ#kJDeNLXB zAXn=jhT1EGQ#Nv z=^vAP3|0A{B0CB)_PV&7%J>MeXbR&~KOcm4{$K<=_)Jt7RJF_;W1KrTM6y3Lz4yE$ zc0autw37WI9}CcX)3SDy)xHp{$(Z)-J@8V@LQ^W0Bn6-n0bnn82{FoED0rQRy_faO zv_Wm$bu%+X4~vj6g6cNtoVDGdo0ozrhV1h8h2`U^iP87;1caR2HQlxH$u)Vfq~Y-y z%lGu?mRVMY{FkE9?@1`%&jj4I)9rSO4jRjcxjuyzwXxSqW*R%`;|aV&Lnk8@#Q|b(C*ETG+wO_&wHlPG)S;{ zO}5Qs!1&yLl(B`{(qr#tSi#s&C}-WUbo=jH-xi@R+b5n2jm|Vi7~bj;T|v+JVa)c; zBElMKLGr<+WMi_Z$$355YSM?7M>!9YyS7gnNawg$Je!S8)*jG21{Oi`HZ|B%4XClO zj4v!soZWopQ7xLJGDxO9Ih;#32DWxAGz`6BvvG@`N5o^)M$T`>^q@8L%y2$UA7!4J z1kghJ&Qw}U({AQ?`}hLb*!^Y^UiEF|CkL5z3DbWU93?0BATGhOwN%k3lHq~!|qzZW(@|O6YUv6+`Xk{rguKI}*wxjI7SCFM( zYC9G(BeR@=fW$&^`aM~0hM9Fp)t@z5?MOF|I~PY%b*S})MtJQee)+~21% zvYeWyeE}T6T9=vZNr9Y97gWQ+>B5c0nwno;yA!KlY6hOheh$^FJ_AouZap?PX zh#|V~(s6#rg?qvJ{4d{0(3D!%q`Peaja?I+XiD*H@JZo1(0xJTb@CtExq?r(uZspx zByA@AE!KB!G#2F#Q&F7YSc$K1dDx0rQ=IU2Pm>ATb#m$V*Cn6jWA06wR?9%u zds@%SJD|VYg<-*TP(h#P!A?!~#o6x4$;FWU_PNi+t(adA+pqIVd_Qv;ITK@t`b z)WsyV#`fDjTDJyMASE?%UkglOlVAa~R29Z|l$U^OpDFanT%ME^WJEo&E$66JZOQ5V z{a10Vb#v?H9{|1!vhh2Q#VZF%3r}_!!@!n3AuWej{%i&3t9%f#fPl-hcZmTTBH>9x z*SC|A0-{UwJYwlMeulID^W#J6f2JDG|F)D2ocg*Bw%@itbfeCE?tW*YIdZnpsGM(f z_WsE$Fm{m_^0-7&a--qsyrr*qEYfo2V5r~-PkZ}|E0@Ezpw})r6K~Hi1G?-BSa%1n z#n1hDo92dchQ@J;7C8Vs4rqn?o)XNIY0b{q)bS<8NDTJS?fh&k_oUX?MR{mycMz;1 zq+iDkXjm~+x7js0(GLkRxxe-IU>m>x2bh@BRH*TqE$!dj-XXy)HzSKsh;wWoHLTUI zomp8q@VGW*n#dcQMY@!shKAy|__=ZF0Gx);eLW+2V8(30x%U$1P>j`v(;BScH7}Fs zXRJklUTG}wah@syc`JIhHQ}P}*%$;Xc=z^aD(9!qhX5cpjI(&W>fi*48S8r`;?l|7|Iqar{m2YQpCx4gp22TykEqpr#v9g0zqDf1~sl%JkM3HJ252^#- z_>1p`4HfPRj1r%Z%2>S$eX+su8II-fnbLFN&ZUffDkr5kD~4GYC{BdqgEu-FR@x#^ zyw`l;wKpa8PEg@IE(?ocvEr2g2RFnqY}BCn1<`Do-}xj9g4t%ox>aN6BhtnWju$qk zm;N*wh}1CJlvURGxjM3n)v3-RZD7cls#Y^A#?!XN83Pz?6b}`ds9p}Gtp4Jl>cxz5 z&f3jVu*TQt_LqL~v!NQxQU`lro~0S+xSNwD#2(I3poG_255^Nf&J4t^o+Cjb!-!l@GeV50G{Q8d303rC9x z0B9fGYt9nsmMCH*v(YqS!RB@VJbquepl(=Y^z(QZPBzTy!B(O2SXmm25|0z&v}TxV z+;$!<$H5wu1;8x?$cKe1tu-b4yxruENfiuvz*{f=4{iPb02dbEe|YQB{{R=xe}L;! zZ*Eo(^=57!1kwR2gRt0T8Sq(c9I|KLjBuy{DdzRk<;h9qY`ArKfDaODMi#NL$X>XMUDs%w+Dp8B2V%wM#S=z&WG&P8D@jU8NXQuPujwRQEReeZEB zC4*bE3X8$j_Z#mnZi9>|;W3eAN)?qA)n})EWkLym5(aRrZB$2oc-hvL&$ek-(PnXR z=p;kVuSF;0cg60+Djtu{ioDKCa2{JhFU4@8!}mW<9UtAvR$ zMkX=ukECY;P-l)p5AN$Habu{@-O{q&OQ8x>d`%_75?3Cg2u{zUCHUasapu<++pMzD zGrb@uJwfy^*_wK8V#lpWhX1!F+tiM?gO@`YPepT-bK529{=A`}{hU?p+v-`>80llU z5!@a}_f%6a!KgmPdiWKvz^Ak#lI63_+v~KaDrzv7=D^XL%JZK!fdb_FNAtGL0$&spiNrf^gbg_h?Gx8=~*WHydy^#KkdrBRoAn)M+(v&!L1*OpS1#yXy#UEl00 z(v!?MQVFm)DX|3~kJC)LlbY%a=}a%}{5bzUYmiDjX9pjlly90_6HGSbpil&0XCYTdKZ#5Va=N{WqiLe?RW7aVS9t_ z#bj{lw(#C8{K9KQkI+;Fn#EKQK4P~1>S?#nngjQ^Uj|h$oH6x;hm}di$j=rB?>*TyT5zOB#z2*UQ;Q;?M`*5ta!NWx(!n( z=KM~i#WvYt{zam{YfaNkiSZTaJ?Ns;p-R+O;-*b(!E}_`}YAV0|A!VrWsOd5YtKutBOI7gmllXqlBPE{UABp{dJ@(_r$Xk|@)X zlg*vo0@ITowV7(eqb63u@V(u)K1i^d`{wR0%#Z2RH03JL`L*hWlwo;6l==qW*wER} z)0%bkUWnWskCx|ARTW|QeEwU1mzu-voxZWpB2lKf_dWxgn4P<4uw2`z{ri(}It|Fy z!}1yNwL$@cRBxkPf?n<>k(EGzr~d$Xftn(SlfR7x1rxQbzi%c@)Fk|N zTUJi?Z$ml`_Z~ekmmnFp&kCL%gJ;v8y9K*F$>_9OlPUe@6Z@Eg-0SX)m3!0uzihQ) zSAY2Sj7e;bMMwtZ-C`Z8Q}eWhB}}KfeWIcs{a)|%^O{W>`gQXT`Ah8LXzVaRO7}Jp z!;R6%&Wx>LRF_fDZKw!-eQN4){!Xgo?zKx}i$xJAX`Uy#?r~{Kfp{710lvA zPQ}=ost3-^3RiKFV!Iy7IXS%y>d|kk4lKyo_~~(W|2OMFM|#v_bOw2=Ki79okm~*Y($LA9FNHzG@ zdT%;@-9A*(dnu7`+H!mzcoMaXD$tz1IQ^5cf2flu`3jzekN6m+%BxiK!906vc=JX# z1ZV4yW^h+L->F|m6cB4VOBF8Sx7 z(v@^B_R81mPZH)`oX2kHD=!S%QC(LtpAx|W9zPMANT%623#5A%Gd8rp`$K5sBBbsv zduL~S7jI^N?_i!{-o!txFcs`MkSbH+H^rBC9vEzzvDpzkbP+sZ-sT33x54ar&1%i4 z>*vnHfHo~T+EkuD^F$lR5+!UyDp$<&A!;7%>m3;Hl&Z4Ma{*Gr!C_P~?YD%~mp7Q8 zI|I?JPg_r~PD;vVBQndUR3dE@st?BW4$5%ewz{lUpAWj_`%Rf7bYY+=_C>Aa6^(Bm zx*P20fmVX~!TIG$JRaLm?_jL$E^6~25kkjhX3o;DDcs-Wvv>O>KeURkH??_n3C;lD z`Oi^8=0#DI${GoJGSowKN@!Ds>Rr`u=@!|ow9?A7kw9{gMny6A;8S1JY;%*16Sx#V zdlTAVSLq(@P{wRiMLX%0Jqbi&6wK9mn9^O|?vGTLl&}=b7t6E6ynMmli`)-=uA^M| z?FJ&l1m(_VpOv0aB@?A^{IR|$B<6t7hM6eq@`x?GB$%(_bkM1yVIOgMh?T1#XyyKP z#4xJWFM7U84GAu^0MaPsICHGP(_qFDobOBO{TP51)9QMu58Jg~Wt8(~cIkR2P*-49 zQph8+tm*w6kVOxRHdRDbXIAGVn7Ukg*Y5x#n6^+=6+y~eBKkr(ysXJSThSQ!J(6_6 zt16s49cewM#{mM-5H2*vpOlDYBVqo($O}LFq=IG3(sZg1sw^Iw#2UkmLD}VoUYjL; zC2~|>$m~_+-_L`nq!r6tJs04#hEQ}YM+{lBjJj%`R^Jm4UM9lZ4Y_X*_d@=M+}KF~ z*#8?i{|Dh7oGGyZIJl%FWO(HC{P+~oT9js?RIdM@DHW#9;2*zlUsI_-)XWw)Ol1UR=$XZlnLcQ2dVK6)m5eu0~(`XJ=nW z=1Ki(ml|!F4;3hW-nFVwjd=a57gJeWci(|)^$*a?c1plvFz*{V+&J8nEOi6#gRsAQ^&NSL822S~JCX`^rS*R+i!? zwT^n8VwWFTV(9A^e@mYR_kN+y=Ui!UUtuVoe$>*Ca)$?#4x2iKIT|)pbN9CbYSbYk z$*H0GKdFm% z1AMKTiN8T_ufVT*0i?y!Kn$iZjXyDD0Ey(AL=|TrfiAb#v|rrdbN%h=F-V`kUGj?( zD2Omy>o@4c%WEqBh%x^MAd$D*jJDpY#DmZ`REIg01l&f=_MATZn(lp@Qfs52yQuql z9@c%T$C+5a8j-onIs2FWN2+@r01umvz?!K6Vj?#`_eqh_PCe-EAK+=@#iz`ltB9kK ztBDA-761gGS6_T%?VjB*v>Z}N#KZxpdqz4UAD_}Gt>bIZVv;03C4zPON|n_-Jn&M zlGBu(E^sQ;<+Ui-zg1|_8Yq`?W{3=jd?-dWs*-V#koZ}f$-FS+YF{2Ur24Y56(Sve z@82CnR-L<*zEQU&je{M=_<^L_fC|EGVMo>R`t-wkrHI}zWAY<_9D!LMG;MjrS~6w* z;LF5)|D4n+Qy}rnXkW5USOeck!{o}A!;^LlHm4UBS^KT0;6gL~0D>V&480tZ%P-#E zUCa%s5!)}qrDSA@JxM&^Rt0}CW7~fEd$JpO+EYCc^`qgO*j^rp&MI&^5?N`X%_Ad( zBayOov6WcdgJ>4Q<)Ql~=VpBh&I=5>sCv%9Vf2%35T=#L^_HtNuUALk6!4z3J0R!g z>ZmJxas;o`HM}>{65Fe^(vXRFDE=M~gRV$l@HGl9{xV8RX(`!aplX@nat`x;C0p#^ zy(HOeNlpN~$nWnd&CGcUN1#QzPF!E5Ubt*6E-nPfug?dswKM>QmBOf1@MMe2dLDk$ zVhBne)Bz}I$CB)BLUJ91N5U2HwUEHS(h`+5&^(M8;k^-Q!^9i8C#9$*XO_h~L$WQG zI;r3l5?NyKqkx>%N1@8i$A@bjKB{=#Q?89mmin}YI8SjqXQ@roy}H)DaiH0x@3q(t zC!?du9@hiy+aa7pzfVF;dcr+GZM-N!;XLJ&RoUunetbNL3PG*>70rJCvB?C0a{aw70W`1^3-I&ixiNBKFoVDG@3A7 z8&|sCqO#2r0yDHAdHfIX$P^g0g=8={s`0F+b}KTJ^%5WBWFIY8azlEK3~7~Gj2Z|C zqY~`6*%Yt|8cG~Gs0=EmDYGjK)T$}X^=y!8!(sHC-|iA3$%#p28F0NIbMz+Z6^P3L zmApR~3g;E4=G{S^ez{($$#;3M{g)j4w1mew7g`2ahw)z7{S^cZufUCd5 z?FblsBfbs+(l)>e#%rDa>>@3?xF5hjA{u<|;<~xtw1}qug-sn`Qp)`3iSZ|uoy1C| z;mz`@*hQmkmG|vnccOR@w~UdO9Yrsv&h^$JQy00Q=M&d%%lYJBNlB%FLDYfpl2ug? zD5^r95KHk*I`4MNe(YB>%nu&%0dhJ&)- zSK5iaN7@wx1mZ{X=C++Xk~>SKo(1QZlf|Dtb1$@B-i|iY)Xv}bz5HgU?I4DN(Qwjp zRc{X|8=XPNf}7cE@wWzJkgly|?EEN$JpR9N8XX6}yRijR$SmR-+a5|5C$V{?)S z%;l0=Qx>KQI!_#iP($*;QJm)D3f=rwjARQC%9mh+JH}ZjxB&%2L#}6O9;Z-HM_3j9 zZ@S6(Nb$c3{{Z0jhzf|J3E*M1Q&I2LO?HQJD-wLStgT7eYosD1+*bh?KmOzoV^~~l zuKMVJdBh6-U>xU3*#;Y7pR{H+XxJrJQBPku6>w?{dg4L;qGP*S{}_EoM*pZj#JsLq zQe)_*e@Dajdu;%iKdv+akfn^h5fJzZ0Tb?WT|f7I>9VXoN6%`W9zbLb2tklO@V-U_D!UVDjLy_W!}ZHPjxI<%%jvks$@Ad zeED$5OafURi6hZd)oKbiF7N&(nanx>TC$W(#uXGUN37jkj5ke8g4J1)ZXy}cA`echEtDoqwdyZthB_FkyRtMt z8tEV~D5=dz1o=dg!ybvZf)2u65YK58TeL#?(gbacKPpmumInLS*nT95*Brf!tz-#Ce1Y>r6`Ww87>d zU>KrfDqrW;J~qeLUXQD=0zTc+ql<1<3R5e%kA8>c!^yp#M{R$udqnp@6b zFw#Noj0M)u|Vwq*2Npi!{~vYWKza5I>=7B69um)7->_yQcW+`frh* z@90adDZzsnKdcYzm4;2Si92-t9`)|A$eQYyqwbo?#LQAIZx#!^EB}u4?lD$nWPM6{ zgL&)*^5~-h(%Xuo22pCC%K3&Ej&*Z|dobO!P}7dTFtR>;fSOmTYPzB6iF}ykT#O!) zYK$U`Fyq9(lnj#H69u;-HPl65KEf*g4jo8c0EE{odVQgx?p$zwi{+q}#%-vk&c^QQ zx4vZn{aPv|H*%m5*z6u2I;~&J4aSbIC=9a!@I@{+SK;xd;=4gPH8A#m5+wa;B_AayTjQcDV&ji01>ko zy#)oaf#NZ5Za9-Xo>;n;eeC8;ygu<)tzie}_37hFW8>e3@fTw@>b;x^0{9gz0tcL< zXhlydNRpE-$9`6lc?sPZINX0$GUDq6Q>{WBXC;4v&p`zvCm^iWRCh#tVe}KW4 zF-Xr#PI`!?2)3Xd04I4Zb=8bTWiLDPd37=lnu^^%u*SeGQGRj0%MZ*5UP&uindKav zKo}~Byf?Iv_>;jIC75kQ(Y*NzB$x9fjPl`+)A$-*|CM%S<>=@EName9Y;J4Fz$Vr! zYWY}^GTA&Y_c&Mpr5Vap8j&)rS}McqPC1?Z!n2Q$x-LG>O~1vl17WB?2y#_9DP8|r zs;np{KKBJR2cA0G2PuP=mTO;CsdPE^)b)#a4TwC?#(pYJ(9rVIv5EP#>m*?PA7Bd4 zqA*f~O8x^~&6rvNl%;%kStDCYY{Z)A-%Gtly;9$qsPWK4f{)( zOoWBe>_FX=KkU7U%}Yrij>4ame0|b2c4vZTKhOR~GOc~E9I?#ja%rN!>6c^ zP0WdR`}=C_Ow)CkcXDqWWEC2gR#QTX)VR_cn_jrQxVWGw zZdzDNdX+v7&92(PfgXPNp;x7-<~j1NW4SHK<_)*gFvS?-FSrp15~Nq!27AHNAZ0Ej zIbzer@J8D$Qc7dO<}mL)j1Z%f)>KJMEcD+iAC;2f645~$7?N7oTbAhW`-322(L+HU zZDEpm5jaB+-vn==?9b`uc%RDWuT=`_9ahW;1u|%$ouQKvUu@s>)Y1hEx373SS=;-H zI6e6X06OzQjMEp}_iI3{{tYDkk}n!(4XctDm$|2xRme!?q;#f z0V5tc`chF*AFFdvH_=(Ay)$3Ny-YGmdHoqjJ^UwDwS4{i71=Ki?d}_`oU=~EZ1)0R z?w<8pyhl=me#ZIKqW+es>`CH$9kl&+mTvP$#n-QXdC5D0a1?)Iy-;o6Xm8nSk)x$i zo#mLho}Njhu~YPp3N|dV&Y;;G23tT?UfX7U42Jx$2abVGdrT|xn{_5!WXC^8KOvkZ zU?L@U`QWF%mEH|;(POt zm)18rST0l{=yHo0xvNc$O9Y{0Zw$g2CKgQaAH_^L!EyuYgi`!&C4?n2fxyKp%e}_0 z80q{zZ&VfMl*fem(px+8zgnd4N(yB_=aq)TNd|Fgi<2ugGbX4`edGI%b;xT?@*&p##Cvzf@J2yghjFF!NkBB0X;NxCTJ}72G)S3fG|Lm;iSlITgeVR0nJDw#@Hw>(-emWrYR49&+~|8yY_cVlS|dVlq_@^# z9k1L|F8hdR!Gif;zl>5MvQj})gZOqMefK3}<0?~U9b zi9f$^85(v-%w$N*;F;r6hcqQcc7F#bYwJ_N4QQ&&B|Nt0no+$MuaV|Q&GDlz{|aQD z4V-rimyS2_y^irc_?ma~xx!XAtvGA4C z#$g*ZH#OA2j!K=p4qWAxkc#=zI|yI8F-<*f{ksBd9$O4O`Sb-Lv@}cfe9Y>^GMs*L%cMHBru9x6gYd>qXT;_A`A=&D2EK5u1%BT#YY69f#0!$g zW_1h;or8kO#>355rq9{;w`tJM>bU6#{)I5K@nh_j9~Rp9W0pzAAfoQ-FrKm0};1rF85I@gw{*BJ!P z8n^B+Bp~V8QfF;Qm=N5D@{&T*QyJG;Pm~6lTnEV1{HS5HvqN zwzT2Zt7$()WA(f?eU$J+>Zir^VD(lo`q&WeUduYqu-;JL$IJTq(+EDSzQMZ>>G6douPK)eBP*KHiR??iD0< ze*=|p3M!)e7q*uK7SuM+mHvC*U-Rv})2`1|_#0+ll1T(#bmjdj;2L@ftGBNiSB0&B z7Ud&}#{+v|6lqpk&}wtvE4x)51YJDk5P^2DPJ)7F==i-NQ(vRyGj%w~)T*Hb)Y9`u z;mpY%njR-TB^Hpwkc2FHC-q25LRu1O`%W--%m($RV>__r*ZMRU86V_aP6{B zRu|1?c5ZO8Q&}Xd`r;DV+aJObWoc*}zV=Y0bHehUmyBIJm1nW@9vLbbvbgrIzwGvD zelT4$!=>c#=2iR(U&#aAK+z0(Oz_|a|HWLJywvW!->qnk<+p)bn}t@8)n)4Xz$1L zLHgGBnF!ki1c3Qy(e3!^GZ9o@M|1f%*M!|yG1}u(pJ3q-nty^dZ$xC(*84&V4nHgd!O{P zZrTGkL^bUScBiI6_55v5VQX;ln-~5Vq5$s}p83UGBD{+mhFm;R(8`-pa<$Rk)d4;3q^m zczNgUJ%{rrdM31Kp=Cp zb!3(@I!}!X?huq*=M%1_$w@cOrXdHT6!X{n?CT2_-J!kaZgyahMyz11A#e3OGD_|C z9%Z7^(f0yxEXAE?IDoRczTmfe+Dc5?rJs~gvZcfkC7Xp;^-C9^-#-Ak+-}c<_3K8j z1>uBuX;WX%KJ9XtX#|cdBQeKuIj0&Ap&bal!?ugW% zZHR|Cy98{!$XV_WMRQ__aq1=ta0e>X<2+wp7nF>L^IR>S4{2le&?28)nA>cYe?G9v zE*9SW=Y|m&hs9dW+DcwnzY=j8<(IqCZ@VB-dcL= zg|)s!VqY_}PVn}MxDc=jZP6uURTl<65!(wBb*A1n7{>)r1%F9JQL@14M7oj?rX#Ja zcaB-zYc2ofLl4W|g5c#_haFODgQ;XE1TKJ=B}qBbfKo2iNhy!6shw$=@vEE*9jcmM z`&DuB*B(nVaae5UaeZ0W9YK1X4lWba&X0dkbhqt8ZIE9Z5B^UkZ6lq|2)!I;Lm<`O*k{VuUvqxTxiwaY?z(21UiQBr9QsKLWVfsxg;Fs zU9JCKX?0%t?}1v(yi;*-jjeCvdh@$KbZVG@2-aupBZAC7?qU2^_!DRl4rV5?*~die zwG{^a19?XeX0gY=#6_^+E38ofS?))v#OUPLSlE~f(-+}6DdyYK037JwiEv?J=DgId zrj3W~!uzP}keWU^^WD1#2_PK(YxUUZWq_a-q|`<+e`l1>M3v}O^>i$BZOif^tiDfU zg}J`5PAmi8LOO#t^EWA1nPj2=BGYp_E34`&^9wktpst4=;Eu2_exb``x zGx{b0TqiDTs?+!^M7T#XVrPBAMEKW;K0qV6W?uoXCz>xF7tQgL;kv?{9LD3 z-*G8e2~Pdw)_EM0+;qyrxSvb5TphA@dX7&tm~OE=eE;fUFmsExOhQFd5LDbTkJ{KjV;(c|Qi z%Gl|0bNPdyTDh_+e##2}<^UwL$Sn_bI}{v`LzC&Kjm4J|vUtrMtV^DjhCin}8K^xC zqO>o0_H5LTM!f*_4I0 zd}^s^&PHNlc!&H|)DKlu7_;VT6^D#m&=gf2RMv?`ck&3cI_sAmd^A{DOG&g^2*d5s zld`dfP}5(k#O zQ9p{nD_%&LjB6l^Z}}u=X%Jbh&eQd)5uQSR_u9(J5*mI7qp`haj6G$X>lr&!#G5YW zr)w9uLh9n}jtLDY^~kw5GqGzi@yeUB?Ah+)pa}}8bW`$-hvg7{0A7O=J%HU)?XUgQUM+zk;cxjIrLuk(7u115~E(fOke|`b6C+ zLK_#I$mMMtd#$a1NPTi)|D~ATsunmP%3NuzlRm40)lf{*-X-@Z>RDiwzi8$eXBx>DNGPWPq&}K z!E$`%n1_rKM>|V>5efbn)De|1AY`nPRpXy&9%**HvEF|2nM6)UtFnsfG+2mhf?&aC zXmGISxzM1f#aH13*9c#GLIza{n>u8fAC;l`*KW3 z{ZE%UNQq!3j+_?v*QHcgO$UnucwAS#HO)9R<^cL3(7W`&s@?@T;}QsSyS?0>Ed^h_ zH3n8Z3;rAwa2@uUl-7%LmG8+UTf)>?)RD5*kzqh*NYq)df5YUsK&Ej{Odcq!p3hUx zn$nv3f>&OYJIh4i={r?@=O>vaH5F7P@tIpg%{ad2G5-L9;{tKFO%@^JZyM*atCM8>b5qi1L;G1hO7oY|@w;YFBwzJ~&>jhq!aw|D3vK=l##7^j_g-!koU zP3DA->W34%K7Tle+hED>f#zQ(**r-5;rEQaPEv_)u!N6~E}OqWVk72UWYdbx%W>4M zljZu4z8-m*32yX5JQ61FNH6GseNRa$BdNhpf%AuK#|AHO z$i`bnuDCY0Ow%Lc(zC+D7OZW|w|1<9rBa=oKz2WF-Kq_)!60Kq9&AYk0#>C8<3C{W zu%UReG{4e(mw{XV!DNP`e{u}V4q8)kxj*=&iDQ!ngFBJoKYsk8#mB=7kzt~;L@ZHS ze{d6i_pVGs1b8Ne^G0vLVa4JN*4I8j!|U%G5x*eoz8dqn+!FDJ5`mp3&wd1EBsbg} zsa22r2dZYn98QfL^SHu>koR5}C07OxiZEJks$PqUu2>)Ij}DGm8g1r=gloqi4EcJ!xnIk+*(Bg`PogHaftRi;Z^L{2IFjXdN8UPPye_%5!FJ%%JmD z;A4$YX0RA~_D2uhxm2=?9sjR}#$T@ILK1A@X9dZR6Oyu0b&RdugxuT@c;Obb(u$-E zu=^mCa|?GfQwK8-y6yh~r9fK0aP4iDF)cdvTAssxFNvXA7Qu?+n)N1lPYeiMKr|T^~w4Sd+ zW897m3;OQIG}({i*Bb1*a#J3xYVa}qEjYyOY5>h>@L?JSqtx`2V3##aUB6<)a`MSu zOXE8HcD5BO^=@nAcjd^c0EDcj{ z9vf&(oTRf7yst6ieA>8XqxJe(P>Sq9wwrL%C|*~fPJrtBJ+|Zww#>5Bu8$pEXD2T! zt~E-S*p*aHiklZ8WD9$4b=HdN7{Qg0p$^#?_scA7tAjHT-s|zcO4}>;Z{$IO0w%hF zz2nt=<_KebxR{salg)Vd-;Ybbhwy)p{z4cZ9ZpVVD|OwkV#skFU)$qiRhE zL99&}W!RQrC10*oVg8cgbiXFsTFR-T#45d~DebEt^zpnxV-{6f;TBhIM#Riqg}hte zd+fxX<=NWTy|O=PvaC5sx}@757&oLzVT`D_rVn7wlAE-{L2r?huct7qXRcB$2bpeYf5qH#j6IaLPcv{_r1nTsIr1rC38kqWrWz*J=R%vQ)e9X&${LE zIT&rny6QNp>nbDU7{m7%4)|4NQVEJksf1ST321(-Y;5bk2@I~Ps-}5gE4|_3`7F4Q zwPQBY%RGMuEOzny6W_=FN8^0j*g>cRU$3f?PZwd`RkhJdue)JI3FH3&O1yGbv00n% zzC>lVn<#pnHnyfp-Y>5At&^qL*W>15xa^nMDa-A360C=(ab7xnf%}N%VTYZBrksmr zx42_{G}L3aIO<;)#aZQiZ;kSPOMx;=N)qd)F@RTJm$Q3V&EgK>iz|O0`5rc6*i+Zj zUZYi&1t3(|){cz0c;gPN2v0??doaTT2H^0)>$4up9-miTExWGnr1!qN=57_0n5^g} zIk#dMmO>z9w#xoM{{RZ6tQ-JMvsx{=wo?zouRb>yGc%kT5}_LWY=0%4&Is5SG{>hd z_$Q5xX2fQm7_2}d&c*ROhmZWWoUw0iwo&OcnrxvfD7c5kSL5reUap9p$`?Jb3Io@$$T;B{o@`cRnizKRID;D}#;RX7)&)CL|DXxH!ej#{91z@|rxD zus*?>(L3qt3%E|qKLQ|~V%iS5D)lvQQ&!c6(^xZdRkAOY=Vs%;RI+G9zath^eU$K) zSzqyK6gKZFmN(_h1cUzmyuECiae$9VKW;aGVwQ#m)kZt z0|cxSWbb?6LffM@zdcXp7{8dG%INaXnMQZLZ706|lA;NxKW4L zKJ1FIvT|`i5E3}2CnFvsmEkOO{v*IAjfPgKEOG!aDTWg^R844#X!f&lkK?TJJY>%q zMn&^;9PrKZQx5_TF(CNu6p6kUgDE@4&9f;o>(8etE@xNY)2#!hLV<;y%Q0py&d%lK zlig)jhGerMoP3Mufb7l6uCk&aW>~IA@SanEy?V{UdYQI{2(Xq53^T^#d0e=w>8@tv zOhJQ(= zfzcZ4q6x6Gn+q{`^3!X!Mf6H8%EzMXYJs*#31JMdJ1hm4?_fs@z?%mm0r2X?!4?xX zP7XFsT*k(1ty{(}K3+yw$1~*L1)AUpIL4bTxvdkyFu^+{1jM zTGTKeOblV;W-zfV4jMBvyV)#Ptt@I;G4e8Tt9Pyg4xHB7gG6?MOghB09zq2G0D z4n4GAU6}XNZ^ZIBJa;yC>`$?*c*^3&a?H%-iz!cKn7G$u;)v<42;dQ8C&Z896V?kJ z!0eF1FpL1-9dK#P$i~IV$%C9UE#+Ta=7J&Rj4^l+@v*|q7Rli_CxJHr*@7fvuxcc! zXpELoVq1xlkG<^hcmz!lW5#1|x83h+O^s{4rqcGdLu4Dho%=1l>U@lN%4YU{2<)H4 zVnzjeg@#&%XKv9?eX&{BL<5J5Y|612FihzIVV6^Tm?9sSsYCSHD#?IZ%jL#ih zI+g3wpj~yw$iEuIV0j~zVhG?8KCv~_wA7^cBYbS|1m61z;%W04LKt|-m8NO%_1OI4 z9Y!31SI8Lb{n-7cfyOZ~N9WyeR9%`6eVgv9*@^8k$ujG-8QKsWx5dnf9g25gGu^I>%l#dcPtcdZVy;chx zEuzz4xiT^Qf@OP+hB12$=EB67V?zvLNnV|G1P8ZbOfVgvtdFdfmJtN*kgFh#9B9Tn z;B(_x#Uyd$C7gLrkBj)MxbS%p@Hjsv<677x@0BeFCJqc!-C5v(nX3hFuvWt+iS#Ja_Kg zm}cPx844BaslD%T!w(NPHT;Gi2okk`+`4y0Wb(5 zjS){3$K*}LDAs^PGq9azwzhQDS(W9>D`lG#TGw8sNFc)x8{W(?@~q4KJFJLi^(^=Z z!l;w+_9h;1S0Vgp_~KQUY2bVh3&yw;QIEhvCWPMuk-~!q4l4#2BXE)VsJssW-vRp$ zI;-~SE4gy}kY{gae&xFo(TfsE-)`I4hv2M!!4J<%3=?Rww!DrymgFl7qRbXBaCobW zj{~0%H?hXJFahx#7=DrPQvncg(MT;2m|*yrA_q_i(D?=vuBx}z)qnt+KMj~;LkvGM zPaB)x@w6Nn*?D$o8n|LYIHEg|@H}QptINBQ$Bu`Q#+%?cJTD}0Ae&gjg9I=`1RSu7 z9w!eJ9yWN@L6=$+spL%nIP0Wzv8xQT*430FgA6c|N#6I#h9BV{AQ@N)U@HltG+_mY zf&}YP*KD7coS5yvBO&%AG@OUwKL$fv1@xDZ8Cf0AaVF)oUGeK2)>wWtv;Vcan!DB-TvNAF< zx{OqY(Aov~( zSa?G=OxPTWw}FE*3rq!VE+d3~%M`3CMz|bk1#K9t%fSs>qoG2Db+73VLB^rtxJV_I zHzH|evG~P+@+Xa%ZNT7|BXT$pd;~uc%E#c%ayT$U2O0zs4=P%0KuDSp@S{u?EHHxA zSgeiTXOx9>3YZ8@bStACJnB)GTGqduK?eunStKu41&LF-=A1ke5>|d5Fk1W%i#Nbc z{RECdctjIKLCE=RLjmE02XUc;f)Uw-*gd1DiD0lgw#)=Kv)SA>!wWs3j4IKV!0?jY z`|p$dq6j98*0d(JOG6Jeo%VUGSy#u$kD-siePS;g=TO1Pf^6}l!bcNvp@WkM95fJ^ z(OZI~L_LzxU}b`J^{RCM&cOB$?q)4yaKV?ZxZeK&j6ulY#TqbuAjO1kiC4f%?BINu z!StVjn*?&vVdF~-0iwh3JS=En0$DbYl`w-A6@!fsrJ^$X{xB*kgXlCZz@vy{tLY8Hk5R>#b)_w$tBEbwWO@LHQ17L;;pk~zWFAp@4 z;*iD=2FR7dCZUM)T7W7M0agz;-?rw6D9F&phmG%N`Gg+>6c;=Kg~{hY4mVj5*Kfo9 zXW}NlXOR{b1f3}AdD~4GBEke{oQ@A0;bU-kVF5zx!Qe1qHP^6xb>La-n*n#h6s3ALqJG|X_sSwRFJ?y7JAC5>(^S;FWgN5pg7Y9N3GC~cl=@qAc6z4 z3|}FuaDFAeWR5qn55q&?AmEsO z8=5>0OcSx=d^AGv5XKOz3=k1xPQjK4Le4m5s45+ z*@+Jg6oIMHQ+wPH5W%|^FpUT}++}Lr2r$F_1D%qwxCf06Nq|8X6WEx4jPgFA4bpQ=b_AXz)eeZp@3?YN51|Q@QeH$DPhPMcU zFoT1}z9;xc&^bJaA%la;@L-JxB0LjZ38TOU8KjLA!X7E?2!#Y34o?Odtw2Wt4hSn^ zI+%a2|HJ@M5C8!K0s;mG1_uQN2mu5E1pxp85d$F-F$54IK~Z57ATn`*kuXA1p|QaQ zBS27Ma?unsQ-bhAV3NY&BqcOsbE2~Gg9c=D(iJt6qp-98+5iXv0RRI(0sjE~056w?Q0`Slp;T_<{vLt!NR~FEH?jFIqjaM*UHd!# z0EYXwz^b&2J+aSs_XZi`_9wmALu973O>1&gG_$LgrPZ^UaliDhn zIbWK2;GA=E+|lBW@}-LZ0CLGdn}tP#B~BAn6F7y|k5HDF2phDjw9yvp)oXChCVM9( zMxoi*JPt~&BedB2{>>j@sZiw{O3`#MJ)^sNdx>>Nz~Hfi0y&h-Qb}<{?4FXlZ>* za2!@`V2&s>Np;Euz=%NbQ@tI-Q)49w$f?Z~?i#tQf(Dsa`dk72PFb+@5ky-cU}|dVv$DE7=r6l8*1X zV6077)O`U(LWCZOQP;OGy&{`O8~PKtBHNTQM-`Kam_%+;RixPsPTY*#&rl=P3hKyW zkGdfO-AB;IvnuI?U2sHw^CSf|4=+IHAln2DifS#4dpX(I-96^10e>}D-l0* z!C0E3u2YkdPSi%Ju~?CB-w;c^k=G?OI^_Uiwh6?Pb5ewBB|uV&g*vTmMIA#`)RkmI zWA2c3f)siq)P;B{r4&cokEFL-XRR7MdrqGLuG;sM#=07vJf%uH&bvU=H?DfxhgKBo zmmvsZ`>ZKN5$GXu>m5PjLUT^5`a9~fx7-%$?MJdBU4nDUYcB1`M#?72$~BZwPBu}R zcH~nBX!s_2p$Wf|Y^I^8gjJQ3NxB>pgDgJnx{;bA(Q-vNDMd!BCO-~aMQvB={bcTFl{e$6=#ra8ktyzRzNqR15kgQ*&pmD^Gb7@y2%Se!L?@ld@zp5D z-PckOL#$EiPUK1`q7evSRNmC_k|Nr{LBkIH$}Cm&4yCnSThk7(>RMDO3IevPE9%3d z7jLNO9m73gQ>RSvMA~ewhghOfSVZQhbRwGG(k?l|JX5$XNO0CwkwbY~RzL-Rx`GF( zBT>~M5$Fd5I4SDF7#2OColjIQYaRFRK#t{YV6|CUU0+m4SM*WVDD`D*wHzqNiXcZ) zN{2O`z>gIuCbuL=l`1>+N)xQBp{Nwmn!?yRCXOsP#4i5kc)rKg02q* zw<_q$B&eiM8z#0%+??j&3enY+Y0b9&3Ul#In`P)@dgg}|)Je$!nS=*raYPMJgNnl6 zy5Ryk(0Y=Fv8XNxjZG>w7j8v3DevkYIVL#D4JH;BcdSNtn;!Lb5~c1OijcNOs|9^h zj-x8&T|rTFLMm3uvc9dIR@EdgC1ov?K>|3UZ^32<6}C?$y<$E0SVg;*6BF5Qy%z7y zVz5wkNreb_tS!H5;E6yt-b$1dYdV4`ri|PbATuhM$S3hcprH*{TmJG2%KD)M6zVAI zg(Q#dRaLBdCpk;EpPiX`(8o|qGmS?#>YSOMb5gyV~|)xd7|S9tZ934+dv1zy%D5r}rT zjwz&0^~DE?ZfJ*HTe)sTEJPI29150mZHh8Sh()hG>k&VRW;rVYu8D^4M|zeX^@M~Z zg#}0p2|xw$M0EB(V2P4bi%YT`O6eRL zJ1tEOFC$^T@|{+xgfSxfNA=>qstL@jG=q5NvAj-O z)i%+_`vbd@#`5=DfaHZ*n^tH*v8`>Jxk==K*&UXk+=6vSNy%YgYenMAFxS*gg>)il8_qMUt z1Y9RD+a*c)i>C~gLD~t;Lwi#SIfOEDBbY!G=8{K#UIR5}dWDmuNq8(DFv;P33U>_CHQZt%-PWM>` z+H9Xvun`h`lX^qHa9G`+dHEq2iY|5lcUBX- zr2XzCNKkbYbqzyVO-)Qq+_1Sc$!_#TkUi)S2+VuYVGeI(=D1{T)jB^gomPuRWKWXp z@;>C!Nhq2wZuZ&{z|c395CPxt2w(@C_(C}8_$*slT&?`&7g9an1vG)*2ntR-p$I@d zqB9|2d2Qln!4T&dv1lNxcO%2pvX}#Vm)1_;w#tT>{-p-^2nqPqI!@(|NkEX@@|zLK zXDew-Wbq@(L!95l6g&gH@jR1-cXC9q#_|@!k1=J^JU5B*12k&ac^k|$a#@(|H)p#g z^=F%nx6MqJRLqfGr{{lOm-?m$JXJ>^;gz{~@FWjW4)a#M7B zmjdMHp7c-Zr}Bl1WrFAqZsMBRSM)H6D`)SS-ijlxK|^>=AwmjNpj26JK;@WM!c=0B z-}<8S(9dhId4=_n5i%p1!vsuExS{)7Z4IgJpY=pKt9TVUP~hrdc!Wd~HhPw@{{UB0 zql;ew3hd%CMYNB23$_0MTig&LqfZ0pDhDM42YO4%9DNT-ooTMIQ&5W0E8z~p;5qH(#D=!)(S`3Fb9g- zFml-*3hkZOL^m6~Z;~a_f1sxuktf1?lj=Y9Kmbnshs>yLywgR_K|ZU`G~FJNcKnAl z=ekP8oq}Y;Y|yGzej0foz)iID*eVh62c;Z>juME;4)b|d(s!4o9$TWlYNh`zBr-R4jx zTYN9VJQJY0Hgnrh`>)i?1|B~3^tAg#>?uz-kZ;!&mpop(4$Zvo9; z5BQG&r2G`S4&k4AYa5wQtohuVo40O5vJg8X#R_eJp6EX0YC8*iBQmjAWD!LTbF89D zfUoz=6bn!)3WNwlsO@7gZkX=$;i?t;)PRR_%shCllfDG^gwvi!XTjV2(}S5)dv+h- zfzi909s=P!(I?n#{MHJtE#p3D7ZdG4Qq$Z$#uU*%^)2BFSv(yoDu40Eh*+e1B-_1B zGGmLpiu&yu*}DpzEx_dFnC}+|7Stzx*zew(0mC5J9pz#;M(Jv6sqt+-Hr}~!_@PbK z$#iuCcZ~TWHn^XP1Wys}QA~0l6yh29kH91Kd<@5YEHt2J^E=akBbvL<7{7WK8^SI& z^@q49HwyShe7AD_P;28ezn3IKWxlbpYeWA4H^n*c0Axa7aNx_wa&upa*T2O$`0q`q z@WulfCdIdAt<04Z!4hPh>7Zh9fZuuzYoEs@g`bJnD9Plo+mxrfklvbiz!{(dfPJE{ zg^1#IUlp@~r}H0@aE6WOMrxaKSdILG11_jR55FNu)=}5TSlo{E$E+RP6t@#@J>eM$ z6B#E)SsR220m8*Oj-AqrY~hjr0NNOu#~h|RxFG5W+MTZqih{$q%0E^eYnpCYE4*+0 z7A7?MuCPJ$ojd+HBGwLWk>>PE3wgFz)&wdgnx*xj+3MKhun*?K071gn%Z>%b*7wrRymF{9d-3kh!~{87c=i-Ik;3#p@8rc+_wpqFrL0pgqp4dl8#t^&wZ zsz;i@A92A3(_=?y=2M#oeoF?Ai+iq(Q*(Jk8H}6nMx8L=Zd!*4*^bavxvubVKn~H zXa$6hL|r;C&tbFX<@J!!aRdA}_n_z1rX6V@cw8eRamaF#wpwB*+(tz^rl)L;zGyw4 z4>ZvC4cMp23amD;zlto-!S$XE`AT*Jh-We6uv2L~mM8xJ zTabW{NzDOJfw^W;={@CPq+RU;0RcgvS+=?c;8+Rs7~Zve^e&5xSyA*5phgoWRzZ1o30rt>)mYq z@HGTDY6xowQ3$9(;>!WT?2&2Ya$fPOL>~l0lvwtD2u^m~BavT}^aG4oho2aW## zRfW!NPRTG&4hQv5W*{Jt@H`!OLleL@#2r7IBl1o^ovxnvQsLd?oaPpQBty_N13jOW ziY=*5Z!RKtaQUL_JWFuD&OS-as@ERNnBUQKReC}@4l(rn*)7pd3XfMx=5zkhJZYi4VpO*nMd|wTfQK0TOe?M-g|;`>P}nbF^t1YGwbg#gLb!WMoB;fTuDOka#)5( zi72$1hrwbb?>o65+wV>d!Mxn4K!YY4+}0;zcMAoCb5D8A23;3i<-t!h2Y+5%p}*V+ z*NWPL!sHzii)`zKVZ9J_Vy7dt-+}~Z2jYNhn(VS8f^`SsJ)Ossw*i7Lu^E5zSx({{YJYqrEp1dyv@R0V@p#xMo06OdkM)S&Ml^ z#77ib^3YYAJQ2S&V9}Y)2e{3E7dwDO@W##$ip1~g!8yc%cotY&D7i%P_>^2jK%M18 zH^i&+fuP6% zK@H(`i#6)0!T`8xI9! z%$$*_THeel%d#whZ|3*}>W<{p(8j(yCuO`*q{BjP<24UH3lrMolvxUA3qbEcx;;_x zLgxgWOZM zc%ez)mf~r#RKeJEw3|Ei;EP=j@d!2cxF6IeNdSLAW0&Ut09%^qYYL!(+`rJLG3~8L zY~IfIwD;~!Eq)K)Q*4o#G|p-ALCkEsnA}rp2f4y=MlSH2=DLyXvh427OWNp+{KCT| z8MyONUmjPIuvKpGPsL%u9@MF0Y2vwckBTqSpC_@#m`-Dm6R>nw+m9(Y;h7-LGj!yD{u-+7h9#EarG`pX<7Cxhim}9j~U?ra84}8xErivo4vteA)r_w z2^<#nZuN*hIHCJHe=;2#=W+s*xvUijc}1ndcPu(CE&!rwJZ~i$fRos2Z5&SEES*xJ zaqmX}IZjF2H1}qmUZE!-ED&RD;;{W;@Cd#AB~HNX4kcrYT2|I0bGwqL?oHlPoIn== zU~SBmn~lnI`;%JH?g)hJvqWc_gwwefY>vqHom?|RRFxe=tO57&P^G$tt_o2K+?3zn z#S&rJgb!rT#b26k`*TiVJNToUKlZFQ9q2tcj%`NUgxK&xr5=seaJxy|f7Nt#gNU&s z7bQ`(MLCwcv*NbHpnzBaJM1)&} z@p2?Hjx3eW666}vfN62LDyt-)Byr!x0$|$9WvpTFP5=@S=v?n4OQV97K1wK(5p#e- z9nF1MDFEhFfUr>wCpQ!1i`{av97=8x$zpf83Uu~&*LXwfK1%nlf$tSeaY4@mbZ5jplpQp z4V=n3p3y|uc%TX{Di-L~!5v3YKyN_mDE;>cqKdK;bOMCxhh$x05a%Pg7MOV1-x-c! z2NJ?>>bVxX#SAwW+;^tBZwQ=`!-R`_!A;&L=CIfs6fNxxiVmAZ{8!Z$oThoGrs11o zXgLRA#g&IJjt2r|$KpR#Ix8GE$UWhGLuWjXf+56nkg-sw%i^|k%t%pv;#7tMxXPQ2 z##HT|WjMM@E_geF#_~zYI|w7iPl{`t+g=kxmzZ18Kg@#G(a84}&Sjn<$WVNDr{)$YxTu&6^oS<@mf(5(4;l&pl zpxo9Xj<%t@Q(L`Mc1Z6lmab@oRPIgP_sG{F9m(MKWl<*)x8Y73E!iE(r0pB=O~Vdw z??WR8t9KuY9VBs06WoVF3H5?#01TD` zeh4%n4zap>DF6|0y~^mp;RQfzcS~#1iWWumJ_$lNUNOIkhGtsxiqRo(>QKy}gDMJ}#(RX|IBIiRt znaaeJ(R5D_B;tEX*mE+EiB!iFW3z;Jq5Tzv^Y|w`pw%eq<`iU}b4?nrs&(`G@(@q;~8*WB|_tnM+71+QO#j%UA;r^ z$wM4Brr{_7k}qnO2B11{4)w6n#i|^8)T5fQa9FUotW|Hh6D2?pi|T>RHH0;9lxjOW z1lG3;EJ)2a)l3^t-MKyXXoiI8#hKz$syi#D(qRWa2;^+BIvNn(hH0bK^HPtq0T&x6 z7brDwRWWc}_1jk+K?D&_NAI$ZvU1B&T#*PB3l3sJ#bzG^nsJ*!;EBm@_al{zqD%lg zx2ObPyP9*ayn4#g?{Z;iJmB#QX#18XlNlp3Ijg}Vn%T6c7O1HX-VvVVnH&+Z;cr#J=b)?B!;%gK^TWJsMD6xncn4D z;&N9O#E2%~Aq2#pXgV=Jz%3cQrz%IYO*!Xk0s*Gy!8zu_$w>Q4aNBLvpC|CKVcI2pFC4O+12@;bI}Uj4CakSe0GCHGmG~gzcGf zV@zhT9l&r3i%r2PyZ{~Pj!gq5r|~`(MZ*h4lUtR_@hEqvy8Dv=yTYV6l}~|EP~3`@ z1bzMjGbdjJ^yo!G=XFwVb^idhQQeU#+rd#{n;oL0XX2eaVF@-q3Deq;s6aRG3uBkP zZv_iQxTm`)khXG}O%(y1k}jV`&B`+HO*`^fTn=Do+=Cw*iC874dNR^Cry9!?o%5>^ zB;=wa`rw+!t%B}1MfDy}9ayS`0pswks&ZB%8-Y`#R2}Hye~Pl%BZB&-s79m>$O%*C zph;GqDWQW38SqW*I#o!3a5vttiw`u>cREV;8XS14^*e8CLZZ)G8SX`=a8=xSCO5TE z1xwmYIXIq3G6@;+bS9fMv)rnI`<9Mn9IS~ulR@nXKn>qC8Zz@w-(ZPRnOr)OLO8zu zt8)nQUL3-BGcti4w*%&?5AA%ysz+t696&@m?LF`U8-^d6 zXx>v=Y*3kKj^s4FqVBe@>a<~@|$@W%j*?FERNz~B_Xg9r|N)(P8y zRY?&|rX4K2sq)Q!~CUG_FBQnLUX-z z0qqj4*$98>G~@$E5}P|L#muZuCCi1C`hi19Q~kkk365-#TOQB)qw2UHcetvIIW+f# z2<$W}adanUQJWNbu1NPI#WR4OVpHSPj^$AA&w_Z9nlANc!8mSDnUFaqoZPIP8@s}$ zEI08$HWMHME|^ac7Tgk;_87C9aG3KV(%tEweSlKCEK zfb7{h&L3IsP2OGNRqWiC7u)kK9y15QXuIi`dy}5%r9gaDZ(0FV{cEO+?nev&09-;Z z$RgfdTr6n&^y(^58m^$iei*Zxz^Z2}ayC$4*#y(ensZEC6*-hgt@A^0L}z5~0dw$9 zf+Y7K0F3;TVher9zb41Y7Kr&H?5EAs90wHV7$^+e?}DY!Z0>fHal?di{TD>%3E1^Y zGB#{PtRmbN9UMCH*@W+_{6Ho*q&tO^Zni^HEVgk+cgZ>L5s(0RBPM^TL0LNy?oM%z zY6S8?HaE(gUMRZ|Ma=F;qEgm{J274)IJcH z%Yfe*RQI`~xCNu{EwSOqdJ}HI@wz#4g#gv za(jMj3H%=f!1l4x*)VvbC`7{gx!~I;^nK+9yvk`qG(#HEz7_`o$bPCAc*2~~B?kM} z-}Si`Im3d;jws+O3)B*Z7+7A|Q&tgkznMA>t;JymFKZ{a33-9Tiu$`awZ9c$0I)>r zt5vewg{Hocds}7nlt`tExmBe64`Z0`WQZuIb5#b;A9}(d#QCk$PvEqlRgHHrLenE7 z{w1V4)n|%$66dgYCXBAC`mK);sz%jO&i??Sqy@aqmgcoZ$g(GO(9D&<0J+K~V5D8e z9aj7B>#}s}7ir#uTtaqsUeJP|-rUp4u_YbOQsJ}*dVTh1-kRZ@C^@Taxi)zsIZEQ3 zPDG*=Z6>A)H1VDM0%HW%e4YZqXq4GzhOlzYP-Qp6Sq#p}n9o8TcHz#;O>hIIFfwde zQYY)_NaIZ5DAcFYXthOJd&EPPECrE;!*REmMxZ!G)MdHI3!}Y!nA2mtF^$6r| z@Kj^4?=YE%5Nv!@9DqQH_C{Og-aqS{9q5 zu;GhwxGJS4dd8QuGiv&&ADjB`LYbsuZ$1Y#OjN0dB19}TIxY}X@;61*j9od+Xy%1B zb0gxXXmj@|#HJ_umA1C!22_xVt07F3IxDHC3pFKeLO7Z-lA^1l)wHGq1ox)`=-!<2 zur>&}>pAs*XRlPiXVuRw%Giel*SC>Io4R%gG5-Ly(he88rU)41?u5>ZGU7WtP$F=W zav~$*oC&fqU{=gRs0Sp+Zp+O)3CMFP&N-tZPjFaAK1k;8E&9sn=(?%jk|fVi$RB-$ zWK^*A1A$>qY=umV`Kpm%vXMRNZW|n>GWf%S!*G4;2$9FRIoIg?(AfeE<_2n$X#&J41)HvrWb$*e>}e>{J+JJVmpW24WiL z6kNwRi@*zXdaI$R?r3iax~1~6A+7^~PQ%`}sChxu<`&CH+_r(>n~>wIhB$??j28{a zmNf27Z3ee|lI0;1oq#-y#DvqNKb5-9qgj<3n@px@6lv5Jo!P6ou$xmvb(JCXfu&H# zNN_a!F5Kk(8%c9&u!ppnk?#rZrsfvEcX$Wnp7vg*5x|3&9!m=yhFsm}Abe3Hv7VO*4L1vddE}kPP#cyvhVep0Hss!qjh3Y zAoD8~lt|?W{?8l;M^{N$TP1;x4L5;>bby`ezSIfBpIAFZX*q~*HMDskXgqR0_0atw zFxZEJJQWQlqns+>uq}~=qHcSxsFv-Q7c_1TaY52r+$;k4qEo8}5F3C4w&z>Jnhd$m za~dq2zRj(inX$rR^_7ff^QN!{2= z6>44W1}!Gtq%@(v5JisSBM>i|$x)O_Y78uOtqZ#5t z*>`fEq|W5glQA1w*(V(#hLFJnYwH0Vgaq!J9u^axCbQYH3dt0!T~+tDsROl#^gb~cpTFMPeqho6P)5=JFKy2dN=&4j&Fgw zniS9B3uLTB9}k*ybe6s&5RWB}vl;C;1ke8fji;kDmbd`oc{0FwsXDHXk)+b3J!c8- zL|!AgTfIn*EA~pdRVRNFWeSXW82}@asmF3Tv?$N|+?@K7J2IkU`h;2#!evXESHT1B zO(A_*Q*|~_=;E-rBIgizrw2jRblsEA3J+^pFzir&l>oLtNxwHn`fnS?!MvP_PSUCd zIn&W>w1b@7>y1V44H=UNv6R_1;ll`oOK-(sr1x@I^!mq~ES=%&aS zlal?GfMD%AHOWs?1qO~kez+ikQ$+GilvPAx_f0sdyRzgc)h%)E?o{V5dU1SVf~fR` zr(w%Tbs59bw~k~Ud{r8d=yOcQCfs<8!gWo~91Cxkc56ta=RC6)5g8^_?b>}(2gfx@ z&JCwct#=sD$zkS*rg#!3ydz)eiVit}hsj7zcszI^q-dugMcetfAjj_nCsqS&*`csZ z<-r-gzKn|R2NUeh?f!brmq+xO{9%cfszewS*%+)rvp|b!;?kep(HzrciUQY=qzNGOftkDKH96)at^WLdF z?8gL{*%tSxIG;`?0AO@{6(L~3iy;|~^K?ebdOqy@f(#o{3g`UR`Wd8uF#3A(Y4*a{04ROIk~0 zc2Bv$t*2wA$aiNIi3fD1S?_ID;udh){{R>h2vcq*HjQ9J64SMQMQHA6j6wVefgFm7 z8;bp&v$SWOml=PIUx((c-65^tyrX1X2e+CxUwby^v~{ zh3+bwU85WNz{d+F^i6ya3lYQ|eUu;#_f~}B-~tSwNXqHZY@%FvC@KUVYhcEpuH8dr z0wj-6xUescAG^@oJ6i#{Npak5IC!3s1P~six@-ZcLr0 zDs<^n!qD6xw!=6nrlEHUg@hL!!E}yo7M^ZY>6tz}d;m-poj7Vce*ig!R?jmRfId-@ zt%nO57&m}+ug!F04`dC%*!S^OBV+&%tVAkp2RFNp?F_X2Q>E6!7hR` zwZBzbnRAGy;gG%`0=CUe3_Inn4_L;{AP2NK@=U|B*l@IODeQRMLH>emT5Y9R!=PcE z<5ZASMC{Kj)5$NQMktpzA>h7{#T^6uyj4Q*{U}=wAkIDMl$h4Fu-1%}?!PVy+Mv$l z%_~f3#~47v%`u}7s|~X42B$d5yaZWLo@ujn(lR4**(;A9g4+r&8>JIW!Q7pBLh^}{ zJyjqTia=XIr2->@+EC)?m=>J8RG3DMP*JMZj9CkFO?WMh>CLFp;0LV}!qBPKXV%_! zfaHhO^mT6I1a9vNn<_BXt%_oq;HF!3Z9Eg26Y@I zqvlmgwS`)<7^IlZXw9`eCxcruJK<814Ti>BlUwS!*o4H{sNfS!w0kkVR4$S*jxlu^ zmrpXcnE8|-<`5$*@m7Yn#S(5%+}{-Ek;ifx4u`v>dgrX`!$HpD_u!RorukTy*J^~< zi8-b;$e#sHK@Pa)x_uBmy{4}A9w3!gtX;1oBM?&sKn%6r(c+D4-zVD0qAE#j@gQg4 z3jr>q3um-59wU0fW|c=$jMxm13El8ct5hAFL~ern=Y(+P%TIE(l^c zZZ~g2nJ0c29Euw>YrJ+r4$r`*RArBf5yeQb7tT-wT1t2*0J*4XJOaSq1r(io4&Ugg zkEHOm;p~yM#TN>X-6|lrHzx{nkxp|-T_yf0wA%<6kLWCxP^Ha5w4;|0=-$@2kOoT?5F`)vO>>&+f?b9)_pQ7x&7-uM4TZD+ z08pvFYI3?Rek*rxvXJ)Sf^Mi#XGcgE*7b(w{%_G%(yBVPko@zU{mP9vYdTvGR6=V> z=z)14NNCH=R~dm!o#f0aRQpv6&*u3posb0Y-i*!%JDF86`ivfFnZ@@lh{Cp5Tvrrt$X$AQE( z!s2~y^v56FfJS3|&}POxo({!tDL|31&G7;+~B!Rys8)iqcpS`UjniEeZ6E zJaFKBKvZJr-tPd1tx@LuQF(^6v?^i1G`-&7oc=BRw?GNQ^C`C{5hr=FWMw5)JE2Dt zsoG6hBkJ4Q=gBq4pr_exaqwIM;(EQp4p&&J#}B`u2v3bf@TpIoOsN9kOECl@gP_WS{x?kAvNb@ z0p3v-kZ-u}T16m39N=tbO_$QJ2&hSoqUeS6z|Nz8!oHI|s*pbj!hF`1gAF*Q3`uCj z=N=@vIKPQGl8F%uqtaXrha?6Xjdms;(lQHfGFwh_%(#-8NkO!UQpw(!TXn@rK+}#; zu$3ke@K;t>gh5tdg@&U5%!pFVPpSlNm9}o2PD_YA$*+->m3%mcTt(KDZp*KvTnj}< z2YbgQURoceRB+#&mWfQ6B*nqZsslQ0aXsX!McCZo0AvED&+Q|Cb@M`th;VTx_5cE_ z)Hicj5IYpZoyAlKX~VgytBa%%-!hJ6*jvp!{_K;_AgW-KP>$rr+==hH5onb1ESx)5 zPtt3OZ1Fq-r}Tb`+7!D{{S|aIMxu(rMb#X!IG^ql+VJjZVh4%?dLW=}WiqNwo=19p z8m)04x7LV3*lW{t1Dq6YdPDiQ_^OVAUD8HQ2j;p%7;*RE#5_mMRG?15p7c+uPkobt zCJRpG&hnaUTnoA9=7@X(_MY`v8L<#MMLn-1IvP(EP2Q`^h`00;Kyej2+qfr|&K5x^ z0uI0g+=3R5>g>b3O3{os_M**+H$p7XW7XZ_x@>#)VnDM;1xdO!GUn|O9mBthdux!> zX|fdChBG)yeJa>@0*^?XNKF>xfT!_ObN>LPCKYLr)ugyY47jZ+&nFW?(=%;G%F}~3 zsn2!PX3`Heh7{_us9lVn$SV~vT&lXEns!cWvP^;+OG(|DX~i%(?(syp5b!yK-qYFx zx4FHNIjW_@Wv?7sZh>^VjZZ7C*G4LbaloF|!F#cB&dZ~xCEjN;s2ZiB^k0jt=-9IM~(1QdqqJ5$yts(uVd8|(jX~g1e z0-^L?hl$W?yW*c(p?i#zsOk%btWE=p44~R$fA-0Vbej4$)aHNqQQ$uR_(PHSWqxK8}k zI?ulXssj}%%TE;7_GWh~xUQO8k#D_74JOmPCJw{ACKXrgx^VfT#^Jc`CJ`i&irdq= zJVSpjJ?ad&v<8jvn<66);G7_rW^ZdI%O3MK-*SO*x#KAQ(VVoYtvpHulPI-fa;)~{ z1BpSSIZPP@5KU`j<*lw40IdqIsfY5}IL}2?9!^?zkNe6-IE#c?R_IiI0g)&Q&fwJ0 zVLtb=b3`YzaPJ>9%8i&~UA*N!3E)|nxa~r!>@LF>-U0Y0G`Mt5fxIjOaxcCK3Ho&8XBr$#>d(bBL?@w^E zfsO%T++{qQUy`SxXy3F~06I5r^kOWe`RkVNFryOC&#^3+O=Qu6b;W2}6>{{XhI z6SpF2J&xWNM^(+7iab;t{m8oW62@nCbD-RxBK?HBP6Fi{mA8-zKg z924=wu;;)gOpO}zm?(lvh5TBYfQwK3GhLwgS}T2 z{{VYwycJR8-J{&8hF#ZH9$~N+kTy+dw&h4S8K`9ORKVlj6C!5lJiw= z7256vU9TI{;T`Qj9>75E0T<@z@3=<$P53IBJ$z6{5xB3~>58-*1LHm+Rs?i`u8sGy z#RgniIS>!LCqN<`-cGngS;9vIMB%tTsZ`hmw7173*JKCg$rj&gcc&QMIV!AoBwFBa z-zbB$)BLwheol8VgBgei_>{uojn_M|EEI?l+|sD_+~;vkh>09kJUeZ+OG&`$RM>Ft zak2~p8>hK3gJePjRnb8XrI$TGf;gu`Amnd5!jgfWN|iyj!0zz0XZAJ^ES8kOU^V^5 z7L!O4>TVtg0f-WfpocqqNP?+=V1nuFy2rq#z5|2u-l)EzV5s(poYfIyS^g+a%cLgb zyX`mJsR;~gPc-~7BfUCc3GiA&-D(cn<+cX=p*q$*fYiaVJ zU|=Mk0aBpP+BAc=pK^YeQ=?>xL*9v8^+F!XJQpopC41!6inalhem{QSs7|A=rqFq{ zK}?Ha!d@-;=rH&%qo3*)o<(T;p7hC{ zmEKE6rtDiptq7Uu{p&^cPnyuO=$3>(v1-xVl{OCq!MGrt&WarqDYJJ^dIap{y#Oq$ zR&Z-si11Xj8a*vyF~!bMt7&^JwIREXsa#6JAq`kiI);y;mz?uhoJl$V0C5KN&uKI~ zvU@=}m0S~`D*V%;=$_3-0R_wc?#XEN4^Ah; zcQt_Cp?iDo7uV8C3GAv0a_^+qR;S!qtootV|#!JzQ{v>P2d$T;kU_Xr~4Xz z;R=BM$(~80AqZMZY7mMjAeu8N#nu*EW?gj2$~*U?dG{g*8CV6D0B~6rNdgJY8b+ZP zYq+N|j};nArd!Eq{{XYLqqyCowCDN!+N=a z+?_n5-li^WQ(-g&G>sU?X}4;pVQ&OCd=+gfpu>tcm|7pvdM+aaj}=!-e`tnoZ|aFq zk2GRRY#}^rOZAyO6V^21% zARBp=RJ3iLcukdCMq}|nL8k+xH12lp6tqlf@4$LsMELm{zcq;}YoP4r!S3+^S5E zCGXv;5GvM03#Ye)oRf>9*iLAN8_zMR(!)1tmXoU+eNXw7Z zmpHgUY#t?DGe^>$CK_(k`tVCIv))#XpizNy77Izzs^WKqWD~t@ZR4vFgx(5u3OX~Y zzl5h$sOKH$`-C-JJ96X`cqY`O>P29Cn};Qdxe%{p;BO=*v_u2%RUL5bJf&1=AYAhh ziz6K|F=Hx=+l}x?c};sdCw5}esZr7~vmuc0RoR3yX4tVDt+{CK4|T&^8(d{leBpR8 znw?K=7nWVvP9F5^4aM4lJ^HPv49ag5)b0z5p;BPk2*s=vltzANM4;fD_`1r-&S}B6 zK54<7&xWT2LfL|zaJY$DJzQ;ghLMr^s&1smgNF^H+?*caie}(& zRr)_vx^K86jO^Mo=B-a*+gbh|^|JV5q!lEn?R_fyJ3l@*h-`&b#>P97 z+hq5ghmsI1-uO&xgHC^!=9%kKEp%>JYVH@CrgT#`iz?54+m8?vffvhiJuNsgO|R_@ z{#u)Bris6j5-d}UY{wN-j{gAYCSMb#{`E>sT@ArF?@l|_NXc<1O}*&GNqa_PEoBgkG9@;|)b}F!WVE%$`@B=bjq`2) z094lC#gswsLA1d)A;w^4pA}$6F2RnVkgzI@7ew5L9)Yoc>Sm0j&( zGM|W;PjOD*ij)CN;&lW{a&C>HnvdZn8nqnrnLpe!uIbMyjBJvbxFK4BY21TcK`NLz z`;|T+QT`zEB?@P?Wj7z{oJkw4c&KtaIe%Z+^N#qd?t%hZ;Hfr zr8nAL9bjfg^hgyO;+-3mf1(3-xnFqlPv(4+U19+6x*Og+RR)Ql079ez1AXqWIvOV* ztal-~*raBv&dyoo#TsHUb5$N@_D>eFAVi-8c&ed|$PBrm8>V-gs%>NfF(wdhd=cUY zc~?h@o$H$BtWlihO`;Q!;iz##iYgA^oEv8B%7QZPg^kh%94lxLOHSg6n1jAl6yh&+ zErN!ttR+e)`Wy@=$r5vw+z{g^aYKSUHE}~xkeQ%pWzOv%igVuQJ2Gecg?(k$DwQDu zXF@bMftP-)lJku-3jz)mV=1S z%%<7ohV6D!TTI~=84^}9W!`G093jdb0{l@x5K7>#oc!FU`Y2n9rgabKt-vFBGMr9U z)dYm@3yN_zL=1wKz!gJj%U0OrBMfQ#-}O|2@J7Q;Qu!8q^2j{ zLG;~`ZY#M?**>Q&l@buy?)W8LwgLc{Zanmx%;e{NwVZ!X4rKA+=6cv zhM+RB#YUnxPq{c`08au5l-S7#?2j}?>G!7#!SKmQ-aFA_9RheJRHt_Uedx4Ih}|jT z&A&KCMr4jEmCKxGdJ~cz5F{W>WTns!DNe^=CnUk%LW>;HPqp``8J`6W-{y~+r#B#Y zs!hC)iUh_3-iVLYJlHnL^0@p|HBLtBYa<*+Z{)hO(btvuU?_W{07-N2Ov! zczl}8h`Wq?eK`_F>MR&APW2+Shq zWvBtYa8KcMNX+*x2mvT4B>`oWAlX6+Zsc+WHZKJ?4pGfD#xYywoX8Lg1A1}p<`&5i zfo5cT-n72Qzp_mR~&MJQzrI4Xg1);n<>I_L>|hZo4YG5yZ4`I|?jw)Oxr5 zqM)$skDC3V{TmL$Pnkpeg8HYDqoY&A?$7iOsUy02K~r`6Owkar9Tw#;*8{+qjKb}y#TO{ z=wXPIFpI(j=72F9N}xF4e3SzuN^Ti0P$w4Ga%5y?6)|GRCKIzw8JrMN8MS@{cp01F-dW%P4~ z%d|oN08>LF{{RwINB-`Y(KUHC8ho5W(AfnA9-R5 zJsavCN|uV-c9lxbmmZ+%h}LBlfxv?#aJm{^iG;QH7TGphTYG&I2jZx-MxCuMM+cO- zeI5_|QFkWOUq+u^zmobfvkcNa!lFY>Ce&yd$xrocq|1%>@l9j6rWhkA+!Pezb%$D1 zGda2uo@leSn^-lF@xOb}C>5mYqlX9y(W~!%32Y+z%C_if%Y0!PN7SRf~gX zG}#j8-;#AYjstPtxdaNPGb)+&f}MQzMubMRN0RReLvz;INR>kT9KM{9>e%a9|fkk zeQTRof6QoizcuuIPu^&Shm9xvoU|AI?@7bTt8n|og{1)@xZA~t5ceko1by6EWFY(c zB21LZEyB#xoMh_*t2(T!*8SZlySQ7;J)gd>MwcRF`1s8MX(X*1=)DouDjV-VAgbw= z@w+UVI1N=PyA?M%uHw@LGOzqa7QFjx*nhgkGN=4KQ1k3NVgCT3@K0llUeebM#6i~P znQ1LNMV6Nk=i?uY2Ygi*cJy}t03j{?R)YMV_I_bM1YP^LvHitXr`lm3dCCK6%Geo~ zRuDlQT2_(!s!nkBvTvDM9TWB1SaZLJL}ET`M{n+QR)g);INjv5nxk&B$lwkU?m@W( zQCPJXQ^54r)sfjL!0f2Zg>|)@c&cH+*o^X2`cQW`cE40A;%ROZ?F^NAZN;+St26sA zda6INRsDdplfFC_knG;%ca+eCCj+x6^kWe+jN0fX3(BXC`Kn}#?^L&)>W~H;g`oSB z1&c}$HVU6rG;a5&;y7kFN_RN#MkWz1;VT17d)23-@l1@7Ab{B$u9$sLn-;%{s2pDd z4cD<`LEktQr{jsKM&K z@!WF@N2%C;2YV08!QZN@NW<7#dG)lqVg*AS4adDve{PVTEwZ6g_jN~etgBPaw)?!2 znN7Hyi|jJ%-4{4DpqCtg5>;Al4$`XA(VBg`y!SLOqp1GlN9kYuO8Iy&Eh|X<^=CMH zIXB2I2&W>Y6~-2f-(Sg5VV1PYqovSVRSLzW#y1pqiBA~>;@FQQV)-XBn0^susevVKXgqlM66HKK3=0;WdGAvdT~iO2x0w3;jx@$qT5gS<;>9_Y3tgC1YQ8D7ySs9x)Af~0kFiSr^l9xj zgD8(`p}L_~o0{z-5sLB&<$muKq-gapRi;?(e1EyFZ?En(m(jxMf{j77L%pAbc&Cu z$eRw~l4k_Lxef{3l|#Ka@74k(9Ym)E#Z?vXF|Kgm%e_*r;Zvgza30nce=**)dT1fs^`*FM;H2IRA2m(aBNMojD2>bO9hzlGYozn_hw7feh!F9|CA!_kNKL|8 zOn0G*GhC5QIYH#3Fg{BS$C3u>Y$b2^D_s=HO*_<*0vpf?*>OT|!z3;O_is%Sr!bwk zTYB0v;Gh=<$l`_*Ywu1j!VKkf8@v=ar#CQ&)^!1>G+d{8p-s)!(inn)@Kr;n5tXDl zp|#k`?cnhzz~;V=(tmXGMc&0jE%0~hzLB6@%9Rg9KeKkwJjV|OOBtg^s~cC?c_F8{ z+mCvrDwb6hC{*6smmXm`^g0^XAKBFx1C*^Igy{8JDpMcXzb^Kj%9VTQ#FuZP?%#*B zxpga35Dd53b;8kW?&#hB0BWer#kloq0TYS7%eI2h-aPHj>6bMnm) zZ`P>WOpXeR_hBi*<1e(^(n=J^G)d}Is`jysE^*1ANh?OtcD|9)Iy3wVdv$zwHFPa3 z&?q-WZbkj7r@hDIoaYxg#JJ{7&s3d2AcSfsty#kzd1#5~#hiJ#p2%7&S<%yLYBYL+ z)JJ~zqfp_hd$$iHSmRcoWac;~#ma0gA;S=67VmSmN4-($8tPSX+h~CU!2+Lz@01FA zO`i&=7ZNyyO~*7r-H}et7SNgSP??xWL|D|Rc^pmVp@=dFW^zJir zPiTIjIkd$p&FQF&noiSyBey5hX|1DFFQ>eVIlP_~JuZ}0XV$kTHqsLuey#FG?#qGh zLZQQ?wBr6K8)NeiSbNjy0Bq(vvi9~)p{}bkHsQHYshGfh$<5|CjYD14XoumbI6P0k zHK5h@=)3%F{Z(Mn=0!&POgOsEZuG}y7Z0^x&`Jytr>NRg+gnbn`#m#uvL>tl04sNQ zlxZ>4v>Jc2Q#LLJYP<7477=~dAbq!HiQlY$%N&ZkXT0V(|#*?u`v{b!Q&N5(C zbd&Y2w&o7VT_J*=(IVh^qq!7T9_6Fy4a)0DV3s&MaB}GFQk#c$)d%F^Cp6qL5Le8n zqBTzR2J|IzSf{P;dKHl|OpKYXYJC9U^4r_uxZw(geX*yj(+D#DKz3wp9jxIZv zgYWrbsS-h?<$olt!{|JUa|hw&A0M5=1|f`2GnLD z+i=>0z;W+Y^h(5%T*n#4Zcl$TR;5e~W1j8;>Fi;vrB)0B)oJ$_Roe*AOaA{Rf0Ez7qP#U3PP=L)7u2zCesObZ>cE5Nj?7JKvPmc9YjWk~APGhk& zka((9dtfo%(8%|M<`^UWQ(ht2@li5?FU20m(;xF!~k(V6p1@$W+WXU#SFz46H~?{cGv;_wo*dQ^|qv>}Rm z@VI&FI)QR?Ln`EF+^RH4DwTZpU+yW)Fh;y12@>8Pq7f}JJ>$Ix2tEoEaP&{RJzvAz zolNc{aolx~A|!B9CB9qrl;rLy!+NXj6!B+VCe*uJp3;vLQR0dy@lHRyXsO?ynxg*8 z@SYF-RYrE2N87KeI+Qd@ZL6g>8_1e^KOePvTbVR}Jz5TkK{2TZ}73my%Eo=u9ke$QyR9rST7+s0YZLy!l#SBdZ zO#74^AYz-D%Gs;zivzzu1lo+9?cRvlax)_}67g}tVA^T1;F<(Fc_8%Kf*ch}Cl8TM zoYBKJD)&u@&%IFo8&xT=g-m5WX}k}bVB8Z6)VX+h9u~w#9KCCv$t*3{E zphg$md&0wf#~ndoG7ZyTm7T-%Q(~bz3|R4R6bQt^OLy@d`oe3o^Ik|GI;0@$Id5;E zsLKOx8IL7F{ifhNTXE!{64-d+-?m9nuF0AR4|_wjoZC$0Pw_wTa2{#zdz|+dImSsh zB>js?(=>+Bpu+c`cQeUoUqJ&-fo**{A@zMqT!%GMwO3TC^5?k8am=m?0;yjV5Y{kF zN{;NXbNv$qBSL^JqAoQ(%g8#!VkH#H#vT zTolGaUh~;#;#P_DevgKka1R%7wOaoGm)U1EQnQ=&4cJ+Lf(3t@fs+~OZ;H%a!1O=nfXf+J-3#EOm z(U4M6!h59eXG*=thDdRcaVuf$vVu%8d$pzGXVAzDjPK>6=+J2FVR+Y|j2jzMy3E_P-9hqb;rCSE-pCrH#=w`@Lfpa<-908Xk1V^B0UShjK>3YN#BI|gnraC zRyL!D*AX<@eL?NJpRznrCgy&{MVdI%ev)yeqk63M>h~(zXcTF%QPEl0qTIimj=3q0 zr~5{d;>{cw5!$HlWuG&-KS^_TLn*LDI&JK*a_7XZn7FyYl$bG8sB&oiPUI^VwT;0> zpYGZIXMQ59Y4s$W6kFSW$a7Sv(i$hx+Z5Ywkbjr;)l$7?(`RYiaszohf~AGJJpy_L z8O6S<{j>52z0elVM$X9hqSG=#tG{;HOe=K}%p4+GZRfPuLOccRxY zMBJHB*6-R*Y!IZVHclIpTp+4$CkcmgRVf?g#aTejKQfGS;!T44LMiP{~7j!W;mO z{L}{EW!(w4*UMu7Zb`0d zaJL2WJJ7`OhB>D<@eNWZdbZ>pm`&|dvS`_RFrGV#dqs$JpbR)&Q;Tm;o=V-p5TwRI z9Kv#O%z%J4ets#883W!^H9L4JlQVD%nC!Hk`zrN$4g)1OC{uz&AOuE9^${?4aZYnd z1F~~eOa_Afld?`i6Ng0i5r`RZHxQ{(Xbl3|iOF$5b*EVc2MPX$vNaqyU9>r=>>uSh zr*GASVIVoa$@y?Wz?ygB-&lUVN7J@#-qVt$SYoAPy{NRo^Z@<1>XghTtx@%DF&^8! zk@HWhP`$?I`hm!OhOKI?r%i>=ae&d8S})KohG4Dqffsgcp~!J^t6Hn7RC#mUWVq&f zlr%~$uckI!;WV^-i@y{2H{z>lHH})XmmeTF4gplJS+wbiC%|`}N}DMD%cGyFnW+4_ zR}b=y!E}^Pm!`j<(HbUAoc``h_Qx`vCUjaYD^jFBCz=6D{fdKYpZJQc`hn~>_=lPG zb#!g%9pI+>*GTv#8U`o3gGTkzK4JtzTkL_5MO3X>l-b&OfQ=0;l=NfuR0aXT$JQlL z(qXQKRN=?FT_?B_E-n-CxZ;p<92BtZ;6T&bzjA&MS$_0)qB2v+@KozGw2Sa6y%I}h zA69_D+Br@OzQ)Ri~1EE5MAAfwWPZz7~mjsKes4ec0XkT7b3(d=*X9+2XW` zvzj}Ctp3$U9~HnVj=5B+fee$)VBip)l=sOhYJmXA-;!x$86;i@0IF2MQN{rTmUB#| z#bz2lH=4HbvXVQ3W!m?=0_Zf0!q-CnJ-E!PY^L zRVv~t+1}UcpG@D-1L?=6zN1mu;cG;>+ydzcfrX6_#_%7n9ar@A^s4NoMTO6CunR}} zBAc{*5#jn#5nD+fui&Tp^=W+?(Njohew0MAfw-sms&nAgR<&1DsN(0i%ba(rm8!O# zHp`rB5Nm&9(I%swVx!x0Q2QO}1h#_?!#~XK zdg%&I(zJo~3@{t~SNj8(6lk%k^0&i(H6>ks z$)MEIa;W*GNBqw4KrU-arwyt)M)CEQi=;MK{D=e_T&7n;1y@Jh1&y$_*7Ww3=?m5r@1t1 z1s%!lC?UtJ6lx&K5M1BpZ_FVQ-B5yQvUM|JsaDA0cLSG#dkhh&^yCY)=F@OfD&CK4 z_-8-m_7skaqcht+TDcQ4v1G%>g+(imvd_FMX$>CP|^rp}Cb>I@F9;Ub)2 z9A0uCGKnOUB$+3kr&XxNH#Zmwj;twD{oN6Py#1r%b-+d6N9o^%)E)l-aUV7Gg$~VU zM+aPc(1Fv@j%@uFi=?(`RcpC#^3)0uvW^}K*0EmIh}A#pjP6w5+G|q-rLHaattF;x z;mK5Ooro?4JP zBcd68Am8;=X}Vh5@zmqVFm;BgP6^?2)hic%p^?d9?$laj8-!rgrXo9S;mmSfBT1)c zZ*R;ejp(jvuNYiWX+Vq>Mkem!6tL8!>}>dV>t$P3&vikc^Knn6M8O9q3xnOQ)XkGB zw-Yno5g%@juR}!C_1_|&A-&%rss^E|-j24BU6iRXx$iIlRDOcdU7_gj4%2Ek>+26t zdoAjZqZ%AX`(uQ(e*hil@txceB$8yD%BfN9V;WrN7yt<+eIN8a2Y%9eO)=IqX`aJ) zIoqdvU1^_8*80b`j*CD`pkbv&yoVIZ&1Q|GG}F;39fogl_TSH4Z6>=ZQ*6D)->Kvk z7Se8sqZy*ZE`RY~?RO2@g&KIzXyl19Q=H(|i6p=rNlli~VU|*nKGTnB-`4Gav*?wy zquTx5FU;-!9a+)7k#GM1Ym59Z2U!F`A$=i0fsdqbvi|_pXxdwLP8aWC&r@C?sBaV^ z$Ptt$jPKm0@InL_GN5F+EM^NtCga(+a;`Jl98;zf01zd}48kPg8Nx1^x6K1g=HWSy zf;bxx&ODVpf*4)H{{Y!-wBmuhaa5_2THBn?ryk_d=}K@;Kbzv5x=gJ90FU~ot;9&+ zgiCJSMXnBMf)F!On8O!yM($&hW|5xFPCK3csr1}I1Q3WsEN#N?0-VCC(sm}g7LTP3 z)arYRsY%e`smukjiHA0vzxIJ?eIiRnW7cnfE_%yMgv#TC{wTD;`&Ihk?t)>UOOF5- zNmRNZWCs8;8n#f?Z%0zCMzM`9bBq8pB&r|%IiTAM{*bQR^Ay|td8awW&Lom#lf3mC z^nE7j4`@0|#L!{&2k{&~@g6D8adU|znIz^)bLk58-Y97Q0K|4~6L#bATJuT4`v_?9grbz1i!H zSJNBqXjQ$})pdPEra?}o18eOMYkH+sfy{VwPVuM_Ya#{igdND?+*5C}$S&rqRHXr-m$!1F z)&{s@jyl|VCXRlT9Y3AtoU=gw-27PuHKH1(E2mNh~q+orq@ne+QA4(>HicJ67;CB%|Rl1~*bQLsF9KDAa;Z)wI8A5aE#3-1x}QXPht{rk@qQRSueVl%_N zXzVkFPd&qur%Xdy0OhEhmlA;c2O5bv58N zuY>oF{vkS<6A*GEBi*bxVR9`$XKwUz)gxIbKJM(WVt47{i^*}!nJA$L(oUgFGfJre z=1m+zLt5U|XL4@tC4SdiXAq>x6vK?0+_~S0*`A|oz0RoO$~49*ui!WiXL9LFbd50n z%|i@PqAv2mkYM5XigW376c{LI{=-e(&F=M+4AiSV6EouDxucm?^t~iQWzHe2V@H5% zQ$CN;pP^A8)_t_9qyGT;w~*h*sZO)sRrkA8TtH2Xxv}D$dnmGls zunuQmL82G>^`)%j&sg~7)adk9QyIHy-DuMr`6_?nRfl(=uR-%pqnddwC7-=$c;#ZW z7mcFkcaPC%m3tMK?&GVUP$8|{7ZRF1F&csDj} z&OAHQn&9TRw1Xgw!A-8mRiw}!(KTs~9@{x_8M|Vp}OQ#@RqYXwk3`TdC zNGVLp(IE_}Atfmw-uwMu_a5xY;&pwlbI$uZ*ZY+HxHj7BLGWbJRhsws&drmkHLPR( zH-}x7$#kt{q)QptICXs}HXo*us4oISefEg{i1W*UEq}1s=*4&b4j7r!iEQG?DY^2k zLaewa^YeaFHoY2ey$bZ~p~iuUJ1P+Jf1HCTB+$LIOzMLlja8SoZ`^_7XfwK)nP#Oz%+Gh?tokPYx6N@>4@y zKEcxd`Tv-o-XRmXzI20Nn0Aa9p%|nRb79GPl~n&<A`ZyMq zzG-wZ+Xj`cc#c(p=e`p@hp%vLOds5Otoa#Sb<87hWu<$&oSXZ{lM40a1uf?-bkefr zhBZYIu6YX2RjXZ3hBY68J`PmvIRE_r!HmFksM#FHtbw$pjnPNqX`Y#Ij!S`kD^vBS z_;00U%BRk|JpSfoD=CJY{9tEe*&58N(*4-Bazs=pss5bf2;_6j0yF)e^Nil>pW7a} zRJ5N7^**|YveG&=`Z|3gO&PQ}<64|P*pu@Q=Sp6i{_DnJ;6qn1M@*+>;Hv3#dawH` zNekXGlX|0}1RleDzZ7QA=eWrlvw{m}am4{u%@&>A z>_g6*Ke%z1-~ErdAATooi0A5FH&v1EFZP1$FIe4@A+8s8$M*t zJ@;5eaHE3n4!jT=Pj3XWteZX~ijXr}CVpN}ASzQcTeFf`NacO`vl>+qPzY>V4QRuT ztrdeV0@1y}>{F{o=>7A=2MCSghWIoe^GUx)77D0B#+ma3a`vaj)D zj*7R{r)=l*cM35p5&a=ye?)>b(?iqTOIz_JWtUx%rKa!%Msa(`5b;Pe+opZn)<{ot ziA!uMq`#+PF6LpftW_P@ISTpvP%9@Uce_pneRQ~xDEpE4RmdJHS|Rq(YNLGiE5^dY zlRH%q9!ThKHm~SJQo5F5bFnKb-S*Q2G}zPHANyd4%?eQ_gR|x=)4eC!jLqSWHa-ow zcvkk5ZT({XSCKUtwHH&!X<5ss{L@nl2&e-UmI(iwkC7;wBI!OCGN=#^o)uitaeTOMX@bpI3cpixNe0Fm^ zRn=?6wn0Ca!}6)N2FD|NUD@nUE}7YHFCU5TQ>caMURt5UzhZ-xeUk+*o+Zhf4j`yn z2{$51zOlAj|9-4%Ek#ZJf`R2vOk$V6Lf*tAPhh)DV+~pVd=^A=iKr~SdY(058%4s| zj05uYQE2*W(kzblW(OWzfE;iDYSLBDB%^g)JuTJpbVZ&$FLqjc;D2O?Sd`b_BCeLH z`u?MKRDD4U6Dc+TG+*>I46U!WgEi+sB-GlYdd~st9;?IJ!kU|=Vtk~cdNRb!6nH_e&c&5p<%twao9Tg zh043C(xzWC1+PNq^;~aW$@CMlS_)nLb+WxpXNlxJv@0RH%~s5GIVTjFKqd=!jid z`p>H#B9rfWS61SKm|o%2luL`byhb|Rlu%77@UnN39^zVl*BY&rK^xjtKy>tX^3h~p zBJM#I={@&%3)`3Ow{?v*YVI+0Ro@v%*9V}RbPFn?R)8J zfc%F8Hs7kJ(ZP~wa<_%da{e2SWQNsjgU0Y~@M8Bcx`}=3 zt57*Qoz?xSUrg~pmE`3&KNDQN=RN((t39ngwh2;8g*c1-!!c}_B#u>Zi*T;H6e}tZKq=A zCY_%{m(2AZQFnRx+X-XKG#0uW>1y79t35rO{y?Ht6 zErp-A-u~<)J|Zf`>hdoxoKy&%>k_owa5jD?_Yj+-WX2zn9Ca_b1s6V$=*Z|yUMG$_ z4PIqL8jC>!{j)M&Tt?oHN{)OzvCi4XJ6bObepT5%b^OK#?4j0jra~Xt|1W5 zvD=(=&Jb$UEZIk04>Guf{OVkjsmL))XI%6&x?;Y_m)C)XTeU0C%Rn`gGgTgsf+zH4 zzMxPF$aSu={8VE+zOIw|XFm-*ppQwAq0$#urt`0u2yts5Qpy^Tp7k24+SgaE$V>C6-A!-sT#iuaHM2yZRt!~ z@zKkhUP%=Su@GP}M-qy;wz_cP>Bf;XX+3j2Qo>%h%v47qn+G%PV8>mU0VFWpb%f z)TyaQbiKa5#-w@?JjXDa&N$~Ch6?m??V%K+PgDJ&KRskus#|pJ*}EwbU_+F4&*&M6 zium5wg4vo2HG(n9RNbie|Fv%!`bZFRqG&&8`QudZDVuY|8KUmOd?LK49)3*r}7ZdvrW>=t3h&JJQV% z?h^8v($o}Xy*ZmJBBx(}(RvWu!p=8M)MWoh=tJv<=+pJpk2Y}PzHl3W`(Sr=2HmUM zcD8F4{{ri3+gac53iwb%%mhddhN)-7k%vahS`?U%c?q1_dZ*t0Kbcg1={8TxZsymQya8i>Q z<{wUPTZ4qVL52LWB4K*%mkG}`0Y-eY{~pMnLu;6?rHf z*wBzZ8A6?$Qpd`O-DLM4TW*TtGVo&crn6d;e>hvNt~VI^3s&)Q_wqE&;8z=MZph#! z_J261;+dS`4Yx;&9krNZ^)_Sv%XEZMowrhY>0J-QC9P~GQ0ZsI=RVBsG+|)4*?fl} zKZ8n0=2J%Ma>o?*lQSvForR%`mkH~~ZVFyJtT5K0LuM7Yi&T)Gw@=fdJ*!cFA!F6w znIFaL&oRrkwQZq^2&yiOeD_nuei{V5L~##fpl|*%)%}Y~_oSeOAWWuCkEpf;I?KIW zsul@FAKE)d>n+b5e8f&nqO3NGU=utEzQy(?UkbR6AoDzrybU~AY#B7xG!3V`T{!$< zjWE>hQZ*pC9GWNe;;VYHnSL>+@SFT`G|b7<6orG5k@V+cSW%PIx)-jP=2{r7k_w}! zoIY(Mr1X%}%Xq1fGWQRM!4g}U!+piiUmF@0`X36LF|}^~4KId0X$ZnwjRM>il*J5G zyPAS{C}dLWW=%;ZvZhLB(`+q=Mn4HyDiobO91JQn$XqNR$x(~OK4i{i)P7g|LT`-@ zx!m5bI-j#Tw!dS@ylh+?v~@9oUH+=A<(>C5s-c`Qs&j8CbgYp89#lOs18SbId&v7W zyoqlo8}2o`)8Uv>07YcXP2XR=y&XJi(<6=<=%~hWbQ9skcL;10{~r#uhCCtcb^)_m z4b&-WZ~tL4-_wf4R}Y{=hCTxcM=!TYd!Y)$7wrEDBL~-S&Hh3n6&mks6sLY9 zk6g1qn~ChH&Uo0tx@;NE%P%liCIjDDca#q`&2KrQ59uQ|LObSLYlYggc-m_Z4<4Kz zM&Z;W(;24hixJ>sf?JMjPi)Q2!B7qDYakNE?= zYc^suss|byTy|}Lt^9|!I>UV8$hqg9!P<#i^C+kA-7!!H<GSgC!q&2hTX%mRXOhe$h(U+Vs4O z1{z9GI!W=ZqgWG5IQ&-Yz4}olk7`EQW?-O)jK3?2_pw-Fc-3=p@a4o`JFA9UsL`TK z0^$&;*%0W5ElsNk^hU{C!7eFqmCX1mmI<2=6xV;;W3yW@BzFl|lnc~*i7{9J=*JW~ z0j=Mu&QNzHR*)UKsVtLikR8Bnl-NIr^KKh++(j%#YI)W76ZUM^aJ4*)*H)7Tu$cW7^I5E7p+}FUKg+=U_-&3|cc}(+| zaprjb|1fPy@W8ua4S-1Tx#l z(()d+vi#u(kxh{Fia@H8aNN5NnMI6^t;xfF=aS(3yZXh>l8*8#?tQ)0$bTa^d;nY= zJUm2#h3>9HUoMFaf*ohRwAo!9c{20~@?T z_5G3k4?TIg1C0>aEK9f-$GH4U*mofRy#$Lvws85q-tP}R#t0zDxY~w#Gmun2@unW@ z;zD3^a4!c_o&X^r$YkOGIZ&XjlpCF~8OdghD6|Q%7(a2(QNyjKE&k(y&BQbU`wsd}CN;lw*u(dNVE zdW`1aDmww%+G;S6@ggKsC2T){M|Ch*iA44J*l=~FTifHTl8Ex z$hfLrE#*D~4S8VTheKef2f{$KXwMl{)=;**GV)sZ#@b1Ro#z6<1jaM2*5`p_{I03i z@4{Xrh~fWm@b-Xs1laX9uoQ0|?v*yAFu%qGwwBJJvFj}hM7-yL!1%Dj4BEfYh0T>> z>mUh-;uNO>gl}#i7|_-OeOjTmTDiFo(g#Qc69@p~Z>yV#8;4A57?a0CcmfbWGwe#f z1I5S>{daAxoJP52)pM$iIwA3aGQP4{8Ag&}><`c8;1Epl=N{3XLSSTSqUt?CwP8=u zKb)w`?%Z$+73ZyFtn3aeZ%IjQNDWKH=1SAstm`1#rP**M6o3}4S?|wcn4Ve*xI|@3 zAB2;J6WN~Lz$9q5?)~ri;TmQT7{{LfGu_NMsf?34vms>CSa5kFczEVBm1gA{?5~~C)H{y#&r-_j+gNZ{p`iu9IfoR z+hXLtYUTD!-r=;Vt*OkRfy@&$9UWEyY|INewrxN_cVii2Dj3M@w_^N7cep^Ja`w!= zK)2tmHP>9FoeLb2skG0|MVf0^3Ni-I!WR7vTgAE!ERcPyVhupQ08ikG6JXRX`!K_balOpxy8Lyy^+%-YD{&kL4tMggoeI47~vIG>55 zg7IS&nkqvTkdrlDrs6xp% z8$5GKRTR3{_LO-7Mq3t=1bPce?=iC;uJoo+%ofu|KI=A;_vJ4alg>@8&LLWAl@z<@ zr!DWoGF7P!+0s}W!7A1>(ZL}b{?cy49%CXbsQ6;_ssxhxDYvS8=0w=BCkxYci4GB)?KxGbPzkmf^!2;?rsaF{+AcHB#-GX#6s`h&C29 zxEZaa;_UBni^U|Q4%8vzn)O2mMznCz2IER2|0IKk(4Oq?qP-Ib`m29z!gp^)oc`h9 z)a)PI0&zR7N9r$FuX07tM1SO(qh5T8c&d{ZGos5AlA#HYWP%6Epc?*%8a67%2z3#6 z@x4kX$iCoOEBsH^K_kTyGe(6D5KXGTe^DC?GOp7TiE*Gy@;!KSfW#W%M>^<-q@uXn zZ{t-W-u~f6a3FRU$}}X{yHdXebo+jy9lVNAjMv&f89(dNN)hwETGWwwgx4aAj8O3B+Nv)C94gyXZt;7xJM7S~$IL1Rs}Ak=?#9)I@Bk7(JUFZ& z1~x;W3j^60lZ#Y!Gc~bG&h-?Mxcf{!69eLlVyB5XFp$u~A^V4LwH(+zi3-u)wKRSs1{MLC$Bd^The)n6QeR;=0~m_|w=@Q5G{9-?3LPRX$x#*ZgIf%2xgnEBVXIN3l_x51a3mG)0d)__BntqCsGcu(%pG&@Pqq zKZ^nxV-*#977-cn+NZIYDs@3!pjpb=k9Bzh=->+HT7SR_vI4{B%z(m@3m(WB*}m^R z9xDt~hP4S;Hx@~w`AeLQq+l%iKhzG#wY9a8N?qfw2Cy`{N)RkrGhqu6P?K0 ziM*U@+lW+06bemSsbQG2;x8bZm&!y^^etlq5Vci`#;fa9RlOD%vKa_-;NwYTw(v~9 zVQW@3(dxqf0BzM4*mtmuU%y~HTCt?8%tU%i~Xi9;x;!_kOnKR~&? z`%StVdq~<++e#N`tiTjx4z&8F@rCX6P?G;rTKy2SnyZ&T2)u^8fnlL0P)x`=aH090 zzdnEj5(gFr2=U;C#uNhHeWhiEN;Mi$C>Y>yPbbBGyDBhwSJR9ZpK#}qO@w6s!}$^c zEHAS7`f)3Ps6%%e5f;}yu6-59EbuhviHIh4!V@GZhqf8SntRaYmhxS`eD0x@_8gEj z^Y?;hsG(T#b5AqKUr%$_co5m0n`mddV7fI>0LfMh{2p=pjE*K6#G_miZ|M_qPDo-B zwX!D`hwbauwp`voJ_+tF;IQe=zaWga-nENB#Q`nlIu{obaA#X;hH z#oX2^dB}yIpk5vlNYJ=t2*)03>@ia^g;a5*`WPTpoJFycrYTX01_?i-&{eksdMD)> zLR2X1GpFUTXf1dQydlPIB(jgD9rot8e<^J6<=gsgG9Rrq@Utn8m&*;HKL`A_YmG=Zt88Q@z04d-bHdcv5|D19%{gbR*x4|C>0M4IqO+ zajaH|I$xcgqfI0l635t@UUz(x&c99eRkr?f4RRtAz5v9vgq6AD^^fI|Onm7KN6#{l zGf#pwPEVKxDZZF;ca#nf#5sYx&9SD1HZBuW{0zrB4iZui1Y9$Pdo;M<&PFiIy7COq zzAHCH}LW_~s)0N7W-oMZxzn}E4a#aCRB`WU+jOt8`pB~M`HE#Lc z64XvZgsTtXO4C|MNic~n_sE^*TTP!N=}hEwQ3VH>QibK92!=0O#(X)~$}fg{?la6G zr&KMmWxvsf{D?2@yPDRrGLGXtyCOp&F}a@rY)UDntct5`-;ne*-( zifMxkG4gpHCc%b$7#*@&ANzI#lghrA)7I#bH0Z??QbJ@5cJE$sg^T4H!j(`m#!BE7 zdxchJ(17hl7BD95&114K+{x`BB3xFA2YX8P*%Hf!-DMX?WL*zynv-j^DY0F&lrNEe z*9?R;$;pKGsQM#gD!pn80@PgiF~AaCQmD3^s!C7VOmbtZlWfZ%q16Tu8stm?(RV1 zC$kr}Z)4|fu`UJ37(t9h_yWj&B*poxqwED9Ke7vwIT0;lYbJ&|Q*frP02$57aII_( z(%gYibT}@n%>eGyER?Gy)7Y~8rxV`ZL7Mp)u2Vj+i$MEO(Gb3%m=sqHv--D3P^y<) zUz7EPQD&B5nnz}cL~dCzCc0sM0aDxlj3r2b%ooA4HR7N}8MG|h zL4Sw#D_kXKg-_5OH|8U9gze)i>pqJQWUoLJ(cK~3g2>jA@~_|}(Q3rdkt}>@m!f*W zIn+w4uW*r%_<-xujx0QkKs#FZbM zKHGLhs4U0fc!cYjiN{o@oFhgdkrVUHfk(f5gnQT2CD&(*W&GwC(S)0#|#d0L4~yn0-BS;fk^a|MjQHP zf{OB#>d2o7n}4E(Oj`1QSBgGtuxZ4lsr&%_EK!QxmctCgN{Qe3fE^>=9j8`BV&H(g z-+Wkdx0idgT4R#B<{Y0seqYCDw)d4>8=f#VUp{>E^jAgb&oX1QCUj-&PCMqoAr|+LMk(``mtetKHU8?)EH8x_Ez1Hb&Z|#t zvlL|xyj&B;2y<7ooW|pZr{D1r+LLh>K}w{yLtq6Se_H9(hOEf~RejjKcS*pax`uUB zx&v99Uz`a(pwfOIb<|6Q^#jr)=*g#yjs6S~)Hi`TT zG@#*(N8&ql?NX5zu3}B%OdzaJn$hPhJLRa*iYkXY0GI)?;dVf{2IdVS(JiA5332+* zNd;(Q7Yd$(Yoi3xxq@R{Vu61@1;KaO-%x{pN4!Iqswl7CjfQdbF{<=6Sx~2bMl!8c znx@ZCe#2OJBq1kPp-v2$7yG23g>4&ck~LRZlH}xZ9~tZE51u|^3%fF{476gR4S;qCOOgCk`P*ME%BAw8xznvM+6q0ia8Ls#iHOYpO^1jW7B>;i+O7dS<06kOu@Ai4b$&)B45(>d#N8@ zkiK-X#W1yxUeH!H%?s^uf?j9(??N4iJ)ihzr-K-&Z#QMRSD3~Cg{_Jh0w&mIo~_s1 zuGksAcz04T?Wj_^<1A_5tiVC*NN^twm5`B-;o4^=={?d*)ckUBi$r(=mj`%BDNcU^>H+#TS~#(iGmfUn}Y zsK1wht0WHJ`cL&<59fe&Tv=1|oM;s4j2Aa*8WFR;oINUboiN+JO2u-MK@bKHi4$~x zctOcSo!NZUMdD6wCV4&F{75R*B*N*S&q`qy@@1QV+|Jv_kTq6ta@dNU zRy+o=jSUGyTCu&7S1f#eyDPz6Iy}SPemg^P5`g4FwCs2{-Z@*+E06!iCNJ zHj9OOi&+Iovr4mFO7TAazp`C{mphj;BgPiOOJ8YucMd4{>KXe`5Y?y5?u}3u|1&yY z*I1KjAYP;4&P13OpX#u%$gtG3HP4WW^}yMGF?dABLfA1LW|Z2)-86V?NZoMr)ICd{U0psLlmP0t!!(=f2jnh} z8~n4N_Ex$h$m*WOh6T&pbo*hc1IU3s7Y>Xc9H(1O6*mxt1AX5&!7WJ}^MwvryPr3O zZN4P1sKjqT(oNkWgr4B~EP^-`Nt*2PspQU5D15G;oJeZ2+Z{zEO#GFm@?%nfpVK~tJIorM+3eH- zaJvKLvhHHJH(1{e6M|MFoJ@n$$GVa&$6c7l(XUdezh;pqF5oSus%kl-c~Sy>ODK^l z10Ow{Vm8TI1!h zdm&NjzAKW_*;5Wx02A)}E>uHrYIitewj>CS>abOXI}lt%gSgq#rg)r1_Wj9614t~0 zMW4Q%)WoJSnsUXUDMy~}lI-QY#IxA7^upKHg7P7lsv)1PDBh$WhQnbxxNG&g4sIG#mQk zOt_cXkCN7i0IjU6S*Y4rBXJh};cz+{K1MJSw~`uKLoGPA3YZUwM|Esn&=-zLggeR=VhFS@zo^ zizeWN(K^i8cN26b?O(yH3_8G(<@@ZkcBrw*N_RKkrpMe#NMt&fQ8wE|qXJ`c4~D zS})}e5N@%%O5hDml0|By7vy}~Ws5t7%#7Szup!81`d1)A$qWxt&BpzK7 zbCZ>il8GKf*-0at?49WE)I>dp(4Nh@UGc?aO-1BqqT_t_8NM+N|8T^pKkT~J3RJtJ zHnYVtgy1CY$yL4C(@7QG?P$CnFh|Wxq7njaL~IPYlCufV@XYnTDK=pVM9XKEupC46 zCirZ{7BmSKu47!C6c*z?p?)&C=$nE)MfOonAsOoVSb}~GfKUPOC?$cOhSGsEA(@ah zL_IwV``oPs4lL<4V20-x?*tymoyrw9vZ=+{n{!0Ln&h9WBBbVrDl;7FPE>!{HzxLK zRdMz2M4p`nk0Z3S58I6{6PT*P+^=@JMFMqw81pxsh97N^oK#MQO`(qs|6!HQXgyF6z(o~xV8A0<=KM^b2T(Azaf>_GqMqQSl&9`o!Ykw; zNubl_&Mv8Sor1IC!m^s+lB9=+7RoyVx}-k*Z1;I|LfihssTL}AU-Ie6FKjW-ub2c4 zJEda)HcOV)fGpb^T)Ia+4gN4q6H~N=b-iGr?Q_z}+k<;YQ+I#2d5$k5YU^}8tzl$p;(%wTLx%V-Nhf2;}oKAtrj*~Q` z^PGTXy_pu@@f^U{eBPx6k<`;tq!F?CJF3>@84hJ@BU8?r-NzOOW%*^N>eUJ{fu;l1 z1?%@Na|w2-T52PACJ8M&T8eVN9SPn~K(K`k7(6O$9-F@<=R;!W5tBmJ;$~7h{f#h} zq^(Srg?3GIt~a!`{D5Ye){xWR!R~pO+VkeRfH-kR6Nuyx_;N+S;fcR*|8^{IW1kYT z&Ubdd0P+uv@xD%@g z?+sE}`F$K2*gUIubkpA!K)M8rWIDsEa&|wIxGr$oP3>Os=N)fbN;c!Av|z1D$hG-_ ze`#0poctUQG%KccMko=IJbM|!<8EQD&S{NnA!@cXQD5hAZdz=f)n<9!`y==Dq8_{h zZup%TG0RW z9k_u$?l#X?6>f@HFtrry>uU^d8;UMDKKpz1SjNE9#`=qC7nK8K_-p47h1BPJ;LhJ6 zE50`;kqF5TxYKF{6YHq3Rb(l{pLjiXJ8L!?B!zCsWNxalmf_#>1Nv4n95KPPDaYUq zQ<)s3TAWe24N$|o49ow=aSrV($3h1jE<(>i1PDvh?b~P?7%f$hy0Fv82s~H`+DUuv z5B)aVJw^1G_4OH>_Q+6Ihk7(NgQ835^-Ffn4aSF4gT-Kq=Sj8&A#DEaPDuKSR!$g0 zM5V<3@HuUHvLZ}1sRgdbacq#CP)euR3|3Ws3yoNQ z?MJiz15Kz#Y?K&T_oh?0y~*0+)WN04$fmjXlKrE(oK;tpWzj?=wxkC~Gb@dQwxaHb z_k}w%14YC5)kJ#b)Qg90z?b1Dwzt6vi=`O=2cK&j&kK!?MbPCsjK7JFX+1LoF8X@l z4SjrRX#6DMU zJccU`Q+hs-SC^s8ZugX89kS|wkrDM<17!1=W$YO)vU`{g6@f?lLsLY=QiEsz7|P+| zKN1>rj&a&%9hj_*f3bPFV*N(K+S$C)s(gynm5+^G+Rn0UHAIfT;vIV6OVsMzEwA+06HjxfZ zc+(v`S^CDtXCq(kiyoJ8+-{dh*j1)NjYl*FNYQ$ZDWX9cOrL=NA+br)1(o^Feh#ef;?4 zji+a{kJFk|&xmTUsE>|s+(D9wK+7*;WhT>aJlW?W;Az_aiL~JK9s#t%RHKICIQVH~ z?00>;VH6K?xMbYsKV|;1GF$cihf)x8#)Nr%e%hlfq0QVPegR+pEJ)d^;WgQF2kyL# zkT%9H=iJslx(f$c3t6qD`**5|aoc}24}o7|J=ls^?6f65WgNupEZ}GAa@>g=AACgm z4dK}OlhV$d$^1-6gbaT|)pvkwYerj-pHL1&5{MBA<1y;szou!SrE&%phekmZwB(0nDh59Q*9C+(Fdf871@Q3Kd<=7rMSxpG9mf?$O9eZZ6U#2hp z)m9~wczdcP9`fyu#aH9gRZJDhwT}QB33V0)6DSd9bbxJ0(r|IxN4;f3&V2)YAZ>36 zN=YE{Q2Lz{;k0#n+{5KfPZ9g+WEVX2HDnBo%d9B}v^Mc1D%wi96jH_CXQfFM z#Y~Spi!w?LyPt3=GuS9>%#zk{>S(ijofH3j#{Tb=Ca-POIXy}G@mY=kc3h`7ZC9gn@%U@-c&JgVlqF>!|@^DH`z1N)K=$hcs->+}Q z619X^1>}iz^)Ss0A2<$;hnhCz?Cn;gtNM8&!aC=>jmN&+PLh6E{u4kG;O`M$W9tz0 z7mwiEuKdbq^^({YHj2}^_vSixt%ZGaG%VZ27QYw7v+t7TEDOpU>`25m9Q&G)Tk1%9 z#$Z>oJ+)MjkU_uJqpam=;gu5kx^|u+5&^3>hm-&;c0j=L>gh_7| z-d%olWH|}V+yyOm{#CCM7Se3S&`HdvoBLX9ic(8w)Eqf8!VOH@i@v{*W*WQ}e%%!O z4@YfWFg=8wgdg9&Ls08Xu9Rf5lj1R{hIMJ`a3EiwtfN=*8q#{a6#VEJ#}Et@oZ9V& z9!+5{_eoTWzURw;AbBp)!4C|yj9D+Tj`a~6%raT{_&_l_{UtDWUX6fSgdMrKh~c=1 zl?fi(E@!KlN8H^QbyrqAB{hcXsrQ_GzX*R*E&GMsa41=`Sxw^rJejtqt3GkUn7oEO zEr$bcEt)yx{Jyb`%t5*ry06arsn#x*z^^j*CCec^buaq zOYzzk-$AL+8_K@vzmCHg!fK%FX~i@YuN3j2pwR(t%ll6yON6EYOsuA>X8GaKBeKrK zvq*iDnuj;h7A7XU?dOvm?-8q0jH7GIE>VSpW*4tHpr$Dn;gQ`(Q?}QlpO>2a+OMK4 zpj5)eNggGv;gm|Td4}kM=qqSN00(Jgkg@Opo@iRfj`F1Skq{M*Ew`Yg^AlT)dy3mERRi0BF~O0F&%i5dS4kL!#qih5wew$s-$c6Io2J z9&-tX&uOo|XdE?Ub;3P}yiXfR{eBNo1)jMmm#Si%%!%n5Ku=5wbgQu z)-zT$078^{ytY9*$*)c_XK!GwjdI`JN%AZ92(u!1Diql2ImDDw2J)!;9=TVXn_a2J zPB#Yz{s3sZ3#W({wQ@Xr{xt1oN2f?BAr z=z8CB;uudc3CDNC{U<}mUExmjLFRuHkXrgbQ{ckXHBg$-=`Vxk|9ukTo!PtvbX?M$ z|7A%e>s>94qRuz(qCns8DiYyv(9EXI3P*cjn7f{r#4+0Ja#1uYloL2QTn2thnQqdJBFEay<728?UG+bXl%t6f$CTjkF^NnfqpyEr znZNf3u=FZ~lG#CHvjoQA{`?I>1i^R`vt1Wm&E~mn_70QT3@MBRdnHQIq=wBPGpo3+ zfTvCxpI@3c?*}CSh$WeG4YN{>Q)X8Ew5rENw8U&mvuN0#Qfy-f{A9%Vt|~E72Who!H4*fdc!N8|K+0|K z14z)dbz=F{8oY(*wEEA6j^Dgn z)K0;lQh>~BIdm|$3)f}to`z8LmF#HzEwk@vJ1NV{MLY_GLXWrCKcpnJB<4_dh zq{(4q>->S_nfY~f2B>4G>5F`A81KVT9nouZl~uTwU7V}eFymKRv(qJgda8t9G%fOY z(yHNHMP8bF2X_q0Pac0xWB)0*5Jk1;FAFxy^)*-gQnWLgYF^jjG@2qLtTOueLS)Kb zpTxS_CsCywF`7N&Zp}8n*40n;z&2zp3;Sl$ zMz8%$;(Le9NOk_t^tnd@6NifS&lsa$8MUdVUjbWMu3}!V>2A7lWr!UHbTYFtc!-;zT(Vq z^;Xjay1_cYVL>-DeBjy6d#!9Uyg z2!1U*BrxIWB@&Z})a9+H3L8h0`F_>xnRUtQDsO8)@8T>G`4#*hMSb$wo5h@%g&f*;x`upz^5!Y2ELzc**iIVT%C02ku|S2H$&axUmpC7eig)|Q z+p*I*joV(y)(=pNk@5LZQnNdOC%XP>E%MI#oT{@?pn&P8_^L;l4kYGSH#Qne3H|}D5l)P1a53F{^cL|u>oZ##E8JP1${(L59qZTo#%ECO zX-|(V=P#nsewjZ_ez@tVv;(gvp6-4zl=2|tzr-_0lyU>WmZI%D(D69bNLL(Bq0?_~ zpmk5Io|j*9KTnDL7|)@t+=kP>^C`6R057@Reb?M#xw{=&Q@AwJmBsx`VA}MZd?W^( zhnd}`v~E&TGDC6-s{f%JX-=Ih)=Dea<^6+NWsLdZ){C?C#pUFYKH!9yctgG*=j}{M zSkl|fK1qn+vO2nLQ-|Fu*T}z1TIlz9Dde+fzfm>c>B@tex z4eqceUJjJ}<(Hp^HOwjanwu@W#7ab>qe^q4zamQ+bo%a~C9{|2u^v~!k!qzK4NcZW zNgl8F#z&O&UwbtFZS@Y%&7+tT>XMRWCG~4!$_c>caN5V)62(~RmlvZf)Y%ALjz5gB zfAVK#bL^#}a~7P`%{9fXAklalDyY0hD>=9Adyq4l!YE+gPa#jl{1PS=H?NA?E+_SM zl+!R%wV`r$!bUSU9CHmf{|mZ(1=J025iycX2xf;`mT&;%tSw89Idy}D2~B%5{7he$ zEi#ZZ&^)ZIbnBtE89J{8xZS#__LdPiJ#dM@Ux+&dH~>b_@l zV)L3Pn1o0JZ`yno-nMP(j0l>qRG?8~40= zcC*f1=KJ`N9h%E%yw3h9!pZ;isdAMRPGetrO0=_YgR;KC1!r$k5f&W(8SHnJer(?S zrRrNUW2F(20~zWZRjV{zME}DZ{#Fu#b+RifV-QRRdLf5UJYX@GA(>RAOTvp{n(FjQ@N7k!8jgiB8K{{UuO=G$|8 zvWkwxK-Cti)?-^}Wq3CLLY%fOx`IuSa-0IX7d(~wikJvW=h^BZOud22?S!ps3TBV{M|gOpP&qxX%eHETw{HIc z(KtnY&l2wII{M1<09BV=%TsR0;EihUlJONU2H4Pnmvaj;Xzw_L{N-rD7 zn+aHk z%YRqTXph0zmzKDc1g~)#`pZ8!@V?XHEL`+hrN`7>mlcZ{aYaTH%wC0J#uhBNy$cSE ztj>B7V#{FPTgOAEKH$7VqtfN{sZFq(hd?B&grK4LxqBzp;(@ivaL&VIBSTWPOrX44 zSA3G{{+l0i^{*xRp2QblGNx0*!|D%SANYk&Fm@Q`4Ob| zs&aUCd5DluFANRi*OYTCC=TOaL9y=xRs`T~uOS3`+^G};HRRKuXC6w9>Y~fbkA>AwU(_|flnjMw-&)&@UM}9VsJ@jH1!sFDqY}>d@#jSZ56=%%)Jm$lcK*e3J&V9E0W1uZx7YAcTzeq}{MFFz0%8VP=GqY~BtJ}MWi5MB(y@$C;vhBL`e{ex5tUVH{&R&DN23kXNy^H}xqkZ?N zG^{q=ZnyOmY6i{${{TT846Wk%fEIvY%ClC40`CVOGQ@Cy%x=P4{=9aLB3TvYKBiU9 zkNXjL;I#%C3YQH{JokuKIw~ax0c!5eLZ7fdwqUDUOab~n^3r0}UHfB5UXQ$~KrU;y zmN3bBUOpud`C>t5Z)stCZCac5oIg=Yx$?s-L(daIYR1h?b<;A2rZQ2~zSb})See{+ z7F@Y`moG75#UmHcSh0nRFQWPuTqVnoOP*5y0D&{mhd{&#GUfDHa^WrziR+}aXvb-o zqA(*6Tk}%O4me=8OC~C1#qUg@Mq$rxX8;Vg{{Y#G_DB-$sS&?q%9{N?b|-lENaRVFwx@)tkoy+EPtHoR&&>@b-p;Dkmzixei|7 zA9&SR-CnNGRSW|(HV#vZY4>u@7yv`OIX>ik5{TAPo%|4czwa8Q6I@ zdm$+HhZt7%5tO4p1B2o@iY*JQc=H3?)6LdZK}swY^lK8qO@ked(aX0BHQu)vbYL`F zU+xnC*?YXPdI7~0P#yh71MVhYe@6tOMIIcl>QbtwJr8<@1=8hqrN%Xt;D%^(ShzluChh>)@e43YHIzm!;}^_G;v=QYBFl>yTt$ySv5SiqTv)MX z^g3BL8mVz*!=-tLZncQ+Vi45CzM6+aqRWLt5ob`S!$MugXTgYuns#w83bVKO8Bsv8 zd6tR;Nv0}}{{S)i_8Gbe!FMY-$^DR5faE*HTa|?kHKtc-QFNEt;W&ws8K#SPANYlS zr6Oq@S?A12Ym^SlRK_)><4cU)YS$J+_+8y$Cyx{GG1*p z0$fR1w1G0GE6=E+1>L}k@};p5IOYKQ6_}bsALcs;2oHuO)fD*z>?9TKM7hAUdhHmC zsb}LcZs$({q80IvoBsfCRjNbV%K9Z?f%5G6i!E7#U`+N2QUdc{h2yd*I2(3ZM**7y zT9xsW{{S@_x(s$+*xO}ccGei6t2+(mShxZM+W!D^0b0tv?Y2~{1jEf9Aqv18>ebd_ zwOL?VuSlQ`f{&hHbjCg-VG@YKH}{OX%TyZjvg29$;#I%~1NY^KvR`AgaHbrD1Ixel z9?HWyFi{?$yKx-UL~TooH8CMJjW_0L7r`ywGZOps7_no}T8uEl#u!;~V#}8nT)A;& zbgqv>sF2hpbg5Fh1|U?rm(vq@hNm3}8HA@%If9YFn1%H&K$g6uWfE%|Pk?n_ac#(PRwO5m$Jo&7p+UZViaCg^Ifo6!a7w7{4Mqva}QU|U2A6>9ny`6BZSZNn-2<)0OQ8%VxX(0Nlh~vo5b`$D&i1Ie$b!3~&C~nl{h}EJ%y2CG*U* zg%@?+1sg65xBU^#c)H#$a}({N05vtytrz`3LnU~IEf2b&wzqt}*pERA5s5)A#A2gZ zmoM5*6AipIXNNVtnJg<|F@7BIrb7+A4l#fug!xpMyii!Y^-B}#!R2TFxNhiQMr zJW7EHO-%GFw-7Ih%~6(Pg_hK7tiT)+tfYHE+y*$6yuv80v+Kzz+IY|(rceve^WMD5 zBa&n^eM=G#aa)!JDClQ!8nU1c6S)2&feUR8DaW(4s?KU~zpH|P2PZV{y+c)CB6vJ= z7=#n&IDAG#CBPbM(EH{s3w+(M%rjw@lL~y7Dn*1BXe#{TTtL!q*uOIOpep#KOzpKk z3uEBRxh6NgZd20ljY6Qp0ky3~N0N^ibsTSLPhaXVytEd;#>V*Fz`1A-#Y@OrRqZ(< z(D^K2>>iE59;0>Xwq@WV60i*B@I>hv0eoB9TOJzA#Lj~3e9Hmg z9@C;;mr!!YX>LK_m>=8+U z<~H*eLZty+>V0fS74B2E-w|$-0$rw%gBqeP>r(z6(MIFpQ5O}9abm?TT)44f^cYyN zV#SLtT)A@P%bb4{=&4YQAu2zPnd!$%%)W#-{3wEOCyrZ)!vT1jf}s{_Six-Kh|dSt zh_K-t6L{fu6`^)fv+7qTBv`i8;SMkH8aWf_U=}u(82YA?#kzFA+^BLA@LGIwK~`Fk z;Br0X;YK?#?0N1+?*$y3#Ein=H{q87Qq^mfc#IKX2Q+m<5KNd1XCf!&A}NIqD0hv< zL!d=`KS2eCR-$n@(^7=7LAcAz#;1X-%x>JP!ZJY8--Ln%g&5vpvc(St>Rc~ZTeQM) z;5`2T>`zWsue3llr1DJ+GXDU+kWi4#yYj+CIazKT7qI&C7c&w$jg=T{ziDt?u?h@< zzi{N&mv|h?=jDJBd!CYEJk7HLax>{nuq|FbE-PlgXa{>0`{HJ8)-v_lU@~E+xXw8n z>_P)HAM|m zE6q#bdqty(dYJ?1!2}jmZSYL?#ZFt4=@B!D=N`ndLWy&4f*2ojFqw&({iZ-zw$}a1 zEQz|Gn1@2e7_nlD7AUb|#fuhPxpMyinHhZu%DGdR7?lSzjZ8wVnYmK65@)B+N|n$h zB)&5%d5m2{Nm7(EYbt`1M`$@0_jtH9IkA=h0I1kfUJd-piU%ONv!8IuW(uXOpbDF_ zLeu{MuwQJV*nN<&FXdkOmW{)NKdFF7`m-p&-+A1Xpu@v-ejj;)(BStq`-u8Ptjer4 z^Qdu_S6aB)-6(8!d@vQ48r$F6Atf3J%8nP~5UH3|wR{|0yrpBO0w5tw4gvdyajM6; zVoJw`u)`?TzB~`apwhXO4sRpinJZC8cx>o>^A+=2QSMq1qc4}3+w^f9{I~Mmz=mQ@ zQ0;q08IBzDL`NH_{m0V9li8sq*jKFo0B|<2<{6ceucH3qg)xR=wFo)KsiAsn>lWFJ zBk8Nx%(*2NeWSeLf##!VvAspTT#6AM3E>wLq$6*}`(SQxC%}M|P2l@EmC~7+P~18lPNR;QfhrNq zLS_rmc$tFXoV`>N4-dQre_8V)Ad3Rn1+_iYT8le&iM211UesIm{-IIll)CXL)3~gW zaexOh`od5XztrJYaG5OpPGBYQ&uG!597{eIZ=GjRpP2wQ&_e-F=`NaJq=mq?pRR?i$xi zOl`IjtIXn+1|SpwR6w-^)T?%*?*sz?^7w@+#wxFJsoJ$$EI*1de|8%f4cS2+1-LnH z(K95f##h9yCy;KtMMbyO{b5q&n~5wT!&Uj3q>n1#@>(eZzVKyJg17bN5|}|%Ph0;0 zQMjQUft2#Hma==ZGRk=>S={qdxpkXbJFy1@66FHdXg2LT*ew>t3Id@;TvM2>#u;V8 zELgFI7+A4m3@o{Emo8knf5y5!0->2iuisao#}Xzc#xVTsw;9N*e^2weHpruG*x05BxoIFu*_2iG%a9X#GM z4@GNNd#G_v7d;F5oD;ke1H~4bF1{fs+Eft^)%lig%cq&RCAnrxVT@@AK&hGp3bc6t z0C5NoSlYACigT7M9v!}7TY;^h%AB;bHwD0j!>jY&Swej9ePM%3wgc5blg?EWAQwS` z0c!X$DORm=LM;lx;%I;~K*Uut96NvZQUN<`56@{-Fx_g?wecA`F+t_}%RzPZg&}y< zt>BGY->FEa#1AnSEL$m!d4N{P)%lijFQB5v7-5DOVPeIXE?mBk^SE?LP$gVCJsyk* z7$-d{RCg*;Y6pk~e&JZm0;P1Q1^Jg9hz|ApjTA$Jyfjr}9x$ll#nXaOl{29XhMk$A@@oZIHH&4Y*R$9I@5NHSWi+=Yl z(aX#rwnVrLFh95sw6WOn9nqGTw57yZgJS{2J>B+`@*4utl;*?kaNvo^>Dj*SU&L}kAwSwG3G4&2~#&l zz^nOTg2Riq?TKmN(Wrb>siRD_OYZoD;I}+L-6FaOhO(_1J+nFhd`*$(0cq|jpK6J5 zLHbAlEw3>g4^uQ)0C+Fl(lUf2)D&353@o^@V#Sa7s%xS`S4-%0Aqmew#0d1LhfG2l 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 BO)UTb literal 0 HcmV?d00001 diff --git a/media/projects/cats4.jpg b/media/projects/cats4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0325ce0e3b1f383c94edb2f15b04896e72050f69 GIT binary patch literal 197119 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%0AEV8T&5CJLdBjU9 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

{-I78X3o+~KVTObVb~ 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⋙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 WO~vT=_2a68@iMmF*4SM9&;QvXI=0.0.4": "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5", + "ansi-colors@^1.0.1": "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9", + "ansi-gray@^0.1.1": "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251", + "ansi-regex@^2.0.0": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df", + "ansi-regex@^3.0.0": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998", + "ansi-regex@^4.1.0": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997", + "ansi-styles@^2.2.1": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe", + "ansi-styles@^3.2.0": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d", + "ansi-styles@^3.2.1": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d", + "ansi-wrap@0.1.0": "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf", + "ansi-wrap@^0.1.0": "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf", + "anymatch@^2.0.0": "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb", + "append-buffer@^1.0.2": "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1", + "aproba@^1.0.3": "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a", + "archy@^1.0.0": "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40", + "are-we-there-yet@~1.1.2": "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21", + "arr-diff@^4.0.0": "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520", + "arr-filter@^1.1.1": "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee", + "arr-flatten@^1.0.1": "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1", + "arr-flatten@^1.1.0": "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1", + "arr-map@^2.0.0": "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4", + "arr-map@^2.0.2": "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4", + "arr-union@^3.1.0": "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4", + "array-each@^1.0.0": "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f", + "array-each@^1.0.1": "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f", + "array-find-index@^1.0.1": "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1", + "array-initial@^1.0.0": "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795", + "array-last@^1.1.1": "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336", + "array-slice@^1.0.0": "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4", + "array-sort@^1.0.0": "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a", + "array-unique@^0.3.2": "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428", + "asn1@~0.2.3": "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136", + "assert-plus@1.0.0": "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525", + "assert-plus@^1.0.0": "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525", + "assign-symbols@^1.0.0": "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367", + "async-done@^1.2.0": "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2", + "async-done@^1.2.2": "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2", + "async-each@^1.0.1": "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf", + "async-foreach@^0.1.3": "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542", + "async-settle@^1.0.0": "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b", + "asynckit@^0.4.0": "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79", + "atob@^2.1.2": "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9", + "aws-sign2@~0.7.0": "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8", + "aws4@^1.8.0": "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59", + "bach@^1.0.0": "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880", + "balanced-match@^1.0.0": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767", + "base@^0.11.1": "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f", + "bcrypt-pbkdf@^1.0.0": "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e", + "binary-extensions@^1.0.0": "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65", + "bindings@^1.5.0": "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df", + "block-stream@*": "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a", + "brace-expansion@^1.1.7": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd", + "braces@^2.3.1": "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729", + "braces@^2.3.2": "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729", + "buffer-equal@^1.0.0": "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe", + "buffer-from@^1.0.0": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef", + "cache-base@^1.0.1": "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2", + "call-bind@^1.0.0": "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.1.tgz#29aca9151f8ddcfd5b9b786898f005f425e88567", + "camelcase-keys@^2.0.0": "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7", + "camelcase@^2.0.0": "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f", + "camelcase@^3.0.0": "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a", + "camelcase@^5.0.0": "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320", + "caseless@~0.12.0": "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc", + "chalk@^1.1.1": "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98", + "chalk@^2.3.0": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424", + "chokidar@^2.0.0": "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917", + "class-utils@^0.3.5": "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463", + "cliui@^3.2.0": "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d", + "cliui@^5.0.0": "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5", + "clone-buffer@^1.0.0": "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58", + "clone-stats@^1.0.0": "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680", + "clone@^2.1.1": "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f", + "cloneable-readable@^1.0.0": "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec", + "code-point-at@^1.0.0": "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77", + "collection-map@^1.0.0": "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c", + "collection-visit@^1.0.0": "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0", + "color-convert@^1.9.0": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8", + "color-name@1.1.3": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25", + "color-support@^1.1.3": "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2", + "combined-stream@^1.0.6": "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f", + "combined-stream@~1.0.6": "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f", + "component-emitter@^1.2.1": "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0", + "concat-map@0.0.1": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b", + "concat-stream@^1.6.0": "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34", + "console-control-strings@^1.0.0": "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e", + "console-control-strings@~1.1.0": "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e", + "convert-source-map@1.X": "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442", + "convert-source-map@^1.5.0": "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442", + "copy-descriptor@^0.1.0": "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d", + "copy-props@^2.0.1": "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe", + "core-util-is@1.0.2": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7", + "core-util-is@~1.0.0": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7", + "cross-spawn@^3.0.0": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982", + "css-tree@^1.1.2": "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5", + "css@2.X": "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929", + "css@^2.2.1": "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929", + "csso@^4.0.0": "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529", + "currently-unhandled@^0.4.1": "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea", + "d@1": "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a", + "d@^1.0.1": "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a", + "dashdash@^1.12.0": "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0", + "debug-fabulous@1.X": "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e", + "debug@3.X": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a", + "debug@^2.2.0": "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f", + "debug@^2.3.3": "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f", + "decamelize@^1.1.1": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290", + "decamelize@^1.1.2": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290", + "decamelize@^1.2.0": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290", + "decode-uri-component@^0.2.0": "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545", + "default-compare@^1.0.0": "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f", + "default-resolution@^2.0.0": "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684", + "define-properties@^1.1.3": "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1", + "define-property@^0.2.5": "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116", + "define-property@^1.0.0": "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6", + "define-property@^2.0.2": "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d", + "delayed-stream@~1.0.0": "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619", + "delegates@^1.0.0": "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a", + "detect-file@^1.0.0": "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7", + "detect-newline@2.X": "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2", + "duplexify@^3.6.0": "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309", + "each-props@^1.3.0": "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333", + "ecc-jsbn@~0.1.1": "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9", + "emoji-regex@^7.0.1": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156", + "end-of-stream@^1.0.0": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0", + "end-of-stream@^1.1.0": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0", + "error-ex@^1.2.0": "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf", + "es5-ext@^0.10.35": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1", + "es5-ext@^0.10.46": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1", + "es5-ext@^0.10.50": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1", + "es5-ext@^0.10.53": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1", + "es5-ext@~0.10.14": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1", + "es5-ext@~0.10.2": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1", + "es5-ext@~0.10.46": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1", + "es6-iterator@^2.0.1": "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7", + "es6-iterator@^2.0.3": "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7", + "es6-iterator@~2.0.3": "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7", + "es6-symbol@^3.1.1": "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18", + "es6-symbol@~3.1.3": "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18", + "es6-weak-map@^2.0.1": "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53", + "es6-weak-map@^2.0.3": "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53", + "escape-string-regexp@^1.0.2": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4", + "escape-string-regexp@^1.0.5": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4", + "event-emitter@^0.3.5": "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39", + "expand-brackets@^2.1.4": "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622", + "expand-tilde@^2.0.0": "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502", + "expand-tilde@^2.0.2": "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502", + "ext@^1.1.2": "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244", + "extend-shallow@^2.0.1": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f", + "extend-shallow@^3.0.0": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8", + "extend-shallow@^3.0.2": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8", + "extend@^3.0.0": "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa", + "extend@~3.0.2": "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa", + "extglob@^2.0.4": "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543", + "extsprintf@1.3.0": "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05", + "extsprintf@^1.2.0": "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f", + "fancy-log@^1.3.2": "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7", + "fast-deep-equal@^3.1.1": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525", + "fast-json-stable-stringify@^2.0.0": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633", + "fast-levenshtein@^1.0.0": "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz#e6a754cc8f15e58987aa9cbd27af66fd6f4e5af9", + "file-uri-to-path@1.0.0": "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd", + "fill-range@^4.0.0": "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7", + "find-up@^1.0.0": "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f", + "find-up@^3.0.0": "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73", + "findup-sync@^2.0.0": "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc", + "findup-sync@^3.0.0": "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1", + "fined@^1.0.1": "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b", + "flagged-respawn@^1.0.0": "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41", + "flush-write-stream@^1.0.2": "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8", + "for-in@^1.0.1": "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80", + "for-in@^1.0.2": "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80", + "for-own@^1.0.0": "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b", + "forever-agent@~0.6.1": "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91", + "form-data@~2.3.2": "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6", + "fragment-cache@^0.2.1": "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19", + "fs-mkdirp-stream@^1.0.0": "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb", + "fs.realpath@^1.0.0": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f", + "fsevents@^1.2.7": "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38", + "fstream@^1.0.0": "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045", + "fstream@^1.0.12": "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045", + "function-bind@^1.1.1": "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d", + "gauge@~2.7.3": "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7", + "gaze@^1.0.0": "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a", + "get-caller-file@^1.0.1": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a", + "get-caller-file@^2.0.1": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e", + "get-intrinsic@^1.0.2": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49", + "get-stdin@^4.0.1": "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe", + "get-value@^2.0.3": "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28", + "get-value@^2.0.6": "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28", + "getpass@^0.1.1": "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa", + "glob-parent@^3.1.0": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae", + "glob-stream@^6.1.0": "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4", + "glob-watcher@^5.0.3": "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.5.tgz#aa6bce648332924d9a8489be41e3e5c52d4186dc", + "glob@^7.0.0": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", + "glob@^7.0.3": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", + "glob@^7.1.1": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", + "glob@^7.1.2": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", + "glob@^7.1.3": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", + "glob@~7.1.1": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", + "global-modules@^1.0.0": "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea", + "global-prefix@^1.0.1": "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe", + "globule@^1.0.0": "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4", + "glogg@^1.0.0": "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f", + "graceful-fs@4.X": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", + "graceful-fs@^4.0.0": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", + "graceful-fs@^4.1.11": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", + "graceful-fs@^4.1.2": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", + "graceful-fs@^4.1.6": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", + "gulp-cli@^2.2.0": "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f", + "gulp-csso@^4.0.1": "https://registry.yarnpkg.com/gulp-csso/-/gulp-csso-4.0.1.tgz#c2ac2b5f7138ed04073ed8f7cf89c12f716580d0", + "gulp-sass@^4.1.0": "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-4.1.0.tgz#486d7443c32d42bf31a6b1573ebbdaa361de7427", + "gulp-sourcemaps@^2.6.5": "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz#a3f002d87346d2c0f3aec36af7eb873f23de8ae6", + "gulp@^4.0.2": "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa", + "gulplog@^1.0.0": "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5", + "har-schema@^2.0.0": "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92", + "har-validator@~5.1.3": "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd", + "has-ansi@^2.0.0": "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91", + "has-flag@^3.0.0": "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd", + "has-symbols@^1.0.1": "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8", + "has-unicode@^2.0.0": "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9", + "has-value@^0.3.1": "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f", + "has-value@^1.0.0": "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177", + "has-values@^0.1.4": "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771", + "has-values@^1.0.0": "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f", + "has@^1.0.3": "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796", + "homedir-polyfill@^1.0.1": "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8", + "hosted-git-info@^2.1.4": "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488", + "http-signature@~1.2.0": "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1", + "in-publish@^2.0.0": "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c", + "indent-string@^2.1.0": "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80", + "inflight@^1.0.4": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9", + "inherits@2": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", + "inherits@^2.0.1": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", + "inherits@^2.0.3": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", + "inherits@~2.0.0": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", + "inherits@~2.0.3": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", + "ini@^1.3.4": "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c", + "interpret@^1.4.0": "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e", + "invert-kv@^1.0.0": "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6", + "is-absolute@^1.0.0": "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576", + "is-accessor-descriptor@^0.1.6": "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6", + "is-accessor-descriptor@^1.0.0": "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656", + "is-arrayish@^0.2.1": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d", + "is-binary-path@^1.0.0": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898", + "is-buffer@^1.1.5": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be", + "is-core-module@^2.1.0": "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a", + "is-data-descriptor@^0.1.4": "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56", + "is-data-descriptor@^1.0.0": "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7", + "is-descriptor@^0.1.0": "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca", + "is-descriptor@^1.0.0": "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec", + "is-descriptor@^1.0.2": "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec", + "is-extendable@^0.1.0": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89", + "is-extendable@^0.1.1": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89", + "is-extendable@^1.0.1": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4", + "is-extglob@^2.1.0": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2", + "is-extglob@^2.1.1": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2", + "is-finite@^1.0.0": "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3", + "is-fullwidth-code-point@^1.0.0": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb", + "is-fullwidth-code-point@^2.0.0": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f", + "is-glob@^3.1.0": "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a", + "is-glob@^4.0.0": "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc", + "is-negated-glob@^1.0.0": "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2", + "is-number@^3.0.0": "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195", + "is-number@^4.0.0": "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff", + "is-plain-object@^2.0.1": "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677", + "is-plain-object@^2.0.3": "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677", + "is-plain-object@^2.0.4": "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677", + "is-promise@^2.2.2": "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1", + "is-relative@^1.0.0": "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d", + "is-typedarray@~1.0.0": "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a", + "is-unc-path@^1.0.0": "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d", + "is-utf8@^0.2.0": "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72", + "is-utf8@^0.2.1": "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72", + "is-valid-glob@^1.0.0": "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa", + "is-windows@^1.0.1": "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d", + "is-windows@^1.0.2": "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d", + "isarray@1.0.0": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11", + "isarray@~1.0.0": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11", + "isexe@^2.0.0": "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10", + "isobject@^2.0.0": "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89", + "isobject@^3.0.0": "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df", + "isobject@^3.0.1": "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df", + "isstream@~0.1.2": "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a", + "js-base64@^2.1.8": "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4", + "jsbn@~0.1.0": "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513", + "json-schema-traverse@^0.4.1": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660", + "json-schema@0.2.3": "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13", + "json-stable-stringify-without-jsonify@^1.0.1": "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651", + "json-stringify-safe@~5.0.1": "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb", + "jsprim@^1.2.2": "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2", + "just-debounce@^1.0.0": "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea", + "kind-of@^3.0.2": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64", + "kind-of@^3.0.3": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64", + "kind-of@^3.2.0": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64", + "kind-of@^4.0.0": "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57", + "kind-of@^5.0.0": "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d", + "kind-of@^5.0.2": "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d", + "kind-of@^6.0.0": "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd", + "kind-of@^6.0.2": "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd", + "last-run@^1.1.0": "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b", + "lazystream@^1.0.0": "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4", + "lcid@^1.0.0": "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835", + "lead@^1.0.0": "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42", + "liftoff@^3.1.0": "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3", + "load-json-file@^1.0.0": "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0", + "locate-path@^3.0.0": "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e", + "lodash@^4.0.0": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52", + "lodash@^4.17.11": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52", + "lodash@^4.17.15": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52", + "lodash@~4.17.10": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52", + "loud-rejection@^1.0.0": "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f", + "lru-cache@^4.0.1": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd", + "lru-queue@^0.1.0": "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3", + "make-iterator@^1.0.0": "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6", + "map-cache@^0.2.0": "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf", + "map-cache@^0.2.2": "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf", + "map-obj@^1.0.0": "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d", + "map-obj@^1.0.1": "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d", + "map-visit@^1.0.0": "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f", + "matchdep@^2.0.0": "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e", + "mdn-data@2.0.14": "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50", + "memoizee@0.4.X": "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72", + "meow@^3.7.0": "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb", + "merge-stream@^2.0.0": "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60", + "micromatch@^3.0.4": "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23", + "micromatch@^3.1.10": "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23", + "micromatch@^3.1.4": "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23", + "mime-db@1.45.0": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea", + "mime-types@^2.1.12": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd", + "mime-types@~2.1.19": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd", + "minimatch@^3.0.4": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083", + "minimatch@~3.0.2": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083", + "minimist@^1.1.3": "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602", + "minimist@^1.2.5": "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602", + "mixin-deep@^1.2.0": "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566", + "mkdirp@>=0.5 0": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def", + "mkdirp@^0.5.0": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def", + "mkdirp@^0.5.1": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def", + "ms@2.0.0": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8", + "ms@^2.1.1": "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2", + "mute-stdout@^1.0.0": "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331", + "nan@^2.12.1": "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19", + "nan@^2.13.2": "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19", + "nanomatch@^1.2.9": "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119", + "next-tick@1": "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb", + "next-tick@^1.1.0": "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb", + "next-tick@~1.0.0": "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c", + "node-gyp@^3.8.0": "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c", + "node-sass@^4.8.3": "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5", + "nopt@2 || 3": "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9", + "normalize-package-data@^2.3.2": "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8", + "normalize-package-data@^2.3.4": "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8", + "normalize-path@^2.0.1": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9", + "normalize-path@^2.1.1": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9", + "normalize-path@^3.0.0": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65", + "now-and-later@^2.0.0": "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c", + "npmlog@0 || 1 || 2 || 3 || 4": "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b", + "npmlog@^4.0.0": "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b", + "number-is-nan@^1.0.0": "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d", + "oauth-sign@~0.9.0": "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455", + "object-assign@4.X": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863", + "object-assign@^4.0.1": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863", + "object-assign@^4.1.0": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863", + "object-copy@^0.1.0": "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c", + "object-keys@^1.0.12": "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e", + "object-keys@^1.1.1": "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e", + "object-visit@^1.0.0": "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb", + "object.assign@^4.0.4": "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940", + "object.assign@^4.1.0": "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940", + "object.defaults@^1.0.0": "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf", + "object.defaults@^1.1.0": "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf", + "object.map@^1.0.0": "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37", + "object.pick@^1.2.0": "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747", + "object.pick@^1.3.0": "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747", + "object.reduce@^1.0.0": "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad", + "once@^1.3.0": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "once@^1.3.1": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "once@^1.3.2": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "once@^1.4.0": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "ordered-read-streams@^1.0.0": "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e", + "os-homedir@^1.0.0": "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3", + "os-locale@^1.4.0": "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9", + "os-tmpdir@^1.0.0": "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274", + "osenv@0": "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410", + "p-limit@^2.0.0": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1", + "p-locate@^3.0.0": "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4", + "p-try@^2.0.0": "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6", + "parse-filepath@^1.0.1": "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891", + "parse-json@^2.2.0": "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9", + "parse-node-version@^1.0.0": "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b", + "parse-passwd@^1.0.0": "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6", + "pascalcase@^0.1.1": "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14", + "path-dirname@^1.0.0": "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0", + "path-exists@^2.0.0": "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b", + "path-exists@^3.0.0": "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515", + "path-is-absolute@^1.0.0": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", + "path-parse@^1.0.6": "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c", + "path-root-regex@^0.1.0": "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d", + "path-root@^0.1.1": "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7", + "path-type@^1.0.0": "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441", + "performance-now@^2.1.0": "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b", + "pify@^2.0.0": "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c", + "pinkie-promise@^2.0.0": "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa", + "pinkie@^2.0.0": "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870", + "plugin-error@^1.0.0": "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c", + "plugin-error@^1.0.1": "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c", + "posix-character-classes@^0.1.0": "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab", + "pretty-hrtime@^1.0.0": "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1", + "process-nextick-args@^2.0.0": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2", + "process-nextick-args@~2.0.0": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2", + "pseudomap@^1.0.2": "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3", + "psl@^1.1.28": "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24", + "pump@^2.0.0": "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909", + "pumpify@^1.3.5": "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce", + "punycode@^2.1.0": "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec", + "punycode@^2.1.1": "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec", + "qs@~6.5.2": "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36", + "read-pkg-up@^1.0.1": "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02", + "read-pkg@^1.0.0": "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28", + "readable-stream@3": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "readable-stream@^2.0.0": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readable-stream@^2.0.1": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readable-stream@^2.0.2": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readable-stream@^2.0.5": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readable-stream@^2.0.6": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readable-stream@^2.1.5": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readable-stream@^2.2.2": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readable-stream@^2.3.3": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readable-stream@^2.3.5": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readable-stream@^2.3.6": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readable-stream@~2.3.6": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "readdirp@^2.2.1": "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525", + "rechoir@^0.6.2": "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384", + "redent@^1.0.0": "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde", + "regex-not@^1.0.0": "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c", + "regex-not@^1.0.2": "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c", + "remove-bom-buffer@^3.0.0": "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53", + "remove-bom-stream@^1.2.0": "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523", + "remove-trailing-separator@^1.0.1": "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef", + "remove-trailing-separator@^1.1.0": "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef", + "repeat-element@^1.1.2": "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce", + "repeat-string@^1.6.1": "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637", + "repeating@^2.0.0": "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda", + "replace-ext@^1.0.0": "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a", + "replace-homedir@^1.0.0": "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c", + "request@^2.87.0": "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3", + "request@^2.88.0": "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3", + "require-directory@^2.1.1": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42", + "require-main-filename@^1.0.1": "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1", + "require-main-filename@^2.0.0": "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b", + "resolve-dir@^1.0.0": "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43", + "resolve-dir@^1.0.1": "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43", + "resolve-options@^1.1.0": "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131", + "resolve-url@^0.2.1": "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a", + "resolve@^1.1.6": "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c", + "resolve@^1.1.7": "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c", + "resolve@^1.10.0": "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c", + "resolve@^1.4.0": "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c", + "ret@~0.1.10": "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc", + "rimraf@2": "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec", + "safe-buffer@^5.0.1": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "safe-buffer@^5.1.0": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "safe-buffer@^5.1.2": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "safe-buffer@~5.1.0": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d", + "safe-buffer@~5.1.1": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d", + "safe-buffer@~5.2.0": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "safe-regex@^1.1.0": "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e", + "safer-buffer@^2.0.2": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a", + "safer-buffer@^2.1.0": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a", + "safer-buffer@~2.1.0": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a", + "sass-graph@2.2.5": "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8", + "scss-tokenizer@^0.2.3": "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1", + "semver-greatest-satisfied-range@^1.1.0": "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b", + "semver@2 || 3 || 4 || 5": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7", + "semver@~5.3.0": "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f", + "set-blocking@^2.0.0": "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7", + "set-blocking@~2.0.0": "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7", + "set-value@^2.0.0": "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b", + "set-value@^2.0.1": "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b", + "signal-exit@^3.0.0": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c", + "snapdragon-node@^2.0.1": "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b", + "snapdragon-util@^3.0.1": "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2", + "snapdragon@^0.8.1": "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d", + "source-map-resolve@^0.5.0": "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a", + "source-map-resolve@^0.5.2": "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a", + "source-map-url@^0.4.0": "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3", + "source-map@^0.4.2": "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b", + "source-map@^0.5.1": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc", + "source-map@^0.5.6": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc", + "source-map@^0.6.0": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263", + "source-map@^0.6.1": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263", + "source-map@~0.6.0": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263", + "sparkles@^1.0.0": "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c", + "spdx-correct@^3.0.0": "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9", + "spdx-exceptions@^2.1.0": "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d", + "spdx-expression-parse@^3.0.0": "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679", + "spdx-license-ids@^3.0.0": "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65", + "split-string@^3.0.1": "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2", + "split-string@^3.0.2": "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2", + "sshpk@^1.7.0": "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877", + "stack-trace@0.0.10": "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0", + "static-extend@^0.1.1": "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6", + "stdout-stream@^1.4.0": "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de", + "stream-exhaust@^1.0.1": "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d", + "stream-shift@^1.0.0": "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d", + "string-width@^1.0.1": "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3", + "string-width@^1.0.2": "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3", + "string-width@^1.0.2 || 2": "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e", + "string-width@^3.0.0": "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961", + "string-width@^3.1.0": "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961", + "string_decoder@^1.1.1": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "string_decoder@~1.1.1": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "strip-ansi@^3.0.0": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", + "strip-ansi@^3.0.1": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", + "strip-ansi@^4.0.0": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f", + "strip-ansi@^5.0.0": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae", + "strip-ansi@^5.1.0": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae", + "strip-ansi@^5.2.0": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae", + "strip-bom-string@1.X": "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92", + "strip-bom@^2.0.0": "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e", + "strip-indent@^1.0.1": "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2", + "supports-color@^2.0.0": "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7", + "supports-color@^5.3.0": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f", + "sver-compat@^1.5.0": "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8", + "tar@^2.0.0": "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40", + "through2-filter@^3.0.0": "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254", + "through2@2.X": "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd", + "through2@^2.0.0": "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd", + "through2@^2.0.3": "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd", + "through2@^4.0.2": "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764", + "through2@~2.0.0": "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd", + "time-stamp@^1.0.0": "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3", + "timers-ext@^0.1.7": "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6", + "to-absolute-glob@^2.0.0": "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b", + "to-object-path@^0.3.0": "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af", + "to-regex-range@^2.1.0": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38", + "to-regex@^3.0.1": "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce", + "to-regex@^3.0.2": "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce", + "to-through@^2.0.0": "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6", + "tough-cookie@~2.5.0": "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2", + "trim-newlines@^1.0.0": "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613", + "true-case-path@^1.0.2": "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d", + "tunnel-agent@^0.6.0": "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd", + "tweetnacl@^0.14.3": "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64", + "tweetnacl@~0.14.0": "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64", + "type@^1.0.1": "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0", + "type@^2.0.0": "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f", + "typedarray@^0.0.6": "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777", + "unc-path-regex@^0.1.2": "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa", + "undertaker-registry@^1.0.0": "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50", + "undertaker@^1.2.1": "https://registry.yarnpkg.com/undertaker/-/undertaker-1.3.0.tgz#363a6e541f27954d5791d6fa3c1d321666f86d18", + "union-value@^1.0.0": "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847", + "unique-stream@^2.0.2": "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac", + "unset-value@^1.0.0": "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559", + "upath@^1.1.1": "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894", + "uri-js@^4.2.2": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e", + "urix@^0.1.0": "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72", + "use@^3.1.0": "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f", + "util-deprecate@^1.0.1": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "util-deprecate@~1.0.1": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "uuid@^3.3.2": "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee", + "v8flags@^3.2.0": "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656", + "validate-npm-package-license@^3.0.1": "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a", + "value-or-function@^3.0.0": "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813", + "verror@1.10.0": "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400", + "vinyl-fs@^3.0.0": "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7", + "vinyl-sourcemap@^1.1.0": "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16", + "vinyl-sourcemaps-apply@^0.2.0": "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705", + "vinyl-sourcemaps-apply@^0.2.1": "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705", + "vinyl@^2.0.0": "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974", + "which-module@^1.0.0": "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f", + "which-module@^2.0.0": "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a", + "which@1": "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a", + "which@^1.2.14": "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a", + "which@^1.2.9": "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a", + "wide-align@^1.1.0": "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457", + "wrap-ansi@^2.0.0": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85", + "wrap-ansi@^5.1.0": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09", + "wrappy@1": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "xtend@~4.0.0": "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54", + "xtend@~4.0.1": "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54", + "y18n@^3.2.1": "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696", + "y18n@^4.0.0": "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4", + "yallist@^2.1.2": "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52", + "yargs-parser@5.0.0-security.0": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz#4ff7271d25f90ac15643b86076a2ab499ec9ee24", + "yargs-parser@^13.1.2": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38", + "yargs@^13.3.2": "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd", + "yargs@^7.1.0": "https://registry.yarnpkg.com/yargs/-/yargs-7.1.1.tgz#67f0ef52e228d4ee0d6311acede8850f53464df6" + }, + "files": [], + "artifacts": { + "node-sass@4.14.1": [ + "vendor", + "vendor/linux-x64-72", + "vendor/linux-x64-72/binding.node" + ] + } +} \ No newline at end of file diff --git a/node_modules/@gulp-sourcemaps/identity-map/LICENSE b/node_modules/@gulp-sourcemaps/identity-map/LICENSE new file mode 100644 index 00000000..bda81ceb --- /dev/null +++ b/node_modules/@gulp-sourcemaps/identity-map/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@gulp-sourcemaps/identity-map/README.md b/node_modules/@gulp-sourcemaps/identity-map/README.md new file mode 100644 index 00000000..2aa3dd17 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/identity-map/README.md @@ -0,0 +1,40 @@ +# @gulp-sourcemaps/identity-map + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] + +Gulp plugin for generating an identity sourcemap for a file. + +## Example + +```js +var identityMap = require('@gulp-sourcemaps/identity-map'); + +gulp.src(...) + .pipe(sourcemaps.init()) + .pipe(identityMap()) // .js and .css files will get a generated sourcemap + .pipe(sourcemaps.write()) + .pipe(gulp.dest(...)) +``` + +## API + +### `identityMap()` + +Returns an `objectMode` Transform stream that processes each file with a `.sourceMap` property and buffered contents. A sourcemap is generated and attached for each `.js` and `.css` file. + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/@gulp-sourcemaps/identity-map.svg +[npm-url]: https://npmjs.org/package/@gulp-sourcemaps/identity-map +[npm-image]: http://img.shields.io/npm/v/@gulp-sourcemaps/identity-map.svg + +[travis-url]: https://travis-ci.org/gulp-sourcemaps/identity-map +[travis-image]: http://img.shields.io/travis/gulp-sourcemaps/identity-map.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/phated/identity-map +[appveyor-image]: https://img.shields.io/appveyor/ci/phated/identity-map.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulp-sourcemaps/identity-map +[coveralls-image]: http://img.shields.io/coveralls/gulp-sourcemaps/identity-map.svg diff --git a/node_modules/@gulp-sourcemaps/identity-map/index.js b/node_modules/@gulp-sourcemaps/identity-map/index.js new file mode 100644 index 00000000..c74d8481 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/identity-map/index.js @@ -0,0 +1,35 @@ +'use strict'; + +var through = require('through2'); +var normalizePath = require('normalize-path'); + +var generate = require('./lib/generate'); + +function identityMap() { + + function transform(file, _, cb) { + if (!file.sourceMap || !file.isBuffer()) { + return cb(null, file); + } + + var sourcePath = normalizePath(file.relative); + var contents = file.contents.toString(); + + switch (file.extname) { + case '.js': { + file.sourceMap = generate.js(sourcePath, contents); + break; + } + case '.css': { + file.sourceMap = generate.css(sourcePath, contents); + break; + } + } + + cb(null, file); + } + + return through.obj(transform); +} + +module.exports = identityMap; diff --git a/node_modules/@gulp-sourcemaps/identity-map/node_modules/.bin/acorn b/node_modules/@gulp-sourcemaps/identity-map/node_modules/.bin/acorn new file mode 120000 index 00000000..dd1b8a92 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/identity-map/node_modules/.bin/acorn @@ -0,0 +1 @@ +../../../../acorn/bin/acorn \ No newline at end of file diff --git a/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/LICENSE.md b/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/LICENSE.md new file mode 100644 index 00000000..a2429b63 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License (MIT) + +**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/README.md b/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/README.md new file mode 100644 index 00000000..b5e44c7b --- /dev/null +++ b/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/README.md @@ -0,0 +1,134 @@ +# through2 + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node streams.Transform (Streams2/3) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +Note: As 2.x.x this module starts using **Streams3** instead of Stream2. To continue using a Streams2 version use `npm install through2@0` to fetch the latest version of 0.x.x. More information about Streams2 vs Streams3 and recommendations see the article **[Why I don't use Node's core 'stream' module](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html)**. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (var i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) + .on('finish', () => doSomethingSpecial()) +``` + +Or object streams: + +```js +var all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + var data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', (data) => { + all.push(data) + }) + .on('end', () => { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## API + +through2([ options, ] [ transformFunction ] [, flushFunction ]) + +Consult the **[stream.Transform](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + (chunk, enc, cb) => { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + ) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + (chunk, enc, cb) => cb(null, chunk), // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +through2.ctor([ options, ] transformFunction[, flushFunction ]) + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +var FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit == "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +var converter = new FToC() +// Or: +var converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +var converter = FToC({objectMode: true}) +``` + +## See Also + + - [through2-map](https://github.com/brycebaril/through2-map) - Array.prototype.map analog for streams. + - [through2-filter](https://github.com/brycebaril/through2-filter) - Array.prototype.filter analog for streams. + - [through2-reduce](https://github.com/brycebaril/through2-reduce) - Array.prototype.reduce analog for streams. + - [through2-spy](https://github.com/brycebaril/through2-spy) - Wrapper for simple stream.PassThrough spies. + - the [mississippi stream utility collection](https://github.com/maxogden/mississippi) includes `through2` as well as many more useful stream modules similar to this one + +## License + +**through2** is Copyright (c) Rod Vagg [@rvagg](https://twitter.com/rvagg) and additional contributors and licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/package.json b/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/package.json new file mode 100644 index 00000000..15960b63 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/package.json @@ -0,0 +1,33 @@ +{ + "name": "through2", + "version": "2.0.5", + "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise", + "main": "through2.js", + "scripts": { + "test": "node test/test.js | faucet" + }, + "repository": { + "type": "git", + "url": "https://github.com/rvagg/through2.git" + }, + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "author": "Rod Vagg (https://github.com/rvagg)", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "devDependencies": { + "bl": "~2.0.1", + "faucet": "0.0.1", + "nyc": "~13.1.0", + "safe-buffer": "~5.1.2", + "stream-spigot": "~3.0.6", + "tape": "~4.9.1" + } +} diff --git a/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/through2.js b/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/through2.js new file mode 100644 index 00000000..6baa6a1e --- /dev/null +++ b/node_modules/@gulp-sourcemaps/identity-map/node_modules/through2/through2.js @@ -0,0 +1,96 @@ +var Transform = require('readable-stream').Transform + , inherits = require('util').inherits + , xtend = require('xtend') + +function DestroyableTransform(opts) { + Transform.call(this, opts) + this._destroyed = false +} + +inherits(DestroyableTransform, Transform) + +DestroyableTransform.prototype.destroy = function(err) { + if (this._destroyed) return + this._destroyed = true + + var self = this + process.nextTick(function() { + if (err) + self.emit('error', err) + self.emit('close') + }) +} + +// a noop _transform function +function noop (chunk, enc, callback) { + callback(null, chunk) +} + + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return function (options, transform, flush) { + if (typeof options == 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform != 'function') + transform = noop + + if (typeof flush != 'function') + flush = null + + return construct(options, transform, flush) + } +} + + +// main export, just make me a transform stream! +module.exports = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(options) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) + + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +module.exports.ctor = through2(function (options, transform, flush) { + function Through2 (override) { + if (!(this instanceof Through2)) + return new Through2(override) + + this.options = xtend(options, override) + + DestroyableTransform.call(this, this.options) + } + + inherits(Through2, DestroyableTransform) + + Through2.prototype._transform = transform + + if (flush) + Through2.prototype._flush = flush + + return Through2 +}) + + +module.exports.obj = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) diff --git a/node_modules/@gulp-sourcemaps/identity-map/package.json b/node_modules/@gulp-sourcemaps/identity-map/package.json new file mode 100644 index 00000000..ccf10b64 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/identity-map/package.json @@ -0,0 +1,52 @@ +{ + "name": "@gulp-sourcemaps/identity-map", + "version": "1.0.2", + "description": "Gulp plugin for generating an identity sourcemap for a file.", + "author": "Gulp-sourcemaps Team", + "contributors": [ + "Blaine Bublitz " + ], + "repository": "gulp-sourcemaps/identity-map", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js", + "lib" + ], + "scripts": { + "lint": "eslint . && jscs index.js test/index.js lib/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "acorn": "^5.0.3", + "css": "^2.2.1", + "normalize-path": "^2.1.1", + "source-map": "^0.6.0", + "through2": "^2.0.3" + }, + "devDependencies": { + "eslint": "^1.7.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.19.0", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "mississippi": "^1.3.0", + "mocha": "^2.4.5", + "vinyl": "^2.0.1" + }, + "keywords": [ + "sourcemap", + "identity", + "generate", + "stream" + ] +} diff --git a/node_modules/@gulp-sourcemaps/map-sources/LICENSE b/node_modules/@gulp-sourcemaps/map-sources/LICENSE new file mode 100644 index 00000000..bda81ceb --- /dev/null +++ b/node_modules/@gulp-sourcemaps/map-sources/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@gulp-sourcemaps/map-sources/README.md b/node_modules/@gulp-sourcemaps/map-sources/README.md new file mode 100644 index 00000000..01a755a6 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/map-sources/README.md @@ -0,0 +1,52 @@ +# @gulp-sourcemaps/map-sources + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] + +Gulp plugin for mapping sources of a sourcemap. + +## Example + +```js +var mapSources = require('@gulp-sourcemaps/map-sources'); + +gulp.src(...) + .pipe(sourcemaps.init()) + .pipe(mapSources(function(sourcePath, file) { + return '../' + sourcePath; + })) + .pipe(sourcemaps.write()) + .pipe(gulp.dest(...)) +``` + +## API + +### `mapSources(mapFn)` + +Takes a map function as the only argument. Returns an `objectMode` Transform stream. + +#### `mapFn(sourcePath, file)` + +The map function is called once per value of the `sources` array of a `sourceMap` attached to each [`Vinyl`][vinyl-url] object passed through the stream. The map function is called with the `sourcePath` string from the `sources` array and the `file` object it originated from. The return value replaces the original value in the array. + +If a `Vinyl` object doesn't have a `sourceMap` or `sourceMap.sources` property, the file is passed through the stream without having the `mapFn` called. + +All `sources` are normalized to use `/` instead of `\\` as path separators. + +## License + +MIT + +[vinyl-url]: https://github.com/gulpjs/vinyl + +[downloads-image]: http://img.shields.io/npm/dm/@gulp-sourcemaps/map-sources.svg +[npm-url]: https://npmjs.org/package/@gulp-sourcemaps/map-sources +[npm-image]: http://img.shields.io/npm/v/@gulp-sourcemaps/map-sources.svg + +[travis-url]: https://travis-ci.org/gulp-sourcemaps/map-sources +[travis-image]: http://img.shields.io/travis/gulp-sourcemaps/map-sources.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/phated/map-sources +[appveyor-image]: https://img.shields.io/appveyor/ci/phated/map-sources.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulp-sourcemaps/map-sources +[coveralls-image]: http://img.shields.io/coveralls/gulp-sourcemaps/map-sources.svg diff --git a/node_modules/@gulp-sourcemaps/map-sources/index.js b/node_modules/@gulp-sourcemaps/map-sources/index.js new file mode 100644 index 00000000..65d85f71 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/map-sources/index.js @@ -0,0 +1,30 @@ +'use strict'; + +var through = require('through2'); +var normalize = require('normalize-path'); + +function mapSources(mapFn) { + + function transform(file, _, cb) { + if (!file.sourceMap || !file.sourceMap.sources) { + return cb(null, file); + } + + function mapper(sourcePath) { + var result = sourcePath; + if (typeof mapFn === 'function') { + result = mapFn(sourcePath, file); + } + + return normalize(result); + } + + file.sourceMap.sources = file.sourceMap.sources.map(mapper); + + cb(null, file); + } + + return through.obj(transform); +} + +module.exports = mapSources; diff --git a/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/LICENSE.md b/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/LICENSE.md new file mode 100644 index 00000000..a2429b63 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License (MIT) + +**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/README.md b/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/README.md new file mode 100644 index 00000000..b5e44c7b --- /dev/null +++ b/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/README.md @@ -0,0 +1,134 @@ +# through2 + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node streams.Transform (Streams2/3) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +Note: As 2.x.x this module starts using **Streams3** instead of Stream2. To continue using a Streams2 version use `npm install through2@0` to fetch the latest version of 0.x.x. More information about Streams2 vs Streams3 and recommendations see the article **[Why I don't use Node's core 'stream' module](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html)**. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (var i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) + .on('finish', () => doSomethingSpecial()) +``` + +Or object streams: + +```js +var all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + var data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', (data) => { + all.push(data) + }) + .on('end', () => { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## API + +through2([ options, ] [ transformFunction ] [, flushFunction ]) + +Consult the **[stream.Transform](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + (chunk, enc, cb) => { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + ) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + (chunk, enc, cb) => cb(null, chunk), // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +through2.ctor([ options, ] transformFunction[, flushFunction ]) + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +var FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit == "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +var converter = new FToC() +// Or: +var converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +var converter = FToC({objectMode: true}) +``` + +## See Also + + - [through2-map](https://github.com/brycebaril/through2-map) - Array.prototype.map analog for streams. + - [through2-filter](https://github.com/brycebaril/through2-filter) - Array.prototype.filter analog for streams. + - [through2-reduce](https://github.com/brycebaril/through2-reduce) - Array.prototype.reduce analog for streams. + - [through2-spy](https://github.com/brycebaril/through2-spy) - Wrapper for simple stream.PassThrough spies. + - the [mississippi stream utility collection](https://github.com/maxogden/mississippi) includes `through2` as well as many more useful stream modules similar to this one + +## License + +**through2** is Copyright (c) Rod Vagg [@rvagg](https://twitter.com/rvagg) and additional contributors and licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/package.json b/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/package.json new file mode 100644 index 00000000..15960b63 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/package.json @@ -0,0 +1,33 @@ +{ + "name": "through2", + "version": "2.0.5", + "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise", + "main": "through2.js", + "scripts": { + "test": "node test/test.js | faucet" + }, + "repository": { + "type": "git", + "url": "https://github.com/rvagg/through2.git" + }, + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "author": "Rod Vagg (https://github.com/rvagg)", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "devDependencies": { + "bl": "~2.0.1", + "faucet": "0.0.1", + "nyc": "~13.1.0", + "safe-buffer": "~5.1.2", + "stream-spigot": "~3.0.6", + "tape": "~4.9.1" + } +} diff --git a/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/through2.js b/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/through2.js new file mode 100644 index 00000000..6baa6a1e --- /dev/null +++ b/node_modules/@gulp-sourcemaps/map-sources/node_modules/through2/through2.js @@ -0,0 +1,96 @@ +var Transform = require('readable-stream').Transform + , inherits = require('util').inherits + , xtend = require('xtend') + +function DestroyableTransform(opts) { + Transform.call(this, opts) + this._destroyed = false +} + +inherits(DestroyableTransform, Transform) + +DestroyableTransform.prototype.destroy = function(err) { + if (this._destroyed) return + this._destroyed = true + + var self = this + process.nextTick(function() { + if (err) + self.emit('error', err) + self.emit('close') + }) +} + +// a noop _transform function +function noop (chunk, enc, callback) { + callback(null, chunk) +} + + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return function (options, transform, flush) { + if (typeof options == 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform != 'function') + transform = noop + + if (typeof flush != 'function') + flush = null + + return construct(options, transform, flush) + } +} + + +// main export, just make me a transform stream! +module.exports = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(options) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) + + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +module.exports.ctor = through2(function (options, transform, flush) { + function Through2 (override) { + if (!(this instanceof Through2)) + return new Through2(override) + + this.options = xtend(options, override) + + DestroyableTransform.call(this, this.options) + } + + inherits(Through2, DestroyableTransform) + + Through2.prototype._transform = transform + + if (flush) + Through2.prototype._flush = flush + + return Through2 +}) + + +module.exports.obj = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) diff --git a/node_modules/@gulp-sourcemaps/map-sources/package.json b/node_modules/@gulp-sourcemaps/map-sources/package.json new file mode 100644 index 00000000..0e339594 --- /dev/null +++ b/node_modules/@gulp-sourcemaps/map-sources/package.json @@ -0,0 +1,47 @@ +{ + "name": "@gulp-sourcemaps/map-sources", + "version": "1.0.0", + "description": "Gulp plugin for mapping sources of a sourcemap.", + "author": "Gulp-sourcemaps Team", + "contributors": [ + "Blaine Bublitz " + ], + "repository": "gulp-sourcemaps/map-sources", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint . && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + }, + "devDependencies": { + "eslint": "^1.7.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.19.0", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "mississippi": "^1.3.0", + "mocha": "^2.4.5", + "vinyl": "^2.0.1" + }, + "keywords": [ + "sourcemap", + "sources", + "stream" + ] +} diff --git a/node_modules/@types/jquery/JQuery.d.ts b/node_modules/@types/jquery/JQuery.d.ts new file mode 100644 index 00000000..f6b1d7e9 --- /dev/null +++ b/node_modules/@types/jquery/JQuery.d.ts @@ -0,0 +1,13022 @@ +// tslint:disable:jsdoc-format +// tslint:disable:max-line-length +// tslint:disable:no-irregular-whitespace + +interface JQuery extends Iterable { + /** + * A string containing the jQuery version number. + * @see \`{@link https://api.jquery.com/jquery-2/#jquery1 }\` + * @since 1.0 + * @example ​ ````Determine if an object is a jQuery object +```javascript +var a = { what: "A regular JS object" }, + b = $( "body" ); +​ +if ( a.jquery ) { // Falsy, since it's undefined + alert( "a is a jQuery object!" ); +} +​ +if ( b.jquery ) { // Truthy, since it's a string + alert( "b is a jQuery object!" ); +} +``` + * @example ​ ````Get the current version of jQuery running on the page +```javascript +alert( "You are running jQuery version: " + $.fn.jquery ); +``` + */ + jquery: string; + /** + * The number of elements in the jQuery object. + * @see \`{@link https://api.jquery.com/length/ }\` + * @since 1.0 + * @example ​ ````Count the divs. Click to add more. +```html + + + + + length demo + + + + +​ +

​ + +​ + + +``` + */ + length: number; + /** + * Create a new jQuery object with elements added to the set of matched elements. + * @param selector A string representing a selector expression to find additional elements to add to the set of matched elements. + * @param context The point in the document at which the selector should begin matching; similar to the context + * argument of the $(selector, context) method. + * @see \`{@link https://api.jquery.com/add/ }\` + * @since 1.4 + */ + add(selector: JQuery.Selector, context: Element): this; + // TODO: The return type should reflect newly selected types. + /** + * Create a new jQuery object with elements added to the set of matched elements. + * @param selector_elements_html_selection _@param_ `selector_elements_html_selection` + *
+ * * `selector` — A string representing a selector expression to find additional elements to add to the set of matched elements.
+ * * `elements` — One or more elements to add to the set of matched elements.
+ * * `html` — An HTML fragment to add to the set of matched elements.
+ * * `selection` — An existing jQuery object to add to the set of matched elements. + * @see \`{@link https://api.jquery.com/add/ }\` + * @since 1.0 + * @since 1.3.2 + * @example ​ ````Finds all divs and makes a border. Then adds all paragraphs to the jQuery object to set their backgrounds yellow. +```html + + + + + add demo + + + + +​ +
+
+
+
+
+
+​ +

Added this... (notice no border)

+​ + +​ + + +``` + * @example ​ ````Adds more elements, matched by the given expression, to the set of matched elements. +```html + + + + + add demo + + + +​ +

Hello

+Hello Again +​ + +​ + + +``` + * @example ​ ````Adds more elements, created on the fly, to the set of matched elements. +```html + + + + + add demo + + + +​ +

Hello

+​ + +​ + + +``` + * @example ​ ````Adds one or more Elements to the set of matched elements. +```html + + + + + add demo + + + +​ +

Hello

+Hello Again +​ + +​ + + +``` + * @example ​ ````Demonstrates how to add (or push) elements to an existing collection +```html + + + + + add demo + + + +​ +

Hello

+Hello Again +​ + +​ + + +``` + */ + add(selector_elements_html_selection: JQuery.Selector | JQuery.TypeOrArray | JQuery.htmlString | JQuery | JQuery.Node): this; + /** + * Add the previous set of elements on the stack to the current set, optionally filtered by a selector. + * @param selector A string containing a selector expression to match the current set of elements against. + * @see \`{@link https://api.jquery.com/addBack/ }\` + * @since 1.8 + * @example ​ ````The .addBack() method causes the previous set of DOM elements in the traversal stack to be added to the current set. In the first example, the top stack contains the set resulting from .find("p"). In the second example, .addBack() adds the previous set of elements on the stack — in this case $("div.after-addback") — to the current set, selecting both the div and its enclosed paragraphs. +```html + + + + + addBack demo + + + + +​ +
+

Before addBack()

+
+

First Paragraph

+

Second Paragraph

+
+
+
+

After addBack()

+
+

First Paragraph

+

Second Paragraph

+
+
+​ + +​ + + +``` + */ + addBack(selector?: JQuery.Selector): this; + /** + * Adds the specified class(es) to each element in the set of matched elements. + * @param className_function _@param_ `className_function` + *
+ * * `className` — One or more space-separated classes to be added to the class attribute of each matched element.
+ * * `function` — A function returning one or more space-separated class names to be added to the existing class + * name(s). Receives the index position of the element in the set and the existing class name(s) as + * arguments. Within the function, `this` refers to the current element in the set. + * @see \`{@link https://api.jquery.com/addClass/ }\` + * @since 1.0 + * @since 1.4 + * @since 3.3 + * @example ​ ````Add the class "selected" to the matched elements. +```html + + + + + addClass demo + + + + +​ +

Hello

+

and

+

Goodbye

+​ + +​ + + +``` + * @example ​ ````Add the classes "selected" and "highlight" to the matched elements. +```html + + + + + addClass demo + + + + +​ +

Hello

+

and

+

Goodbye

+​ + +​ + + +``` + * @example ​ ````Pass in a function to .addClass() to add the "green" class to a div that already has a "red" class. +```html + + + + + addClass demo + + + + +​ +
This div should be white
+
This div will be green because it now has the "green" and "red" classes. + It would be red if the addClass function failed.
+
This div should be white
+

There are zero green divs

+​ + +​ + + +``` + */ + addClass(className_function: JQuery.TypeOrArray | ((this: TElement, index: number, currentClassName: string) => string)): this; + /** + * Insert content, specified by the parameter, after each element in the set of matched elements. + * @param contents One or more additional DOM elements, text nodes, arrays of elements and text nodes, HTML strings, or + * jQuery objects to insert after each element in the set of matched elements. + * @see \`{@link https://api.jquery.com/after/ }\` + * @since 1.0 + * @example ​ ````Inserts some HTML after all paragraphs. +```html + + + + + after demo + + + + +​ +

I would like to say:

+​ + +​ + + +``` + * @example ​ ````Inserts a DOM element after all paragraphs. +```html + + + + + after demo + + + + +​ +

I would like to say:

+​ + +​ + + +``` + * @example ​ ````Inserts a jQuery object (similar to an Array of DOM Elements) after all paragraphs. +```html + + + + + after demo + + + + +​ +Hello +

I would like to say:

+​ + +​ + + +``` + */ + after(...contents: Array>>): this; + /** + * Insert content, specified by the parameter, after each element in the set of matched elements. + * @param function_functionーhtml _@param_ `function_functionーhtml` + *
+ * * `function` — A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert + * after each element in the set of matched elements. Receives the index position of the element in the + * set as an argument. Within the function, `this` refers to the current element in the set.
+ * * `functionーhtml` — A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert + * after each element in the set of matched elements. Receives the index position of the element in the + * set and the old HTML value of the element as arguments. Within the function, `this` refers to the + * current element in the set. + * @see \`{@link https://api.jquery.com/after/ }\` + * @since 1.4 + * @since 1.10 + */ + after(function_functionーhtml: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; + /** + * Register a handler to be called when Ajax requests complete. This is an AjaxEvent. + * @param handler The function to be invoked. + * @see \`{@link https://api.jquery.com/ajaxComplete/ }\` + * @since 1.0 + * @example ​ ````Show a message when an Ajax request completes. +```javascript +$( document ).ajaxComplete(function( event, request, settings ) { + $( "#msg" ).append( "
  • Request Complete.
  • " ); +}); +``` + */ + ajaxComplete(handler: (this: Document, + event: JQuery.TriggeredEvent, + jqXHR: JQuery.jqXHR, + ajaxOptions: JQuery.AjaxSettings) => void | false): this; + /** + * Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event. + * @param handler The function to be invoked. + * @see \`{@link https://api.jquery.com/ajaxError/ }\` + * @since 1.0 + * @example ​ ````Show a message when an Ajax request fails. +```javascript +$( document ).ajaxError(function( event, request, settings ) { + $( "#msg" ).append( "
  • Error requesting page " + settings.url + "
  • " ); +}); +``` + */ + ajaxError(handler: (this: Document, + event: JQuery.TriggeredEvent, + jqXHR: JQuery.jqXHR, + ajaxSettings: JQuery.AjaxSettings, + thrownError: string) => void | false): this; + /** + * Attach a function to be executed before an Ajax request is sent. This is an Ajax Event. + * @param handler The function to be invoked. + * @see \`{@link https://api.jquery.com/ajaxSend/ }\` + * @since 1.0 + * @example ​ ````Show a message before an Ajax request is sent. +```javascript +$( document ).ajaxSend(function( event, request, settings ) { + $( "#msg" ).append( "
  • Starting request at " + settings.url + "
  • " ); +}); +``` + */ + ajaxSend(handler: (this: Document, + event: JQuery.TriggeredEvent, + jqXHR: JQuery.jqXHR, + ajaxOptions: JQuery.AjaxSettings) => void | false): this; + /** + * Register a handler to be called when the first Ajax request begins. This is an Ajax Event. + * @param handler The function to be invoked. + * @see \`{@link https://api.jquery.com/ajaxStart/ }\` + * @since 1.0 + * @example ​ ````Show a loading message whenever an Ajax request starts (and none is already active). +```javascript +$( document ).ajaxStart(function() { + $( "#loading" ).show(); +}); +``` + */ + ajaxStart(handler: (this: Document) => void | false): this; + /** + * Register a handler to be called when all Ajax requests have completed. This is an Ajax Event. + * @param handler The function to be invoked. + * @see \`{@link https://api.jquery.com/ajaxStop/ }\` + * @since 1.0 + * @example ​ ````Hide a loading message after all the Ajax requests have stopped. +```javascript +$( document ).ajaxStop(function() { + $( "#loading" ).hide(); +}); +``` + */ + ajaxStop(handler: (this: Document) => void | false): this; + /** + * Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event. + * @param handler The function to be invoked. + * @see \`{@link https://api.jquery.com/ajaxSuccess/ }\` + * @since 1.0 + * @example ​ ````Show a message when an Ajax request completes successfully. +```javascript +$( document ).ajaxSuccess(function( event, request, settings ) { + $( "#msg" ).append( "
  • Successful Request!
  • " ); +}); +``` + */ + ajaxSuccess(handler: (this: Document, + event: JQuery.TriggeredEvent, + jqXHR: JQuery.jqXHR, + ajaxOptions: JQuery.AjaxSettings, + data: JQuery.PlainObject) => void | false): this; + /** + * Perform a custom animation of a set of CSS properties. + * @param properties An object of CSS properties and values that the animation will move toward. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/animate/ }\` + * @since 1.0 + * @example ​ ````An example of using an 'easing' function to provide a different style of animation. This will only work if you have a plugin that provides this easing function. Note, this code will do nothing unless the paragraph element is hidden. +```javascript +$( "p" ).animate({ + opacity: "show" +}, "slow", "easein" ); +``` + * @example ​ ````Animate all paragraphs and execute a callback function when the animation is complete. The first argument is an object of CSS properties, the second specifies that the animation should take 1000 milliseconds to complete, the third states the easing type, and the fourth argument is an anonymous callback function. +```javascript +$( "p" ).animate({ + height: 200, + width: 400, + opacity: 0.5 +}, 1000, "linear", function() { + alert( "all done" ); +}); +``` + */ + animate(properties: JQuery.PlainObject, + duration: JQuery.Duration, + easing: string, + complete?: (this: TElement) => void): this; + /** + * Perform a custom animation of a set of CSS properties. + * @param properties An object of CSS properties and values that the animation will move toward. + * @param duration_easing _@param_ `duration_easing` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/animate/ }\` + * @since 1.0 + * @example ​ ````Click the button to animate the div with a number of different properties. +```html + + + + + animate demo + + + + +​ + +
    Hello!
    +​ + +​ + + +``` + * @example ​ ````Animates a div's left property with a relative value. Click several times on the buttons to see the relative animations queued up. +```html + + + + + animate demo + + + + +​ + + +
    +​ + +​ + + +``` + * @example ​ ````Animate all paragraphs to toggle both height and opacity, completing the animation within 600 milliseconds. +```javascript +$( "p" ).animate({ + height: "toggle", + opacity: "toggle" +}, "slow" ); +``` + * @example ​ ````Animate all paragraphs to a left style of 50 and opacity of 1 (opaque, visible), completing the animation within 500 milliseconds. +```javascript +$( "p" ).animate({ + left: 50, + opacity: 1 +}, 500 ); +``` + */ + animate(properties: JQuery.PlainObject, + duration_easing: JQuery.Duration | string, + complete?: (this: TElement) => void): this; + /** + * Perform a custom animation of a set of CSS properties. + * @param properties An object of CSS properties and values that the animation will move toward. + * @param options A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/animate/ }\` + * @since 1.0 + * @example ​ ````The first button shows how an unqueued animation works. It expands the div out to 90% width while the font-size is increasing. Once the font-size change is complete, the border animation will begin. + +The second button starts a traditional chained animation, where each animation will start once the previous animation on the element has completed. +```html + + + + + animate demo + + + + +​ + + + + +
    Block1
    +
    Block2
    +​ + +​ + + +``` + * @example ​ ````Animates the first div's left property and synchronizes the remaining divs, using the step function to set their left properties at each stage of the animation. +```html + + + + + animate demo + + + + +​ +

    +
    +
    +
    +
    +
    +
    +​ + +​ + + +``` + * @example ​ ````Animate the left and opacity style properties of all paragraphs; run the animation outside the queue, so that it will automatically start without waiting for its turn. +```javascript +$( "p" ).animate({ + left: "50px", + opacity: 1 +}, { + duration: 500, + queue: false +}); +``` + * @example ​ ````Animates all paragraphs to toggle both height and opacity, completing the animation within 600 milliseconds. +```javascript +$( "p" ).animate({ + height: "toggle", + opacity: "toggle" +}, { + duration: "slow" +}); +``` + * @example ​ ````Use an easing function to provide a different style of animation. This will only work if you have a plugin that provides this easing function. +```javascript +$( "p" ).animate({ + opacity: "show" +}, { + duration: "slow", + easing: "easein" +}); +``` + */ + animate(properties: JQuery.PlainObject, + options: JQuery.EffectsOptions): this; + /** + * Perform a custom animation of a set of CSS properties. + * @param properties An object of CSS properties and values that the animation will move toward. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/animate/ }\` + * @since 1.0 + */ + animate(properties: JQuery.PlainObject, + complete?: (this: TElement) => void): this; + /** + * Insert content, specified by the parameter, to the end of each element in the set of matched elements. + * @param contents One or more additional DOM elements, text nodes, arrays of elements and text nodes, HTML strings, or + * jQuery objects to insert at the end of each element in the set of matched elements. + * @see \`{@link https://api.jquery.com/append/ }\` + * @since 1.0 + * @example ​ ````Appends some HTML to all paragraphs. +```html + + + + + append demo + + + + +​ +

    I would like to say:

    +​ + +​ + + +``` + * @example ​ ````Appends an Element to all paragraphs. +```html + + + + + append demo + + + + +​ +

    I would like to say:

    +​ + +​ + + +``` + * @example ​ ````Appends a jQuery object (similar to an Array of DOM Elements) to all paragraphs. +```html + + + + + append demo + + + + +​ +Hello world!!! +

    I would like to say:

    +​ + +​ + + +``` + */ + append(...contents: Array>>): this; + /** + * Insert content, specified by the parameter, to the end of each element in the set of matched elements. + * @param funсtion A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert at + * the end of each element in the set of matched elements. Receives the index position of the element + * in the set and the old HTML value of the element as arguments. Within the function, `this` refers to + * the current element in the set. + * @see \`{@link https://api.jquery.com/append/ }\` + * @since 1.4 + */ + append(funсtion: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; + /** + * Insert every element in the set of matched elements to the end of the target. + * @param target A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements + * will be inserted at the end of the element(s) specified by this parameter. + * @see \`{@link https://api.jquery.com/appendTo/ }\` + * @since 1.0 + * @example ​ ````Append all spans to the element with the ID "foo" (Check append() documentation for more examples) +```html + + + + + appendTo demo + + + + +​ +I have nothing more to say... +​ +
    FOO!
    +​ + +​ + + +``` + */ + appendTo(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; + /** + * Set one or more attributes for the set of matched elements. + * @param attributeName The name of the attribute to set. + * @param value_function _@param_ `value_function` + *
    + * * `value` — A value to set for the attribute. If `null`, the specified attribute will be removed (as in \`{@link removeAttr .removeAttr()}`).
    + * * `function` — A function returning the value to set. `this` is the current element. Receives the index position of + * the element in the set and the old attribute value as arguments. + * @see \`{@link https://api.jquery.com/attr/ }\` + * @since 1.0 + * @since 1.1 + * @example ​ ````Set the id for divs based on the position in the page. +```html + + + + + attr demo + + + + +​ +
    Zero-th
    +
    First
    +
    Second
    +​ + +​ + + +``` + * @example ​ ````Set the src attribute from title attribute on the image. +```html + + + + + attr demo + + + +​ + +​ + +​ + + +``` + */ + attr(attributeName: string, + value_function: string | number | null | ((this: TElement, index: number, attr: string) => string | number | void | undefined)): this; + /** + * Set one or more attributes for the set of matched elements. + * @param attributes An object of attribute-value pairs to set. + * @see \`{@link https://api.jquery.com/attr/ }\` + * @since 1.0 + * @example ​ ````Set some attributes for all <img>s in the page. +```html + + + + + attr demo + + + + +​ + + + +​ +
    Attribute of Ajax
    +​ + +​ + + +``` + */ + attr(attributes: JQuery.PlainObject): this; + /** + * Get the value of an attribute for the first element in the set of matched elements. + * @param attributeName The name of the attribute to get. + * @see \`{@link https://api.jquery.com/attr/ }\` + * @since 1.0 + * @example ​ ````Display the checked attribute and property of a checkbox as it changes. +```html + + + + + attr demo + + + + +​ + + +

    +​ + +​ + + +``` + * @example ​ ````Find the title attribute of the first <em> in the page. +```html + + + + + attr demo + + + + +​ +

    Once there was a large dinosaur...

    +​ +The title of the emphasis is:
    +​ + +​ + + +``` + */ + attr(attributeName: string): string | undefined; + /** + * Insert content, specified by the parameter, before each element in the set of matched elements. + * @param contents One or more additional DOM elements, text nodes, arrays of elements and text nodes, HTML strings, or + * jQuery objects to insert before each element in the set of matched elements. + * @see \`{@link https://api.jquery.com/before/ }\` + * @since 1.0 + * @example ​ ````Inserts some HTML before all paragraphs. +```html + + + + + before demo + + + + +​ +

    is what I said...

    +​ + +​ + + +``` + * @example ​ ````Inserts a DOM element before all paragraphs. +```html + + + + + before demo + + + + +​ +

    is what I said...

    +​ + +​ + + +``` + * @example ​ ````Inserts a jQuery object (similar to an Array of DOM Elements) before all paragraphs. +```html + + + + + before demo + + + + +​ +

    is what I said...

    Hello +​ + +​ + + +``` + */ + before(...contents: Array>>): this; + /** + * Insert content, specified by the parameter, before each element in the set of matched elements. + * @param function_functionーhtml _@param_ `function_functionーhtml` + *
    + * * `function` — A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert + * before each element in the set of matched elements. Receives the index position of the element in + * the set as an argument. Within the function, `this` refers to the current element in the set.
    + * * `functionーhtml` — A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert + * before each element in the set of matched elements. Receives the index position of the element in + * the set and the old HTML value of the element as arguments. Within the function, `this` refers to the + * current element in the set. + * @see \`{@link https://api.jquery.com/before/ }\` + * @since 1.4 + * @since 1.10 + */ + before(function_functionーhtml: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; + // [bind() overloads] https://github.com/jquery/api.jquery.com/issues/1048 + /** + * Attach a handler to an event for the elements. + * @param eventType A string containing one or more DOM event types, such as "click" or "submit," or custom event names. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/bind/ }\` + * @since 1.0 + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + */ + bind( + eventType: TType, + eventData: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach a handler to an event for the elements. + * @param eventType A string containing one or more DOM event types, such as "click" or "submit," or custom event names. + * @param handler_preventBubble _@param_ `handler_preventBubble` + *
    + * * `handler` — A function to execute each time the event is triggered.
    + * * `preventBubble` — Setting the third argument to false will attach a function that prevents the default action from + * occurring and stops the event from bubbling. The default is `true`. + * @see \`{@link https://api.jquery.com/bind/ }\` + * @since 1.0 + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````Handle click and double-click for the paragraph. Note: the coordinates are window relative, so in this case relative to the demo iframe. +```html + + + + + bind demo + + + + +​ +

    Click or double click here.

    + +​ + +​ + + +``` + * @example ​ ````To display each paragraph's text in an alert box whenever it is clicked: +```javascript +$( "p" ).bind( "click", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Cancel a default action and prevent it from bubbling up by returning false: +```javascript +$( "form" ).bind( "submit", function() { + return false; +}) +``` + * @example ​ ````Cancel only the default action by using the .preventDefault() method. +```javascript +$( "form" ).bind( "submit", function( event ) { + event.preventDefault(); +}); +``` + * @example ​ ````Stop an event from bubbling without preventing the default action by using the .stopPropagation() method. +```javascript +$( "form" ).bind( "submit", function( event ) { + event.stopPropagation(); +}); +``` + * @example ​ ````Bind custom events. +```html + + + + + bind demo + + + + +​ +

    Has an attached custom event.

    + + +​ + +​ + + +``` + */ + bind( + eventType: TType, + handler_preventBubble: JQuery.TypeEventHandler | + false | + null | + undefined + ): this; + /** + * Attach a handler to an event for the elements. + * @param events An object containing one or more DOM event types and functions to execute for them. + * @see \`{@link https://api.jquery.com/bind/ }\` + * @since 1.4 + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````Bind multiple events simultaneously. +```javascript +$( "div.test" ).bind({ + click: function() { + $( this ).addClass( "active" ); + }, + mouseenter: function() { + $( this ).addClass( "inside" ); + }, + mouseleave: function() { + $( this ).removeClass( "inside" ); + } +}); +``` + */ + bind(events: JQuery.TypeEventHandlers): this; + /** + * Bind an event handler to the "blur" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/blur/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + blur(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "blur" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/blur/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To trigger the blur event on all paragraphs: +```javascript +$( "p" ).blur(); +``` + */ + blur(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to the "change" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/change/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + change(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "change" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/change/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Attaches a change event to the select that gets the text for each selected option and writes them in the div. It then triggers the event for the initial text draw. +```html + + + + + change demo + + + + +​ + +
    +​ + +​ + + +``` + * @example ​ ````To add a validity test to all text input elements: +```javascript +$( "input[type='text']" ).change(function() { + // Check input( $( this ).val() ) for validity here +}); +``` + */ + change(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Get the children of each element in the set of matched elements, optionally filtered by a selector. + * @param selector A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/children/ }\` + * @since 1.0 + * @example ​ ````Find all children of the clicked element. +```html + + + + + children demo + + + + +​ +
    +​ + +​ + + +``` + * @example ​ ````Find all children of each div. +```html + + + + + children demo + + + + +​ +

    Hello (this is a paragraph)

    +​ +
    Hello Again (this span is a child of the a div)
    +

    And Again (in another paragraph)

    +​ +
    And One Last Time (most text directly in a div)
    +​ + +​ + + +``` + * @example ​ ````Find all children with a class "selected" of each div. +```html + + + + + children demo + + + + +​ +
    + Hello +

    Hello Again

    +
    And Again
    +

    And One Last Time

    +
    +​ + +​ + + +``` + */ + children(selector?: JQuery.Selector): this; + /** + * Remove from the queue all items that have not yet been run. + * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. + * @see \`{@link https://api.jquery.com/clearQueue/ }\` + * @since 1.4 + * @example ​ ````Empty the queue. +```html + + + + + clearQueue demo + + + + +​ + + +
    +​ + +​ + + +``` + */ + clearQueue(queueName?: string): this; + /** + * Bind an event handler to the "click" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/click/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + click(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "click" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/click/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Hide paragraphs on a page when they are clicked: +```html + + + + + click demo + + + + +​ +

    First Paragraph

    +

    Second Paragraph

    +

    Yet one more Paragraph

    +​ + +​ + + +``` + * @example ​ ````Trigger the click event on all of the paragraphs on the page: +```javascript +$( "p" ).click(); +``` + */ + click(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Create a deep copy of the set of matched elements. + * @param withDataAndEvents A Boolean indicating whether event handlers and data should be copied along with the elements. The + * default value is false. *In jQuery 1.5.0 the default value was incorrectly true; it was changed back + * to false in 1.5.1 and up. + * @param deepWithDataAndEvents A Boolean indicating whether event handlers and data for all children of the cloned element should + * be copied. By default its value matches the first argument's value (which defaults to false). + * @see \`{@link https://api.jquery.com/clone/ }\` + * @since 1.0 + * @since 1.5 + * @example ​ ````Clones all b elements (and selects the clones) and prepends them to all paragraphs. +```html + + + + + clone demo + + + +​ +Hello

    , how are you?

    +​ + +​ + + +``` + */ + clone(withDataAndEvents?: boolean, deepWithDataAndEvents?: boolean): this; + /** + * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. + * @param selector A string containing a selector expression to match elements against. + * @param context A DOM element within which a matching element may be found. + * @see \`{@link https://api.jquery.com/closest/ }\` + * @since 1.4 + */ + closest(selector: JQuery.Selector, context: Element): this; + /** + * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. + * @param selector_selection_element _@param_ `selector_selection_element` + *
    + * * `selector` — A string containing a selector expression to match elements against.
    + * * `selection` — A jQuery object to match elements against.
    + * * `element` — An element to match elements against. + * @see \`{@link https://api.jquery.com/closest/ }\` + * @since 1.3 + * @since 1.6 + * @example ​ ````Show how event delegation can be done with closest. The closest list element toggles a yellow background when it or its descendent is clicked. +```html + + + + + closest demo + + + + +​ +
      +
    • Click me!
    • +
    • You can also Click me!
    • +
    +​ + +​ + + +``` + * @example ​ ````Pass a jQuery object to closest. The closest list element toggles a yellow background when it or its descendent is clicked. +```html + + + + + closest demo + + + + +​ +
      +
    • Click me!
    • +
    • You can also Click me!
    • +
    +​ + +​ + + +``` + */ + closest(selector_selection_element: JQuery.Selector | Element | JQuery): this; + /** + * Get the children of each element in the set of matched elements, including text and comment nodes. + * @see \`{@link https://api.jquery.com/contents/ }\` + * @since 1.2 + * @example ​ ````Find all the text nodes inside a paragraph and wrap them with a bold tag. +```html + + + + + contents demo + + + +​ +

    Hello John, how are you doing?

    +​ + +​ + + +``` + * @example ​ ````Change the background color of links inside of an iframe. +```html + + + + + contents demo + + + +​ + +​ + +​ + + +``` + */ + contents(): JQuery; + /** + * Bind an event handler to the "contextmenu" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/contextmenu/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + contextmenu(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "contextmenu" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/contextmenu/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To show a "Hello World!" alert box when the contextmenu event is triggered on a paragraph on the page: +```javascript +$( "p" ).contextmenu(function() { + alert( "Hello World!" ); +}); +``` + * @example ​ ````Right click to toggle background color. +```html + + + + + contextmenu demo + + + + +​ +
    +Right click the block +​ + +​ + + +``` + */ + contextmenu(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Set one or more CSS properties for the set of matched elements. + * @param propertyName A CSS property name. + * @param value_function _@param_ `value_function` + *
    + * * `value` — A value to set for the property.
    + * * `function` — A function returning the value to set. `this` is the current element. Receives the index position of + * the element in the set and the old value as arguments. + * @see \`{@link https://api.jquery.com/css/ }\` + * @since 1.0 + * @since 1.4 + * @example ​ ````Change the color of any paragraph to red on mouseover event. +```html + + + + + css demo + + + + +​ +

    Just roll the mouse over me.

    +​ +

    Or me to see a color change.

    +​ + +​ + + +``` + * @example ​ ````Increase the width of #box by 200 pixels the first time it is clicked. +```html + + + + + css demo + + + + +​ +
    Click me to grow
    +​ + +​ + + +``` + * @example ​ ````Highlight a clicked word in the paragraph. +```html + + + + + css demo + + + + +​ +

    + Once upon a time there was a man + who lived in a pizza parlor. This + man just loved pizza and ate it all + the time. He went on to be the + happiest man in the world. The end. +

    +​ + +​ + + +``` + */ + css(propertyName: string, + value_function: string | number | ((this: TElement, index: number, value: string) => string | number | void | undefined)): this; + /** + * Set one or more CSS properties for the set of matched elements. + * @param properties An object of property-value pairs to set. + * @see \`{@link https://api.jquery.com/css/ }\` + * @since 1.0 + * @example ​ ````Change the font weight and background color on mouseenter and mouseleave. +```html + + + + + css demo + + + + +​ +

    Move the mouse over a paragraph.

    +

    Like this one or the one above.

    +​ + +​ + + +``` + * @example ​ ````Increase the size of a div when you click it. +```html + + + + + css demo + + + + +​ +
    click
    +
    click
    +​ + +​ + + +``` + */ + css(properties: JQuery.PlainObject string | number | void | undefined)>): this; + /** + * Get the computed style properties for the first element in the set of matched elements. + * @param propertyName A CSS property. + * @see \`{@link https://api.jquery.com/css/ }\` + * @since 1.0 + * @example ​ ````Get the background color of a clicked div. +```html + + + + + css demo + + + + +​ +  +
    +
    +
    +
    +​ + +​ + + +``` + */ + css(propertyName: string): string; + /** + * Get the computed style properties for the first element in the set of matched elements. + * @param propertyNames An array of one or more CSS properties. + * @see \`{@link https://api.jquery.com/css/ }\` + * @since 1.9 + * @example ​ ````Get the width, height, text color, and background color of a clicked div. +```html + + + + + css demo + + + + +​ +

     

    +
    1
    +
    2
    +
    3
    +
    4
    +​ + +​ + + +``` + */ + css(propertyNames: string[]): JQuery.PlainObject; + /** + * Store arbitrary data associated with the matched elements. + * @param key A string naming the piece of data to set. + * @param value The new data value; this can be any Javascript type except `undefined`. + * @see \`{@link https://api.jquery.com/data/ }\` + * @since 1.2.3 + * @example ​ ````Store then retrieve a value from the div element. +```html + + + + + data demo + + + + +​ +
    + The values stored were + + and + +
    +​ + +​ + + +``` + */ + data(key: string, value: string | number | boolean | symbol | object | null): this; + /** + * Store arbitrary data associated with the matched elements. + * @param obj An object of key-value pairs of data to update. + * @see \`{@link https://api.jquery.com/data/ }\` + * @since 1.4.3 + */ + data(obj: JQuery.PlainObject): this; + /** + * Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute. + * @param key Name of the data stored. + * @param value `undefined` is not recognized as a data value. Calls such as `.data( "name", undefined )` + * will return the jQuery object that it was called on, allowing for chaining. + * @see \`{@link https://api.jquery.com/data/ }\` + * @since 1.2.3 + */ + // `unified-signatures` is disabled so that behavior when passing `undefined` to `value` can be documented. Unifying the signatures + // results in potential confusion for users from an unexpected parameter. + // tslint:disable-next-line:unified-signatures + data(key: string, value: undefined): any; + /** + * Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute. + * @param key Name of the data stored. + * @see \`{@link https://api.jquery.com/data/ }\` + * @since 1.2.3 + * @example ​ ````Get the data named "blah" stored at for an element. +```html + + + + + data demo + + + + +​ +
    A div
    + + + + +

    The "blah" value of this div is ?

    +​ + +​ + + +``` + */ + data(key: string): any; + /** + * Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute. + * @see \`{@link https://api.jquery.com/data/ }\` + * @since 1.4 + */ + data(): JQuery.PlainObject; + /** + * Bind an event handler to the "dblclick" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/dblclick/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + dblclick(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "dblclick" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/dblclick/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To bind a "Hello World!" alert box to the dblclick event on every paragraph on the page: +```javascript +$( "p" ).dblclick(function() { + alert( "Hello World!" ); +}); +``` + * @example ​ ````Double click to toggle background color. +```html + + + + + dblclick demo + + + + +​ +
    +Double click the block +​ + +​ + + +``` + */ + dblclick(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Set a timer to delay execution of subsequent items in the queue. + * @param duration An integer indicating the number of milliseconds to delay execution of the next item in the queue. + * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. + * @see \`{@link https://api.jquery.com/delay/ }\` + * @since 1.4 + * @example ​ ````Animate the hiding and showing of two divs, delaying the first before showing it. +```html + + + + + delay demo + + + + +​ +

    +
    +
    +​ + +​ + + +``` + */ + delay(duration: JQuery.Duration, queueName?: string): this; + /** + * Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. + * @param selector A selector to filter the elements that trigger the event. + * @param eventType A string containing one or more space-separated JavaScript event types, such as "click" or + * "keydown," or custom event names. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/delegate/ }\` + * @since 1.4.2 + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + */ + delegate( + selector: JQuery.Selector, + eventType: TType, + eventData: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. + * @param selector A selector to filter the elements that trigger the event. + * @param eventType A string containing one or more space-separated JavaScript event types, such as "click" or + * "keydown," or custom event names. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/delegate/ }\` + * @since 1.4.2 + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````Click a paragraph to add another. Note that .delegate() attaches a click event handler to all paragraphs - even new ones. +```html + + + + + delegate demo + + + + +​ +

    Click me!

    +​ + +​ + +​ + + +``` + * @example ​ ````To display each paragraph's text in an alert box whenever it is clicked: +```javascript +$( "body" ).delegate( "p", "click", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````To cancel a default action and prevent it from bubbling up, return false: +```javascript +$( "body" ).delegate( "a", "click", function() { + return false; +}); +``` + * @example ​ ````To cancel only the default action by using the preventDefault method. +```javascript +$( "body" ).delegate( "a", "click", function( event ) { + event.preventDefault(); +}); +``` + * @example ​ ````Can bind custom events too. +```html + + + + + delegate demo + + + + +​ +

    Has an attached custom event.

    + + +​ + +​ + + +``` + */ + delegate( + selector: JQuery.Selector, + eventType: TType, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. + * @param selector A selector to filter the elements that trigger the event. + * @param events A plain object of one or more event types and functions to execute for them. + * @see \`{@link https://api.jquery.com/delegate/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + */ + delegate(selector: JQuery.Selector, + events: JQuery.TypeEventHandlers + ): this; + /** + * Execute the next function on the queue for the matched elements. + * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. + * @see \`{@link https://api.jquery.com/dequeue/ }\` + * @since 1.2 + * @example ​ ````Use dequeue to end a custom queue function which allows the queue to keep going. +```html + + + + + dequeue demo + + + + +​ + +
    +​ + +​ + + +``` + */ + dequeue(queueName?: string): this; + /** + * Remove the set of matched elements from the DOM. + * @param selector A selector expression that filters the set of matched elements to be removed. + * @see \`{@link https://api.jquery.com/detach/ }\` + * @since 1.4 + * @example ​ ````Detach all paragraphs from the DOM +```html + + + + + detach demo + + + + +​ +

    Hello

    +how are +

    you?

    + +​ + +​ + + +``` + */ + detach(selector?: JQuery.Selector): this; + /** + * Iterate over a jQuery object, executing a function for each matched element. + * @param funсtion A function to execute for each matched element. + * @see \`{@link https://api.jquery.com/each/ }\` + * @since 1.0 + * @example ​ ````Iterate over three divs and sets their color property. +```html + + + + + each demo + + + + +​ +
    Click here
    +
    to iterate through
    +
    these divs.
    +​ + +​ + + +``` + * @example ​ ````To access a jQuery object instead of the regular DOM element, use $( this ). For example: +```html + + + + + each demo + + + + +​ +To do list: (click here to change) +
      +
    • Eat
    • +
    • Sleep
    • +
    • Be merry
    • +
    +​ + +​ + + +``` + * @example ​ ````Use return false to break out of each() loops early. +```html + + + + + each demo + + + + +​ + + +
    +
    +
    +
    +
    Stop here
    +
    +
    +
    +​ + +​ + + +``` + */ + each(funсtion: (this: TElement, index: number, element: TElement) => void | false): this; + /** + * Remove all child nodes of the set of matched elements from the DOM. + * @see \`{@link https://api.jquery.com/empty/ }\` + * @since 1.0 + * @example ​ ````Removes all child nodes (including text nodes) from all paragraphs +```html + + + + + empty demo + + + + +​ +

    + Hello, Person and person. +

    +​ + +​ + +​ + + +``` + */ + empty(): this; + /** + * End the most recent filtering operation in the current chain and return the set of matched elements to its previous state. + * @see \`{@link https://api.jquery.com/end/ }\` + * @since 1.0 + * @example ​ ````Selects all paragraphs, finds span elements inside these, and reverts the selection back to the paragraphs. +```html + + + + + end demo + + + + +​ +

    + Hi there how are you doing? +

    +​ +

    + This span is one of + several spans in this + sentence. +

    +​ +
    + Tags in jQuery object initially: +
    +​ +
    + Tags in jQuery object after find: +
    +​ +
    + Tags in jQuery object after end: +
    +​ + +​ + + +``` + * @example ​ ````Selects all paragraphs, finds span elements inside these, and reverts the selection back to the paragraphs. +```html + + + + + end demo + + + + +​ +

    Hello, how are you?

    +​ + +​ + + +``` + */ + end(): this; + /** + * Reduce the set of matched elements to the one at the specified index. + * @param index An integer indicating the 0-based position of the element. + * An integer indicating the position of the element, counting backwards from the last element in the set. + * @see \`{@link https://api.jquery.com/eq/ }\` + * @since 1.1.2 + * @since 1.4 + * @example ​ ````Turn the div with index 2 blue by adding an appropriate class. +```html + + + + + eq demo + + + + +​ +
    +
    +
    +
    +
    +
    +​ + +​ + + +``` + */ + eq(index: number): this; + /** + * Merge the contents of an object onto the jQuery prototype to provide new jQuery instance methods. + * @param obj An object to merge onto the jQuery prototype. + * @see \`{@link https://api.jquery.com/jQuery.fn.extend/ }\` + * @since 1.0 + * @example ​ ````Add two methods to the jQuery prototype ($.fn) object and then use one of them. +```html + + + + + jQuery.fn.extend demo + + + + +​ + + +​ + +​ + + +``` + */ + extend(obj: object): this; + /** + * Display the matched elements by fading them to opaque. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/fadeIn/ }\` + * @since 1.4.3 + */ + fadeIn(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; + /** + * Display the matched elements by fading them to opaque. + * @param duration_easing _@param_ `duration_easing` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/fadeIn/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Fades a red block in over the text. Once the animation is done, it quickly fades in more text on top. +```html + + + + + fadeIn demo + + + + +​ +

    + Let it be known that the party of the first part + and the party of the second part are henceforth + and hereto directed to assess the allegations + for factual correctness... (click!) +

    CENSORED!
    +

    +​ + +​ + + +``` + */ + fadeIn(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; + /** + * Display the matched elements by fading them to opaque. + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition.
    + * * `complete` — A function to call once the animation is complete, called once per matched element.
    + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/fadeIn/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Animates hidden divs to fade in one by one, completing each animation within 600 milliseconds. +```html + + + + + fadeIn demo + + + + +​ +Click here... +
    +
    +
    +​ + +​ + + +``` + */ + fadeIn(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; + /** + * Hide the matched elements by fading them to transparent. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/fadeOut/ }\` + * @since 1.4.3 + * @example ​ ````Fades out two divs, one with a "linear" easing and one with the default, "swing," easing. +```html + + + + + fadeOut demo + + + + +​ + + +​ +
    +​ +
    linear
    +
    swing
    +​ + +​ + + +``` + */ + fadeOut(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; + /** + * Hide the matched elements by fading them to transparent. + * @param duration_easing _@param_ `duration_easing` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/fadeOut/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Fades out spans in one section that you click on. +```html + + + + + fadeOut demo + + + + +​ +

    Find the modifiers -

    +

    + If you really want to go outside + in the cold then make sure to wear + your warm jacket given to you by + your favorite teacher. +

    +​ + +​ + + +``` + */ + fadeOut(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; + /** + * Hide the matched elements by fading them to transparent. + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition.
    + * * `complete` — A function to call once the animation is complete, called once per matched element.
    + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/fadeOut/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Animates all paragraphs to fade out, completing the animation within 600 milliseconds. +```html + + + + + fadeOut demo + + + + +​ +

    + If you click on this paragraph + you'll see it just fade away. +

    +​ + +​ + + +``` + */ + fadeOut(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; + /** + * Adjust the opacity of the matched elements. + * @param duration A string or number determining how long the animation will run. + * @param opacity A number between 0 and 1 denoting the target opacity. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/fadeTo/ }\` + * @since 1.4.3 + */ + fadeTo(duration: JQuery.Duration, opacity: number, easing: string, complete?: (this: TElement) => void): this; + /** + * Adjust the opacity of the matched elements. + * @param duration A string or number determining how long the animation will run. + * @param opacity A number between 0 and 1 denoting the target opacity. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/fadeTo/ }\` + * @since 1.0 + * @example ​ ````Animates first paragraph to fade to an opacity of 0.33 (33%, about one third visible), completing the animation within 600 milliseconds. +```html + + + + + fadeTo demo + + + +​ +

    +Click this paragraph to see it fade. +

    +​ +

    +Compare to this one that won't fade. +

    +​ + +​ + + +``` + * @example ​ ````Fade div to a random opacity on each click, completing the animation within 200 milliseconds. +```html + + + + + fadeTo demo + + + + +​ +

    And this is the library that John built...

    +​ +
    +
    +
    +​ + +​ + + +``` + * @example ​ ````Find the right answer! The fade will take 250 milliseconds and change various styles when it completes. +```html + + + + + fadeTo demo + + + + +​ +

    Wrong

    +
    +

    Wrong

    +
    +

    Right!

    +
    +​ + +​ + + +``` + */ + fadeTo(duration: JQuery.Duration, opacity: number, complete?: (this: TElement) => void): this; + /** + * Display or hide the matched elements by animating their opacity. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/fadeToggle/ }\` + * @since 1.4.4 + * @example ​ ````Fades first paragraph in or out, completing the animation within 600 milliseconds and using a linear easing. Fades last paragraph in or out for 200 milliseconds, inserting a "finished" message upon completion. +```html + + + + + fadeToggle demo + + + +​ + + +

    This paragraph has a slow, linear fade.

    +

    This paragraph has a fast animation.

    +
    +​ + +​ + + +``` + */ + fadeToggle(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; + /** + * Display or hide the matched elements by animating their opacity. + * @param duration_easing _@param_ `duration_easing` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/fadeToggle/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Fades first paragraph in or out, completing the animation within 600 milliseconds and using a linear easing. Fades last paragraph in or out for 200 milliseconds, inserting a "finished" message upon completion. +```html + + + + + fadeToggle demo + + + +​ + + +

    This paragraph has a slow, linear fade.

    +

    This paragraph has a fast animation.

    +
    +​ + +​ + + +``` + */ + fadeToggle(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; + /** + * Display or hide the matched elements by animating their opacity. + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition.
    + * * `complete` — A function to call once the animation is complete, called once per matched element.
    + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/fadeToggle/ }\` + * @since 1.0 + * @since 1.4.3 + */ + fadeToggle(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; + /** + * Reduce the set of matched elements to those that match the selector or pass the function's test. + * @param selector_elements_selection_function _@param_ `selector_elements_selection_function` + *
    + * * `selector` — A string containing a selector expression to match the current set of elements against.
    + * * `elements` — One or more DOM elements to match the current set of elements against.
    + * * `selection` — An existing jQuery object to match the current set of elements against.
    + * * `function` — A function used as a test for each element in the set. this is the current DOM element. + * @see \`{@link https://api.jquery.com/filter/ }\` + * @since 1.0 + * @since 1.4 + * @example ​ ````Change the color of all divs; then add a border to those with a "middle" class. +```html + + + + + filter demo + + + + +​ +
    +
    +
    +
    +
    +
    +​ + +​ + + +``` + * @example ​ ````Change the color of all divs; then add a border to the second one (index == 1) and the div with an id of "fourth." +```html + + + + + filter demo + + + + +​ +
    +
    +
    +
    +
    +
    +​ + +​ + + +``` + * @example ​ ````Select all divs and filter the selection with a DOM element, keeping only the one with an id of "unique". +```javascript +$( "div" ).filter( document.getElementById( "unique" ) ); +``` + * @example ​ ````Select all divs and filter the selection with a jQuery object, keeping only the one with an id of "unique". +```javascript +$( "div" ).filter( $( "#unique" ) ); +``` + */ + filter(selector_elements_selection_function: + JQuery.Selector | + JQuery.TypeOrArray | + JQuery | + ((this: TElement, index: number, element: TElement) => boolean) + ): this; + /** + * Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element. + * @param selector_element _@param_ `selector_element` + *
    + * * `selector` — A string containing a selector expression to match elements against.
    + * * `element` — An element or a jQuery object to match elements against. + * @see \`{@link https://api.jquery.com/find/ }\` + * @since 1.0 + * @since 1.6 + * @example ​ ````Starts with all paragraphs and searches for descendant span elements, same as $( "p span" ) +```html + + + + + find demo + + + +​ +

    Hello, how are you?

    +

    Me? I'm good.

    +​ + +​ + + +``` + * @example ​ ````A selection using a jQuery collection of all span tags. Only spans within p tags are changed to red while others are left blue. +```html + + + + + find demo + + + + +​ +

    Hello, how are you?

    +

    Me? I'm good.

    +
    Did you eat yet?
    +​ + +​ + + +``` + * @example ​ ````Add spans around each word then add a hover and italicize words with the letter t. +```html + + + + + find demo + + + + +​ +

    + When the day is short + find that which matters to you + or stop believing +

    +​ + +​ + + +``` + */ + find(selector_element: K | JQuery): JQuery; + find(selector_element: K | JQuery): JQuery; + find(selector_element: JQuery.Selector | Element | E | JQuery): JQuery; + /** + * Stop the currently-running animation, remove all queued animations, and complete all animations for the matched elements. + * @param queue The name of the queue in which to stop animations. + * @see \`{@link https://api.jquery.com/finish/ }\` + * @since 1.9 + * @example ​ ````Click the Go button once to start the animation, and then click the other buttons to see how they affect the current and queued animations. +```html + + + + + finish demo + + + + +​ +
    +
    + +
    + + +
    + + +
    + + +
    + +
    + +
    +​ + +​ + + +``` + */ + finish(queue?: string): this; + /** + * Reduce the set of matched elements to the first in the set. + * @see \`{@link https://api.jquery.com/first/ }\` + * @since 1.4 + * @example ​ ````Highlight the first span in a paragraph. +```html + + + + + first demo + + + + +​ +

    + Look: + This is some text in a paragraph. + This is a note about it. +

    +​ + +​ + + +``` + */ + first(): this; + /** + * Bind an event handler to the "focus" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/focus/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + focus(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "focus" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/focus/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Fire focus. +```html + + + + + focus demo + + + + +​ +

    focus fire

    +

    focus fire

    +​ + +​ + + +``` + * @example ​ ````To stop people from writing in text input boxes, try: +```javascript +$( "input[type=text]" ).focus(function() { + $( this ).blur(); +}); +``` + * @example ​ ````To focus on a login input box with id 'login' on page startup, try: +```javascript +$( document ).ready(function() { + $( "#login" ).focus(); +}); +``` + */ + focus(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to the "focusin" event. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/focusin/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + focusin(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "focusin" event. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/focusin/ }\` + * @since 1.4 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Watch for a focus to occur within the paragraphs on the page. +```html + + + + + focusin demo + + + + +​ +

    focusin fire

    +

    focusin fire

    +​ + +​ + + +``` + */ + focusin(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to the "focusout" JavaScript event. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/focusout/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + focusout(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "focusout" JavaScript event. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/focusout/ }\` + * @since 1.4 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Watch for a loss of focus to occur inside paragraphs and note the difference between the focusout count and the blur count. (The blur count does not change because those events do not bubble.) +```html + + + + + focusout demo + + + + +​ +
    +

    +
    + +

    +

    + +

    +
    +
    focusout fire
    +
    blur fire
    +​ + +​ + + +``` + */ + focusout(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Retrieve one of the elements matched by the jQuery object. + * @param index A zero-based integer indicating which element to retrieve. + * @see \`{@link https://api.jquery.com/get/ }\` + * @since 1.0 + * @example ​ ````Display the tag name of the click element. +```html + + + + + get demo + + + + +​ +  +

    In this paragraph is an important section

    +
    +​ + +​ + + +``` + */ + get(index: number): TElement; + /** + * Retrieve the elements matched by the jQuery object. + * @see \`{@link https://api.jquery.com/get/ }\` + * @since 1.0 + * @example ​ ````Select all divs in the document and return the DOM Elements as an Array; then use the built-in reverse() method to reverse that array. +```html + + + + + get demo + + + + +​ +Reversed - +​ +
    One
    +
    Two
    +
    Three
    +​ + +​ + + +``` + */ + get(): TElement[]; + /** + * Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element. + * @param selector_contained _@param_ `selector_contained` + *
    + * * `selector` — A string containing a selector expression to match elements against.
    + * * `contained` — A DOM element to match elements against. + * @see \`{@link https://api.jquery.com/has/ }\` + * @since 1.4 + * @example ​ ````Check if an element is inside another. +```html + + + + + has demo + + + + +​ +
    • Does the UL contain an LI?
    +​ + +​ + + +``` + */ + has(selector_contained: string | Element): this; + /** + * Determine whether any of the matched elements are assigned the given class. + * @param className The class name to search for. + * @see \`{@link https://api.jquery.com/hasClass/ }\` + * @since 1.2 + * @example ​ ````Looks for the paragraph that contains 'selected' as a class. +```html + + + + + hasClass demo + + + + +​ +

    This paragraph is black and is the first paragraph.

    +

    This paragraph is red and is the second paragraph.

    +
    First paragraph has selected class:
    +
    Second paragraph has selected class:
    +
    At least one paragraph has selected class:
    +​ + +​ + + +``` + */ + hasClass(className: string): boolean; + /** + * Set the CSS height of every matched element. + * @param value_function _@param_ `value_function` + *
    + * * `value` — An integer representing the number of pixels, or an integer with an optional unit of measure + * appended (as a string).
    + * * `function` — A function returning the height to set. Receives the index position of the element in the set and + * the old height as arguments. Within the function, `this` refers to the current element in the set. + * @see \`{@link https://api.jquery.com/height/ }\` + * @since 1.0 + * @since 1.4.1 + * @example ​ ````To set the height of each div on click to 30px plus a color change. +```html + + + + + height demo + + + + +​ +
    +
    +
    +
    +
    +​ + +​ + + +``` + */ + height(value_function: string | number | ((this: TElement, index: number, height: number) => string | number)): this; + /** + * Get the current computed height for the first element in the set of matched elements. + * @see \`{@link https://api.jquery.com/height/ }\` + * @since 1.0 + * @example ​ ````Show various heights. Note the values are from the iframe so might be smaller than you expected. The yellow highlight shows the iframe body. +```html + + + + + height demo + + + + +​ + + + +​ +
     
    +

    + Sample paragraph to test height +

    +​ + +​ + + +``` + */ + height(): number | undefined; + /** + * Hide the matched elements. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/hide/ }\` + * @since 1.4.3 + */ + hide(duration: JQuery.Duration, easing: string, complete: (this: TElement) => void): this; + /** + * Hide the matched elements. + * @param duration A string or number determining how long the animation will run. + * @param easing_complete _@param_ `easing_complete` + *
    + * * `easing` — A string indicating which easing function to use for the transition.
    + * * `complete` — A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/hide/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Animates all spans (words in this case) to hide fastly, completing each animation within 200 milliseconds. Once each animation is done, it starts the next one. +```html + + + + + hide demo + + + + +​ + + +
    + Once upon a + time there were + three programmers... +
    +​ + +​ + + +``` + * @example ​ ````Hides the divs when clicked over 2 seconds, then removes the div element when its hidden. Try clicking on more than one box at a time. +```html + + + + + hide demo + + + + +​ +
    +​ + +​ + + +``` + */ + hide(duration: JQuery.Duration, easing_complete: string | ((this: TElement) => void)): this; + /** + * Hide the matched elements. + * @param duration_complete_options _@param_ `duration_complete_options` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `complete` — A function to call once the animation is complete, called once per matched element.
    + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/hide/ }\` + * @since 1.0 + * @example ​ ````Hides all paragraphs then the link on click. +```html + + + + + hide demo + + + +​ +

    Hello

    +Click to hide me too +

    Here is another paragraph

    +​ + +​ + + +``` + * @example ​ ````Animates all shown paragraphs to hide slowly, completing the animation within 600 milliseconds. +```html + + + + + hide demo + + + + +​ + +

    Hiya

    +

    Such interesting text, eh?

    +​ + +​ + + +``` + */ + hide(duration_complete_options?: JQuery.Duration | ((this: TElement) => void) | JQuery.EffectsOptions): this; + /** + * Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements. + * @param handlerIn A function to execute when the mouse pointer enters the element. + * @param handlerOut A function to execute when the mouse pointer leaves the element. + * @see \`{@link https://api.jquery.com/hover/ }\` + * @since 1.0 + * @deprecated ​ Deprecated. + * + * **Cause**: The `.hover()` method is a shorthand for the use of the `mouseover`/`mouseout` events. It is often a poor user interface choice because it does not allow for any small amounts of delay between when the mouse enters or exits an area and when the event fires. This can make it quite difficult to use with UI widgets such as drop-down menus. For more information on the problems of hovering, see the \`{@link http://cherne.net/brian/resources/jquery.hoverIntent.html hoverIntent plugin}\`. + * + * **Solution**: Review uses of `.hover()` to determine if they are appropriate, and consider use of plugins such as `hoverIntent` as an alternative. The direct replacement for `.hover(fn1, fn2)`, is `.on("mouseenter", fn1).on("mouseleave", fn2)`. + * @example ​ ````To add a special style to list items that are being hovered over, try: +```html + + + + + hover demo + + + + +​ +
      +
    • Milk
    • +
    • Bread
    • +
    • Chips
    • +
    • Socks
    • +
    +​ + +​ + + +``` + * @example ​ ````To add a special style to table cells that are being hovered over, try: +```javascript +$( "td" ).hover( + function() { + $( this ).addClass( "hover" ); + }, function() { + $( this ).removeClass( "hover" ); + } +); +``` + * @example ​ ````To unbind the above example use: +```javascript +$( "td" ).off( "mouseenter mouseleave" ); +``` + */ + hover(handlerIn: JQuery.TypeEventHandler | + false, + handlerOut: JQuery.TypeEventHandler | + false): this; + /** + * Bind a single handler to the matched elements, to be executed when the mouse pointer enters or leaves the elements. + * @param handlerInOut A function to execute when the mouse pointer enters or leaves the element. + * @see \`{@link https://api.jquery.com/hover/ }\` + * @since 1.4 + * @deprecated ​ Deprecated. + * + * **Cause**: The `.hover()` method is a shorthand for the use of the `mouseover`/`mouseout` events. It is often a poor user interface choice because it does not allow for any small amounts of delay between when the mouse enters or exits an area and when the event fires. This can make it quite difficult to use with UI widgets such as drop-down menus. For more information on the problems of hovering, see the \`{@link http://cherne.net/brian/resources/jquery.hoverIntent.html hoverIntent plugin}\`. + * + * **Solution**: Review uses of `.hover()` to determine if they are appropriate, and consider use of plugins such as `hoverIntent` as an alternative. The direct replacement for `.hover(fn1, fn2)`, is `.on("mouseenter", fn1).on("mouseleave", fn2)`. + * @example ​ ````Slide the next sibling LI up or down on hover, and toggle a class. +```html + + + + + hover demo + + + + +​ +
      +
    • Milk
    • +
    • White
    • +
    • Carrots
    • +
    • Orange
    • +
    • Broccoli
    • +
    • Green
    • +
    +​ + +​ + + +``` + */ + hover(handlerInOut: JQuery.TypeEventHandler | + false): this; + /** + * Set the HTML contents of each element in the set of matched elements. + * @param htmlString_function _@param_ `htmlString_function` + *
    + * * `htmlString` — A string of HTML to set as the content of each matched element.
    + * * `function` — A function returning the HTML content to set. Receives the index position of the element in the set + * and the old HTML value as arguments. jQuery empties the element before calling the function; use the + * oldhtml argument to reference the previous content. Within the function, `this` refers to the current + * element in the set. + * @see \`{@link https://api.jquery.com/html/ }\` + * @since 1.0 + * @since 1.4 + * @example ​ ````Add some html to each div. +```html + + + + + html demo + + + + +​ +Hello +
    +
    +
    +​ + +​ + + +``` + * @example ​ ````Add some html to each div then immediately do further manipulations to the inserted html. +```html + + + + + html demo + + + + +​ +
    +
    +
    +​ + +​ + + +``` + */ + html(htmlString_function: JQuery.htmlString | + JQuery.Node | + ((this: TElement, index: number, oldhtml: JQuery.htmlString) => JQuery.htmlString | JQuery.Node)): this; + /** + * Get the HTML contents of the first element in the set of matched elements. + * @see \`{@link https://api.jquery.com/html/ }\` + * @since 1.0 + * @example ​ ````Click a paragraph to convert it from html to text. +```html + + + + + html demo + + + + +​ +

    + Click to change the html +

    +

    + to a text node. +

    +

    + This does nothing. +

    +​ + +​ + + +``` + */ + html(): string; + /** + * Search for a given element from among the matched elements. + * @param selector_element _@param_ `selector_element` + *
    + * * `selector` — A selector representing a jQuery collection in which to look for an element.
    + * * `element` — The DOM element or first element within the jQuery object to look for. + * @see \`{@link https://api.jquery.com/index/ }\` + * @since 1.0 + * @since 1.4 + * @example ​ ````On click, returns the index (zero-based) of that div in the page. +```html + + + + + index demo + + + + +​ +Click a div! +
    First div
    +
    Second div
    +
    Third div
    +​ + +​ + + +``` + * @example ​ ````Returns the index for the element with ID bar. +```html + + + + + index demo + + + + +​ +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    +
    +​ + +​ + + +``` + * @example ​ ````Returns the index for the first item in the jQuery collection. +```html + + + + + index demo + + + + +​ +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    +
    +​ + +​ + + +``` + * @example ​ ````Returns the index for the element with ID bar in relation to all <li> elements. +```html + + + + + index demo + + + + +​ +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    +
    +​ + +​ + + +``` + * @example ​ ````Returns the index for the element with ID bar in relation to its siblings. +```html + + + + + index demo + + + + +​ +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    +
    +​ + +​ + + +``` + * @example ​ ````Returns -1, as there is no element with ID foobar. +```html + + + + + index demo + + + + +​ +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    +
    +​ + +​ + + +``` + */ + index(selector_element?: JQuery.Selector | Element | JQuery): number; + /** + * Set the CSS inner height of each element in the set of matched elements. + * @param value_function _@param_ `value_function` + *
    + * * `value` — A number representing the number of pixels, or a number along with an optional unit of measure + * appended (as a string).
    + * * `function` — A function returning the inner height (including padding but not border) to set. Receives the index + * position of the element in the set and the old inner height as arguments. Within the function, `this` + * refers to the current element in the set. + * @see \`{@link https://api.jquery.com/innerHeight/ }\` + * @since 1.8.0 + * @example ​ ````Change the inner height of each div the first time it is clicked (and change its color). +```html + + + + + innerHeight demo + + + + +​ +
    d
    +
    d
    +
    d
    +
    d
    +
    d
    +​ + +​ + + +``` + */ + innerHeight(value_function: string | number | ((this: TElement, index: number, height: number) => string | number)): this; + /** + * Get the current computed height for the first element in the set of matched elements, including padding but not border. + * @see \`{@link https://api.jquery.com/innerHeight/ }\` + * @since 1.2.6 + * @example ​ ````Get the innerHeight of a paragraph. +```html + + + + + innerHeight demo + + + + +​ +

    Hello

    +

    +​ + +​ + + +``` + */ + innerHeight(): number | undefined; + /** + * Set the CSS inner width of each element in the set of matched elements. + * @param value_function _@param_ `value_function` + *
    + * * `value` — A number representing the number of pixels, or a number along with an optional unit of measure + * appended (as a string).
    + * * `function` — A function returning the inner width (including padding but not border) to set. Receives the index + * position of the element in the set and the old inner width as arguments. Within the function, `this` + * refers to the current element in the set. + * @see \`{@link https://api.jquery.com/innerWidth/ }\` + * @since 1.8.0 + * @example ​ ````Change the inner width of each div the first time it is clicked (and change its color). +```html + + + + + innerWidth demo + + + + +​ +
    d
    +
    d
    +
    d
    +
    d
    +
    d
    +​ + +​ + + +``` + */ + innerWidth(value_function: string | number | ((this: TElement, index: number, width: number) => string | number)): this; + /** + * Get the current computed inner width for the first element in the set of matched elements, including padding but not border. + * @see \`{@link https://api.jquery.com/innerWidth/ }\` + * @since 1.2.6 + * @example ​ ````Get the innerWidth of a paragraph. +```html + + + + + innerWidth demo + + + + +​ +

    Hello

    +

    +​ + +​ + + +``` + */ + innerWidth(): number | undefined; + /** + * Insert every element in the set of matched elements after the target. + * @param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements + * will be inserted after the element(s) specified by this parameter. + * @see \`{@link https://api.jquery.com/insertAfter/ }\` + * @since 1.0 + * @example ​ ````Insert all paragraphs after an element with id of "foo". Same as $( "#foo" ).after( "p" ) +```html + + + + + insertAfter demo + + + + +​ +

    is what I said...

    +
    FOO!
    +​ + +​ + + +``` + */ + insertAfter(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; + /** + * Insert every element in the set of matched elements before the target. + * @param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements + * will be inserted before the element(s) specified by this parameter. + * @see \`{@link https://api.jquery.com/insertBefore/ }\` + * @since 1.0 + * @example ​ ````Insert all paragraphs before an element with id of "foo". Same as $( "#foo" ).before( "p" ) +```html + + + + + insertBefore demo + + + + +​ +
    FOO!
    +

    I would like to say:

    +​ + +​ + + +``` + */ + insertBefore(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; + /** + * Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments. + * @param selector_function_selection_elements _@param_ `selector_function_selection_elements` + *
    + * * `selector` — A string containing a selector expression to match elements against.
    + * * `function` — A function used as a test for every element in the set. It accepts two arguments, `index`, which is + * the element's index in the jQuery collection, and `element`, which is the DOM element. Within the + * function, `this` refers to the current DOM element.
    + * * `selection` — An existing jQuery object to match the current set of elements against.
    + * * `elements` — One or more elements to match the current set of elements against. + * @see \`{@link https://api.jquery.com/is/ }\` + * @since 1.0 + * @since 1.6 + * @example ​ ````Shows a few ways is() can be used inside an event handler. +```html + + + + + is demo + + + + +​ +
    +
    +
    +
    +

    Peter
    +
    +

     

    +​ + +​ + + +``` + * @example ​ ````Returns true, because the parent of the input is a form element. +```html + + + + + is demo + + + + +​ +
    + +
    +
    +​ + +​ + + +``` + * @example ​ ````Returns false, because the parent of the input is a p element. +```html + + + + + is demo + + + + +​ +
    +

    +
    +
    +​ + +​ + + +``` + * @example ​ ````Checks against an existing collection of alternating list elements. Blue, alternating list elements slide up while others turn red. +```html + + + + + is demo + + + + +​ +
      +
    • Chrome
    • +
    • Safari
    • +
    • Firefox
    • +
    • Opera
    • +
    +​ + +​ + + +``` + * @example ​ ````An alternate way to achieve the above example using an element rather than a jQuery object. Checks against an existing collection of alternating list elements. Blue, alternating list elements slide up while others turn red. +```html + + + + + is demo + + + + +​ +
      +
    • Chrome
    • +
    • Safari
    • +
    • Firefox
    • +
    • Opera
    • +
    +​ + +​ + + +``` + */ + is(selector_function_selection_elements: JQuery.Selector | JQuery.TypeOrArray | JQuery | ((this: TElement, index: number, element: TElement) => boolean)): boolean; + /** + * Bind an event handler to the "keydown" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/keydown/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + keydown(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "keydown" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/keydown/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the event object for the keydown handler when a key is pressed in the input. +```html + + + + + keydown demo + + + + +​ +
    +
    + + +
    +
    + + +​ + +​ + + +``` + */ + keydown(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to the "keypress" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/keypress/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + keypress(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "keypress" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/keypress/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the event object when a key is pressed in the input. Note: This demo relies on a simple $.print() plugin (https://api.jquery.com/resources/events.js) for the event object's output. +```html + + + + + keypress demo + + + + +​ +
    +
    + + +
    +
    + + +​ + +​ + + +``` + */ + keypress(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to the "keyup" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/keyup/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + keyup(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "keyup" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/keyup/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the event object for the keyup handler (using a simple $.print plugin) when a key is released in the input. +```html + + + + + keyup demo + + + + +​ +
    +
    + + +
    +
    + + +​ + +​ + + +``` + */ + keyup(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Reduce the set of matched elements to the final one in the set. + * @see \`{@link https://api.jquery.com/last/ }\` + * @since 1.4 + * @example ​ ````Highlight the last span in a paragraph. +```html + + + + + last demo + + + + +​ +

    Look: This is some text in a paragraph. This is a note about it.

    +​ + +​ + + +``` + */ + last(): this; + + /** + * Reduce the set of matched elements to the even ones in the set, numbered from zero. + * @see \`{@link https://api.jquery.com/even/ }\` + * @since 3.5 + * @example ​ ````Highlight the even items in a list. +```html + + + + + even demo + + + + + +
      +
    • Look:
    • +
    • This is some text in a list.
    • +
    • This is a note about it.
    • +
    • This is another note about it.
    • +
    + + + + + +``` + */ + even(): this; + + /** + * Reduce the set of matched elements to the odd ones in the set, numbered from zero. + * @see \`{@link https://api.jquery.com/odd/ }\` + * @since 3.5 + * @example ​ ````Highlight the odd items in a list. +```html + + + + + odd demo + + + + + +
      +
    • Look:
    • +
    • This is some text in a list.
    • +
    • This is a note about it.
    • +
    • This is another note about it.
    • +
    + + + + + +``` + */ + odd(): this; + + /** + * Load data from the server and place the returned HTML into the matched element. + * @param url A string containing the URL to which the request is sent. + * @param data A plain object or string that is sent to the server with the request. + * @param complete A callback function that is executed when the request completes. + * @see \`{@link https://api.jquery.com/load/ }\` + * @since 1.0 + * @example ​ ````Same as above, but will POST the additional parameters to the server and a callback that is executed when the server is finished responding. +```javascript +$( "#feeds" ).load( "feeds.php", { limit: 25 }, function() { + alert( "The last 25 entries in the feed have been loaded" ); +}); +``` + */ + load(url: string, + data: string | JQuery.PlainObject, + complete: (this: TElement, responseText: string, textStatus: JQuery.Ajax.TextStatus, jqXHR: JQuery.jqXHR) => void): this; + /** + * Load data from the server and place the returned HTML into the matched element. + * @param url A string containing the URL to which the request is sent. + * @param complete_data _@param_ `complete_data` + *
    + * * `complete` — A callback function that is executed when the request completes.
    + * * `data` — A plain object or string that is sent to the server with the request. + * @see \`{@link https://api.jquery.com/load/ }\` + * @since 1.0 + * @example ​ ````Load another page's list items into an ordered list. +```html + + + + + load demo + + + + +​ +Projects: +
      +​ + +​ + + +``` + * @example ​ ````Display a notice if the Ajax request encounters an error. +```html + + + + + load demo + + + + +​ +Successful Response (should be blank): +
      +Error Response: +
      +​ + +​ + + +``` + * @example ​ ````Load the feeds.html file into the div with the ID of feeds. +```javascript +$( "#feeds" ).load( "feeds.html" ); +``` + * @example ​ ````pass arrays of data to the server. +```javascript +$( "#objectID" ).load( "test.php", { "choices[]": [ "Jon", "Susan" ] } ); +``` + */ + load(url: string, + complete_data?: ((this: TElement, responseText: string, textStatus: JQuery.Ajax.TextStatus, jqXHR: JQuery.jqXHR) => void) | string | JQuery.PlainObject): this; + /** + * Pass each element in the current matched set through a function, producing a new jQuery object containing the return values. + * @param callback A function object that will be invoked for each element in the current set. + * @see \`{@link https://api.jquery.com/map/ }\` + * @since 1.2 + * @example ​ ````Build a list of all the values within a form. +```html + + + + + map demo + + + + +​ +

      Values:

      +
      + + + +
      +​ + +​ + + +``` + * @example ​ ````A contrived example to show some functionality. +```html + + + + + map demo + + + + +​ +
        +
      • First
      • +
      • Second
      • +
      • Third
      • +
      • Fourth
      • +
      • Fifth
      • +
      +
        +
      +​ + +​ + + +``` + * @example ​ ````Equalize the heights of the divs. +```html + + + + + map demo + + + + +​ + +
      +
      +
      +​ + +​ + + +``` + */ + map(callback: (this: TElement, index: number, domElement: TElement) => JQuery.TypeOrArray | null | undefined): JQuery; + /** + * Bind an event handler to the "mousedown" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mousedown/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + mousedown(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "mousedown" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mousedown/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show texts when mouseup and mousedown event triggering. +```html + + + + + mousedown demo + + + +​ +

      Press mouse and release here.

      +​ + +​ + + +``` + */ + mousedown(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mouseenter/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + mouseenter(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mouseenter/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show texts when mouseenter and mouseout event triggering. + mouseover fires when the pointer moves into the child element as well, while mouseenter fires only when the pointer moves into the bound element. +```html + + + + + mouseenter demo + + + + +​ +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +​ +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +​ + +​ + + +``` + */ + mouseenter(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mouseleave/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + mouseleave(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mouseleave/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show number of times mouseout and mouseleave events are triggered. mouseout fires when the pointer moves out of child element as well, while mouseleave fires only when the pointer moves out of the bound element. +```html + + + + + mouseleave demo + + + + +​ +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +​ + +​ + + +``` + */ + mouseleave(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to the "mousemove" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mousemove/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + mousemove(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "mousemove" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mousemove/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the mouse coordinates when the mouse is moved over the yellow div. Coordinates are relative to the window, which in this case is the iframe. +```html + + + + + mousemove demo + + + + +​ +

      + Move the mouse over the div. +   +

      +
      +​ + +​ + + +``` + */ + mousemove(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to the "mouseout" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mouseout/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + mouseout(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "mouseout" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mouseout/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the number of times mouseout and mouseleave events are triggered. + mouseout fires when the pointer moves out of the child element as well, while mouseleave fires only when the pointer moves out of the bound element. +```html + + + + + mouseout demo + + + + +​ +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +​ +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +​ + +​ + + +``` + */ + mouseout(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to the "mouseover" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mouseover/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + mouseover(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "mouseover" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mouseover/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the number of times mouseover and mouseenter events are triggered. +mouseover fires when the pointer moves into the child element as well, while mouseenter fires only when the pointer moves into the bound element. +```html + + + + + mouseover demo + + + + +​ +
      + move your mouse +
      +
      +
      +​ +
      + move your mouse +
      +
      +
      +​ + +​ + + +``` + */ + mouseover(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to the "mouseup" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mouseup/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + mouseup(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "mouseup" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/mouseup/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show texts when mouseup and mousedown event triggering. +```html + + + + + mouseup demo + + + +​ +

      Press mouse and release here.

      +​ + +​ + + +``` + */ + mouseup(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector. + * @param selector A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/next/ }\` + * @since 1.0 + * @example ​ ````Find the very next sibling of each disabled button and change its text "this button is disabled". +```html + + + + + next demo + + + + +​ +
      -
      +
      -
      +
      -
      +​ + +​ + + +``` + * @example ​ ````Find the very next sibling of each paragraph. Keep only the ones with a class "selected". +```html + + + + + next demo + + + +​ +

      Hello

      +

      Hello Again

      +
      And Again
      +​ + +​ + + +``` + */ + next(selector?: JQuery.Selector): this; + /** + * Get all following siblings of each element in the set of matched elements, optionally filtered by a selector. + * @param selector A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/nextAll/ }\` + * @since 1.2 + * @example ​ ````Locate all the divs after the first and give them a class. +```html + + + + + nextAll demo + + + + +​ +
      first
      +
      sibling
      child
      +
      sibling
      +
      sibling
      ​ + +​ + + +``` + * @example ​ ````Locate all the paragraphs after the second child in the body and give them a class. +```html + + + + + nextAll demo + + + + +​ +

      p

      +
      div
      +

      p

      +

      p

      +
      div
      +

      p

      +
      div
      +​ + +​ + + +``` + */ + nextAll(selector?: string): this; + /** + * Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed. + * @param selector_element _@param_ `selector_element` + *
      + * * `selector` — A string containing a selector expression to indicate where to stop matching following sibling elements.
      + * * `element` — A DOM node or jQuery object indicating where to stop matching following sibling elements. + * @param filter A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/nextUntil/ }\` + * @since 1.4 + * @since 1.6 + * @example ​ ````Find the siblings that follow <dt id="term-2"> up to the next <dt> and give them a red background color. Also, find <dd> siblings that follow <dt id="term-1"> up to <dt id="term-3"> and give them a green text color. +```html + + + + + nextUntil demo + + + +​ +
      +
      term 1
      +
      definition 1-a
      +
      definition 1-b
      +
      definition 1-c
      +
      definition 1-d
      +
      term 2
      +
      definition 2-a
      +
      definition 2-b
      +
      definition 2-c
      +
      term 3
      +
      definition 3-a
      +
      definition 3-b
      +
      +​ + +​ + + +``` + */ + nextUntil(selector_element?: JQuery.Selector | Element | JQuery, filter?: JQuery.Selector): this; + /** + * Remove elements from the set of matched elements. + * @param selector_function_selection _@param_ `selector_function_selection` + *
      + * * `selector` — A string containing a selector expression, a DOM element, or an array of elements to match against the set.
      + * * `function` — A function used as a test for each element in the set. It accepts two arguments, `index`, which is + * the element's index in the jQuery collection, and `element`, which is the DOM element. Within the + * function, `this` refers to the current DOM element.
      + * * `selection` — An existing jQuery object to match the current set of elements against. + * @see \`{@link https://api.jquery.com/not/ }\` + * @since 1.0 + * @since 1.4 + * @example ​ ````Adds a border to divs that are not green or blue. +```html + + + + + not demo + + + + +​ +
      +
      +
      +
      +
      +
      +
      +​ + +​ + + +``` + * @example ​ ````Removes the element with the ID "selected" from the set of all paragraphs. +```javascript +$( "p" ).not( $( "#selected" )[ 0 ] ); +``` + * @example ​ ````Removes the element with the ID "selected" from the set of all paragraphs. +```javascript +$( "p" ).not( "#selected" ); +``` + * @example ​ ````Removes all elements that match "div p.selected" from the total set of all paragraphs. +```javascript +$( "p" ).not( $( "div p.selected" ) ); +``` + */ + not(selector_function_selection: JQuery.Selector | JQuery.TypeOrArray | JQuery | ((this: TElement, index: number, element: TElement) => boolean)): this; + /** + * Remove an event handler. + * @param events One or more space-separated event types and optional namespaces, or just namespaces, such as + * "click", "keydown.myPlugin", or ".myPlugin". + * @param selector A selector which should match the one originally passed to .on() when attaching event handlers. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/off/ }\` + * @since 1.7 + * @example ​ ````Add and remove event handlers on the colored button. +```html + + + + + off demo + + + + +​ + + + +
      Click!
      +​ + +​ + + +``` + * @example ​ ````Remove just one previously bound handler by passing it as the third argument: +```javascript +var foo = function() { + // Code to handle some kind of event +}; +​ +// ... Now foo will be called when paragraphs are clicked ... +$( "body" ).on( "click", "p", foo ); +​ +// ... Foo will no longer be called. +$( "body" ).off( "click", "p", foo ); +``` + */ + off( + events: TType, + selector: JQuery.Selector, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Remove an event handler. + * @param events One or more space-separated event types and optional namespaces, or just namespaces, such as + * "click", "keydown.myPlugin", or ".myPlugin". + * @param selector_handler _@param_ `selector_handler` + *
      + * * `selector` — A selector which should match the one originally passed to `.on()` when attaching event handlers.
      + * * `handler` — A handler function previously attached for the event(s), or the special value `false`. + * @see \`{@link https://api.jquery.com/off/ }\` + * @since 1.7 + * @example ​ ````Remove all delegated click handlers from all paragraphs: +```javascript +$( "p" ).off( "click", "**" ); +``` + * @example ​ ````Unbind all delegated event handlers by their namespace: +```javascript +var validate = function() { + // Code to validate form entries +}; +​ +// Delegate events under the ".validator" namespace +$( "form" ).on( "click.validator", "button", validate ); +​ +$( "form" ).on( "keypress.validator", "input[type='text']", validate ); +​ +// Remove event handlers in the ".validator" namespace +$( "form" ).off( ".validator" ); +``` + */ + off( + events: TType, + selector_handler?: JQuery.Selector | + JQuery.TypeEventHandler | + false + ): this; + /** + * Remove an event handler. + * @param events An object where the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent handler functions previously attached for the event(s). + * @param selector A selector which should match the one originally passed to .on() when attaching event handlers. + * @see \`{@link https://api.jquery.com/off/ }\` + * @since 1.7 + */ + off(events: JQuery.TypeEventHandlers, + selector?: JQuery.Selector): this; + /** + * Remove an event handler. + * @param event A jQuery.Event object. + * @see \`{@link https://api.jquery.com/off/ }\` + * @since 1.7 + * @example ​ ````Remove all event handlers from all paragraphs: +```javascript +$( "p" ).off(); +``` + */ + off(event?: JQuery.TriggeredEvent): this; + /** + * Set the current coordinates of every element in the set of matched elements, relative to the document. + * @param coordinates_function _@param_ `coordinates_function` + *
      + * * `coordinates` — An object containing the properties `top` and `left`, which are numbers indicating the new top and + * left coordinates for the elements.
      + * * `function` — A function to return the coordinates to set. Receives the index of the element in the collection as + * the first argument and the current coordinates as the second argument. The function should return an + * object with the new `top` and `left` properties. + * @see \`{@link https://api.jquery.com/offset/ }\` + * @since 1.4 + * @example ​ ````Set the offset of the second paragraph: +```html + + + + + offset demo + + + + +​ +

      Hello

      2nd Paragraph

      +​ + +​ + + +``` + */ + offset(coordinates_function: JQuery.CoordinatesPartial | ((this: TElement, index: number, coords: JQuery.Coordinates) => JQuery.CoordinatesPartial)): this; + /** + * Get the current coordinates of the first element in the set of matched elements, relative to the document. + * @see \`{@link https://api.jquery.com/offset/ }\` + * @since 1.2 + * @example ​ ````Access the offset of the second paragraph: +```html + + + + + offset demo + + + + +​ +

      Hello

      2nd Paragraph

      +​ + +​ + + +``` + * @example ​ ````Click to see the offset. +```html + + + + + offset demo + + + + +​ +
      Click an element.
      +

      + This is the best way to find an offset. +

      +
      +
      +​ + +​ + + +``` + */ + offset(): JQuery.Coordinates | undefined; + /** + * Get the closest ancestor element that is positioned. + * @see \`{@link https://api.jquery.com/offsetParent/ }\` + * @since 1.2.6 + * @example ​ ````Find the offsetParent of item "A." +```html + + + + + offsetParent demo + + + +​ +
        +
      • I
      • +
      • II +
          +
        • A
        • +
        • B +
            +
          • 1
          • +
          • 2
          • +
          • 3
          • +
          +
        • +
        • C
        • +
        +
      • +
      • III
      • +
      +​ + +​ + + +``` + */ + offsetParent(): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + */ + on( + events: TType, + selector: JQuery.Selector, + data: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + */ + on( + events: TType, + selector: null | undefined, + data: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\` in place of \`{@link JQueryEventObject }\`. + */ + on(events: string, + selector: JQuery.Selector | null | undefined, + data: any, + handler: ((event: JQueryEventObject) => void)): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand + * for a function that simply does return false. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @example ​ ````Click any paragraph to add another after it. Note that .on() allows a click event on any paragraph--even new ones--since the event is handled by the ever-present body element after it bubbles to there. +```html + + + + + on demo + + + + +​ +

      Click me!

      + +​ + +​ + + +``` + * @example ​ ````Display each paragraph's text in an alert box whenever it is clicked: +```javascript +$( "body" ).on( "click", "p", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Cancel a link's default action using the .preventDefault() method: +```javascript +$( "body" ).on( "click", "a", function( event ) { + event.preventDefault(); +}); +``` + */ + on( + events: TType, + selector: JQuery.Selector, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @example ​ ````Pass data to the event handler, which is specified here by name: +```javascript +function myHandler( event ) { + alert( event.data.foo ); +} +$( "p" ).on( "click", { foo: "bar" }, myHandler ); +``` + */ + on( + events: TType, + data: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector_data _@param_ `selector_data` + *
      + * * `selector` — A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element.
      + * * `data` — Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\` in place of \`{@link JQueryEventObject }\`. + * @example ​ ````Click any paragraph to add another after it. Note that .on() allows a click event on any paragraph--even new ones--since the event is handled by the ever-present body element after it bubbles to there. +```html + + + + + on demo + + + + +​ +

      Click me!

      + +​ + +​ + + +``` + * @example ​ ````Display each paragraph's text in an alert box whenever it is clicked: +```javascript +$( "body" ).on( "click", "p", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Cancel a link's default action using the .preventDefault() method: +```javascript +$( "body" ).on( "click", "a", function( event ) { + event.preventDefault(); +}); +``` + * @example ​ ````Pass data to the event handler, which is specified here by name: +```javascript +function myHandler( event ) { + alert( event.data.foo ); +} +$( "p" ).on( "click", { foo: "bar" }, myHandler ); +``` + */ + on(events: string, + selector_data: any, + handler: ((event: JQueryEventObject) => void)): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand + * for a function that simply does return false. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @example ​ ````Display a paragraph's text in an alert when it is clicked: +```javascript +$( "p" ).on( "click", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Cancel a form submit action and prevent the event from bubbling up by returning false: +```javascript +$( "form" ).on( "submit", false ); +``` + * @example ​ ````Cancel only the default action by using .preventDefault(). +```javascript +$( "form" ).on( "submit", function( event ) { + event.preventDefault(); +}); +``` + * @example ​ ````Stop submit events from bubbling without preventing form submit, using .stopPropagation(). +```javascript +$( "form" ).on( "submit", function( event ) { + event.stopPropagation(); +}); +``` + * @example ​ ````Pass data to the event handler using the second argument to .trigger() +```javascript +$( "div" ).on( "click", function( event, person ) { + alert( "Hello, " + person.name ); +}); +$( "div" ).trigger( "click", { name: "Jim" } ); +``` + * @example ​ ````Use the the second argument of .trigger() to pass an array of data to the event handler +```javascript +$( "div" ).on( "click", function( event, salutation, name ) { + alert( salutation + ", " + name ); +}); +$( "div" ).trigger( "click", [ "Goodbye", "Jim" ] ); +``` + * @example ​ ````Attach and trigger custom (non-browser) events. +```html + + + + + on demo + + + + +​ +

      Has an attached custom event.

      + + +​ + +​ + + +``` + * @example ​ ````Attach multiple events—one on mouseenter and one on mouseleave to the same element: +```javascript +$( "#cart" ).on( "mouseenter mouseleave", function( event ) { + $( this ).toggleClass( "active" ); +}); +``` + */ + on( + events: TType, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\` in place of \`{@link JQueryEventObject }\`. + * @example ​ ````Display a paragraph's text in an alert when it is clicked: +```javascript +$( "p" ).on( "click", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Cancel a form submit action and prevent the event from bubbling up by returning false: +```javascript +$( "form" ).on( "submit", false ); +``` + * @example ​ ````Cancel only the default action by using .preventDefault(). +```javascript +$( "form" ).on( "submit", function( event ) { + event.preventDefault(); +}); +``` + * @example ​ ````Stop submit events from bubbling without preventing form submit, using .stopPropagation(). +```javascript +$( "form" ).on( "submit", function( event ) { + event.stopPropagation(); +}); +``` + * @example ​ ````Pass data to the event handler using the second argument to .trigger() +```javascript +$( "div" ).on( "click", function( event, person ) { + alert( "Hello, " + person.name ); +}); +$( "div" ).trigger( "click", { name: "Jim" } ); +``` + * @example ​ ````Use the the second argument of .trigger() to pass an array of data to the event handler +```javascript +$( "div" ).on( "click", function( event, salutation, name ) { + alert( salutation + ", " + name ); +}); +$( "div" ).trigger( "click", [ "Goodbye", "Jim" ] ); +``` + * @example ​ ````Attach and trigger custom (non-browser) events. +```html + + + + + on demo + + + + +​ +

      Has an attached custom event.

      + + +​ + +​ + + +``` + * @example ​ ````Attach multiple events—one on mouseenter and one on mouseleave to the same element: +```javascript +$( "#cart" ).on( "mouseenter mouseleave", function( event ) { + $( this ).toggleClass( "active" ); +}); +``` + */ + on(events: string, + handler: ((event: JQueryEventObject) => void)): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If + * the selector is null or omitted, the handler is always called when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event occurs. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + */ + on( + events: JQuery.TypeEventHandlers, + selector: JQuery.Selector, + data: TData + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If + * the selector is null or omitted, the handler is always called when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event occurs. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + */ + on( + events: JQuery.TypeEventHandlers, + selector: null | undefined, + data: TData + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If + * the selector is null or omitted, the handler is always called when it reaches the selected element. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + */ + on(events: JQuery.TypeEventHandlers, + selector: JQuery.Selector + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param data Data to be passed to the handler in event.data when an event occurs. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + */ + on( + events: JQuery.TypeEventHandlers, + data: TData + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @example ​ ````Attach multiple event handlers simultaneously using a plain object. +```html + + + + + on demo + + + + +​ +
      test div
      +​ + +​ + + +``` + */ + on(events: JQuery.TypeEventHandlers): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: TType, + selector: JQuery.Selector, + data: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: TType, + selector: null | undefined, + data: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand + * for a function that simply does return false. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: TType, + selector: JQuery.Selector, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: TType, + data: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand + * for a function that simply does return false. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + * @example ​ ````Tie a one-time click to each div. +```html + + + + + one demo + + + + +​ +
      +
      +
      +
      +
      +

      Click a green square...

      +​ + +​ + + +``` + * @example ​ ````To display the text of all paragraphs in an alert box the first time each of them is clicked: +```javascript +$( "p" ).one( "click", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Event handlers will trigger once per element per event type +```html + + + + + one demo + + + +​ +
      0
      +
      Hover/click me
      +​ + +​ + + +``` + */ + one( + events: TType, + handler: JQuery.TypeEventHandler| + false + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If + * the selector is null or omitted, the handler is always called when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event occurs. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: JQuery.TypeEventHandlers, + selector: JQuery.Selector, + data: TData + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If + * the selector is null or omitted, the handler is always called when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event occurs. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: JQuery.TypeEventHandlers, + selector: null | undefined, + data: TData + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If + * the selector is null or omitted, the handler is always called when it reaches the selected element. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one(events: JQuery.TypeEventHandlers, + selector: JQuery.Selector): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param data Data to be passed to the handler in event.data when an event occurs. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: JQuery.TypeEventHandlers, + data: TData + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one(events: JQuery.TypeEventHandlers): this; + /** + * Set the CSS outer height of each element in the set of matched elements. + * @param value_function _@param_ `value_function` + *
      + * * `value` — A number representing the number of pixels, or a number along with an optional unit of measure + * appended (as a string).
      + * * `function` — A function returning the outer height to set. Receives the index position of the element in the set + * and the old outer height as arguments. Within the function, `this` refers to the current element in + * the set. + * @see \`{@link https://api.jquery.com/outerHeight/ }\` + * @since 1.8.0 + * @example ​ ````Change the outer height of each div the first time it is clicked (and change its color). +```html + + + + + outerHeight demo + + + + +​ +
      d
      +
      d
      +
      d
      +
      d
      +
      d
      +​ + +​ + + +``` + */ + outerHeight(value_function: string | number | ((this: TElement, index: number, height: number) => string | number), + includeMargin?: boolean): this; + /** + * Get the current computed outer height (including padding, border, and optionally margin) for the first element in the set of matched elements. + * @param includeMargin A Boolean indicating whether to include the element's margin in the calculation. + * @see \`{@link https://api.jquery.com/outerHeight/ }\` + * @since 1.2.6 + * @example ​ ````Get the outerHeight of a paragraph. +```html + + + + + outerHeight demo + + + + +​ +

      Hello

      +​ + +​ + + +``` + */ + outerHeight(includeMargin?: boolean): number | undefined; + /** + * Set the CSS outer width of each element in the set of matched elements. + * @param value_function _@param_ `value_function` + *
      + * * `value` — A number representing the number of pixels, or a number along with an optional unit of measure + * appended (as a string).
      + * * `function` — A function returning the outer width to set. Receives the index position of the element in the set + * and the old outer width as arguments. Within the function, `this` refers to the current element in + * the set. + * @see \`{@link https://api.jquery.com/outerWidth/ }\` + * @since 1.8.0 + * @example ​ ````Change the outer width of each div the first time it is clicked (and change its color). +```html + + + + + outerWidth demo + + + + +​ +
      d
      +
      d
      +
      d
      +
      d
      +
      d
      +​ + +​ + + +``` + */ + outerWidth(value_function: string | number | ((this: TElement, index: number, width: number) => string | number), + includeMargin?: boolean): this; + /** + * Get the current computed outer width (including padding, border, and optionally margin) for the first element in the set of matched elements. + * @param includeMargin A Boolean indicating whether to include the element's margin in the calculation. + * @see \`{@link https://api.jquery.com/outerWidth/ }\` + * @since 1.2.6 + * @example ​ ````Get the outerWidth of a paragraph. +```html + + + + + outerWidth demo + + + + +​ +

      Hello

      +​ + +​ + + +``` + */ + outerWidth(includeMargin?: boolean): number | undefined; + /** + * Get the parent of each element in the current set of matched elements, optionally filtered by a selector. + * @param selector A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/parent/ }\` + * @since 1.0 + * @example ​ ````Shows the parent of each element as (parent > child). Check the View Source to see the raw html. +```html + + + + + parent demo + + + + +​ +
      div, + span, + b +
      +​ +

      p, + span, + em + +

      +​ +
      div, + strong, + span, + em, + b, + + + b +
      +​ + +​ + + +``` + * @example ​ ````Find the parent element of each paragraph with a class "selected". +```html + + + + + parent demo + + + +​ +

      Hello

      +

      Hello Again

      +​ + +​ + + +``` + */ + parent(selector?: JQuery.Selector): this; + /** + * Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector. + * @param selector A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/parents/ }\` + * @since 1.0 + * @example ​ ````Find all parent elements of each b. +```html + + + + + parents demo + + + + +​ +
      +

      + + My parents are: + +

      +
      +​ + +​ + + +``` + * @example ​ ````Click to find all unique div parent elements of each span. +```html + + + + + parents demo + + + + +​ +

      +

      +
      Hello
      + Hello Again +
      +
      + And Hello Again +
      +

      + Click Hellos to toggle their parents. +​ + +​ + + +``` + */ + parents(selector: K | JQuery): JQuery; + parents(selector: K | JQuery): JQuery; + // tslint:disable-next-line:no-unnecessary-generics + parents(selector?: JQuery.Selector): JQuery; + /** + * Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object. + * @param selector_element _@param_ `selector_element` + *
      + * * `selector` — A string containing a selector expression to indicate where to stop matching ancestor elements.
      + * * `element` — A DOM node or jQuery object indicating where to stop matching ancestor elements. + * @param filter A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/parentsUntil/ }\` + * @since 1.4 + * @since 1.6 + * @example ​ ````Find the ancestors of <li class="item-a"> up to <ul class="level-1"> and give them a red background color. Also, find ancestors of <li class="item-2"> that have a class of "yes" up to <ul class="level-1"> and give them a green border. +```html + + + + + parentsUntil demo + + + +​ +
        +
      • I
      • +
      • II +
          +
        • A
        • +
        • B +
            +
          • 1
          • +
          • 2
          • +
          • 3
          • +
          +
        • +
        • C
        • +
        +
      • +
      • III
      • +
      +​ + +​ + + +``` + */ + parentsUntil(selector_element?: JQuery.Selector | Element | JQuery, filter?: JQuery.Selector): this; + /** + * Get the current coordinates of the first element in the set of matched elements, relative to the offset parent. + * @see \`{@link https://api.jquery.com/position/ }\` + * @since 1.2 + * @example ​ ````Access the position of the second paragraph: +```html + + + + + position demo + + + + +​ +
      +

      Hello

      +
      +

      +​ + +​ + + +``` + */ + position(): JQuery.Coordinates; + /** + * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. + * @param contents One or more additional DOM elements, text nodes, arrays of elements and text nodes, HTML strings, or + * jQuery objects to insert at the beginning of each element in the set of matched elements. + * @see \`{@link https://api.jquery.com/prepend/ }\` + * @since 1.0 + * @example ​ ````Prepends some HTML to all paragraphs. +```html + + + + + prepend demo + + + + +​ +

      there, friend!

      +

      amigo!

      +​ + +​ + + +``` + * @example ​ ````Prepends a DOM Element to all paragraphs. +```html + + + + + prepend demo + + + + +​ +

      is what I'd say

      +

      is what I said

      +​ + +​ + + +``` + * @example ​ ````Prepends a jQuery object (similar to an Array of DOM Elements) to all paragraphs. +```html + + + + + prepend demo + + + + +​ +

      is what was said.

      Hello +​ + +​ + + +``` + */ + prepend(...contents: Array>>): this; + /** + * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. + * @param funсtion A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert at + * the beginning of each element in the set of matched elements. Receives the index position of the + * element in the set and the old HTML value of the element as arguments. Within the function, `this` + * refers to the current element in the set. + * @see \`{@link https://api.jquery.com/prepend/ }\` + * @since 1.4 + */ + prepend(funсtion: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; + /** + * Insert every element in the set of matched elements to the beginning of the target. + * @param target A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements + * will be inserted at the beginning of the element(s) specified by this parameter. + * @see \`{@link https://api.jquery.com/prependTo/ }\` + * @since 1.0 + * @example ​ ````Prepend all spans to the element with the ID "foo" (Check .prepend() documentation for more examples) +```html + + + + + prependTo demo + + + + +​ +
      FOO!
      +I have something to say... +​ + +​ + + +``` + */ + prependTo(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; + /** + * Get the immediately preceding sibling of each element in the set of matched elements. If a selector is provided, it retrieves the previous sibling only if it matches that selector. + * @param selector A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/prev/ }\` + * @since 1.0 + * @example ​ ````Find the very previous sibling of each div. +```html + + + + + prev demo + + + + +​ +
      +
      +
      has child
      +
      +
      +
      +
      +
      +

      +​ + +​ + + +``` + * @example ​ ````For each paragraph, find the very previous sibling that has a class "selected". +```html + + + + + prev demo + + + +​ +
      Hello
      +

      Hello Again

      +

      And Again

      +​ + +​ + + +``` + */ + prev(selector?: JQuery.Selector): this; + /** + * Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector. + * @param selector A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/prevAll/ }\` + * @since 1.2 + * @example ​ ````Locate all the divs preceding the last div and give them a class. +```html + + + + + prevAll demo + + + + +​ +
      +
      +
      +
      +​ + +​ + + +``` + */ + prevAll(selector?: JQuery.Selector): this; + /** + * Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object. + * @param selector_element _@param_ `selector_element` + *
      + * * `selector` — A string containing a selector expression to indicate where to stop matching preceding sibling elements.
      + * * `element` — A DOM node or jQuery object indicating where to stop matching preceding sibling elements. + * @param filter A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/prevUntil/ }\` + * @since 1.4 + * @since 1.6 + * @example ​ ````Find the siblings that precede <dt id="term-2"> up to the preceding <dt> and give them a red background color. Also, find previous <dd> siblings of <dt id="term-3"> up to <dt id="term-1"> and give them a green text color. +```html + + + + + prevUntil demo + + + +​ +
      +
      term 1
      +
      definition 1-a
      +
      definition 1-b
      +
      definition 1-c
      +
      definition 1-d
      +​ +
      term 2
      +
      definition 2-a
      +
      definition 2-b
      +
      definition 2-c
      +​ +
      term 3
      +
      definition 3-a
      +
      definition 3-b
      +
      +​ + +​ + + +``` + */ + prevUntil(selector_element?: JQuery.Selector | Element | JQuery, filter?: JQuery.Selector): this; + /** + * Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished. + * @param type The type of queue that needs to be observed. + * @param target Object onto which the promise methods have to be attached + * @see \`{@link https://api.jquery.com/promise/ }\` + * @since 1.6 + */ + promise(type: string, target: T): T & JQuery.Promise; + /** + * Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished. + * @param target Object onto which the promise methods have to be attached + * @see \`{@link https://api.jquery.com/promise/ }\` + * @since 1.6 + */ + promise(target: T): T & JQuery.Promise; + /** + * Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished. + * @param type The type of queue that needs to be observed. + * @see \`{@link https://api.jquery.com/promise/ }\` + * @since 1.6 + * @example ​ ````Using .promise() on a collection with no active animation returns a resolved Promise: +```javascript +var div = $( "
      " ); +​ +div.promise().done(function( arg1 ) { + // Will fire right away and alert "true" + alert( this === div && arg1 === div ); +}); +``` + * @example ​ ````Resolve the returned Promise when all animations have ended (including those initiated in the animation callback or added later on): +```html + + + + + promise demo + + + + +​ + +

      Ready...

      +
      +
      +
      +
      +​ + +​ + + +``` + * @example ​ ````Resolve the returned Promise using a $.when() statement (the .promise() method makes it possible to do this with jQuery collections): +```html + + + + + promise demo + + + + +​ + +

      Ready...

      +
      +
      +
      +
      +​ + +​ + + +``` + */ + promise(type?: string): JQuery.Promise; + /** + * Set one or more properties for the set of matched elements. + * @param propertyName The name of the property to set. + * @param value_function _@param_ `value_function` + *
      + * * `value` — A value to set for the property.
      + * * `function` — A function returning the value to set. Receives the index position of the element in the set and the + * old property value as arguments. Within the function, the keyword `this` refers to the current element. + * @see \`{@link https://api.jquery.com/prop/ }\` + * @since 1.6 + */ + prop(propertyName: string, + value_function: string | number | boolean | symbol | object | null | undefined | ((this: TElement, index: number, oldPropertyValue: any) => any)): this; + /** + * Set one or more properties for the set of matched elements. + * @param properties An object of property-value pairs to set. + * @see \`{@link https://api.jquery.com/prop/ }\` + * @since 1.6 + * @example ​ ````Disable all checkboxes on the page. +```html + + + + + prop demo + + + + +​ + + + + +​ + +​ + + +``` + */ + prop(properties: JQuery.PlainObject): this; + /** + * Get the value of a property for the first element in the set of matched elements. + * @param propertyName The name of the property to get. + * @see \`{@link https://api.jquery.com/prop/ }\` + * @since 1.6 + * @example ​ ````Display the checked property and attribute of a checkbox as it changes. +```html + + + + + prop demo + + + + +​ + + +

      +​ + +​ + + +``` + */ + prop(propertyName: string): any; + /** + * Add a collection of DOM elements onto the jQuery stack. + * @param elements An array of elements to push onto the stack and make into a new jQuery object. + * @param name The name of a jQuery method that generated the array of elements. + * @param args The arguments that were passed in to the jQuery method (for serialization). + * @see \`{@link https://api.jquery.com/pushStack/ }\` + * @since 1.3 + */ + pushStack(elements: ArrayLike, name: string, args: any[]): this; + /** + * Add a collection of DOM elements onto the jQuery stack. + * @param elements An array of elements to push onto the stack and make into a new jQuery object. + * @see \`{@link https://api.jquery.com/pushStack/ }\` + * @since 1.0 + * @example ​ ````Add some elements onto the jQuery stack, then pop back off again. +```javascript +jQuery([]) + .pushStack( document.getElementsByTagName( "div" ) ) + .remove() + .end(); +``` + */ + pushStack(elements: ArrayLike): this; + /** + * Manipulate the queue of functions to be executed, once for each matched element. + * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. + * @param newQueue The new function to add to the queue, with a function to call that will dequeue the next item. + * An array of functions to replace the current queue contents. + * @see \`{@link https://api.jquery.com/queue/ }\` + * @since 1.2 + * @example ​ ````Set a queue array to delete the queue. +```html + + + + + queue demo + + + + +​ + + +
      +​ + +​ + + +``` + */ + queue(queueName: string, newQueue: JQuery.TypeOrArray>): this; + /** + * Manipulate the queue of functions to be executed, once for each matched element. + * @param newQueue The new function to add to the queue, with a function to call that will dequeue the next item. + * An array of functions to replace the current queue contents. + * @see \`{@link https://api.jquery.com/queue/ }\` + * @since 1.2 + * @example ​ ````Queue a custom function. +```html + + + + + queue demo + + + + +​ +Click here... +
      +​ + +​ + + +``` + */ + queue(newQueue: JQuery.TypeOrArray>): this; + /** + * Show the queue of functions to be executed on the matched elements. + * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. + * @see \`{@link https://api.jquery.com/queue/ }\` + * @since 1.2 + * @example ​ ````Show the length of the queue. +```html + + + + + queue demo + + + + +​ +

      The queue length is:

      +
      +​ + +​ + + +``` + */ + queue(queueName?: string): JQuery.Queue; + /** + * Specify a function to execute when the DOM is fully loaded. + * @param handler A function to execute after the DOM is ready. + * @see \`{@link https://api.jquery.com/ready/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.0. Use `jQuery(function() { })`. + * @example ​ ````Display a message when the DOM is loaded. +```html + + + + + ready demo + + + + + +​ +

      Not loaded yet.

      +​ + + +``` + */ + ready(handler: ($: JQueryStatic) => void): this; + /** + * Remove the set of matched elements from the DOM. + * @param selector A selector expression that filters the set of matched elements to be removed. + * @see \`{@link https://api.jquery.com/remove/ }\` + * @since 1.0 + * @example ​ ````Removes all paragraphs from the DOM +```html + + + + + remove demo + + + + +​ +

      Hello

      +how are +

      you?

      + +​ + +​ + + +``` + * @example ​ ````Removes all paragraphs that contain "Hello" from the DOM. Analogous to doing $("p").filter(":contains('Hello')").remove(). +```html + + + + + remove demo + + + + +​ +

      Hello

      +how are +

      you?

      + +​ + +​ + + +``` + */ + remove(selector?: string): this; + /** + * Remove an attribute from each element in the set of matched elements. + * @param attributeName An attribute to remove; as of version 1.7, it can be a space-separated list of attributes. + * @see \`{@link https://api.jquery.com/removeAttr/ }\` + * @since 1.0 + * @example ​ ````Clicking the button changes the title of the input next to it. Move the mouse pointer over the text input to see the effect of adding and removing the title attribute. +```html + + + + + removeAttr demo + + + +​ + + +
      +​ + +​ + + +``` + */ + removeAttr(attributeName: string): this; + /** + * Remove a single class, multiple classes, or all classes from each element in the set of matched elements. + * @param className_function _@param_ `className_function` + *
      + * * `className` — One or more space-separated classes to be removed from the class attribute of each matched element.
      + * * `function` — A function returning one or more space-separated class names to be removed. Receives the index + * position of the element in the set and the old class value as arguments. + * @see \`{@link https://api.jquery.com/removeClass/ }\` + * @since 1.0 + * @since 1.4 + * @since 3.3 + * @example ​ ````Remove the class 'blue' from the matched elements. +```html + + + + + removeClass demo + + + + +​ +

      Hello

      +

      and

      +

      then

      +

      Goodbye

      +​ + +​ + + +``` + * @example ​ ````Remove the class 'blue' and 'under' from the matched elements. +```html + + + + + removeClass demo + + + + +​ +

      Hello

      +

      and

      +

      then

      +

      Goodbye

      +​ + +​ + + +``` + * @example ​ ````Remove all the classes from the matched elements. +```html + + + + + removeClass demo + + + + +​ +

      Hello

      +

      and

      +

      then

      +

      Goodbye

      +​ + +​ + + +``` + */ + removeClass(className_function?: JQuery.TypeOrArray | ((this: TElement, index: number, className: string) => string)): this; + /** + * Remove a previously-stored piece of data. + * @param name A string naming the piece of data to delete. + * An array or space-separated string naming the pieces of data to delete. + * @see \`{@link https://api.jquery.com/removeData/ }\` + * @since 1.2.3 + * @since 1.7 + * @example ​ ````Set a data store for 2 names then remove one of them. +```html + + + + + removeData demo + + + + +​ +
      value1 before creation:
      +
      value1 after creation:
      +
      value1 after removal:
      +
      value2 after removal:
      +​ + +​ + + +``` + */ + removeData(name?: JQuery.TypeOrArray): this; + /** + * Remove a property for the set of matched elements. + * @param propertyName The name of the property to remove. + * @see \`{@link https://api.jquery.com/removeProp/ }\` + * @since 1.6 + * @example ​ ````Set a numeric property on a paragraph and then remove it. +```html + + + + + removeProp demo + + + + +​ +

      +​ + +​ + + +``` + */ + removeProp(propertyName: string): this; + /** + * Replace each target element with the set of matched elements. + * @param target A selector string, jQuery object, DOM element, or array of elements indicating which element(s) to replace. + * @see \`{@link https://api.jquery.com/replaceAll/ }\` + * @since 1.2 + * @example ​ ````Replace all the paragraphs with bold words. +```html + + + + + replaceAll demo + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + */ + replaceAll(target: JQuery.Selector | JQuery | JQuery.TypeOrArray): this; + /** + * Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed. + * @param newContent_function _@param_ `newContent_function` + *
      + * * `newContent` — The content to insert. May be an HTML string, DOM element, array of DOM elements, or jQuery object.
      + * * `function` — A function that returns content with which to replace the set of matched elements. + * @see \`{@link https://api.jquery.com/replaceWith/ }\` + * @since 1.2 + * @since 1.4 + * @example ​ ````On click, replace the button with a div containing the same word. +```html + + + + + replaceWith demo + + + + +​ + + + +​ + +​ + + +``` + * @example ​ ````Replace all paragraphs with bold words. +```html + + + + + replaceWith demo + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````On click, replace each paragraph with a div that is already in the DOM and selected with the $() function. Notice it doesn't clone the object but rather moves it to replace the paragraph. +```html + + + + + replaceWith demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +
      Replaced!
      +​ + +​ + + +``` + * @example ​ ````On button click, replace the containing div with its child divs and append the class name of the selected element to the paragraph. +```html + + + + + replaceWith demo + + + + +​ +

      + +

      +
      +
      Scooby
      +
      Dooby
      +
      Doo
      +
      +​ + +​ + + +``` + */ + replaceWith(newContent_function: JQuery.htmlString | + JQuery | + JQuery.TypeOrArray | + JQuery.Node | + ((this: TElement, index: number, oldhtml: JQuery.htmlString) => JQuery.htmlString | + JQuery | + JQuery.TypeOrArray | + JQuery.Node)): this; + /** + * Bind an event handler to the "resize" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/resize/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + resize(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "resize" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/resize/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To see the window width while (or after) it is resized, try: +```javascript +$( window ).resize(function() { + $( "body" ).prepend( "
      " + $( window ).width() + "
      " ); +}); +``` + */ + resize(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Bind an event handler to the "scroll" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/scroll/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + scroll(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "scroll" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/scroll/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To do something when your page is scrolled: +```html + + + + + scroll demo + + + + +​ +
      Try scrolling the iframe.
      +

      Paragraph - Scroll happened!

      +​ + +​ + + +``` + */ + scroll(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Set the current horizontal position of the scroll bar for each of the set of matched elements. + * @param value An integer indicating the new position to set the scroll bar to. + * @see \`{@link https://api.jquery.com/scrollLeft/ }\` + * @since 1.2.6 + * @example ​ ````Set the scrollLeft of a div. +```html + + + + + scrollLeft demo + + + + +​ +

      lalala

      Hello

      +​ + +​ + + +``` + */ + scrollLeft(value: number): this; + /** + * Get the current horizontal position of the scroll bar for the first element in the set of matched elements. + * @see \`{@link https://api.jquery.com/scrollLeft/ }\` + * @since 1.2.6 + * @example ​ ````Get the scrollLeft of a paragraph. +```html + + + + + scrollLeft demo + + + + +​ +

      Hello

      +​ + +​ + + +``` + */ + scrollLeft(): number | undefined; + /** + * Set the current vertical position of the scroll bar for each of the set of matched elements. + * @param value A number indicating the new position to set the scroll bar to. + * @see \`{@link https://api.jquery.com/scrollTop/ }\` + * @since 1.2.6 + * @example ​ ````Set the scrollTop of a div. +```html + + + + + scrollTop demo + + + + +​ +

      lalala

      Hello

      +​ + +​ + + +``` + */ + scrollTop(value: number): this; + /** + * Get the current vertical position of the scroll bar for the first element in the set of matched elements or set the vertical position of the scroll bar for every matched element. + * @see \`{@link https://api.jquery.com/scrollTop/ }\` + * @since 1.2.6 + * @example ​ ````Get the scrollTop of a paragraph. +```html + + + + + scrollTop demo + + + + +​ +

      Hello

      +​ + +​ + + +``` + */ + scrollTop(): number | undefined; + /** + * Bind an event handler to the "select" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/select/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + select(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "select" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/select/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To do something when text in input boxes is selected: +```html + + + + + select demo + + + + +​ +

      Click and drag the mouse to select text in the inputs.

      + + +
      + ​ + +​ + + +``` + * @example ​ ````To trigger the select event on all input elements, try: +```javascript +$( "input" ).select(); +``` + */ + select(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Encode a set of form elements as a string for submission. + * @see \`{@link https://api.jquery.com/serialize/ }\` + * @since 1.0 + * @example ​ ````Serialize a form to a query string that could be sent to a server in an Ajax request. +```html + + + + + serialize demo + + + + +​ +
      + +​ +
      + +​ +
      + + + + +​ +
      + + + + +
      +​ +

      +​ + +​ + + +``` + */ + serialize(): string; + /** + * Encode a set of form elements as an array of names and values. + * @see \`{@link https://api.jquery.com/serializeArray/ }\` + * @since 1.2 + * @example ​ ````Get the values from a form, iterate through them, and append them to a results display. +```html + + + + + serializeArray demo + + + + +​ +

      Results:

      +
      + + +
      + + + + + + + + +
      +​ + +​ + + +``` + */ + serializeArray(): JQuery.NameValuePair[]; + /** + * Display the matched elements. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/show/ }\` + * @since 1.4.3 + */ + show(duration: JQuery.Duration, easing: string, complete: (this: TElement) => void): this; + /** + * Display the matched elements. + * @param duration A string or number determining how long the animation will run. + * @param easing_complete _@param_ `easing_complete` + *
      + * * `easing` — A string indicating which easing function to use for the transition.
      + * * `complete` — A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/show/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Show the first div, followed by each next adjacent sibling div in order, with a 200ms animation. Each animation starts when the previous sibling div's animation ends. +```html + + + + + show demo + + + + +​ + + +
      Hello 3,
      +
      how
      +
      are
      +
      you?
      +​ + +​ + + +``` + * @example ​ ````Show all span and input elements with an animation. Change the text once the animation is done. +```html + + + + + show demo + + + + +​ + +Are you sure? (type 'yes' if you are) +
      +
      + +
      +
      +

      I'm hidden...

      +​ + +​ + + +``` + */ + show(duration: JQuery.Duration, easing_complete: string | ((this: TElement) => void)): this; + /** + * Display the matched elements. + * @param duration_complete_options _@param_ `duration_complete_options` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/show/ }\` + * @since 1.0 + * @example ​ ````Animates all hidden paragraphs to show slowly, completing the animation within 600 milliseconds. +```html + + + + + show demo + + + + +​ + +

      Hello 2

      +​ + +​ + + +``` + */ + show(duration_complete_options?: JQuery.Duration | ((this: TElement) => void) | JQuery.EffectsOptions): this; + /** + * Get the siblings of each element in the set of matched elements, optionally filtered by a selector. + * @param selector A string containing a selector expression to match elements against. + * @see \`{@link https://api.jquery.com/siblings/ }\` + * @since 1.0 + * @example ​ ````Find the unique siblings of all yellow li elements in the 3 lists (including other yellow li elements if appropriate). +```html + + + + + siblings demo + + + + +​ +
        +
      • One
      • +
      • Two
      • +
      • Three
      • +
      • Four
      • +
      +​ +
        +
      • Five
      • +
      • Six
      • +
      • Seven
      • +
      +​ +
        +
      • Eight
      • +
      • Nine
      • +
      • Ten
      • +
      • Eleven
      • +
      +​ +

      Unique siblings:

      +​ + +​ + + +``` + * @example ​ ````Find all siblings with a class "selected" of each div. +```html + + + + + siblings demo + + + +​ +
      Hello
      +

      Hello Again

      +

      And Again

      +​ + +​ + + +``` + */ + siblings(selector?: JQuery.Selector): this; + /** + * Reduce the set of matched elements to a subset specified by a range of indices. + * @param start An integer indicating the 0-based position at which the elements begin to be selected. If negative, + * it indicates an offset from the end of the set. + * @param end An integer indicating the 0-based position at which the elements stop being selected. If negative, + * it indicates an offset from the end of the set. If omitted, the range continues until the end of the set. + * @see \`{@link https://api.jquery.com/slice/ }\` + * @since 1.1.4 + * @example ​ ````Turns divs yellow based on a random slice. +```html + + + + + slice demo + + + + +​ +

      + Click the button!

      +
      +
      +
      +
      +
      +
      +
      +
      +
      + ​ + +​ + + +``` + * @example ​ ````Selects all paragraphs, then slices the selection to include only the first element. +```javascript +$( "p" ).slice( 0, 1 ).wrapInner( "" ); +``` + * @example ​ ````Selects all paragraphs, then slices the selection to include only the first and second element. +```javascript +$( "p" ).slice( 0, 2 ).wrapInner( "" ); +``` + * @example ​ ````Selects all paragraphs, then slices the selection to include only the second element. +```javascript +$( "p" ).slice( 1, 2 ).wrapInner( "" ); +``` + * @example ​ ````Selects all paragraphs, then slices the selection to include only the second and third element. +```javascript +$( "p" ).slice( 1 ).wrapInner( "" ); +``` + * @example ​ ````Selects all paragraphs, then slices the selection to include only the third element. +```javascript +$( "p" ).slice( -1 ).wrapInner( "" ); +``` + */ + slice(start: number, end?: number): this; + /** + * Display the matched elements with a sliding motion. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/slideDown/ }\` + * @since 1.4.3 + */ + slideDown(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; + /** + * Display the matched elements with a sliding motion. + * @param duration_easing _@param_ `duration_easing` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/slideDown/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Animates all inputs to slide down, completing the animation within 1000 milliseconds. Once the animation is done, the input look is changed especially if it is the middle input which gets the focus. +```html + + + + + slideDown demo + + + + +​ +
      Push!
      + + + + ​ + +​ + + +``` + */ + slideDown(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; + /** + * Display the matched elements with a sliding motion. + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/slideDown/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Animates all divs to slide down and show themselves over 600 milliseconds. +```html + + + + + slideDown demo + + + + +​ +Click me! +
      +
      +
      +​ + +​ + + +``` + */ + slideDown(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; + /** + * Display or hide the matched elements with a sliding motion. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/slideToggle/ }\` + * @since 1.4.3 + */ + slideToggle(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; + /** + * Display or hide the matched elements with a sliding motion. + * @param duration_easing _@param_ `duration_easing` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/slideToggle/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Animates divs between dividers with a toggle that makes some appear and some disappear. +```html + + + + + slideToggle demo + + + + +​ +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      There have been 0 toggled divs.

      +​ + +​ + + +``` + */ + slideToggle(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; + /** + * Display or hide the matched elements with a sliding motion. + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/slideToggle/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Animates all paragraphs to slide up or down, completing the animation within 600 milliseconds. +```html + + + + + slideToggle demo + + + + +​ + +

      + This is the paragraph to end all paragraphs. You + should feel lucky to have seen such a paragraph in + your life. Congratulations! +

      +​ + +​ + + +``` + */ + slideToggle(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; + /** + * Hide the matched elements with a sliding motion. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/slideUp/ }\` + * @since 1.4.3 + */ + slideUp(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; + /** + * Hide the matched elements with a sliding motion. + * @param duration_easing _@param_ `duration_easing` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/slideUp/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Animates the parent paragraph to slide up, completing the animation within 200 milliseconds. Once the animation is done, it displays an alert. +```html + + + + + slideUp demo + + + + +​ +
      + + +
      +​ +
      + + +
      +​ +
      + + +
      +​ +
      +​ + +​ + + +``` + */ + slideUp(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; + /** + * Hide the matched elements with a sliding motion. + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/slideUp/ }\` + * @since 1.0 + * @since 1.4.3 + * @example ​ ````Animates all divs to slide up, completing the animation within 400 milliseconds. +```html + + + + + slideUp demo + + + + +​ +Click me! +
      +
      +
      +
      +
      +​ + +​ + + +``` + */ + slideUp(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; + /** + * Stop the currently-running animation on the matched elements. + * @param queue The name of the queue in which to stop animations. + * @param clearQueue A Boolean indicating whether to remove queued animation as well. Defaults to false. + * @param jumpToEnd A Boolean indicating whether to complete the current animation immediately. Defaults to false. + * @see \`{@link https://api.jquery.com/stop/ }\` + * @since 1.7 + */ + stop(queue: string, clearQueue?: boolean, jumpToEnd?: boolean): this; + /** + * Stop the currently-running animation on the matched elements. + * @param clearQueue A Boolean indicating whether to remove queued animation as well. Defaults to false. + * @param jumpToEnd A Boolean indicating whether to complete the current animation immediately. Defaults to false. + * @see \`{@link https://api.jquery.com/stop/ }\` + * @since 1.2 + * @example ​ ````Click the Go button once to start the animation, then click the STOP button to stop it where it's currently positioned. Another option is to click several buttons to queue them up and see that stop just kills the currently playing one. +```html + + + + + stop demo + + + + +​ + + + +
      +​ + +​ + + +``` + * @example ​ ````Click the slideToggle button to start the animation, then click again before the animation is completed. The animation will toggle the other direction from the saved starting point. +```html + + + + + stop demo + + + + +​ + +
      +​ + +​ + + +``` + */ + stop(clearQueue?: boolean, jumpToEnd?: boolean): this; + /** + * Bind an event handler to the "submit" JavaScript event, or trigger that event on an element. + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/submit/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + */ + submit(eventData: TData, + handler: JQuery.TypeEventHandler): this; + /** + * Bind an event handler to the "submit" JavaScript event, or trigger that event on an element. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/submit/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````If you'd like to prevent forms from being submitted unless a flag variable is set, try: +```html + + + + + submit demo + + + + +​ +

      Type 'correct' to validate.

      +
      +
      + + +
      +
      + +​ + +​ + + +``` + * @example ​ ````If you'd like to prevent forms from being submitted unless a flag variable is set, try: +```javascript +$( "form" ).submit(function() { + return this.some_flag_variable; +}); +``` + * @example ​ ````To trigger the submit event on the first form on the page, try: +```javascript +$( "form:first" ).submit(); +``` + */ + submit(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Set the content of each element in the set of matched elements to the specified text. + * @param text_function _@param_ `text_function` + *
      + * * `text` — The text to set as the content of each matched element. When Number or Boolean is supplied, it will + * be converted to a String representation.
      + * * `function` — A function returning the text content to set. Receives the index position of the element in the set + * and the old text value as arguments. + * @see \`{@link https://api.jquery.com/text/ }\` + * @since 1.0 + * @since 1.4 + * @example ​ ````Add text to the paragraph (notice the bold tag is escaped). +```html + + + + + text demo + + + + +​ +

      Test Paragraph.

      +​ + +​ + + +``` + */ + text(text_function: string | number | boolean | ((this: TElement, index: number, text: string) => string | number | boolean)): this; + /** + * Get the combined text contents of each element in the set of matched elements, including their descendants. + * @see \`{@link https://api.jquery.com/text/ }\` + * @since 1.0 + * @example ​ ````Find the text in the first paragraph (stripping out the html), then set the html of the last paragraph to show it is just text (the red bold is gone). +```html + + + + + text demo + + + + +​ +

      Test Paragraph.

      +

      +​ + +​ + + +``` + */ + text(): string; + /** + * Retrieve all the elements contained in the jQuery set, as an array. + * @see \`{@link https://api.jquery.com/toArray/ }\` + * @since 1.4 + * @example ​ ````Select all divs in the document and return the DOM Elements as an Array; then use the built-in reverse() method to reverse that array. +```html + + + + + toArray demo + + + + +​ +Reversed - +​ +
      One
      +
      Two
      +
      Three
      ​ + +​ + + +``` + */ + toArray(): TElement[]; + /** + * Display or hide the matched elements. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/toggle/ }\` + * @since 1.4.3 + */ + toggle(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; + /** + * Display or hide the matched elements. + * @param duration A string or number determining how long the animation will run. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/toggle/ }\` + * @since 1.0 + */ + toggle(duration: JQuery.Duration, complete: (this: TElement) => void): this; + /** + * Display or hide the matched elements. + * @param duration_complete_options_display _@param_ `duration_complete_options_display` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `options` — A map of additional options to pass to the method.
      + * * `display` — Use true to show the element or false to hide it. + * @see \`{@link https://api.jquery.com/toggle/ }\` + * @since 1.0 + * @since 1.3 + * @example ​ ````Toggles all paragraphs. +```html + + + + + toggle demo + + + +​ + +

      Hello

      +

      Good Bye

      +​ + +​ + + +``` + * @example ​ ````Animates all paragraphs to be shown if they are hidden and hidden if they are visible, completing the animation within 600 milliseconds. +```html + + + + + toggle demo + + + + +​ + +

      Hiya

      +

      Such interesting text, eh?

      +​ + +​ + + +``` + * @example ​ ````Shows all paragraphs, then hides them all, back and forth. +```html + + + + + toggle demo + + + +​ + +

      Hello

      +

      Good Bye

      +​ + +​ + + +``` + */ + toggle(duration_complete_options_display?: JQuery.Duration | ((this: TElement) => void) | JQuery.EffectsOptions | boolean): this; + /** + * Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the state argument. + * @param className_function _@param_ `className_function` + *
      + * * `className` — One or more class names (separated by spaces) to be toggled for each element in the matched set.
      + * * `function` — A function that returns class names to be toggled in the class attribute of each element in the + * matched set. Receives the index position of the element in the set, the old class value, and the state as arguments. + * @param state A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed. + * @see \`{@link https://api.jquery.com/toggleClass/ }\` + * @since 1.0 + * @since 1.3 + * @since 1.4 + * @since 3.3 + * @example ​ ````Toggle the class 'highlight' when a paragraph is clicked. +```html + + + + + toggleClass demo + + + + +​ +

      Click to toggle

      +

      highlight

      +

      on these

      +

      paragraphs

      +​ + +​ + + +``` + * @example ​ ````Add the "highlight" class to the clicked paragraph on every third click of that paragraph, remove it every first and second click. +```html + + + + + toggleClass demo + + + + +​ +

      Click to toggle (clicks: 0)

      +

      highlight (clicks: 0)

      +

      on these (clicks: 0)

      +

      paragraphs (clicks: 0)

      +​ + +​ + + +``` + * @example ​ ````Toggle the class name(s) indicated on the buttons for each div. +```html + + + + + toggleClass demo + + + + +​ +
      + + + + + reset +
      +
      +
      +
      +
      +
      +
      +​ + +​ + + +``` + */ + toggleClass(className_function: JQuery.TypeOrArray | ((this: TElement, index: number, className: string, state: TState) => string), + state?: TState): this; + /** + * Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the state argument. + * @param state A boolean value to determine whether the class should be added or removed. + * @see \`{@link https://api.jquery.com/toggleClass/ }\` + * @since 1.4 + * @deprecated ​ Deprecated since 3.0. See \`{@link https://github.com/jquery/jquery/pull/2618 }\`. + * + * **Cause**: Calling `.toggleClass()` with no arguments, or with a single Boolean `true` or `false` argument, has been deprecated. Its behavior was poorly documented, but essentially the method saved away the current class value in a data item when the class was removed and restored the saved value when it was toggled back. If you do not believe you are specificially trying to use this form of the method, it is possible you are accidentally doing so via an inadvertent undefined value, as `.toggleClass( undefined )` toggles all classes. + * + * **Solution**: If this functionality is still needed, save the current full `.attr( "class" )` value in a data item and restore it when required. + */ + toggleClass(state?: boolean): this; + /** + * Execute all handlers and behaviors attached to the matched elements for the given event type. + * @param eventType_event _@param_ `eventType_event` + *
      + * * `eventType` — A string containing a JavaScript event type, such as `click` or `submit`.
      + * * `event` — A \`{@link https://api.jquery.com/category/events/event-object/ jQuery.Event}\` object. + * @param extraParameters Additional parameters to pass along to the event handler. + * @see \`{@link https://api.jquery.com/trigger/ }\` + * @since 1.0 + * @since 1.3 + * @example ​ ````Clicks to button #2 also trigger a click for button #1. +```html + + + + + trigger demo + + + + +​ + + +
      0 button #1 clicks.
      +
      0 button #2 clicks.
      +​ + +​ + + +``` + * @example ​ ````To submit the first form without using the submit() function, try: +```javascript +$( "form:first" ).trigger( "submit" ); +``` + * @example ​ ````To submit the first form without using the submit() function, try: +```javascript +var event = jQuery.Event( "submit" ); +$( "form:first" ).trigger( event ); +if ( event.isDefaultPrevented() ) { + // Perform an action... +} +``` + * @example ​ ````To pass arbitrary data to an event: +```javascript +$( "p" ) + .click(function( event, a, b ) { + // When a normal click fires, a and b are undefined + // for a trigger like below a refers to "foo" and b refers to "bar" + }) + .trigger( "click", [ "foo", "bar" ] ); +``` + * @example ​ ````To pass arbitrary data through an event object: +```javascript +var event = jQuery.Event( "logged" ); +event.user = "foo"; +event.pass = "bar"; +$( "body" ).trigger( event ); +``` + * @example ​ ````Alternative way to pass data through an event object: +```javascript +$( "body" ).trigger({ + type:"logged", + user:"foo", + pass:"bar" +}); +``` + */ + trigger(eventType_event: string | JQuery.Event, extraParameters?: any[] | JQuery.PlainObject | string | number | boolean): this; + /** + * Execute all handlers attached to an element for an event. + * @param eventType_event _@param_ `eventType_event` + *
      + * * `eventType` — A string containing a JavaScript event type, such as `click` or `submit`.
      + * * `event` — A \`{@link https://api.jquery.com/category/events/event-object/ jQuery.Event}\` object. + * @param extraParameters Additional parameters to pass along to the event handler. + * @see \`{@link https://api.jquery.com/triggerHandler/ }\` + * @since 1.2 + * @since 1.3 + * @example ​ ````If you called .triggerHandler() on a focus event - the browser's default focus action would not be triggered, only the event handlers bound to the focus event. +```html + + + + + triggerHandler demo + + + +​ + +

      +​ + +​ + +​ + + +``` + */ + triggerHandler(eventType_event: string | JQuery.Event, extraParameters?: any[] | JQuery.PlainObject | string | number | boolean): any; + /** + * Remove a previously-attached event handler from the elements. + * @param event A string containing one or more DOM event types, such as "click" or "submit," or custom event names. + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/unbind/ }\` + * @since 1.0 + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.0. Use \`{@link off }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````Can bind and unbind events to the colored button. +```html + + + + + unbind demo + + + + +​ + + + +
      Click!
      +​ + +​ + + +``` + * @example ​ ````To unbind just one previously bound handler, pass the function in as the second argument: +```javascript +var foo = function() { + // Code to handle some kind of event +}; +​ +$( "p" ).bind( "click", foo ); // ... Now foo will be called when paragraphs are clicked ... +​ +$( "p" ).unbind( "click", foo ); // ... foo will no longer be called. +``` + */ + unbind( + event: TType, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Remove a previously-attached event handler from the elements. + * @param event A string containing one or more DOM event types, such as "click" or "submit," or custom event names. + * A jQuery.Event object. + * @see \`{@link https://api.jquery.com/unbind/ }\` + * @since 1.0 + * @deprecated ​ Deprecated since 3.0. Use \`{@link off }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````To unbind all events from all paragraphs, write: +```javascript +$( "p" ).unbind(); +``` + * @example ​ ````To unbind all click events from all paragraphs, write: +```javascript +$( "p" ).unbind( "click" ); +``` + */ + unbind(event?: string | JQuery.TriggeredEvent): this; + /** + * Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. + * @param selector A selector which will be used to filter the event results. + * @param eventType A string containing a JavaScript event type, such as "click" or "keydown" + * @param handler A function to execute each time the event is triggered. + * @see \`{@link https://api.jquery.com/undelegate/ }\` + * @since 1.4.2 + * @deprecated ​ Deprecated since 3.0. Use \`{@link off }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````Can bind and unbind events to the colored button. +```html + + + + + undelegate demo + + + + +​ + + + +
      Click!
      +​ + +​ + + +``` + * @example ​ ````To undelegate just one previously bound handler, pass the function in as the third argument: +```javascript +var foo = function () { + // Code to handle some kind of event +}; +​ +// ... Now foo will be called when paragraphs are clicked ... +$( "body" ).delegate( "p", "click", foo ); +​ +// ... foo will no longer be called. +$( "body" ).undelegate( "p", "click", foo ); +``` + */ + undelegate( + selector: JQuery.Selector, + eventType: TType, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. + * @param selector A selector which will be used to filter the event results. + * @param eventType_events _@param_ `eventType_events` + *
      + * * `eventType` — A string containing a JavaScript event type, such as "click" or "keydown"
      + * * `events` — An object of one or more event types and previously bound functions to unbind from them. + * @see \`{@link https://api.jquery.com/undelegate/ }\` + * @since 1.4.2 + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.0. Use \`{@link off }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + */ + undelegate(selector: JQuery.Selector, + eventType_events: string | + JQuery.TypeEventHandlers): this; + /** + * Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. + * @param namespace A selector which will be used to filter the event results. + * @see \`{@link https://api.jquery.com/undelegate/ }\` + * @since 1.4.2 + * @since 1.6 + * @deprecated ​ Deprecated since 3.0. Use \`{@link off }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````To unbind all delegated events from all paragraphs, write: +```javascript +$( "p" ).undelegate(); +``` + * @example ​ ````To unbind all delegated click events from all paragraphs, write: +```javascript +$( "p" ).undelegate( "click" ); +``` + * @example ​ ````To unbind all delegated events by their namespace: +```javascript +var foo = function() { + // Code to handle some kind of event +}; +​ +// Delegate events under the ".whatever" namespace +$( "form" ).delegate( ":button", "click.whatever", foo ); +​ +$( "form" ).delegate( "input[type='text'] ", "keypress.whatever", foo ); +​ +// Unbind all events delegated under the ".whatever" namespace +$( "form" ).undelegate( ".whatever" ); +``` + */ + undelegate(namespace?: string): this; + /** + * Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place. + * @param selector A selector to check the parent element against. If an element's parent does not match the selector, + * the element won't be unwrapped. + * @see \`{@link https://api.jquery.com/unwrap/ }\` + * @since 1.4 + * @since 3.0 + * @example ​ ````Wrap/unwrap a div around each of the paragraphs. +```html + + + + + unwrap demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      ​ + +​ + + +``` + */ + unwrap(selector?: string): this; + /** + * Set the value of each element in the set of matched elements. + * @param value_function _@param_ `value_function` + *
      + * * `value` — A string of text, a number, or an array of strings corresponding to the value of each matched + * element to set as selected/checked.
      + * * `function` — A function returning the value to set. `this` is the current element. Receives the index position of + * the element in the set and the old value as arguments. + * @see \`{@link https://api.jquery.com/val/ }\` + * @since 1.0 + * @since 1.4 + * @example ​ ````Set the value of an input box. +```html + + + + + val demo + + + + +​ +
      + + + +
      + +​ + +​ + + +``` + * @example ​ ````Use the function argument to modify the value of an input box. +```html + + + + + val demo + + + +​ +

      Type something and then click or tab out of the input.

      + +​ + +​ + + +``` + * @example ​ ````Set a single select, a multiple select, checkboxes and a radio button . +```html + + + + + val demo + + + + +​ + +​ + +​ +
      + check1 + check2 + radio1 + radio2 +​ + +​ + + +``` + */ + val(value_function: string | number | string[] | ((this: TElement, index: number, value: string) => string)): this; + /** + * Get the current value of the first element in the set of matched elements. + * @see \`{@link https://api.jquery.com/val/ }\` + * @since 1.0 + * @example ​ ````Get the single value from a single select and an array of values from a multiple select and display their values. +```html + + + + + val demo + + + + +​ +

      +​ + +​ + +​ + +​ + + +``` + * @example ​ ````Find the value of an input box. +```html + + + + + val demo + + + + +​ + +

      +​ + +​ + + +``` + */ + val(): string | number | string[] | undefined; + /** + * Set the CSS width of each element in the set of matched elements. + * @param value_function _@param_ `value_function` + *
      + * * `value` — An integer representing the number of pixels, or an integer along with an optional unit of measure + * appended (as a string).
      + * * `function` — A function returning the width to set. Receives the index position of the element in the set and the + * old width as arguments. Within the function, `this` refers to the current element in the set. + * @see \`{@link https://api.jquery.com/width/ }\` + * @since 1.0 + * @since 1.4.1 + * @example ​ ````Change the width of each div the first time it is clicked (and change its color). +```html + + + + + width demo + + + + +​ +
      d
      +
      d
      +
      d
      +
      d
      +
      d
      +​ + +​ + + +``` + */ + width(value_function: string | number | ((this: TElement, index: number, value: number) => string | number)): this; + /** + * Get the current computed width for the first element in the set of matched elements. + * @see \`{@link https://api.jquery.com/width/ }\` + * @since 1.0 + * @example ​ ````Show various widths. Note the values are from the iframe so might be smaller than you expected. The yellow highlight shows the iframe body. +```html + + + + + width demo + + + + +​ + + + +
       
      +

      + Sample paragraph to test width +

      +​ + +​ + + +``` + */ + width(): number | undefined; + /** + * Wrap an HTML structure around each element in the set of matched elements. + * @param wrappingElement_function _@param_ `wrappingElement_function` + *
      + * * `wrappingElement` — A selector, element, HTML string, or jQuery object specifying the structure to wrap around the + * matched elements. When you pass a jQuery collection containing more than one element, or a selector + * matching more than one element, the first element will be used.
      + * * `function` — A callback function returning the HTML content or jQuery object to wrap around the matched elements. + * Receives the index position of the element in the set as an argument. Within the function, `this` + * refers to the current element in the set. + * @see \`{@link https://api.jquery.com/wrap/ }\` + * @since 1.0 + * @since 1.4 + * @example ​ ````Wrap a new div around all of the paragraphs. +```html + + + + + wrap demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Wraps a newly created tree of objects around the spans. Notice anything in between the spans gets left out like the <strong> (red text) in this example. Even the white space between spans is left out. Click View Source to see the original html.> +```html + + + + + wrap demo + + + + +​ +Span Text +What about me? +Another One +​ + +​ + + +``` + * @example ​ ````Wrap a new div around all of the paragraphs. +```html + + + + + wrap demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Wrap a jQuery object double depth div around all of the paragraphs. Notice it doesn't move the object but just clones it to wrap around its target. +```html + + + + + wrap demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +
      +​ + +​ + + +``` + */ + wrap(wrappingElement_function: JQuery.Selector | JQuery.htmlString | Element | JQuery | ((this: TElement, index: number) => string | JQuery)): this; + /** + * Wrap an HTML structure around all elements in the set of matched elements. + * @param wrappingElement_function _@param_ `wrappingElement_function` + *
      + * * `wrappingElement` — A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements.
      + * * `function` — A callback function returning the HTML content or jQuery object to wrap around all the matched + * elements. Within the function, `this` refers to the first element in the set. **Prior to jQuery + * 3.0**, the callback was incorrectly called for every element in the set and received the index + * position of the element in the set as an argument. + * @see \`{@link https://api.jquery.com/wrapAll/ }\` + * @since 1.2 + * @since 1.4 + * @example ​ ````Wrap a new div around all of the paragraphs. +```html + + + + + wrapAll demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Wraps a newly created tree of objects around the spans. Notice anything in between the spans gets left out like the <strong> (red text) in this example. Even the white space between spans is left out. Click View Source to see the original html. +```html + + + + + wrapAll demo + + + + +​ +Span Text +What about me? +Another One +​ + +​ + + +``` + * @example ​ ````Wrap a new div around all of the paragraphs. +```html + + + + + wrapAll demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Wrap a jQuery object double depth div around all of the paragraphs. Notice it doesn't move the object but just clones it to wrap around its target. +```html + + + + + wrapAll demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +
      +​ + +​ + + +``` + */ + wrapAll(wrappingElement_function: JQuery.Selector | JQuery.htmlString | Element | JQuery | ((this: TElement) => string | JQuery)): this; + /** + * Wrap an HTML structure around the content of each element in the set of matched elements. + * @param wrappingElement_function _@param_ `wrappingElement_function` + *
      + * * `wrappingElement` — An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap + * around the content of the matched elements.
      + * * `function` — A callback function which generates a structure to wrap around the content of the matched elements. + * Receives the index position of the element in the set as an argument. Within the function, `this` + * refers to the current element in the set. + * @see \`{@link https://api.jquery.com/wrapInner/ }\` + * @since 1.2 + * @since 1.4 + * @example ​ ````Selects all paragraphs and wraps a bold tag around each of its contents. +```html + + + + + wrapInner demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Wraps a newly created tree of objects around the inside of the body. +```html + + + + + wrapInner demo + + + + +​ +Plain old text, or is it? +​ + +​ + + +``` + * @example ​ ````Selects all paragraphs and wraps a bold tag around each of its contents. +```html + + + + + wrapInner demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Selects all paragraphs and wraps a jQuery object around each of its contents. +```html + + + + + wrapInner demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + */ + wrapInner(wrappingElement_function: JQuery.Selector | JQuery.htmlString | Element | JQuery | ((this: TElement, index: number) => string | JQuery | Element)): this; + + [n: number]: TElement; +} diff --git a/node_modules/@types/jquery/JQueryStatic.d.ts b/node_modules/@types/jquery/JQueryStatic.d.ts new file mode 100644 index 00000000..3386f6db --- /dev/null +++ b/node_modules/@types/jquery/JQueryStatic.d.ts @@ -0,0 +1,13521 @@ +// tslint:disable:jsdoc-format +// tslint:disable:max-line-length +// tslint:disable:no-irregular-whitespace + +interface JQueryStatic { + /** + * @see \`{@link https://api.jquery.com/jquery.ajax/#jQuery-ajax1 }\` + * @deprecated ​ Deprecated. Use \`{@link ajaxSetup }\`. + */ + ajaxSettings: JQuery.AjaxSettings; + Animation: JQuery.AnimationStatic; + Callbacks: JQuery.CallbacksStatic; + /** + * Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize CSS property naming, or create custom properties. + * @see \`{@link https://api.jquery.com/jQuery.cssHooks/ }\` + * @since 1.4.3 + */ + cssHooks: JQuery.CSSHooks; + /** + * An object containing all CSS properties that may be used without a unit. The .css() method uses this object to see if it may append px to unitless values. + * @see \`{@link https://api.jquery.com/jQuery.cssNumber/ }\` + * @since 1.4.3 + */ + cssNumber: JQuery.PlainObject; + Deferred: JQuery.DeferredStatic; + easing: JQuery.Easings; + Event: JQuery.EventStatic; + /** + * @see \`{@link https://learn.jquery.com/events/event-extensions/ }\` + */ + event: JQuery.EventExtensions; + expr: JQuery.Selectors; + // Set to HTMLElement to minimize breaks but should probably be Element. + readonly fn: JQuery; + fx: JQuery.Effects; + /** + * A Promise-like object (or "thenable") that resolves when the document is ready. + * @see \`{@link https://api.jquery.com/jQuery.ready/ }\` + * @since 1.8 + * @example ​ ````Listen for document ready using jQuery.when. +```javascript +$.when( $.ready ).then(function() { + // Document is ready. +}); +``` + * @example ​ ````Typical usage involving another promise, using jQuery.when. +```javascript +$.when( + $.getJSON( "ajax/test.json" ), + $.ready +).done(function( data ) { + // Document is ready. + // Value of test.json is passed as `data`. +}); +``` + */ + ready: JQuery.Thenable; + /** + * A collection of properties that represent the presence of different browser features or bugs. Intended for jQuery's internal use; specific properties may be removed when they are no longer needed internally to improve page startup performance. For your own project's feature-detection needs, we strongly recommend the use of an external library such as Modernizr instead of dependency on properties in jQuery.support. + * @see \`{@link https://api.jquery.com/jQuery.support/ }\` + * @since 1.3 + * @deprecated ​ Deprecated since 1.9. See \`{@link https://api.jquery.com/jQuery.support/ }\`. + */ + support: JQuery.PlainObject; + timers: Array>; + Tween: JQuery.TweenStatic; + valHooks: JQuery.ValHooks; + // HACK: This is the factory function returned when importing jQuery without a DOM. Declaring it separately breaks using the type parameter on JQueryStatic. + // HACK: The discriminator parameter handles the edge case of passing a Window object to JQueryStatic. It doesn't actually exist on the factory function. + (window: Window, discriminator: boolean): JQueryStatic; + /** + * Creates DOM elements on the fly from the provided string of raw HTML. + * @param html _@param_ `html` + *
      + * * `html (ownerDocument)` — A string of HTML to create on the fly. Note that this parses HTML, not XML.
      + * * `html (attributes)` — A string defining a single, standalone, HTML element (e.g. <div/> or <div></div>). + * @param ownerDocument_attributes _@param_ `ownerDocument_attributes` + *
      + * * `ownerDocument` — A document in which the new elements will be created.
      + * * `attributes` — An object of attributes, events, and methods to call on the newly-created element. + * @see \`{@link https://api.jquery.com/jQuery/ }\` + * @since 1.0 + * @since 1.4 + * @example ​ ````Create a div element (and all of its contents) dynamically and append it to the body element. Internally, an element is created and its innerHTML property set to the given markup. +```javascript +$( "

      Hello

      " ).appendTo( "body" ) +``` + * @example ​ ````Create some DOM elements. +```javascript +$( "
      ", { + "class": "test", + text: "Click me!", + click: function() { + $( this ).toggleClass( "test" ); + } +}) + .appendTo( "body" ); +``` + */ + // tslint:disable-next-line:no-unnecessary-generics + (html: JQuery.htmlString, ownerDocument_attributes?: Document | JQuery.PlainObject): JQuery; + /** + * Accepts a string containing a CSS selector which is then used to match a set of elements. + * @param selector A string containing a selector expression + * @param context A DOM Element, Document, Selector or jQuery to use as context + * @see \`{@link https://api.jquery.com/jQuery/ }\` + * @since 1.0 + * @example ​ ````Find all p elements that are children of a div element and apply a border to them. +```html + + + + + jQuery demo + + + +​ +

      one

      +

      two

      +

      three

      +​ + + + +``` + * @example ​ ````Find all inputs of type radio within the first form in the document. +```javascript +$( "input:radio", document.forms[ 0 ] ); +``` + * @example ​ ````Find all div elements within an XML document from an Ajax response. +```javascript +$( "div", xml.responseXML ); +``` +​ + */ + // tslint:disable-next-line:no-unnecessary-generics + (selector: JQuery.Selector, context?: Element | Document | JQuery | JQuery.Selector): JQuery; + /** + * Return a collection of matched elements either found in the DOM based on passed argument(s) or created by passing an HTML string. + * @param element A DOM element to wrap in a jQuery object. + * @see \`{@link https://api.jquery.com/jQuery/ }\` + * @since 1.0 + * @example ​ ````Set the background color of the page to black. +```javascript +$( document.body ).css( "background", "black" ); +``` + */ + // NOTE: `HTMLSelectElement` is both an Element and an Array-Like Object but jQuery treats it as an Element. + (element: HTMLSelectElement): JQuery; + /** + * Return a collection of matched elements either found in the DOM based on passed argument(s) or created by passing an HTML string. + * @param element_elementArray _@param_ `element_elementArray` + *
      + * * `element` — A DOM element to wrap in a jQuery object.
      + * * `elementArray` — An array containing a set of DOM elements to wrap in a jQuery object. + * @see \`{@link https://api.jquery.com/jQuery/ }\` + * @since 1.0 + * @example ​ ````Set the background color of the page to black. +```javascript +$( document.body ).css( "background", "black" ); +``` + * @example ​ ````Hide all the input elements within a form. +```javascript +$( myForm.elements ).hide(); +``` + */ + (element_elementArray: T | ArrayLike): JQuery; + /** + * Return a collection of matched elements either found in the DOM based on passed argument(s) or created by passing an HTML string. + * @param selection An existing jQuery object to clone. + * @see \`{@link https://api.jquery.com/jQuery/ }\` + * @since 1.0 + */ + (selection: JQuery): JQuery; + /** + * Binds a function to be executed when the DOM has finished loading. + * @param callback The function to execute when the DOM is ready. + * @see \`{@link https://api.jquery.com/jQuery/ }\` + * @since 1.0 + * @example ​ ````Execute the function when the DOM is ready to be used. +```javascript +$(function() { + // Document is ready +}); +``` + * @example ​ ````Use both the shortcut for $(document).ready() and the argument to write failsafe jQuery code using the $ alias, without relying on the global alias. +```javascript +jQuery(function( $ ) { + // Your code using failsafe $ alias here... +}); +``` + */ + // tslint:disable-next-line:no-unnecessary-generics unified-signatures + (callback: ((this: Document, $: JQueryStatic) => void)): JQuery; + /** + * Return a collection of matched elements either found in the DOM based on passed argument(s) or created by passing an HTML string. + * @param object A plain object to wrap in a jQuery object. + * @see \`{@link https://api.jquery.com/jQuery/ }\` + * @since 1.0 + */ + (object: T): JQuery; + /** + * Returns an empty jQuery set. + * @see \`{@link https://api.jquery.com/jQuery/ }\` + * @since 1.4 + */ + // tslint:disable-next-line:no-unnecessary-generics + (): JQuery; + /** + * Perform an asynchronous HTTP (Ajax) request. + * @param url A string containing the URL to which the request is sent. + * @param settings A set of key/value pairs that configure the Ajax request. All settings are optional. A default can + * be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings. + * @see \`{@link https://api.jquery.com/jQuery.ajax/ }\` + * @since 1.5 + */ + ajax(url: string, settings?: JQuery.AjaxSettings): JQuery.jqXHR; + /** + * Perform an asynchronous HTTP (Ajax) request. + * @param settings A set of key/value pairs that configure the Ajax request. All settings are optional. A default can + * be set for any option with $.ajaxSetup(). + * @see \`{@link https://api.jquery.com/jQuery.ajax/ }\` + * @since 1.0 + * @example ​ ````Save some data to the server and notify the user once it's complete. +```javascript +$.ajax({ + method: "POST", + url: "some.php", + data: { name: "John", location: "Boston" } +}) + .done(function( msg ) { + alert( "Data Saved: " + msg ); + }); +``` + * @example ​ ````Retrieve the latest version of an HTML page. +```javascript +$.ajax({ + url: "test.html", + cache: false +}) + .done(function( html ) { + $( "#results" ).append( html ); + }); +``` + * @example ​ ````Send an xml document as data to the server. By setting the processData + option to false, the automatic conversion of data to strings is prevented. +```javascript +var xmlDocument = [create xml document]; +var xmlRequest = $.ajax({ + url: "page.php", + processData: false, + data: xmlDocument +}); +​ +xmlRequest.done( handleResponse ); +``` + * @example ​ ````Send an id as data to the server, save some data to the server, and notify the user once it's complete. If the request fails, alert the user. +```javascript +var menuId = $( "ul.nav" ).first().attr( "id" ); +var request = $.ajax({ + url: "script.php", + method: "POST", + data: { id : menuId }, + dataType: "html" +}); +​ +request.done(function( msg ) { + $( "#log" ).html( msg ); +}); +​ +request.fail(function( jqXHR, textStatus ) { + alert( "Request failed: " + textStatus ); +}); +``` + * @example ​ ````Load and execute a JavaScript file. +```javascript +$.ajax({ + method: "GET", + url: "test.js", + dataType: "script" +}); +``` + */ + ajax(settings?: JQuery.AjaxSettings): JQuery.jqXHR; + /** + * Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax(). + * @param dataTypes An optional string containing one or more space-separated dataTypes + * @param handler A handler to set default values for future Ajax requests. + * @see \`{@link https://api.jquery.com/jQuery.ajaxPrefilter/ }\` + * @since 1.5 + */ + ajaxPrefilter(dataTypes: string, + handler: (options: JQuery.AjaxSettings, originalOptions: JQuery.AjaxSettings, jqXHR: JQuery.jqXHR) => string | void): void; + /** + * Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax(). + * @param handler A handler to set default values for future Ajax requests. + * @see \`{@link https://api.jquery.com/jQuery.ajaxPrefilter/ }\` + * @since 1.5 + */ + ajaxPrefilter(handler: (options: JQuery.AjaxSettings, originalOptions: JQuery.AjaxSettings, jqXHR: JQuery.jqXHR) => string | void): void; + /** + * Set default values for future Ajax requests. Its use is not recommended. + * @param options A set of key/value pairs that configure the default Ajax request. All options are optional. + * @see \`{@link https://api.jquery.com/jQuery.ajaxSetup/ }\` + * @since 1.1 + * @example ​ ````Sets the defaults for Ajax requests to the url "/xmlhttp/", disables global handlers and uses POST instead of GET. The following Ajax requests then sends some data without having to set anything else. +```javascript +$.ajaxSetup({ + url: "/xmlhttp/", + global: false, + type: "POST" +}); +$.ajax({ data: myData }); +``` + */ + ajaxSetup(options: JQuery.AjaxSettings): JQuery.AjaxSettings; + /** + * Creates an object that handles the actual transmission of Ajax data. + * @param dataType A string identifying the data type to use + * @param handler A handler to return the new transport object to use with the data type provided in the first argument. + * @see \`{@link https://api.jquery.com/jQuery.ajaxTransport/ }\` + * @since 1.5 + */ + ajaxTransport(dataType: string, + handler: (options: JQuery.AjaxSettings, originalOptions: JQuery.AjaxSettings, jqXHR: JQuery.jqXHR) => JQuery.Transport | void): void; + /** + * @deprecated ​ Deprecated since 3.3. Internal. See \`{@link https://github.com/jquery/jquery/issues/3384 }\`. + */ + camelCase(value: string): string; + cleanData(elems: ArrayLike): void; + /** + * Check to see if a DOM element is a descendant of another DOM element. + * @param container The DOM element that may contain the other element. + * @param contained The DOM element that may be contained by (a descendant of) the other element. + * @see \`{@link https://api.jquery.com/jQuery.contains/ }\` + * @since 1.4 + * @example ​ ````Check if an element is a descendant of another. +```javascript +$.contains( document.documentElement, document.body ); // true +$.contains( document.body, document.documentElement ); // false +``` + */ + contains(container: Element, contained: Element): boolean; + css(elem: Element, name: string): any; + /** + * Store arbitrary data associated with the specified element. Returns the value that was set. + * @param element The DOM element to associate with the data. + * @param key A string naming the piece of data to set. + * @param value The new data value; this can be any Javascript type except `undefined`. + * @see \`{@link https://api.jquery.com/jQuery.data/ }\` + * @since 1.2.3 + * @example ​ ````Get the data named "blah" stored at for an element. +```html + + + + + jQuery.data demo + + + + +​ +
      A div
      + + + + +

      The "blah" value of this div is ?

      +​ + +​ + + +``` + */ + data(element: Element | Document | Window | JQuery.PlainObject, key: string, value: T): T; + /** + * Returns value at named data store for the element, as set by `jQuery.data(element, name, value)`, or the full data store for the element. + * @param element The DOM element to query for the data. + * @param key Name of the data stored. + * @param value `undefined` is not recognized as a data value. Calls such as `jQuery.data( el, "name", undefined )` + * will return the corresponding data for "name", and is therefore the same as `jQuery.data( el, "name" )` + * @see \`{@link https://api.jquery.com/jQuery.data/ }\` + * @since 1.2.3 + */ + // `unified-signatures` is disabled so that behavior when passing `undefined` to `value` can be documented. Unifying the signatures + // results in potential confusion for users from an unexpected parameter. + // tslint:disable-next-line:unified-signatures + data(element: Element | Document | Window | JQuery.PlainObject, key: string, value: undefined): any; + /** + * Returns value at named data store for the element, as set by `jQuery.data(element, name, value)`, or the full data store for the element. + * @param element The DOM element to query for the data. + * @param key Name of the data stored. + * @see \`{@link https://api.jquery.com/jQuery.data/ }\` + * @since 1.2.3 + * @since 1.4 + * @example ​ ````Store then retrieve a value from the div element. +```html + + + + + jQuery.data demo + + + + +​ +
      + The values stored were + + and + +
      +​ + +​ + + +``` + */ + data(element: Element | Document | Window | JQuery.PlainObject, key?: string): any; + /** + * Execute the next function on the queue for the matched element. + * @param element A DOM element from which to remove and execute a queued function. + * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. + * @see \`{@link https://api.jquery.com/jQuery.dequeue/ }\` + * @since 1.3 + * @example ​ ````Use jQuery.dequeue() to end a custom queue function which allows the queue to keep going. +```html + + + + + jQuery.dequeue demo + + + + +​ + +
      +​ + +​ + + +``` + */ + dequeue(element: Element, queueName?: string): void; + /** + * A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties. + * @param array The array to iterate over. + * @param callback The function that will be executed on every object. + * @see \`{@link https://api.jquery.com/jQuery.each/ }\` + * @since 1.0 + * @example ​ ````Iterates through the array displaying each number as both a word and numeral +```html + + + + + jQuery.each demo + + + + +​ +
      +
      +
      +
      +
      +​ + +​ + + +``` + * @example ​ ````Iterates over items in an array, accessing both the current item and its index. +```javascript +$.each( [ "a", "b", "c" ], function( i, l ){ + alert( "Index #" + i + ": " + l ); +}); +``` + */ + each(array: ArrayLike, callback: (this: T, indexInArray: number, value: T) => any): ArrayLike; + /** + * A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties. + * @param obj The object to iterate over. + * @param callback The function that will be executed on every object. + * @see \`{@link https://api.jquery.com/jQuery.each/ }\` + * @since 1.0 + * @example ​ ````Iterates through the array displaying each number as both a word and numeral +```html + + + + + jQuery.each demo + + + + +​ +
      +
      +
      +
      +
      +​ + +​ + + +``` + * @example ​ ````Iterates over the properties in an object, accessing both the current item and its key. +```javascript +$.each({ name: "John", lang: "JS" }, function( k, v ) { + alert( "Key: " + k + ", Value: " + v ); +}); +``` + */ + each(obj: T, callback: (this: T[K], propertyName: K, valueOfProperty: T[K]) => any): T; + /** + * Takes a string and throws an exception containing it. + * @param message The message to send out. + * @see \`{@link https://api.jquery.com/jQuery.error/ }\` + * @since 1.4.1 + * @example ​ ````Override jQuery.error for display in Firebug. +```javascript +jQuery.error = console.error; +``` + */ + error(message: string): any; + /** + * Escapes any character that has a special meaning in a CSS selector. + * @param selector A string containing a selector expression to escape. + * @see \`{@link https://api.jquery.com/jQuery.escapeSelector/ }\` + * @since 3.0 + * @example ​ ````Escape an ID containing a hash. +```javascript +$.escapeSelector( "#target" ); // "\#target" +``` + * @example ​ ````Select all the elements having a class name of .box inside a div. +```javascript +$( "div" ).find( "." + $.escapeSelector( ".box" ) ); +``` + */ + escapeSelector(selector: JQuery.Selector): JQuery.Selector; + /** + * Merge the contents of two or more objects together into the first object. + * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. + * @param target The object to extend. It will receive the new properties. + * @param object1 An object containing additional properties to merge in. + * @param object2 An object containing additional properties to merge in. + * @param object3 An object containing additional properties to merge in. + * @param object4 An object containing additional properties to merge in. + * @param object5 An object containing additional properties to merge in. + * @param object6 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.1.4 + * @example ​ ````Merge two objects recursively, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(deep: true, target: T, object1: U, object2: V, object3: W, object4: X, object5: Y, object6: Z): T & U & V & W & X & Y & Z; + /** + * Merge the contents of two or more objects together into the first object. + * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. + * @param target The object to extend. It will receive the new properties. + * @param object1 An object containing additional properties to merge in. + * @param object2 An object containing additional properties to merge in. + * @param object3 An object containing additional properties to merge in. + * @param object4 An object containing additional properties to merge in. + * @param object5 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.1.4 + * @example ​ ````Merge two objects recursively, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(deep: true, target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y; + /** + * Merge the contents of two or more objects together into the first object. + * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. + * @param target The object to extend. It will receive the new properties. + * @param object1 An object containing additional properties to merge in. + * @param object2 An object containing additional properties to merge in. + * @param object3 An object containing additional properties to merge in. + * @param object4 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.1.4 + * @example ​ ````Merge two objects recursively, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(deep: true, target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X; + /** + * Merge the contents of two or more objects together into the first object. + * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. + * @param target The object to extend. It will receive the new properties. + * @param object1 An object containing additional properties to merge in. + * @param object2 An object containing additional properties to merge in. + * @param object3 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.1.4 + * @example ​ ````Merge two objects recursively, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(deep: true, target: T, object1: U, object2: V, object3: W): T & U & V & W; + /** + * Merge the contents of two or more objects together into the first object. + * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. + * @param target The object to extend. It will receive the new properties. + * @param object1 An object containing additional properties to merge in. + * @param object2 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.1.4 + * @example ​ ````Merge two objects recursively, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(deep: true, target: T, object1: U, object2: V): T & U & V; + /** + * Merge the contents of two or more objects together into the first object. + * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. + * @param target The object to extend. It will receive the new properties. + * @param object1 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.1.4 + * @example ​ ````Merge two objects recursively, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(deep: true, target: T, object1: U): T & U; + /** + * Merge the contents of two or more objects together into the first object. + * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. + * @param target The object to extend. It will receive the new properties. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.1.4 + */ + extend(deep: true, target: T): this & T; + /** + * Merge the contents of two or more objects together into the first object. + * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. + * @param target The object to extend. It will receive the new properties. + * @param object1 An object containing additional properties to merge in. + * @param objectN Additional objects containing properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.1.4 + * @example ​ ````Merge two objects recursively, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(deep: true, target: any, object1: any, ...objectN: any[]): any; + /** + * Merge the contents of two or more objects together into the first object. + * @param target An object that will receive the new properties if additional objects are passed in or that will + * extend the jQuery namespace if it is the sole argument. + * @param object1 An object containing additional properties to merge in. + * @param object2 An object containing additional properties to merge in. + * @param object3 An object containing additional properties to merge in. + * @param object4 An object containing additional properties to merge in. + * @param object5 An object containing additional properties to merge in. + * @param object6 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.0 + * @example ​ ````Merge two objects, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + * @example ​ ````Merge defaults and options, without modifying the defaults. This is a common plugin development pattern. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y, object6: Z): T & U & V & W & X & Y & Z; + /** + * Merge the contents of two or more objects together into the first object. + * @param target An object that will receive the new properties if additional objects are passed in or that will + * extend the jQuery namespace if it is the sole argument. + * @param object1 An object containing additional properties to merge in. + * @param object2 An object containing additional properties to merge in. + * @param object3 An object containing additional properties to merge in. + * @param object4 An object containing additional properties to merge in. + * @param object5 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.0 + * @example ​ ````Merge two objects, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + * @example ​ ````Merge defaults and options, without modifying the defaults. This is a common plugin development pattern. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y; + /** + * Merge the contents of two or more objects together into the first object. + * @param target An object that will receive the new properties if additional objects are passed in or that will + * extend the jQuery namespace if it is the sole argument. + * @param object1 An object containing additional properties to merge in. + * @param object2 An object containing additional properties to merge in. + * @param object3 An object containing additional properties to merge in. + * @param object4 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.0 + * @example ​ ````Merge two objects, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + * @example ​ ````Merge defaults and options, without modifying the defaults. This is a common plugin development pattern. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X; + /** + * Merge the contents of two or more objects together into the first object. + * @param target An object that will receive the new properties if additional objects are passed in or that will + * extend the jQuery namespace if it is the sole argument. + * @param object1 An object containing additional properties to merge in. + * @param object2 An object containing additional properties to merge in. + * @param object3 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.0 + * @example ​ ````Merge two objects, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + * @example ​ ````Merge defaults and options, without modifying the defaults. This is a common plugin development pattern. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(target: T, object1: U, object2: V, object3: W): T & U & V & W; + /** + * Merge the contents of two or more objects together into the first object. + * @param target An object that will receive the new properties if additional objects are passed in or that will + * extend the jQuery namespace if it is the sole argument. + * @param object1 An object containing additional properties to merge in. + * @param object2 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.0 + * @example ​ ````Merge two objects, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + * @example ​ ````Merge defaults and options, without modifying the defaults. This is a common plugin development pattern. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(target: T, object1: U, object2: V): T & U & V; + /** + * Merge the contents of two or more objects together into the first object. + * @param target An object that will receive the new properties if additional objects are passed in or that will + * extend the jQuery namespace if it is the sole argument. + * @param object1 An object containing additional properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.0 + * @example ​ ````Merge two objects, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + * @example ​ ````Merge defaults and options, without modifying the defaults. This is a common plugin development pattern. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(target: T, object1: U): T & U; + /** + * Merge the contents of two or more objects together into the first object. + * @param target An object that will receive the new properties if additional objects are passed in or that will + * extend the jQuery namespace if it is the sole argument. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.0 + */ + extend(target: T): this & T; + /** + * Merge the contents of two or more objects together into the first object. + * @param target An object that will receive the new properties if additional objects are passed in or that will + * extend the jQuery namespace if it is the sole argument. + * @param object1 An object containing additional properties to merge in. + * @param objectN Additional objects containing properties to merge in. + * @see \`{@link https://api.jquery.com/jQuery.extend/ }\` + * @since 1.0 + * @example ​ ````Merge two objects, modifying the first. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + * @example ​ ````Merge defaults and options, without modifying the defaults. This is a common plugin development pattern. +```html + + + + + jQuery.extend demo + + + +​ +
      +​ + +​ + + +``` + */ + extend(target: any, object1: any, ...objectN: any[]): any; + /** + * Load data from the server using a HTTP GET request. + * @param url A string containing the URL to which the request is sent. + * @param data A plain object or string that is sent to the server with the request. + * @param success A callback function that is executed if the request succeeds. Required if `dataType` is provided, + * but you can use `null` or \`{@link noop jQuery.noop}\` as a placeholder. + * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). + * @see \`{@link https://api.jquery.com/jQuery.get/ }\` + * @since 1.0 + */ + get(url: string, + data: JQuery.PlainObject | string, + success: JQuery.jqXHR.DoneCallback | null, + dataType?: string): JQuery.jqXHR; + /** + * Load data from the server using a HTTP GET request. + * @param url A string containing the URL to which the request is sent. + * @param success A callback function that is executed if the request succeeds. Required if `dataType` is provided, + * but you can use `null` or \`{@link noop jQuery.noop}\` as a placeholder. + * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). + * @see \`{@link https://api.jquery.com/jQuery.get/ }\` + * @since 1.0 + * @example ​ ````Get the test.php page contents, which has been returned in json format (<?php echo json_encode( array( "name"=>"John","time"=>"2pm" ) ); ?>), and add it to the page. +```javascript +$.get( "test.php", function( data ) { + $( "body" ) + .append( "Name: " + data.name ) // John + .append( "Time: " + data.time ); // 2pm +}, "json" ); +``` + */ + get(url: string, + success: JQuery.jqXHR.DoneCallback | null, + dataType: string): JQuery.jqXHR; + /** + * Load data from the server using a HTTP GET request. + * @param url A string containing the URL to which the request is sent. + * @param success_data _@param_ `success_data` + *
      + * * `success` — A callback function that is executed if the request succeeds. Required if `dataType` is provided, + * but you can use `null` or \`{@link noop jQuery.noop}\` as a placeholder.
      + * * `data` — A plain object or string that is sent to the server with the request. + * @see \`{@link https://api.jquery.com/jQuery.get/ }\` + * @since 1.0 + * @example ​ ````Request the test.php page and send some additional data along (while still ignoring the return results). +```javascript +$.get( "test.php", { name: "John", time: "2pm" } ); +``` + * @example ​ ````Pass arrays of data to the server (while still ignoring the return results). +```javascript +$.get( "test.php", { "choices[]": ["Jon", "Susan"] } ); +``` + * @example ​ ````Alert the results from requesting test.php (HTML or XML, depending on what was returned). +```javascript +$.get( "test.php", function( data ) { + alert( "Data Loaded: " + data ); +}); +``` + * @example ​ ````Alert the results from requesting test.cgi with an additional payload of data (HTML or XML, depending on what was returned). +```javascript +$.get( "test.cgi", { name: "John", time: "2pm" } ) + .done(function( data ) { + alert( "Data Loaded: " + data ); + }); +``` + */ + get(url: string, + success_data: JQuery.jqXHR.DoneCallback | JQuery.PlainObject | string): JQuery.jqXHR; + /** + * Load data from the server using a HTTP GET request. + * @param url_settings _@param_ `url_settings` + *
      + * * `url` — A string containing the URL to which the request is sent.
      + * * `settings` — A set of key/value pairs that configure the Ajax request. All properties except for `url` are + * optional. A default can be set for any option with \`{@link ajaxSetup $.ajaxSetup()}\`. See \`{@link https://api.jquery.com/jquery.ajax/#jQuery-ajax-settings jQuery.ajax( settings )}\` + * for a complete list of all settings. The type option will automatically be set to `GET`. + * @see \`{@link https://api.jquery.com/jQuery.get/ }\` + * @since 1.0 + * @since 1.12 + * @since 2.2 + * @example ​ ````Request the test.php page, but ignore the return results. +```javascript +$.get( "test.php" ); +``` + */ + get(url_settings?: string | JQuery.UrlAjaxSettings): JQuery.jqXHR; + /** + * Load JSON-encoded data from the server using a GET HTTP request. + * @param url A string containing the URL to which the request is sent. + * @param data A plain object or string that is sent to the server with the request. + * @param success A callback function that is executed if the request succeeds. + * @see \`{@link https://api.jquery.com/jQuery.getJSON/ }\` + * @since 1.0 + */ + getJSON(url: string, + data: JQuery.PlainObject | string, + success: JQuery.jqXHR.DoneCallback): JQuery.jqXHR; + /** + * Load JSON-encoded data from the server using a GET HTTP request. + * @param url A string containing the URL to which the request is sent. + * @param success_data _@param_ `url_settings` + *
      + * * `success` — A callback function that is executed if the request succeeds.
      + * * `data` — A plain object or string that is sent to the server with the request. + * @see \`{@link https://api.jquery.com/jQuery.getJSON/ }\` + * @since 1.0 + * @example ​ ````Loads the four most recent pictures of Mount Rainier from the Flickr JSONP API. +```html + + + + + jQuery.getJSON demo + + + + +​ +
      +​ + +​ + + +``` + * @example ​ ````Load the JSON data from test.js and access a name from the returned JSON data. +```javascript +$.getJSON( "test.js", function( json ) { + console.log( "JSON Data: " + json.users[ 3 ].name ); + }); + ``` + * @example ​ ````Load the JSON data from test.js, passing along additional data, and access a name from the returned JSON data. + If an error occurs, log an error message instead. +```javascript +$.getJSON( "test.js", { name: "John", time: "2pm" } ) + .done(function( json ) { + console.log( "JSON Data: " + json.users[ 3 ].name ); + }) + .fail(function( jqxhr, textStatus, error ) { + var err = textStatus + ", " + error; + console.log( "Request Failed: " + err ); +}); +``` + */ + getJSON(url: string, + success_data?: JQuery.jqXHR.DoneCallback | JQuery.PlainObject | string): JQuery.jqXHR; + /** + * Load a JavaScript file from the server using a GET HTTP request, then execute it. + * @param url A string containing the URL to which the request is sent. + * @param success A callback function that is executed if the request succeeds. + * @see \`{@link https://api.jquery.com/jQuery.getScript/ }\` + * @since 1.0 + * @example ​ ````Define a $.cachedScript() method that allows fetching a cached script: +```javascript +jQuery.cachedScript = function( url, options ) { +​ + // Allow user to set any option except for dataType, cache, and url + options = $.extend( options || {}, { + dataType: "script", + cache: true, + url: url + }); +​ + // Use $.ajax() since it is more flexible than $.getScript + // Return the jqXHR object so we can chain callbacks + return jQuery.ajax( options ); +}; +​ +// Usage +$.cachedScript( "ajax/test.js" ).done(function( script, textStatus ) { + console.log( textStatus ); +}); +``` + * @example ​ ````Load the official jQuery Color Animation plugin dynamically and bind some color animations to occur once the new functionality is loaded. +```html + + + + + jQuery.getScript demo + + + + +​ + +
      +​ + +​ + + +``` + */ + getScript(url: string, + success?: JQuery.jqXHR.DoneCallback): JQuery.jqXHR; + /** + * Load a JavaScript file from the server using a GET HTTP request, then execute it. + * @see \`{@link https://api.jquery.com/jQuery.getScript/ }\` + * @since 1.12 + * @since 2.2 + */ + getScript(options: JQuery.UrlAjaxSettings): JQuery.jqXHR; + /** + * Execute some JavaScript code globally. + * @param code The JavaScript code to execute. + * @see \`{@link https://api.jquery.com/jQuery.globalEval/ }\` + * @since 1.0.4 + * @example ​ ````Execute a script in the global context. +```javascript +function test() { + jQuery.globalEval( "var newVar = true;" ) +} +test(); +// newVar === true +``` + */ + globalEval(code: string): void; + /** + * Finds the elements of an array which satisfy a filter function. The original array is not affected. + * @param array The array-like object to search through. + * @param funсtion The function to process each item against. The first argument to the function is the item, and the + * second argument is the index. The function should return a Boolean value. `this` will be the global + * window object. + * @param invert If "invert" is false, or not provided, then the function returns an array consisting of all elements + * for which "callback" returns true. If "invert" is true, then the function returns an array + * consisting of all elements for which "callback" returns false. + * @see \`{@link https://api.jquery.com/jQuery.grep/ }\` + * @since 1.0 + * @example ​ ````Filters the original array of numbers leaving that are not 5 and have an index greater than 4. Then it removes all 9s. +```html + + + + + jQuery.grep demo + + + + +​ +
      +

      + +​ + +​ + + +``` + * @example ​ ````Filter an array of numbers to include only numbers bigger then zero. +```javascript +$.grep( [ 0, 1, 2 ], function( n, i ) { + return n > 0; +}); +``` + * @example ​ ````Filter an array of numbers to include numbers that are not bigger than zero. +```javascript +$.grep( [ 0, 1, 2 ], function( n, i ) { + return n > 0; +}, true ); +``` + */ + grep(array: ArrayLike, + funсtion: (elementOfArray: T, indexInArray: number) => boolean, + invert?: boolean): T[]; + /** + * Determine whether an element has any jQuery data associated with it. + * @param element A DOM element to be checked for data. + * @see \`{@link https://api.jquery.com/jQuery.hasData/ }\` + * @since 1.5 + * @example ​ ````Set data on an element and see the results of hasData. +```html + + + + + jQuery.hasData demo + + + +​ +

      Results:

      +​ + +​ + + +``` + */ + hasData(element: Element | Document | Window | JQuery.PlainObject): boolean; + /** + * Holds or releases the execution of jQuery's ready event. + * @param hold Indicates whether the ready hold is being requested or released + * @see \`{@link https://api.jquery.com/jQuery.holdReady/ }\` + * @since 1.6 + * @deprecated ​ Deprecated since 3.2. See \`{@link https://github.com/jquery/jquery/issues/3288 }\`. + * + * **Cause**: The `jQuery.holdReady()` method has been deprecated due to its detrimental effect on the global performance of the page. This method can prevent all the code on the page from initializing for extended lengths of time. + * + * **Solution**: Rewrite the page so that it does not require all jQuery ready handlers to be delayed. This might be accomplished, for example, by late-loading only the code that requires the delay when it is safe to run. Due to the complexity of this method, jQuery Migrate does not attempt to fill the functionality. If the underlying version of jQuery used with jQuery Migrate no longer contains `jQuery.holdReady()` the code will fail shortly after this warning appears. + * @example ​ ````Delay the ready event until a custom plugin has loaded. +```javascript +$.holdReady( true ); +$.getScript( "myplugin.js", function() { + $.holdReady( false ); +}); +``` + */ + holdReady(hold: boolean): void; + /** + * Modify and filter HTML strings passed through jQuery manipulation methods. + * @param html The HTML string on which to operate. + * @see \`{@link https://api.jquery.com/jQuery.htmlPrefilter/ }\` + * @since 1.12 + * @since 2.2 + */ + htmlPrefilter(html: JQuery.htmlString): JQuery.htmlString; + /** + * Search for a specified value within an array and return its index (or -1 if not found). + * @param value The value to search for. + * @param array An array through which to search. + * @param fromIndex The index of the array at which to begin the search. The default is 0, which will search the whole array. + * @see \`{@link https://api.jquery.com/jQuery.inArray/ }\` + * @since 1.2 + * @example ​ ````Report the index of some elements in the array. +```html + + + + + jQuery.inArray demo + + + + +​ +
      "John" found at
      +
      4 found at
      +
      "Karl" not found, so
      +
      "Pete" is in the array, but not at or after index 2, so
      +​ + +​ + + +``` + */ + inArray(value: T, array: T[], fromIndex?: number): number; + /** + * Determine whether the argument is an array. + * @param obj Object to test whether or not it is an array. + * @see \`{@link https://api.jquery.com/jQuery.isArray/ }\` + * @since 1.3 + * @deprecated ​ Deprecated since 3.2. Use \`{@link ArrayConstructor.isArray Array.isArray}\`. + * @example ​ ````Finds out if the parameter is an array. +```html + + + + + jQuery.isArray demo + + + +​ +Is [] an Array? +​ + +​ + + +``` + */ + isArray(obj: any): obj is any[]; + /** + * Check to see if an object is empty (contains no enumerable properties). + * @param obj The object that will be checked to see if it's empty. + * @see \`{@link https://api.jquery.com/jQuery.isEmptyObject/ }\` + * @since 1.4 + * @example ​ ````Check an object to see if it's empty. +```javascript +jQuery.isEmptyObject({}); // true +jQuery.isEmptyObject({ foo: "bar" }); // false +``` + */ + isEmptyObject(obj: any): boolean; + /** + * Determine if the argument passed is a JavaScript function object. + * @param obj Object to test whether or not it is a function. + * @see \`{@link https://api.jquery.com/jQuery.isFunction/ }\` + * @since 1.2 + * @deprecated ​ Deprecated since 3.3. Use `typeof x === "function"`. + * @example ​ ````Test a few parameter examples. +```html + + + + + jQuery.isFunction demo + + + + +​ +
      jQuery.isFunction( objs[ 0 ] ) =
      +
      jQuery.isFunction( objs[ 1 ] ) =
      +
      jQuery.isFunction( objs[ 2 ] ) =
      +
      jQuery.isFunction( objs[ 3 ] ) =
      +
      jQuery.isFunction( objs[ 4 ] ) =
      +​ + +​ + + +``` + * @example ​ ````Finds out if the parameter is a function. +```javascript +$.isFunction(function() {}); +``` + */ + // tslint:disable-next-line:ban-types + isFunction(obj: any): obj is Function; + /** + * Determines whether its argument represents a JavaScript number. + * @param value The value to be tested. + * @see \`{@link https://api.jquery.com/jQuery.isNumeric/ }\` + * @since 1.7 + * @deprecated ​ Deprecated since 3.3. Internal. See \`{@link https://github.com/jquery/jquery/issues/2960 }\`. + * @example ​ ````Sample return values of $.isNumeric with various inputs. +```javascript +// true (numeric) +$.isNumeric( "-10" ) +$.isNumeric( "0" ) +$.isNumeric( 0xFF ) +$.isNumeric( "0xFF" ) +$.isNumeric( "8e5" ) +$.isNumeric( "3.1415" ) +$.isNumeric( +10 ) +$.isNumeric( 0144 ) +​ +// false (non-numeric) +$.isNumeric( "-0x42" ) +$.isNumeric( "7.2acdgs" ) +$.isNumeric( "" ) +$.isNumeric( {} ) +$.isNumeric( NaN ) +$.isNumeric( null ) +$.isNumeric( true ) +$.isNumeric( Infinity ) +$.isNumeric( undefined ) +``` + */ + isNumeric(value: any): boolean; + /** + * Check to see if an object is a plain object (created using "{}" or "new Object"). + * @param obj The object that will be checked to see if it's a plain object. + * @see \`{@link https://api.jquery.com/jQuery.isPlainObject/ }\` + * @since 1.4 + * @example ​ ````Check an object to see if it's a plain object. +```javascript +jQuery.isPlainObject({}) // true +jQuery.isPlainObject( "test" ) // false +``` + */ + isPlainObject(obj: any): boolean; + /** + * Determine whether the argument is a window. + * @param obj Object to test whether or not it is a window. + * @see \`{@link https://api.jquery.com/jQuery.isWindow/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Internal. See \`{@link https://github.com/jquery/jquery/issues/3629 }\`. + * + * **Cause**: This method returns `true` if its argument is thought to be a `window` element. It was created for internal use and is not a reliable way of detecting `window` for public needs. + * + * **Solution**: Remove any use of `jQuery.isWindow()` from code. If it is truly needed it can be replaced with a check for `obj != null && obj === obj.window` which was the test used inside this method. + * @example ​ ````Finds out if the parameter is a window. +```html + + + + + jQuery.isWindow demo + + + +​ +Is 'window' a window? +​ + +​ + + +``` + */ + isWindow(obj: any): obj is Window; + /** + * Check to see if a DOM node is within an XML document (or is an XML document). + * @param node The DOM node that will be checked to see if it's in an XML document. + * @see \`{@link https://api.jquery.com/jQuery.isXMLDoc/ }\` + * @since 1.1.4 + * @example ​ ````Check an object to see if it's in an XML document. +```javascript +jQuery.isXMLDoc( document ) // false +jQuery.isXMLDoc( document.body ) // false +``` + */ + isXMLDoc(node: Node): boolean; + /** + * Convert an array-like object into a true JavaScript array. + * @param obj Any object to turn into a native Array. + * @see \`{@link https://api.jquery.com/jQuery.makeArray/ }\` + * @since 1.2 + * @example ​ ````Turn a collection of HTMLElements into an Array of them. +```html + + + + + jQuery.makeArray demo + + + + +​ +
      First
      +
      Second
      +
      Third
      +
      Fourth
      +​ + +​ + + +``` + * @example ​ ````Turn a jQuery object into an array +```javascript +var obj = $( "li" ); +var arr = $.makeArray( obj ); +``` + */ + makeArray(obj: ArrayLike): T[]; + /** + * Translate all items in an array or object to new array of items. + * @param array The Array to translate. + * @param callback The function to process each item against. The first argument to the function is the array item, the + * second argument is the index in array The function can return any value. A returned array will be + * flattened into the resulting array. Within the function, this refers to the global (window) object. + * @see \`{@link https://api.jquery.com/jQuery.map/ }\` + * @since 1.0 + * @example ​ ````Use $.map() to change the values of an array. +```html + + + + + jQuery.map demo + + + + +​ +
      +

      + +​ + +​ + + +``` + * @example ​ ````Map the original array to a new one and add 4 to each value. +```javascript +$.map( [ 0, 1, 2 ], function( n ) { + return n + 4; +}); +``` + * @example ​ ````Map the original array to a new one, adding 1 to each value if it is bigger then zero and removing it if not. +```javascript +$.map( [ 0, 1, 2 ], function( n ) { + return n > 0 ? n + 1 : null; +}); +``` + * @example ​ ````Map the original array to a new one; each element is added with its original value and the value plus one. +```javascript +$.map( [ 0, 1, 2 ], function( n ) { + return [ n, n + 1 ]; +}); +``` + * @example ​ ````Map the original array to a new one; each element is squared. +```javascript +$.map( [ 0, 1, 2, 3 ], function( a ) { + return a * a; +}); +``` + * @example ​ ````Map the original array to a new one, removing numbers less than 50 by returning null and subtracting 45 from the rest. +```javascript +$.map( [ 0, 1, 52, 97 ], function( a ) { + return (a > 50 ? a - 45 : null); +}); +``` + * @example ​ ````Augment the resulting array by returning an array inside the function. +```javascript +var array = [ 0, 1, 52, 97 ]; +array = $.map( array, function( a, index ) { + return [ a - 45, index ]; +}); +``` + */ + map(array: T[], callback: (this: Window, elementOfArray: T, indexInArray: number) => JQuery.TypeOrArray | null | undefined): TReturn[]; + /** + * Translate all items in an array or object to new array of items. + * @param obj The Object to translate. + * @param callback The function to process each item against. The first argument to the function is the value; the + * second argument is the key of the object property. The function can return any value to add to the + * array. A returned array will be flattened into the resulting array. Within the function, this refers + * to the global (window) object. + * @see \`{@link https://api.jquery.com/jQuery.map/ }\` + * @since 1.6 + * @example ​ ````Map the original object to a new array and double each value. +```javascript +var dimensions = { width: 10, height: 15, length: 20 }; +dimensions = $.map( dimensions, function( value, index ) { + return value * 2; +}); +``` + * @example ​ ````Map an object's keys to an array. +```javascript +var dimensions = { width: 10, height: 15, length: 20 }; +var keys = $.map( dimensions, function( value, key ) { + return key; +}); +``` + */ + map(obj: T, callback: (this: Window, propertyOfObject: T[K], key: K) => JQuery.TypeOrArray | null | undefined): TReturn[]; + /** + * Merge the contents of two arrays together into the first array. + * @param first The first array-like object to merge, the elements of second added. + * @param second The second array-like object to merge into the first, unaltered. + * @see \`{@link https://api.jquery.com/jQuery.merge/ }\` + * @since 1.0 + * @example ​ ````Merges two arrays, altering the first argument. +```javascript +$.merge( [ 0, 1, 2 ], [ 2, 3, 4 ] ) +``` + * @example ​ ````Merges two arrays, altering the first argument. +```javascript +$.merge( [ 3, 2, 1 ], [ 4, 3, 2 ] ) +``` + * @example ​ ````Merges two arrays, but uses a copy, so the original isn't altered. +```javascript +var first = [ "a", "b", "c" ]; +var second = [ "d", "e", "f" ]; +$.merge( $.merge( [], first ), second ); +``` + */ + merge(first: ArrayLike, second: ArrayLike): Array; + /** + * Relinquish jQuery's control of the $ variable. + * @param removeAll A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself). + * @see \`{@link https://api.jquery.com/jQuery.noConflict/ }\` + * @since 1.0 + * @example ​ ````Map the original object that was referenced by $ back to $. +```javascript +jQuery.noConflict(); +// Do something with jQuery +jQuery( "div p" ).hide(); +// Do something with another library's $() +$( "content" ).style.display = "none"; +``` + * @example ​ ````Revert the $ alias and then create and execute a function to provide the $ as a jQuery alias inside the function's scope. Inside the function the original $ object is not available. This works well for most plugins that don't rely on any other library. +```javascript +jQuery.noConflict(); +(function( $ ) { + $(function() { + // More code using $ as alias to jQuery + }); +})(jQuery); +​ +// Other code using $ as an alias to the other library +``` + * @example ​ ````Create a different alias instead of jQuery to use in the rest of the script. +```javascript +var j = jQuery.noConflict(); +​ +// Do something with jQuery +j( "div p" ).hide(); +​ +// Do something with another library's $() +$( "content" ).style.display = "none"; +``` + * @example ​ ````Completely move jQuery to a new namespace in another object. +```javascript +var dom = {}; +dom.query = jQuery.noConflict( true ); +``` + * @example ​ ````Load two versions of jQuery (not recommended). Then, restore jQuery's globally scoped variables to the first loaded jQuery. +```html + + + + + jQuery.noConflict demo + + + +​ +
      +

      Before $.noConflict(true)

      +
      + +​ + +​ + + +``` + */ + noConflict(removeAll?: boolean): this; + /** + * @deprecated ​ Deprecated since 3.2. + * + * **Cause**: This public but never-documented method has been deprecated as of jQuery 3.2.0. + * + * **Solution**: Replace calls such as `jQuery.nodeName( elem, "div" )` with a test such as `elem.nodeName.toLowerCase() === "div"`. + */ + nodeName(elem: Node, name: string): boolean; + /** + * An empty function. + * @see \`{@link https://api.jquery.com/jQuery.noop/ }\` + * @since 1.4 + */ + noop(): undefined; + /** + * Return a number representing the current time. + * @see \`{@link https://api.jquery.com/jQuery.now/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link DateConstructor.now Date.now}\`. + */ + now(): number; + /** + * Create a serialized representation of an array, a plain object, or a jQuery object suitable for use in a URL query string or Ajax request. In case a jQuery object is passed, it should contain input elements with name/value properties. + * @param obj An array, a plain object, or a jQuery object to serialize. + * @param traditional A Boolean indicating whether to perform a traditional "shallow" serialization. + * @see \`{@link https://api.jquery.com/jQuery.param/ }\` + * @since 1.2 + * @since 1.4 + * @example ​ ````Serialize a key/value object. +```html + + + + + jQuery.param demo + + + + +​ +
      +​ + +​ + + +``` + * @example ​ ````Serialize a few complex objects +```html + + + + + jQuery.param demo + + + + +​​ + +​ + + +``` + */ + param(obj: any[] | JQuery.PlainObject | JQuery, traditional?: boolean): string; + /** + * Parses a string into an array of DOM nodes. + * @param data HTML string to be parsed + * @param context Document element to serve as the context in which the HTML fragment will be created + * @param keepScripts A Boolean indicating whether to include scripts passed in the HTML string + * @see \`{@link https://api.jquery.com/jQuery.parseHTML/ }\` + * @since 1.8 + */ + parseHTML(data: string, context: Document | null | undefined, keepScripts: boolean): JQuery.Node[]; + /** + * Parses a string into an array of DOM nodes. + * @param data HTML string to be parsed + * @param context_keepScripts _@param_ `context_keepScripts` + *
      + * * `context` — Document element to serve as the context in which the HTML fragment will be created
      + * * `keepScripts` — A Boolean indicating whether to include scripts passed in the HTML string + * @see \`{@link https://api.jquery.com/jQuery.parseHTML/ }\` + * @since 1.8 + * @example ​ ````Create an array of DOM nodes using an HTML string and insert it into a div. +```html + + + + + jQuery.parseHTML demo + + + +​ +
      +

      Content:

      +
      +​ + +​ + + +``` + */ + parseHTML(data: string, context_keepScripts?: Document | null | boolean): JQuery.Node[]; + /** + * Takes a well-formed JSON string and returns the resulting JavaScript value. + * @param json The JSON string to parse. + * @see \`{@link https://api.jquery.com/jQuery.parseJSON/ }\` + * @since 1.4.1 + * @deprecated ​ Deprecated since 3.0. Use \`{@link JSON.parse }\`. + * + * **Cause**: The `jQuery.parseJSON` method in recent jQuery is identical to the native `JSON.parse`. As of jQuery 3.0 `jQuery.parseJSON` is deprecated. + * + * **Solution**: Replace any use of `jQuery.parseJSON` with `JSON.parse`. + * @example ​ ````Parse a JSON string. +```javascript +var obj = jQuery.parseJSON( '{ "name": "John" }' ); +alert( obj.name === "John" ); +``` + */ + parseJSON(json: string): any; + /** + * Parses a string into an XML document. + * @param data a well-formed XML string to be parsed + * @see \`{@link https://api.jquery.com/jQuery.parseXML/ }\` + * @since 1.5 + * @example ​ ````Create a jQuery object using an XML string and obtain the value of the title node. +```html + + + + + jQuery.parseXML demo + + + +​ +

      +

      +​ + +​ + + +``` + */ + parseXML(data: string): XMLDocument; + /** + * Load data from the server using a HTTP POST request. + * @param url A string containing the URL to which the request is sent. + * @param data A plain object or string that is sent to the server with the request. + * @param success A callback function that is executed if the request succeeds. Required if dataType is provided, but + * can be null in that case. + * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). + * @see \`{@link https://api.jquery.com/jQuery.post/ }\` + * @since 1.0 + * @example ​ ````Post to the test.php page and get content which has been returned in json format (<?php echo json_encode(array("name"=>"John","time"=>"2pm")); ?>). +```javascript +$.post( "test.php", { func: "getNameAndTime" }, function( data ) { + console.log( data.name ); // John + console.log( data.time ); // 2pm +}, "json"); +``` + */ + post(url: string, + data: JQuery.PlainObject | string, + success: JQuery.jqXHR.DoneCallback | null, + dataType?: string): JQuery.jqXHR; + /** + * Load data from the server using a HTTP POST request. + * @param url A string containing the URL to which the request is sent. + * @param success A callback function that is executed if the request succeeds. Required if dataType is provided, but + * can be null in that case. + * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). + * @see \`{@link https://api.jquery.com/jQuery.post/ }\` + * @since 1.0 + */ + post(url: string, + success: JQuery.jqXHR.DoneCallback | null, + dataType: string): JQuery.jqXHR; + /** + * Load data from the server using a HTTP POST request. + * @param url A string containing the URL to which the request is sent. + * @param success_data _@param_ `success_data` + *
      + * * `success` — A callback function that is executed if the request succeeds. Required if `dataType` is provided, + * but can be `null` in that case.
      + * * `data` — A plain object or string that is sent to the server with the request. + * @see \`{@link https://api.jquery.com/jQuery.post/ }\` + * @since 1.0 + * @example ​ ````Request the test.php page and send some additional data along (while still ignoring the return results). +```javascript +$.post( "test.php", { name: "John", time: "2pm" } ); +``` + * @example ​ ````Pass arrays of data to the server (while still ignoring the return results). +```javascript +$.post( "test.php", { 'choices[]': [ "Jon", "Susan" ] } ); +``` + * @example ​ ````Send form data using Ajax requests +```javascript +$.post( "test.php", $( "#testform" ).serialize() ); +``` + * @example ​ ````Alert the results from requesting test.php (HTML or XML, depending on what was returned). +```javascript +$.post( "test.php", function( data ) { + alert( "Data Loaded: " + data ); +}); +``` + * @example ​ ````Alert the results from requesting test.php with an additional payload of data (HTML or XML, depending on what was returned). +```javascript +$.post( "test.php", { name: "John", time: "2pm" }) + .done(function( data ) { + alert( "Data Loaded: " + data ); + }); +``` + * @example ​ ````Post a form using Ajax and put results in a div +```html + + + + + jQuery.post demo + + + +​ +
      + + +
      + +
      +​ + +​ + + +``` + */ + post(url: string, + success_data: JQuery.jqXHR.DoneCallback | JQuery.PlainObject | string): JQuery.jqXHR; + /** + * Load data from the server using a HTTP POST request. + * @param url_settings _@param_ `url_settings` + *
      + * * `url` — A string containing the URL to which the request is sent.
      + * * `settings` — A set of key/value pairs that configure the Ajax request. All properties except for `url` are optional. + * A default can be set for any option with \`{@link ajaxSetup $.ajaxSetup()}\`. See \`{@link https://api.jquery.com/jquery.ajax/#jQuery-ajax-settings jQuery.ajax( settings )}\` + * for a complete list of all settings. Type will automatically be set to `POST`. + * @see \`{@link https://api.jquery.com/jQuery.post/ }\` + * @since 1.0 + * @since 1.12 + * @since 2.2 + * @example ​ ````Request the test.php page, but ignore the return results. +```javascript +$.post( "test.php" ); +``` + */ + post(url_settings?: string | JQuery.UrlAjaxSettings): JQuery.jqXHR; + + // region proxy + // #region proxy + + // region (funсtion, null | undefined) + // #region (funсtion, null | undefined) + + // region 0 to 7 additional arguments + // #region 0 to 7 additional arguments + + // region 0 parameters + // #region 0 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C) => TReturn, + context: null | undefined, + a: A, b: B, c: C): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B) => TReturn, + context: null | undefined, + a: A, b: B): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A) => TReturn, + context: null | undefined, + a: A): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: () => TReturn, + context: null | undefined): () => TReturn; + + // #endregion + + // region 1 parameters + // #region 1 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, + t: T) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, + t: T) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, + t: T) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, + t: T) => TReturn, + context: null | undefined, + a: A, b: B, c: C): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, + t: T) => TReturn, + context: null | undefined, + a: A, b: B): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, + t: T) => TReturn, + context: null | undefined, + a: A): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (t: T) => TReturn, + context: null | undefined): (t: T) => TReturn; + + // #endregion + + // region 2 parameters + // #region 2 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, + t: T, u: U) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, + t: T, u: U) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, + t: T, u: U) => TReturn, + context: null | undefined, + a: A, b: B, c: C): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, + t: T, u: U) => TReturn, + context: null | undefined, + a: A, b: B): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, + t: T, u: U) => TReturn, + context: null | undefined, + a: A): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (t: T, u: U) => TReturn, + context: null | undefined): (t: T, u: U) => TReturn; + + // #endregion + + // region 3 parameters + // #region 3 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U, v: V) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U, v: V) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, + t: T, u: U, v: V) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, + t: T, u: U, v: V) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, + t: T, u: U, v: V) => TReturn, + context: null | undefined, + a: A, b: B, c: C): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, + t: T, u: U, v: V) => TReturn, + context: null | undefined, + a: A, b: B): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, + t: T, u: U, v: V) => TReturn, + context: null | undefined, + a: A): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (t: T, u: U, v: V) => TReturn, + context: null | undefined): (t: T, u: U, v: V) => TReturn; + + // #endregion + + // region 4 parameters + // #region 4 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U, v: V, w: W) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U, v: V, w: W) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, + t: T, u: U, v: V, w: W) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, + t: T, u: U, v: V, w: W) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, + t: T, u: U, v: V, w: W) => TReturn, + context: null | undefined, + a: A, b: B, c: C): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, + t: T, u: U, v: V, w: W) => TReturn, + context: null | undefined, + a: A, b: B): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, + t: T, u: U, v: V, w: W) => TReturn, + context: null | undefined, + a: A): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (t: T, u: U, v: V, w: W) => TReturn, + context: null | undefined): (t: T, u: U, v: V, w: W) => TReturn; + + // #endregion + + // region 5 parameters + // #region 5 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: null | undefined, + a: A, b: B, c: C): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: null | undefined, + a: A, b: B): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: null | undefined, + a: A): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (t: T, u: U, v: V, w: W, x: X) => TReturn, + context: null | undefined): (t: T, u: U, v: V, w: W, x: X) => TReturn; + + // #endregion + + // region 6 parameters + // #region 6 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: null | undefined, + a: A, b: B, c: C): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: null | undefined, + a: A, b: B): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: null | undefined, + a: A): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: null | undefined): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + + // #endregion + + // region 7+ parameters + // #region 7+ parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, e: E, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, d: D, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: null | undefined, + a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, c: C, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: null | undefined, + a: A, b: B, c: C): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, b: B, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: null | undefined, + a: A, b: B): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (a: A, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: null | undefined, + a: A): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: null | undefined): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + + // #endregion + + // #endregion + + // region 8+ additional arguments + // #region 8+ additional arguments + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param additionalArguments Any number of arguments to be passed to the function referenced in the function argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.9 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + */ + proxy(funсtion: (...args: any[]) => TReturn, + context: null | undefined, + ...additionalArguments: any[]): (...args: any[]) => TReturn; + + // #endregion + + // #endregion + + // region (funсtion, context) + // #region (funсtion, context) + + // region 0 to 7 additional arguments + // #region 0 to 7 additional arguments + + // region 0 parameters + // #region 0 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, g: G) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C) => TReturn, + context: TContext, + a: A, b: B, c: C): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B) => TReturn, + context: TContext, + a: A, b: B): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4` + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A) => TReturn, + context: TContext, + a: A): () => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext) => TReturn, + context: TContext): () => TReturn; + + // #endregion + + // region 1 parameters + // #region 1 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, + t: T) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, + t: T) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, + t: T) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, + t: T) => TReturn, + context: TContext, + a: A, b: B, c: C): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, + t: T) => TReturn, + context: TContext, + a: A, b: B): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, + t: T) => TReturn, + context: TContext, + a: A): (t: T) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, t: T) => TReturn, + context: TContext): (t: T) => TReturn; + + // #endregion + + // region 2 parameters + // #region 2 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, + t: T, u: U) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, + t: T, u: U) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, + t: T, u: U) => TReturn, + context: TContext, + a: A, b: B, c: C): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, + t: T, u: U) => TReturn, + context: TContext, + a: A, b: B): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, + t: T, u: U) => TReturn, + context: TContext, + a: A): (t: T, u: U) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, t: T, u: U) => TReturn, + context: TContext): (t: T, u: U) => TReturn; + + // #endregion + + // region 3 parameters + // #region 3 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U, v: V) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U, v: V) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, + t: T, u: U, v: V) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, + t: T, u: U, v: V) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, + t: T, u: U, v: V) => TReturn, + context: TContext, + a: A, b: B, c: C): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, + t: T, u: U, v: V) => TReturn, + context: TContext, + a: A, b: B): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, + t: T, u: U, v: V) => TReturn, + context: TContext, + a: A): (t: T, u: U, v: V) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, t: T, u: U, v: V) => TReturn, + context: TContext): (t: T, u: U, v: V) => TReturn; + + // #endregion + + // region 4 parameters + // #region 4 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U, v: V, w: W) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U, v: V, w: W) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, + t: T, u: U, v: V, w: W) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, + t: T, u: U, v: V, w: W) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, + t: T, u: U, v: V, w: W) => TReturn, + context: TContext, + a: A, b: B, c: C): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, + t: T, u: U, v: V, w: W) => TReturn, + context: TContext, + a: A, b: B): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, + t: T, u: U, v: V, w: W) => TReturn, + context: TContext, + a: A): (t: T, u: U, v: V, w: W) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, t: T, u: U, v: V, w: W) => TReturn, + context: TContext): (t: T, u: U, v: V, w: W) => TReturn; + + // #endregion + + // region 5 parameters + // #region 5 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: TContext, + a: A, b: B, c: C): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: TContext, + a: A, b: B): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, + t: T, u: U, v: V, w: W, x: X) => TReturn, + context: TContext, + a: A): (t: T, u: U, v: V, w: W, x: X) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, t: T, u: U, v: V, w: W, x: X) => TReturn, + context: TContext): (t: T, u: U, v: V, w: W, x: X) => TReturn; + + // #endregion + + // region 6 parameters + // #region 6 parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: TContext, + a: A, b: B, c: C): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: TContext, + a: A, b: B): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, + t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: TContext, + a: A): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, + context: TContext): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; + + // #endregion + + // region 7+ parameters + // #region 7+ parameters + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @param g An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, g: G, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @param f An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, f: F, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @param e An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, e: E, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @param d An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, d: D, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: TContext, + a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @param c An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, c: C, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: TContext, + a: A, b: B, c: C): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @param b An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, b: B, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: TContext, + a: A, b: B): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param a An argument to be passed to the function referenced in the `function` argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, a: A, + t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: TContext, + a: A): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, + context: TContext): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; + + // #endregion + + // #endregion + + // region 8+ additional arguments + // #region 8+ additional arguments + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param funсtion The function whose context will be changed. + * @param context The object to which the context (`this`) of the function should be set. + * @param additionalArguments Any number of arguments to be passed to the function referenced in the function argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Change the context of functions bound to a click handler using the "function, context" signature. Unbind the first handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + * @example ​ ````Change the context of a function bound to the click handler, +```html + + + + + jQuery.proxy demo + + + +​ +

      +
      +​ + +​ + + +``` + */ + proxy(funсtion: (this: TContext, ...args: any[]) => TReturn, + context: TContext, + ...additionalArguments: any[]): (...args: any[]) => TReturn; + + // #endregion + + // #endregion + + // region (context, name) + // #region (context, name) + + /** + * Takes a function and returns a new one that will always have a particular context. + * @param context The object to which the context of the function should be set. + * @param name The name of the function whose context will be changed (should be a property of the context object). + * @param additionalArguments Any number of arguments to be passed to the function named in the name argument. + * @see \`{@link https://api.jquery.com/jQuery.proxy/ }\` + * @since 1.4 + * @since 1.6 + * @deprecated ​ Deprecated since 3.3. Use \`{@link Function#bind }\`. + * @example ​ ````Enforce the context of the function using the "context, function name" signature. Unbind the handler after first click. +```html + + + + + jQuery.proxy demo + + + +​ +

      +

      +​ + +​ + + +``` + */ + proxy(context: TContext, + name: keyof TContext, + ...additionalArguments: any[]): (...args: any[]) => any; + + // #endregion + + // #endregion + + /** + * Manipulate the queue of functions to be executed on the matched element. + * @param element A DOM element where the array of queued functions is attached. + * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. + * @param newQueue The new function to add to the queue. + * An array of functions to replace the current queue contents. + * @see \`{@link https://api.jquery.com/jQuery.queue/ }\` + * @since 1.3 + * @example ​ ````Show the length of the queue. +```html + + + + + jQuery.queue demo + + + + +​ + + +
      + ​ + +​ + + +``` + * @example ​ ````Queue a custom function. +```html + + + + + jQuery.queue demo + + + + +​ +Click here... +
      +​ + +​ + + +``` + * @example ​ ````Set a queue array to delete the queue. +```html + + + + + jQuery.queue demo + + + + +​ + + +
      +​ + +​ + + +``` + */ + queue(element: T, queueName?: string, newQueue?: JQuery.TypeOrArray>): JQuery.Queue; + /** + * Handles errors thrown synchronously in functions wrapped in jQuery(). + * @param error An error thrown in the function wrapped in jQuery(). + * @see \`{@link https://api.jquery.com/jQuery.readyException/ }\` + * @since 3.1 + * @example ​ ````Pass the received error to console.error. +```javascript +jQuery.readyException = function( error ) { + console.error( error ); +}; +``` + */ + readyException(error: Error): any; + /** + * Remove a previously-stored piece of data. + * @param element A DOM element from which to remove data. + * @param name A string naming the piece of data to remove. + * @see \`{@link https://api.jquery.com/jQuery.removeData/ }\` + * @since 1.2.3 + * @example ​ ````Set a data store for 2 names then remove one of them. +```html + + + + + jQuery.removeData demo + + + + +​ +
      value1 before creation:
      +
      value1 after creation:
      +
      value1 after removal:
      +
      value2 after removal:
      +​ + +​ + + +``` + */ + removeData(element: Element | Document | Window | JQuery.PlainObject, name?: string): void; + /** + * Creates an object containing a set of properties ready to be used in the definition of custom animations. + * @param duration A string or number determining how long the animation will run. + * @param easing A string indicating which easing function to use for the transition. + * @param complete A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/jQuery.speed/ }\` + * @since 1.1 + */ + speed(duration: JQuery.Duration, easing: string, complete: (this: TElement) => void): JQuery.EffectsOptions; + /** + * Creates an object containing a set of properties ready to be used in the definition of custom animations. + * @param duration A string or number determining how long the animation will run. + * @param easing_complete _@param_ `easing_complete` + *
      + * * `easing` — A string indicating which easing function to use for the transition.
      + * * `complete` — A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/jQuery.speed/ }\` + * @since 1.0 + * @since 1.1 + */ + speed(duration: JQuery.Duration, + easing_complete: string | ((this: TElement) => void)): JQuery.EffectsOptions; + /** + * Creates an object containing a set of properties ready to be used in the definition of custom animations. + * @param duration_complete_settings _@param_ `duration_complete_settings` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `settings` — + * @see \`{@link https://api.jquery.com/jQuery.speed/ }\` + * @since 1.0 + * @since 1.1 + */ + speed(duration_complete_settings?: JQuery.Duration | ((this: TElement) => void) | JQuery.SpeedSettings): JQuery.EffectsOptions; + /** + * Remove the whitespace from the beginning and end of a string. + * @param str The string to trim. + * @see \`{@link https://api.jquery.com/jQuery.trim/ }\` + * @since 1.0 + * @example ​ ````Remove the white spaces at the start and at the end of the string. +```html + + + + + jQuery.trim demo + + + +​ +
      
      +
      
      +​
      +
      +​
      +
      +
      +```
      +     * @example ​ ````Remove the white spaces at the start and at the end of the string.
      +```javascript
      +$.trim("    hello, how are you?    ");
      +```
      +     * @example ​ ````Remove the white spaces at the start and at the end of the string.
      +```javascript
      +$.trim("    hello, how are you?    ");
      +```
      +     */
      +    trim(str: string): string;
      +    /**
      +     * Determine the internal JavaScript [[Class]] of an object.
      +     * @param obj Object to get the internal JavaScript [[Class]] of.
      +     * @see \`{@link https://api.jquery.com/jQuery.type/ }\`
      +     * @since 1.4.3
      +     * @deprecated ​ Deprecated since 3.3. See \`{@link https://github.com/jquery/jquery/issues/3605 }\`.
      +     * @example ​ ````Find out if the parameter is a RegExp.
      +```html
      +
      +
      +
      +  
      +  jQuery.type demo
      +  
      +
      +
      +​
      +Is it a RegExp? 
      +​
      +
      +​
      +
      +
      +```
      +     */
      +    type(obj: any): 'array' | 'boolean' | 'date' | 'error' | 'function' | 'null' | 'number' | 'object' | 'regexp' | 'string' | 'symbol' | 'undefined';
      +    /**
      +     * Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers.
      +     * @param array The Array of DOM elements.
      +     * @see \`{@link https://api.jquery.com/jQuery.unique/ }\`
      +     * @since 1.1.3
      +     * @deprecated ​ Deprecated since 3.0. Use \`{@link uniqueSort }\`.
      +     *
      +     * **Cause**: The fact that `jQuery.unique` sorted its results in DOM order was surprising to many who did not read the documentation carefully. As of jQuery 3.0 this function is being renamed to make it clear.
      +     *
      +     * **Solution**: Replace all uses of `jQuery.unique` with `jQuery.uniqueSort` which is the same function with a better name.
      +     * @example ​ ````Removes any duplicate elements from the array of divs.
      +```html
      +
      +
      +
      +  
      +  jQuery.unique demo
      +  
      +  
      +
      +
      +​
      +
      There are 6 divs in this document.
      +
      +
      +
      +
      +
      +​ + +​ + + +``` + */ + unique(array: T[]): T[]; + /** + * Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers. + * @param array The Array of DOM elements. + * @see \`{@link https://api.jquery.com/jQuery.uniqueSort/ }\` + * @since 1.12 + * @since 2.2 + * @example ​ ````Removes any duplicate elements from the array of divs. +```html + + + + + jQuery.uniqueSort demo + + + + +​ +
      There are 6 divs in this document.
      +
      +
      +
      +
      +
      +​ + +​ + + +``` + */ + uniqueSort(array: T[]): T[]; + /** + * Provides a way to execute callback functions based on zero or more Thenable objects, usually Deferred objects that represent asynchronous events. + * @see \`{@link https://api.jquery.com/jQuery.when/ }\` + * @since 1.5 + * @example ​ ````Execute a function after two Ajax requests are successful. (See the jQuery.ajax() documentation for a complete description of success and error cases for an ajax request). +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) { + // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively. + // Each argument is an array with the following structure: [ data, statusText, jqXHR ] + var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It" + if ( /Whip It/.test( data ) ) { + alert( "We got what we came for!" ); + } +}); +``` + * @example ​ ````Execute the function myFunc when both ajax requests are successful, or myFailure if either one has an error. +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ) + .then( myFunc, myFailure ); +``` + */ + when( + deferredT: JQuery.Promise | JQuery.Thenable | TR1, + deferredU: JQuery.Promise | JQuery.Thenable | UR1, + deferredV: JQuery.Promise | JQuery.Thenable | VR1, + ): JQuery.Promise3< + TR1, TJ1, never, + UR1, UJ1, never, + VR1, VJ1, never>; + /** + * Provides a way to execute callback functions based on zero or more Thenable objects, usually Deferred objects that represent asynchronous events. + * @see \`{@link https://api.jquery.com/jQuery.when/ }\` + * @since 1.5 + * @example ​ ````Execute a function after two Ajax requests are successful. (See the jQuery.ajax() documentation for a complete description of success and error cases for an ajax request). +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) { + // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively. + // Each argument is an array with the following structure: [ data, statusText, jqXHR ] + var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It" + if ( /Whip It/.test( data ) ) { + alert( "We got what we came for!" ); + } +}); +``` + * @example ​ ````Execute the function myFunc when both ajax requests are successful, or myFailure if either one has an error. +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ) + .then( myFunc, myFailure ); +``` + */ + when( + deferredT: JQuery.Promise | JQuery.Thenable | TR1, + deferredU: JQuery.Promise | JQuery.Thenable | UR1, + ): JQuery.Promise2< + TR1, TJ1, never, + UR1, UJ1, never>; + /** + * Provides a way to execute callback functions based on zero or more Thenable objects, usually Deferred objects that represent asynchronous events. + * @see \`{@link https://api.jquery.com/jQuery.when/ }\` + * @since 1.5 + * @example ​ ````Execute a function after two Ajax requests are successful. (See the jQuery.ajax() documentation for a complete description of success and error cases for an ajax request). +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) { + // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively. + // Each argument is an array with the following structure: [ data, statusText, jqXHR ] + var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It" + if ( /Whip It/.test( data ) ) { + alert( "We got what we came for!" ); + } +}); +``` + * @example ​ ````Execute the function myFunc when both ajax requests are successful, or myFailure if either one has an error. +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ) + .then( myFunc, myFailure ); +``` + */ + when( + deferredT: JQuery.Promise3 | + JQuery.Promise2 + ): JQuery.Promise3< + TR1, TJ1, never, + TR2, TJ2, never, + TR3, TJ3, never>; + /** + * Provides a way to execute callback functions based on zero or more Thenable objects, usually Deferred objects that represent asynchronous events. + * @see \`{@link https://api.jquery.com/jQuery.when/ }\` + * @since 1.5 + * @example ​ ````Execute a function after two Ajax requests are successful. (See the jQuery.ajax() documentation for a complete description of success and error cases for an ajax request). +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) { + // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively. + // Each argument is an array with the following structure: [ data, statusText, jqXHR ] + var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It" + if ( /Whip It/.test( data ) ) { + alert( "We got what we came for!" ); + } +}); +``` + * @example ​ ````Execute the function myFunc when both ajax requests are successful, or myFailure if either one has an error. +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ) + .then( myFunc, myFailure ); +``` + */ + when(deferred: JQuery.Promise | JQuery.Thenable | TR1): JQuery.Promise; + /** + * Provides a way to execute callback functions based on zero or more Thenable objects, usually Deferred objects that represent asynchronous events. + * @param deferreds Zero or more Thenable objects. + * @see \`{@link https://api.jquery.com/jQuery.when/ }\` + * @since 1.5 + * @example ​ ````Execute a function after two Ajax requests are successful. (See the jQuery.ajax() documentation for a complete description of success and error cases for an ajax request). +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) { + // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively. + // Each argument is an array with the following structure: [ data, statusText, jqXHR ] + var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It" + if ( /Whip It/.test( data ) ) { + alert( "We got what we came for!" ); + } +}); +``` + * @example ​ ````Execute the function myFunc when both ajax requests are successful, or myFailure if either one has an error. +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ) + .then( myFunc, myFailure ); +``` + */ + when(...deferreds: Array | JQuery.Thenable | TR1>): JQuery.Promise; + /** + * Provides a way to execute callback functions based on zero or more Thenable objects, usually Deferred objects that represent asynchronous events. + * @param deferreds Zero or more Thenable objects. + * @see \`{@link https://api.jquery.com/jQuery.when/ }\` + * @since 1.5 + * @example ​ ````Execute a function after two Ajax requests are successful. (See the jQuery.ajax() documentation for a complete description of success and error cases for an ajax request). +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) { + // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively. + // Each argument is an array with the following structure: [ data, statusText, jqXHR ] + var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It" + if ( /Whip It/.test( data ) ) { + alert( "We got what we came for!" ); + } +}); +``` + * @example ​ ````Execute the function myFunc when both ajax requests are successful, or myFailure if either one has an error. +```javascript +$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ) + .then( myFunc, myFailure ); +``` + */ + when(...deferreds: any[]): JQuery.Promise; +} diff --git a/node_modules/@types/jquery/LICENSE b/node_modules/@types/jquery/LICENSE new file mode 100644 index 00000000..9e841e7a --- /dev/null +++ b/node_modules/@types/jquery/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/node_modules/@types/jquery/README.md b/node_modules/@types/jquery/README.md new file mode 100644 index 00000000..cbf60bb3 --- /dev/null +++ b/node_modules/@types/jquery/README.md @@ -0,0 +1,16 @@ +# Installation +> `npm install --save @types/jquery` + +# Summary +This package contains type definitions for jquery (https://jquery.com). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/jquery. + +### Additional Details + * Last updated: Mon, 07 Dec 2020 19:49:03 GMT + * Dependencies: [@types/sizzle](https://npmjs.com/package/@types/sizzle) + * Global values: `$`, `Symbol`, `jQuery` + +# Credits +These definitions were written by [Leonard Thieu](https://github.com/leonard-thieu), [Boris Yankov](https://github.com/borisyankov), [Christian Hoffmeister](https://github.com/choffmeister), [Steve Fenton](https://github.com/Steve-Fenton), [Diullei Gomes](https://github.com/Diullei), [Tass Iliopoulos](https://github.com/tasoili), [Jason Swearingen](https://github.com/jasons-novaleaf), [Sean Hill](https://github.com/seanski), [Guus Goossens](https://github.com/Guuz), [Kelly Summerlin](https://github.com/ksummerlin), [Basarat Ali Syed](https://github.com/basarat), [Nicholas Wolverson](https://github.com/nwolverson), [Derek Cicerone](https://github.com/derekcicerone), [Andrew Gaspar](https://github.com/AndrewGaspar), [Seikichi Kondo](https://github.com/seikichi), [Benjamin Jackman](https://github.com/benjaminjackman), [Poul Sorensen](https://github.com/s093294), [Josh Strobl](https://github.com/JoshStrobl), [John Reilly](https://github.com/johnnyreilly), [Dick van den Brink](https://github.com/DickvdBrink), [Thomas Schulz](https://github.com/King2500), [Terry Mun](https://github.com/terrymun), and [Martin Badin](https://github.com/martin-badin). diff --git a/node_modules/@types/jquery/dist/jquery.slim.d.ts b/node_modules/@types/jquery/dist/jquery.slim.d.ts new file mode 100644 index 00000000..bdd21a75 --- /dev/null +++ b/node_modules/@types/jquery/dist/jquery.slim.d.ts @@ -0,0 +1,3 @@ +/// + +export = jQuery; diff --git a/node_modules/@types/jquery/index.d.ts b/node_modules/@types/jquery/index.d.ts new file mode 100644 index 00000000..cba98875 --- /dev/null +++ b/node_modules/@types/jquery/index.d.ts @@ -0,0 +1,35 @@ +// Type definitions for jquery 3.5 +// Project: https://jquery.com +// Definitions by: Leonard Thieu +// Boris Yankov +// Christian Hoffmeister +// Steve Fenton +// Diullei Gomes +// Tass Iliopoulos +// Jason Swearingen +// Sean Hill +// Guus Goossens +// Kelly Summerlin +// Basarat Ali Syed +// Nicholas Wolverson +// Derek Cicerone +// Andrew Gaspar +// Seikichi Kondo +// Benjamin Jackman +// Poul Sorensen +// Josh Strobl +// John Reilly +// Dick van den Brink +// Thomas Schulz +// Terry Mun +// Martin Badin +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.7 + +/// +/// +/// +/// +/// + +export = jQuery; diff --git a/node_modules/@types/jquery/legacy.d.ts b/node_modules/@types/jquery/legacy.d.ts new file mode 100644 index 00000000..cd76159a --- /dev/null +++ b/node_modules/@types/jquery/legacy.d.ts @@ -0,0 +1,200 @@ +// tslint:disable:no-irregular-whitespace + +// tslint:disable-next-line:no-empty-interface +interface JQueryCallback extends JQuery.Callbacks { } +interface JQueryDeferred extends JQuery.Deferred { } +// tslint:disable-next-line:no-empty-interface +interface JQueryEventConstructor extends JQuery.EventStatic { } +interface JQueryDeferred extends JQuery.Deferred { } +// tslint:disable-next-line:no-empty-interface +interface JQueryAjaxSettings extends JQuery.AjaxSettings { } +interface JQueryAnimationOptions extends JQuery.EffectsOptions { } +// tslint:disable-next-line:no-empty-interface +interface JQueryCoordinates extends JQuery.Coordinates { } +interface JQueryGenericPromise extends JQuery.Thenable { } +// tslint:disable-next-line:no-empty-interface +interface JQueryXHR extends JQuery.jqXHR { } +interface JQueryPromise extends JQuery.Promise { } +// tslint:disable-next-line:no-empty-interface +interface JQuerySerializeArrayElement extends JQuery.NameValuePair { } + +/** + * @deprecated ​ Deprecated since 1.9. See \`{@link https://api.jquery.com/jQuery.support/ }\`. + */ +// tslint:disable-next-line:no-empty-interface +interface JQuerySupport extends JQuery.PlainObject { } + +// Legacy types that are not represented in the current type definitions are marked deprecated. + +/** + * @deprecated ​ Deprecated. Use \`{@link JQuery.Deferred.Callback }\` or \`{@link JQuery.Deferred.CallbackBase }\`. + */ +interface JQueryPromiseCallback { + (value?: T, ...args: any[]): void; +} +/** + * @deprecated ​ Deprecated. Use \`{@link JQueryStatic.param JQueryStatic['param']}\`. + */ +interface JQueryParam { + /** + * Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request. + * @param obj An array or object to serialize. + * @param traditional A Boolean indicating whether to perform a traditional "shallow" serialization. + */ + (obj: any, traditional?: boolean): string; +} +/** + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\`. + */ +interface BaseJQueryEventObject extends Event { + /** + * The current DOM element within the event bubbling phase. + * @see \`{@link https://api.jquery.com/event.currentTarget/ }\` + */ + currentTarget: Element; + /** + * An optional object of data passed to an event method when the current executing handler is bound. + * @see \`{@link https://api.jquery.com/event.data/ }\` + */ + data: any; + /** + * The element where the currently-called jQuery event handler was attached. + * @see \`{@link https://api.jquery.com/event.delegateTarget/ }\` + */ + delegateTarget: Element; + /** + * Returns whether event.preventDefault() was ever called on this event object. + * @see \`{@link https://api.jquery.com/event.isDefaultPrevented/ }\` + */ + isDefaultPrevented(): boolean; + /** + * Returns whether event.stopImmediatePropagation() was ever called on this event object. + * @see \`{@link https://api.jquery.com/event.isImmediatePropagationStopped/ }\` + */ + isImmediatePropagationStopped(): boolean; + /** + * Returns whether event.stopPropagation() was ever called on this event object. + * @see \`{@link https://api.jquery.com/event.isPropagationStopped/ }\` + */ + isPropagationStopped(): boolean; + /** + * The namespace specified when the event was triggered. + * @see \`{@link https://api.jquery.com/event.namespace/ }\` + */ + namespace: string; + /** + * The browser's original Event object. + * @see \`{@link https://api.jquery.com/category/events/event-object/ }\` + */ + originalEvent: Event; + /** + * If this method is called, the default action of the event will not be triggered. + * @see \`{@link https://api.jquery.com/event.preventDefault/ }\` + */ + preventDefault(): any; + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + */ + relatedTarget: Element; + /** + * The last value returned by an event handler that was triggered by this event, unless the value was undefined. + * @see \`{@link https://api.jquery.com/event.result/ }\` + */ + result: any; + /** + * Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree. + * @see \`{@link https://api.jquery.com/event.stopImmediatePropagation/ }\` + */ + stopImmediatePropagation(): void; + /** + * Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event. + * @see \`{@link https://api.jquery.com/event.stopPropagation/ }\` + */ + stopPropagation(): void; + /** + * The DOM element that initiated the event. + * @see \`{@link https://api.jquery.com/event.target/ }\` + */ + target: Element; + /** + * The mouse position relative to the left edge of the document. + * @see \`{@link https://api.jquery.com/event.pageX/ }\` + */ + pageX: number; + /** + * The mouse position relative to the top edge of the document. + * @see \`{@link https://api.jquery.com/event.pageY/ }\` + */ + pageY: number; + /** + * For key or mouse events, this property indicates the specific key or button that was pressed. + * @see \`{@link https://api.jquery.com/event.which/ }\` + */ + which: number; + /** + * Indicates whether the META key was pressed when the event fired. + * @see \`{@link https://api.jquery.com/event.metaKey/ }\` + */ + metaKey: boolean; +} +/** + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\`. + */ +interface JQueryInputEventObject extends BaseJQueryEventObject { + altKey: boolean; + ctrlKey: boolean; + metaKey: boolean; + shiftKey: boolean; +} +/** + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\`. + */ +interface JQueryMouseEventObject extends JQueryInputEventObject { + button: number; + clientX: number; + clientY: number; + offsetX: number; + offsetY: number; + pageX: number; + pageY: number; + screenX: number; + screenY: number; +} +/** + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\`. + */ +interface JQueryKeyEventObject extends JQueryInputEventObject { + /** @deprecated */ + char: string; + /** @deprecated */ + charCode: number; + key: string; + /** @deprecated */ + keyCode: number; +} +/** + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\`. + */ +interface JQueryEventObject extends BaseJQueryEventObject, JQueryInputEventObject, JQueryMouseEventObject, JQueryKeyEventObject { } +/** + * @deprecated ​ Deprecated. + */ +interface JQueryPromiseOperator { + (callback1: JQuery.TypeOrArray>, + ...callbacksN: Array>>): JQueryPromise; +} +/** + * @deprecated ​ Deprecated. Internal. See \`{@link https://github.com/jquery/api.jquery.com/issues/912 }\`. + */ +interface JQueryEasingFunction { + (percent: number): number; +} +/** + * @deprecated ​ Deprecated. Internal. See \`{@link https://github.com/jquery/api.jquery.com/issues/912 }\`. + */ +interface JQueryEasingFunctions { + [name: string]: JQueryEasingFunction; + linear: JQueryEasingFunction; + swing: JQueryEasingFunction; +} diff --git a/node_modules/@types/jquery/misc.d.ts b/node_modules/@types/jquery/misc.d.ts new file mode 100644 index 00000000..126d3744 --- /dev/null +++ b/node_modules/@types/jquery/misc.d.ts @@ -0,0 +1,6648 @@ +// tslint:disable:jsdoc-format +// tslint:disable:max-line-length +// tslint:disable:no-irregular-whitespace + +declare namespace JQuery { + type TypeOrArray = T | T[]; + type Node = Element | Text | Comment | Document | DocumentFragment; + + /** + * A string is designated htmlString in jQuery documentation when it is used to represent one or more DOM elements, typically to be created and inserted in the document. When passed as an argument of the jQuery() function, the string is identified as HTML if it starts with ) and is parsed as such until the final > character. Prior to jQuery 1.9, a string was considered to be HTML if it contained anywhere within the string. + */ + type htmlString = string; + /** + * A selector is used in jQuery to select DOM elements from a DOM document. That document is, in most cases, the DOM document present in all browsers, but can also be an XML document received via Ajax. + */ + type Selector = string; + + /** + * The PlainObject type is a JavaScript object containing zero or more key-value pairs. The plain object is, in other words, an Object object. It is designated "plain" in jQuery documentation to distinguish it from other kinds of JavaScript objects: for example, null, user-defined arrays, and host objects such as document, all of which have a typeof value of "object." + * + * **Note**: The type declaration of PlainObject is imprecise. It includes host objects and user-defined arrays which do not match jQuery's definition. + */ + interface PlainObject { + [key: string]: T; + } + + interface Selectors extends Sizzle.Selectors { + /** + * @deprecated ​ Deprecated since 3.0. Use \`{@link Selectors#pseudos }\`. + * + * **Cause**: The standard way to add new custom selectors through jQuery is `jQuery.expr.pseudos`. These two other aliases are deprecated, although they still work as of jQuery 3.0. + * + * **Solution**: Rename any of the older usage to `jQuery.expr.pseudos`. The functionality is identical. + */ + ':': Sizzle.Selectors.PseudoFunctions; + /** + * @deprecated ​ Deprecated since 3.0. Use \`{@link Selectors#pseudos }\`. + * + * **Cause**: The standard way to add new custom selectors through jQuery is `jQuery.expr.pseudos`. These two other aliases are deprecated, although they still work as of jQuery 3.0. + * + * **Solution**: Rename any of the older usage to `jQuery.expr.pseudos`. The functionality is identical. + */ + filter: Sizzle.Selectors.FilterFunctions; + } + + // region Ajax + // #region Ajax + + interface AjaxSettings extends Ajax.AjaxSettingsBase { + /** + * A string containing the URL to which the request is sent. + */ + url?: string; + } + + interface UrlAjaxSettings extends Ajax.AjaxSettingsBase { + /** + * A string containing the URL to which the request is sent. + */ + url: string; + } + + namespace Ajax { + type SuccessTextStatus = 'success' | 'notmodified' | 'nocontent'; + type ErrorTextStatus = 'timeout' | 'error' | 'abort' | 'parsererror'; + type TextStatus = SuccessTextStatus | ErrorTextStatus; + + type SuccessCallback = (this: TContext, data: any, textStatus: SuccessTextStatus, jqXHR: jqXHR) => void; + + type ErrorCallback = (this: TContext, jqXHR: jqXHR, textStatus: ErrorTextStatus, errorThrown: string) => void; + + type CompleteCallback = (this: TContext, jqXHR: jqXHR, textStatus: TextStatus) => void; + + /** + * @see \`{@link https://api.jquery.com/jquery.ajax/#jQuery-ajax-settings }\` + */ + interface AjaxSettingsBase { + /** + * A set of key/value pairs that map a given dataType to its MIME type, which gets sent in the Accept request header. This header tells the server what kind of response it will accept in return. + */ + accepts?: PlainObject; + /** + * By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false. Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active. As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated; you must use the success/error/complete callback options instead of the corresponding methods of the jqXHR object such as jqXHR.done(). + */ + async?: boolean; + /** + * A pre-request callback function that can be used to modify the jqXHR (in jQuery 1.4.x, XMLHTTPRequest) object before it is sent. Use this to set custom headers, etc. The jqXHR and settings objects are passed as arguments. This is an Ajax Event. Returning false in the beforeSend function will cancel the request. As of jQuery 1.5, the beforeSend option will be called regardless of the type of request. + */ + beforeSend?(this: TContext, jqXHR: jqXHR, settings: this): false | void; + /** + * If set to false, it will force requested pages not to be cached by the browser. Note: Setting cache to false will only work correctly with HEAD and GET requests. It works by appending "_={timestamp}" to the GET parameters. The parameter is not needed for other types of requests, except in IE8 when a POST is made to a URL that has already been requested by a GET. + */ + cache?: boolean; + /** + * A function to be called when the request finishes (after success and error callbacks are executed). The function gets passed two arguments: The jqXHR (in jQuery 1.4.x, XMLHTTPRequest) object and a string categorizing the status of the request ("success", "notmodified", "nocontent", "error", "timeout", "abort", or "parsererror"). As of jQuery 1.5, the complete setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event. + */ + complete?: TypeOrArray>; + /** + * An object of string/regular-expression pairs that determine how jQuery will parse the response, given its content type. + */ + contents?: PlainObject; + /** + * When sending data to the server, use this content type. Default is "application/x-www-form-urlencoded; charset=UTF-8", which is fine for most cases. If you explicitly pass in a content-type to $.ajax(), then it is always sent to the server (even if no data is sent). As of jQuery 1.6 you can pass false to tell jQuery to not set any content type header. Note: The W3C XMLHttpRequest specification dictates that the charset is always UTF-8; specifying another charset will not force the browser to change the encoding. Note: For cross-domain requests, setting the content type to anything other than application/x-www-form-urlencoded, multipart/form-data, or text/plain will trigger the browser to send a preflight OPTIONS request to the server. + */ + contentType?: string | false; + /** + * This object will be the context of all Ajax-related callbacks. By default, the context is an object that represents the Ajax settings used in the call ($.ajaxSettings merged with the settings passed to $.ajax). + */ + context?: TContext; + /** + * An object containing dataType-to-dataType converters. Each converter's value is a function that returns the transformed value of the response. + */ + converters?: PlainObject<((value: any) => any) | true>; + /** + * If you wish to force a crossDomain request (such as JSONP) on the same domain, set the value of crossDomain to true. This allows, for example, server-side redirection to another domain. + */ + crossDomain?: boolean; + /** + * Data to be sent to the server. It is converted to a query string, if not already a string. It's appended to the url for GET-requests. See processData option to prevent this automatic processing. Object must be Key/Value pairs. If value is an Array, jQuery serializes multiple values with same key based on the value of the traditional setting (described below). + */ + data?: PlainObject | string; + /** + * A function to be used to handle the raw response data of XMLHttpRequest. This is a pre-filtering function to sanitize the response. You should return the sanitized data. The function accepts two arguments: The raw data returned from the server and the 'dataType' parameter. + */ + dataFilter?(data: string, type: string): any; + /** + * The type of data that you're expecting back from the server. If none is specified, jQuery will try to infer it based on the MIME type of the response (an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string). The available types (and the result passed as the first argument to your success callback) are: + * + * "xml": Returns a XML document that can be processed via jQuery. + * + * "html": Returns HTML as plain text; included script tags are evaluated when inserted in the DOM. + * + * "script": Evaluates the response as JavaScript and returns it as plain text. Disables caching by appending a query string parameter, _=[TIMESTAMP], to the URL unless the cache option is set to true. Note: This will turn POSTs into GETs for remote-domain requests. + * + * "json": Evaluates the response as JSON and returns a JavaScript object. Cross-domain "json" requests are converted to "jsonp" unless the request includes jsonp: false in its request options. The JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. As of jQuery 1.9, an empty response is also rejected; the server should return a response of null or {} instead. (See json.org for more information on proper JSON formatting.) + * + * "jsonp": Loads in a JSON block using JSONP. Adds an extra "?callback=?" to the end of your URL to specify the callback. Disables caching by appending a query string parameter, "_=[TIMESTAMP]", to the URL unless the cache option is set to true. + * + * "text": A plain text string. + * + * multiple, space-separated values: As of jQuery 1.5, jQuery can convert a dataType from what it received in the Content-Type header to what you require. For example, if you want a text response to be treated as XML, use "text xml" for the dataType. You can also make a JSONP request, have it received as text, and interpreted by jQuery as XML: "jsonp text xml". Similarly, a shorthand string such as "jsonp xml" will first attempt to convert from jsonp to xml, and, failing that, convert from jsonp to text, and then from text to xml. + */ + dataType?: 'xml' | 'html' | 'script' | 'json' | 'jsonp' | 'text' | string; + /** + * The MIME type of content that is used to submit the form to the server. Possible values are: + * + * "application/x-www-form-urlencoded": The initial default type. + * + * "multipart/form-data": The type that allows file element(s) to upload file data. + * + * "text/plain": A type introduced in HTML5. + */ + enctype?: 'application/x-www-form-urlencoded' | 'multipart/form-data' | 'text/plain'; + /** + * A function to be called if the request fails. The function receives three arguments: The jqXHR (in jQuery 1.4.x, XMLHttpRequest) object, a string describing the type of error that occurred and an optional exception object, if one occurred. Possible values for the second argument (besides null) are "timeout", "error", "abort", and "parsererror". When an HTTP error occurs, errorThrown receives the textual portion of the HTTP status, such as "Not Found" or "Internal Server Error." As of jQuery 1.5, the error setting can accept an array of functions. Each function will be called in turn. Note: This handler is not called for cross-domain script and cross-domain JSONP requests. This is an Ajax Event. + */ + error?: TypeOrArray>; + /** + * Whether to trigger global Ajax event handlers for this request. The default is true. Set to false to prevent the global handlers like ajaxStart or ajaxStop from being triggered. This can be used to control various Ajax Events. + */ + global?: boolean; + /** + * An object of additional header key/value pairs to send along with requests using the XMLHttpRequest transport. The header X-Requested-With: XMLHttpRequest is always added, but its default XMLHttpRequest value can be changed here. Values in the headers setting can also be overwritten from within the beforeSend function. + */ + headers?: PlainObject; + /** + * Allow the request to be successful only if the response has changed since the last request. This is done by checking the Last-Modified header. Default value is false, ignoring the header. In jQuery 1.4 this technique also checks the 'etag' specified by the server to catch unmodified data. + */ + ifModified?: boolean; + /** + * Allow the current environment to be recognized as "local," (e.g. the filesystem), even if jQuery does not recognize it as such by default. The following protocols are currently recognized as local: file, *-extension, and widget. If the isLocal setting needs modification, it is recommended to do so once in the $.ajaxSetup() method. + */ + isLocal?: boolean; + /** + * Override the callback function name in a JSONP request. This value will be used instead of 'callback' in the 'callback=?' part of the query string in the url. So {jsonp:'onJSONPLoad'} would result in 'onJSONPLoad=?' passed to the server. As of jQuery 1.5, setting the jsonp option to false prevents jQuery from adding the "?callback" string to the URL or attempting to use "=?" for transformation. In this case, you should also explicitly set the jsonpCallback setting. For example, { jsonp: false, jsonpCallback: "callbackName" }. If you don't trust the target of your Ajax requests, consider setting the jsonp property to false for security reasons. + */ + jsonp?: string | false; + /** + * Specify the callback function name for a JSONP request. This value will be used instead of the random name automatically generated by jQuery. It is preferable to let jQuery generate a unique name as it'll make it easier to manage the requests and provide callbacks and error handling. You may want to specify the callback when you want to enable better browser caching of GET requests. As of jQuery 1.5, you can also use a function for this setting, in which case the value of jsonpCallback is set to the return value of that function. + */ + jsonpCallback?: string | ((this: TContext) => string); + /** + * The HTTP method to use for the request (e.g. "POST", "GET", "PUT"). + */ + method?: string; + /** + * A mime type to override the XHR mime type. + */ + mimeType?: string; + /** + * A password to be used with XMLHttpRequest in response to an HTTP access authentication request. + */ + password?: string; + /** + * By default, data passed in to the data option as an object (technically, anything other than a string) will be processed and transformed into a query string, fitting to the default content-type "application/x-www-form-urlencoded". If you want to send a DOMDocument, or other non-processed data, set this option to false. + */ + processData?: boolean; + /** + * Only applies when the "script" transport is used (e.g., cross-domain requests with "jsonp" or "script" dataType and "GET" type). Sets the charset attribute on the script tag used in the request. Used when the character set on the local page is not the same as the one on the remote script. + */ + scriptCharset?: string; + /** + * An object of numeric HTTP codes and functions to be called when the response has the corresponding code. + * + * If the request is successful, the status code functions take the same parameters as the success callback; if it results in an error (including 3xx redirect), they take the same parameters as the error callback. + */ + statusCode?: StatusCodeCallbacks; + /** + * A function to be called if the request succeeds. The function gets passed three arguments: The data returned from the server, formatted according to the dataType parameter or the dataFilter callback function, if specified; a string describing the status; and the jqXHR (in jQuery 1.4.x, XMLHttpRequest) object. As of jQuery 1.5, the success setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event. + */ + success?: TypeOrArray>; + /** + * Set a timeout (in milliseconds) for the request. A value of 0 means there will be no timeout. This will override any global timeout set with $.ajaxSetup(). The timeout period starts at the point the $.ajax call is made; if several other requests are in progress and the browser has no connections available, it is possible for a request to time out before it can be sent. In jQuery 1.4.x and below, the XMLHttpRequest object will be in an invalid state if the request times out; accessing any object members may throw an exception. In Firefox 3.0+ only, script and JSONP requests cannot be cancelled by a timeout; the script will run even if it arrives after the timeout period. + */ + timeout?: number; + /** + * Set this to true if you wish to use the traditional style of param serialization. + */ + traditional?: boolean; + /** + * An alias for method. You should use type if you're using versions of jQuery prior to 1.9.0. + */ + type?: string; + /** + * A username to be used with XMLHttpRequest in response to an HTTP access authentication request. + */ + username?: string; + // ActiveXObject requires "lib": ["scripthost"] which consumers would also require + /** + * Callback for creating the XMLHttpRequest object. Defaults to the ActiveXObject when available (IE), the XMLHttpRequest otherwise. Override to provide your own implementation for XMLHttpRequest or enhancements to the factory. + */ + xhr?(): XMLHttpRequest; + /** + * An object of fieldName-fieldValue pairs to set on the native XHR object. + * + * In jQuery 1.5, the withCredentials property was not propagated to the native XHR and thus CORS requests requiring it would ignore this flag. For this reason, we recommend using jQuery 1.5.1+ should you require the use of it. + */ + xhrFields?: XHRFields; + } + + // region StatusCodeCallbacks + // #region StatusCodeCallbacks + + type StatusCodeCallbacks = { + // region Success Status Codes + // #region Success Status Codes + + // jQuery treats 2xx and 304 status codes as a success + + 200?: SuccessCallback; + 201?: SuccessCallback; + 202?: SuccessCallback; + 203?: SuccessCallback; + 204?: SuccessCallback; + 205?: SuccessCallback; + 206?: SuccessCallback; + 207?: SuccessCallback; + 208?: SuccessCallback; + 209?: SuccessCallback; + 210?: SuccessCallback; + 211?: SuccessCallback; + 212?: SuccessCallback; + 213?: SuccessCallback; + 214?: SuccessCallback; + 215?: SuccessCallback; + 216?: SuccessCallback; + 217?: SuccessCallback; + 218?: SuccessCallback; + 219?: SuccessCallback; + 220?: SuccessCallback; + 221?: SuccessCallback; + 222?: SuccessCallback; + 223?: SuccessCallback; + 224?: SuccessCallback; + 225?: SuccessCallback; + 226?: SuccessCallback; + 227?: SuccessCallback; + 228?: SuccessCallback; + 229?: SuccessCallback; + 230?: SuccessCallback; + 231?: SuccessCallback; + 232?: SuccessCallback; + 233?: SuccessCallback; + 234?: SuccessCallback; + 235?: SuccessCallback; + 236?: SuccessCallback; + 237?: SuccessCallback; + 238?: SuccessCallback; + 239?: SuccessCallback; + 240?: SuccessCallback; + 241?: SuccessCallback; + 242?: SuccessCallback; + 243?: SuccessCallback; + 244?: SuccessCallback; + 245?: SuccessCallback; + 246?: SuccessCallback; + 247?: SuccessCallback; + 248?: SuccessCallback; + 249?: SuccessCallback; + 250?: SuccessCallback; + 251?: SuccessCallback; + 252?: SuccessCallback; + 253?: SuccessCallback; + 254?: SuccessCallback; + 255?: SuccessCallback; + 256?: SuccessCallback; + 257?: SuccessCallback; + 258?: SuccessCallback; + 259?: SuccessCallback; + 260?: SuccessCallback; + 261?: SuccessCallback; + 262?: SuccessCallback; + 263?: SuccessCallback; + 264?: SuccessCallback; + 265?: SuccessCallback; + 266?: SuccessCallback; + 267?: SuccessCallback; + 268?: SuccessCallback; + 269?: SuccessCallback; + 270?: SuccessCallback; + 271?: SuccessCallback; + 272?: SuccessCallback; + 273?: SuccessCallback; + 274?: SuccessCallback; + 275?: SuccessCallback; + 276?: SuccessCallback; + 277?: SuccessCallback; + 278?: SuccessCallback; + 279?: SuccessCallback; + 280?: SuccessCallback; + 281?: SuccessCallback; + 282?: SuccessCallback; + 283?: SuccessCallback; + 284?: SuccessCallback; + 285?: SuccessCallback; + 286?: SuccessCallback; + 287?: SuccessCallback; + 288?: SuccessCallback; + 289?: SuccessCallback; + 290?: SuccessCallback; + 291?: SuccessCallback; + 292?: SuccessCallback; + 293?: SuccessCallback; + 294?: SuccessCallback; + 295?: SuccessCallback; + 296?: SuccessCallback; + 297?: SuccessCallback; + 298?: SuccessCallback; + 299?: SuccessCallback; + 304?: SuccessCallback; + + // #endregion + + // region Error Status Codes + // #region Error Status Codes + + 300?: ErrorCallback; + 301?: ErrorCallback; + 302?: ErrorCallback; + 303?: ErrorCallback; + 305?: ErrorCallback; + 306?: ErrorCallback; + 307?: ErrorCallback; + 308?: ErrorCallback; + 309?: ErrorCallback; + 310?: ErrorCallback; + 311?: ErrorCallback; + 312?: ErrorCallback; + 313?: ErrorCallback; + 314?: ErrorCallback; + 315?: ErrorCallback; + 316?: ErrorCallback; + 317?: ErrorCallback; + 318?: ErrorCallback; + 319?: ErrorCallback; + 320?: ErrorCallback; + 321?: ErrorCallback; + 322?: ErrorCallback; + 323?: ErrorCallback; + 324?: ErrorCallback; + 325?: ErrorCallback; + 326?: ErrorCallback; + 327?: ErrorCallback; + 328?: ErrorCallback; + 329?: ErrorCallback; + 330?: ErrorCallback; + 331?: ErrorCallback; + 332?: ErrorCallback; + 333?: ErrorCallback; + 334?: ErrorCallback; + 335?: ErrorCallback; + 336?: ErrorCallback; + 337?: ErrorCallback; + 338?: ErrorCallback; + 339?: ErrorCallback; + 340?: ErrorCallback; + 341?: ErrorCallback; + 342?: ErrorCallback; + 343?: ErrorCallback; + 344?: ErrorCallback; + 345?: ErrorCallback; + 346?: ErrorCallback; + 347?: ErrorCallback; + 348?: ErrorCallback; + 349?: ErrorCallback; + 350?: ErrorCallback; + 351?: ErrorCallback; + 352?: ErrorCallback; + 353?: ErrorCallback; + 354?: ErrorCallback; + 355?: ErrorCallback; + 356?: ErrorCallback; + 357?: ErrorCallback; + 358?: ErrorCallback; + 359?: ErrorCallback; + 360?: ErrorCallback; + 361?: ErrorCallback; + 362?: ErrorCallback; + 363?: ErrorCallback; + 364?: ErrorCallback; + 365?: ErrorCallback; + 366?: ErrorCallback; + 367?: ErrorCallback; + 368?: ErrorCallback; + 369?: ErrorCallback; + 370?: ErrorCallback; + 371?: ErrorCallback; + 372?: ErrorCallback; + 373?: ErrorCallback; + 374?: ErrorCallback; + 375?: ErrorCallback; + 376?: ErrorCallback; + 377?: ErrorCallback; + 378?: ErrorCallback; + 379?: ErrorCallback; + 380?: ErrorCallback; + 381?: ErrorCallback; + 382?: ErrorCallback; + 383?: ErrorCallback; + 384?: ErrorCallback; + 385?: ErrorCallback; + 386?: ErrorCallback; + 387?: ErrorCallback; + 388?: ErrorCallback; + 389?: ErrorCallback; + 390?: ErrorCallback; + 391?: ErrorCallback; + 392?: ErrorCallback; + 393?: ErrorCallback; + 394?: ErrorCallback; + 395?: ErrorCallback; + 396?: ErrorCallback; + 397?: ErrorCallback; + 398?: ErrorCallback; + 399?: ErrorCallback; + 400?: ErrorCallback; + 401?: ErrorCallback; + 402?: ErrorCallback; + 403?: ErrorCallback; + 404?: ErrorCallback; + 405?: ErrorCallback; + 406?: ErrorCallback; + 407?: ErrorCallback; + 408?: ErrorCallback; + 409?: ErrorCallback; + 410?: ErrorCallback; + 411?: ErrorCallback; + 412?: ErrorCallback; + 413?: ErrorCallback; + 414?: ErrorCallback; + 415?: ErrorCallback; + 416?: ErrorCallback; + 417?: ErrorCallback; + 418?: ErrorCallback; + 419?: ErrorCallback; + 420?: ErrorCallback; + 421?: ErrorCallback; + 422?: ErrorCallback; + 423?: ErrorCallback; + 424?: ErrorCallback; + 425?: ErrorCallback; + 426?: ErrorCallback; + 427?: ErrorCallback; + 428?: ErrorCallback; + 429?: ErrorCallback; + 430?: ErrorCallback; + 431?: ErrorCallback; + 432?: ErrorCallback; + 433?: ErrorCallback; + 434?: ErrorCallback; + 435?: ErrorCallback; + 436?: ErrorCallback; + 437?: ErrorCallback; + 438?: ErrorCallback; + 439?: ErrorCallback; + 440?: ErrorCallback; + 441?: ErrorCallback; + 442?: ErrorCallback; + 443?: ErrorCallback; + 444?: ErrorCallback; + 445?: ErrorCallback; + 446?: ErrorCallback; + 447?: ErrorCallback; + 448?: ErrorCallback; + 449?: ErrorCallback; + 450?: ErrorCallback; + 451?: ErrorCallback; + 452?: ErrorCallback; + 453?: ErrorCallback; + 454?: ErrorCallback; + 455?: ErrorCallback; + 456?: ErrorCallback; + 457?: ErrorCallback; + 458?: ErrorCallback; + 459?: ErrorCallback; + 460?: ErrorCallback; + 461?: ErrorCallback; + 462?: ErrorCallback; + 463?: ErrorCallback; + 464?: ErrorCallback; + 465?: ErrorCallback; + 466?: ErrorCallback; + 467?: ErrorCallback; + 468?: ErrorCallback; + 469?: ErrorCallback; + 470?: ErrorCallback; + 471?: ErrorCallback; + 472?: ErrorCallback; + 473?: ErrorCallback; + 474?: ErrorCallback; + 475?: ErrorCallback; + 476?: ErrorCallback; + 477?: ErrorCallback; + 478?: ErrorCallback; + 479?: ErrorCallback; + 480?: ErrorCallback; + 481?: ErrorCallback; + 482?: ErrorCallback; + 483?: ErrorCallback; + 484?: ErrorCallback; + 485?: ErrorCallback; + 486?: ErrorCallback; + 487?: ErrorCallback; + 488?: ErrorCallback; + 489?: ErrorCallback; + 490?: ErrorCallback; + 491?: ErrorCallback; + 492?: ErrorCallback; + 493?: ErrorCallback; + 494?: ErrorCallback; + 495?: ErrorCallback; + 496?: ErrorCallback; + 497?: ErrorCallback; + 498?: ErrorCallback; + 499?: ErrorCallback; + 500?: ErrorCallback; + 501?: ErrorCallback; + 502?: ErrorCallback; + 503?: ErrorCallback; + 504?: ErrorCallback; + 505?: ErrorCallback; + 506?: ErrorCallback; + 507?: ErrorCallback; + 508?: ErrorCallback; + 509?: ErrorCallback; + 510?: ErrorCallback; + 511?: ErrorCallback; + 512?: ErrorCallback; + 513?: ErrorCallback; + 514?: ErrorCallback; + 515?: ErrorCallback; + 516?: ErrorCallback; + 517?: ErrorCallback; + 518?: ErrorCallback; + 519?: ErrorCallback; + 520?: ErrorCallback; + 521?: ErrorCallback; + 522?: ErrorCallback; + 523?: ErrorCallback; + 524?: ErrorCallback; + 525?: ErrorCallback; + 526?: ErrorCallback; + 527?: ErrorCallback; + 528?: ErrorCallback; + 529?: ErrorCallback; + 530?: ErrorCallback; + 531?: ErrorCallback; + 532?: ErrorCallback; + 533?: ErrorCallback; + 534?: ErrorCallback; + 535?: ErrorCallback; + 536?: ErrorCallback; + 537?: ErrorCallback; + 538?: ErrorCallback; + 539?: ErrorCallback; + 540?: ErrorCallback; + 541?: ErrorCallback; + 542?: ErrorCallback; + 543?: ErrorCallback; + 544?: ErrorCallback; + 545?: ErrorCallback; + 546?: ErrorCallback; + 547?: ErrorCallback; + 548?: ErrorCallback; + 549?: ErrorCallback; + 550?: ErrorCallback; + 551?: ErrorCallback; + 552?: ErrorCallback; + 553?: ErrorCallback; + 554?: ErrorCallback; + 555?: ErrorCallback; + 556?: ErrorCallback; + 557?: ErrorCallback; + 558?: ErrorCallback; + 559?: ErrorCallback; + 560?: ErrorCallback; + 561?: ErrorCallback; + 562?: ErrorCallback; + 563?: ErrorCallback; + 564?: ErrorCallback; + 565?: ErrorCallback; + 566?: ErrorCallback; + 567?: ErrorCallback; + 568?: ErrorCallback; + 569?: ErrorCallback; + 570?: ErrorCallback; + 571?: ErrorCallback; + 572?: ErrorCallback; + 573?: ErrorCallback; + 574?: ErrorCallback; + 575?: ErrorCallback; + 576?: ErrorCallback; + 577?: ErrorCallback; + 578?: ErrorCallback; + 579?: ErrorCallback; + 580?: ErrorCallback; + 581?: ErrorCallback; + 582?: ErrorCallback; + 583?: ErrorCallback; + 584?: ErrorCallback; + 585?: ErrorCallback; + 586?: ErrorCallback; + 587?: ErrorCallback; + 588?: ErrorCallback; + 589?: ErrorCallback; + 590?: ErrorCallback; + 591?: ErrorCallback; + 592?: ErrorCallback; + 593?: ErrorCallback; + 594?: ErrorCallback; + 595?: ErrorCallback; + 596?: ErrorCallback; + 597?: ErrorCallback; + 598?: ErrorCallback; + 599?: ErrorCallback; + + // #endregion + } & { + // Status codes not listed require type annotations when defining the callback + [index: number]: SuccessCallback | ErrorCallback; + }; + + // #endregion + + // Writable properties on XMLHttpRequest + interface XHRFields extends Partial> { + msCaching?: string; + } + } + + interface Transport { + send(headers: PlainObject, completeCallback: Transport.SuccessCallback): void; + abort(): void; + } + + namespace Transport { + type SuccessCallback = (status: number, statusText: Ajax.TextStatus, responses?: PlainObject, headers?: string) => void; + } + + /** + * @see \`{@link https://api.jquery.com/jquery.ajax/#jqXHR }\` + */ + interface jqXHR extends Promise3, never, + Ajax.SuccessTextStatus, Ajax.ErrorTextStatus, never, + jqXHR, string, never>, + Pick, + Partial> { + responseJSON?: any; + abort(statusText?: string): void; + + /** + * Determine the current state of a Deferred object. + * @see \`{@link https://api.jquery.com/deferred.state/ }\` + * @since 1.7 + */ + state(): 'pending' | 'resolved' | 'rejected'; + statusCode(map: Ajax.StatusCodeCallbacks): void; + } + + namespace jqXHR { + interface DoneCallback> extends Deferred.Callback3 { } + + interface FailCallback extends Deferred.Callback3 { } + + interface AlwaysCallback> extends Deferred.Callback3 { } + } + + // #endregion + + // region Callbacks + // #region Callbacks + + interface CallbacksStatic { + /** + * A multi-purpose callbacks list object that provides a powerful way to manage callback lists. + * @param flags An optional list of space-separated flags that change how the callback list behaves. + * @see \`{@link https://api.jquery.com/jQuery.Callbacks/ }\` + * @since 1.7 + */ + // tslint:disable-next-line:ban-types no-unnecessary-generics + (flags?: string): Callbacks; + } + + // tslint:disable-next-line:ban-types + interface Callbacks { + /** + * Add a callback or a collection of callbacks to a callback list. + * @param callback A function, or array of functions, that are to be added to the callback list. + * @param callbacks A function, or array of functions, that are to be added to the callback list. + * @see \`{@link https://api.jquery.com/callbacks.add/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.add() to add new callbacks to a callback list: +```javascript +// A sample logging function to be added to a callbacks list +var foo = function( value ) { + console.log( "foo: " + value ); +}; +​ +// Another function to also be added to the list +var bar = function( value ) { + console.log( "bar: " + value ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the function "foo" to the list +callbacks.add( foo ); +​ +// Fire the items on the list +callbacks.fire( "hello" ); +// Outputs: "foo: hello" +​ +// Add the function "bar" to the list +callbacks.add( bar ); +​ +// Fire the items on the list again +callbacks.fire( "world" ); +​ +// Outputs: +// "foo: world" +// "bar: world" +``` + */ + add(callback: TypeOrArray, ...callbacks: Array>): this; + /** + * Disable a callback list from doing anything more. + * @see \`{@link https://api.jquery.com/callbacks.disable/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.disable() to disable further calls to a callback list: +```javascript +// A sample logging function to be added to a callbacks list +var foo = function( value ) { + console.log( value ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the above function to the list +callbacks.add( foo ); +​ +// Fire the items on the list +callbacks.fire( "foo" ); +// Outputs: foo +​ +// Disable further calls being possible +callbacks.disable(); +​ +// Attempt to fire with "foobar" as an argument +callbacks.fire( "foobar" ); +// foobar isn't output +``` + */ + disable(): this; + /** + * Determine if the callbacks list has been disabled. + * @see \`{@link https://api.jquery.com/callbacks.disabled/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.disabled() to determine if the callbacks list has been disabled: +```javascript +// A sample logging function to be added to a callbacks list +var foo = function( value ) { + console.log( "foo:" + value ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the logging function to the callback list +callbacks.add( foo ); +​ +// Fire the items on the list, passing an argument +callbacks.fire( "hello" ); +// Outputs "foo: hello" +​ +// Disable the callbacks list +callbacks.disable(); +​ +// Test the disabled state of the list +console.log ( callbacks.disabled() ); +// Outputs: true +``` + */ + disabled(): boolean; + /** + * Remove all of the callbacks from a list. + * @see \`{@link https://api.jquery.com/callbacks.empty/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.empty() to empty a list of callbacks: +```javascript +// A sample logging function to be added to a callbacks list +var foo = function( value1, value2 ) { + console.log( "foo: " + value1 + "," + value2 ); +}; +​ +// Another function to also be added to the list +var bar = function( value1, value2 ) { + console.log( "bar: " + value1 + "," + value2 ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the two functions +callbacks.add( foo ); +callbacks.add( bar ); +​ +// Empty the callbacks list +callbacks.empty(); +​ +// Check to ensure all callbacks have been removed +console.log( callbacks.has( foo ) ); +// false +console.log( callbacks.has( bar ) ); +// false +``` + */ + empty(): this; + /** + * Call all of the callbacks with the given arguments. + * @param args The argument or list of arguments to pass back to the callback list. + * @see \`{@link https://api.jquery.com/callbacks.fire/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.fire() to invoke the callbacks in a list with any arguments that have been passed: +```javascript +// A sample logging function to be added to a callbacks list +var foo = function( value ) { + console.log( "foo:" + value ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the function "foo" to the list +callbacks.add( foo ); +​ +// Fire the items on the list +callbacks.fire( "hello" ); // Outputs: "foo: hello" +callbacks.fire( "world" ); // Outputs: "foo: world" +​ +// Add another function to the list +var bar = function( value ){ + console.log( "bar:" + value ); +}; +​ +// Add this function to the list +callbacks.add( bar ); +​ +// Fire the items on the list again +callbacks.fire( "hello again" ); +// Outputs: +// "foo: hello again" +// "bar: hello again" +``` + */ + fire(...args: any[]): this; + /** + * Determine if the callbacks have already been called at least once. + * @see \`{@link https://api.jquery.com/callbacks.fired/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.fired() to determine if the callbacks in a list have been called at least once: +```javascript +// A sample logging function to be added to a callbacks list +var foo = function( value ) { + console.log( "foo:" + value ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the function "foo" to the list +callbacks.add( foo ); +​ +// Fire the items on the list +callbacks.fire( "hello" ); // Outputs: "foo: hello" +callbacks.fire( "world" ); // Outputs: "foo: world" +​ +// Test to establish if the callbacks have been called +console.log( callbacks.fired() ); +``` + */ + fired(): boolean; + /** + * Call all callbacks in a list with the given context and arguments. + * @param context A reference to the context in which the callbacks in the list should be fired. + * @param args An argument, or array of arguments, to pass to the callbacks in the list. + * @see \`{@link https://api.jquery.com/callbacks.fireWith/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.fireWith() to fire a list of callbacks with a specific context and an array of arguments: +```javascript +// A sample logging function to be added to a callbacks list +var log = function( value1, value2 ) { + console.log( "Received: " + value1 + "," + value2 ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the log method to the callbacks list +callbacks.add( log ); +​ +// Fire the callbacks on the list using the context "window" +// and an arguments array +​ +callbacks.fireWith( window, [ "foo","bar" ] ); +// Outputs: "Received: foo, bar" +``` + */ + fireWith(context: object, args?: ArrayLike): this; + /** + * Determine whether or not the list has any callbacks attached. If a callback is provided as an argument, determine whether it is in a list. + * @param callback The callback to search for. + * @see \`{@link https://api.jquery.com/callbacks.has/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.has() to check if a callback list contains a specific callback: +```javascript +// A sample logging function to be added to a callbacks list +var foo = function( value1, value2 ) { + console.log( "Received: " + value1 + "," + value2 ); +}; +​ +// A second function which will not be added to the list +var bar = function( value1, value2 ) { + console.log( "foobar" ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the log method to the callbacks list +callbacks.add( foo ); +​ +// Determine which callbacks are in the list +console.log( callbacks.has( foo ) ); +// true +console.log( callbacks.has( bar ) ); +// false +``` + */ + has(callback?: T): boolean; + /** + * Lock a callback list in its current state. + * @see \`{@link https://api.jquery.com/callbacks.lock/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.lock() to lock a callback list to avoid further changes being made to the list state: +```javascript +// A sample logging function to be added to a callbacks list +var foo = function( value ) { + console.log( "foo:" + value ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the logging function to the callback list +callbacks.add( foo ); +​ +// Fire the items on the list, passing an argument +callbacks.fire( "hello" ); +// Outputs "foo: hello" +​ +// Lock the callbacks list +callbacks.lock(); +​ +// Try firing the items again +callbacks.fire( "world" ); +​ +// As the list was locked, no items were called, +// so "world" isn't logged +``` + * @example ​ ````Use callbacks.lock() to lock a callback list with "memory," and then resume using the list: +```html + + + + + callbacks.lock demo + + + +​ +
      +​ + +​ + + +``` + */ + lock(): this; + /** + * Determine if the callbacks list has been locked. + * @see \`{@link https://api.jquery.com/callbacks.locked/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.locked() to determine the lock-state of a callback list: +```javascript +// A sample logging function to be added to a callbacks list +var foo = function( value ) { + console.log( "foo: " + value ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the logging function to the callback list +callbacks.add( foo ); +​ +// Fire the items on the list, passing an argument +callbacks.fire( "hello" ); +// Outputs "foo: hello" +​ +// Lock the callbacks list +callbacks.lock(); +​ +// Test the lock-state of the list +console.log ( callbacks.locked() ); +// true +``` + */ + locked(): boolean; + /** + * Remove a callback or a collection of callbacks from a callback list. + * @param callbacks A function, or array of functions, that are to be removed from the callback list. + * @see \`{@link https://api.jquery.com/callbacks.remove/ }\` + * @since 1.7 + * @example ​ ````Use callbacks.remove() to remove callbacks from a callback list: +```javascript +// A sample logging function to be added to a callbacks list +var foo = function( value ) { + console.log( "foo: " + value ); +}; +​ +var callbacks = $.Callbacks(); +​ +// Add the function "foo" to the list +callbacks.add( foo ); +​ +// Fire the items on the list +callbacks.fire( "hello" ); +// Outputs: "foo: hello" +​ +// Remove "foo" from the callback list +callbacks.remove( foo ); +​ +// Fire the items on the list again +callbacks.fire( "world" ); +​ +// Nothing output as "foo" is no longer in the list +``` + */ + remove(...callbacks: T[]): this; + } + + // #endregion + + // region CSS hooks + // #region CSS hooks + + // Workaround for TypeScript 2.3 which does not have support for weak types handling. + type CSSHook = + Partial<_CSSHook> & ( + Pick<_CSSHook, 'get'> | + Pick<_CSSHook, 'set'> + ); + + interface _CSSHook { + get(elem: TElement, computed: any, extra: any): any; + set(elem: TElement, value: any): void; + } + + interface CSSHooks { + // Set to HTMLElement to minimize breaks but should probably be Element. + [propertyName: string]: CSSHook; + } + + // #endregion + + // region Deferred + // #region Deferred + + /** + * Any object that has a then method. + */ + interface Thenable extends PromiseLike { } + + // Type parameter guide + // -------------------- + // Each type parameter represents a parameter in one of the three possible callbacks. + // + // The first letter indicates which position the parameter is in. + // + // T = A = 1st position + // U = B = 2nd position + // V = C = 3rd position + // S = R = rest position + // + // The second letter indicates which whether it is a [R]esolve, Re[J]ect, or [N]otify value. + // + // The third letter indicates whether the value is returned in the [D]one filter, [F]ail filter, or [P]rogress filter. + + /** + * This object provides a subset of the methods of the Deferred object (then, done, fail, always, pipe, progress, state and promise) to prevent users from changing the state of the Deferred. + * @see \`{@link https://api.jquery.com/Types/#Promise }\` + */ + interface PromiseBase { + /** + * Add handlers to be called when the Deferred object is either resolved or rejected. + * @param alwaysCallback A function, or array of functions, that is called when the Deferred is resolved or rejected. + * @param alwaysCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected. + * @see \`{@link https://api.jquery.com/deferred.always/ }\` + * @since 1.6 + * @example ​ ````Since the jQuery.get() method returns a jqXHR object, which is derived from a Deferred object, we can attach a callback for both success and error using the deferred.always() method. +```javascript +$.get( "test.php" ).always(function() { + alert( "$.get completed with success or error callback arguments" ); +}); +``` + */ + always(alwaysCallback: TypeOrArray>, + ...alwaysCallbacks: Array>>): this; + /** + * Add handlers to be called when the Deferred object is resolved. + * @param doneCallback A function, or array of functions, that are called when the Deferred is resolved. + * @param doneCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is resolved. + * @see \`{@link https://api.jquery.com/deferred.done/ }\` + * @since 1.5 + * @example ​ ````Since the jQuery.get method returns a jqXHR object, which is derived from a Deferred object, we can attach a success callback using the .done() method. +```javascript +$.get( "test.php" ).done(function() { + alert( "$.get succeeded" ); +}); +``` + * @example ​ ````Resolve a Deferred object when the user clicks a button, triggering a number of callback functions: +```html + + + + + deferred.done demo + + + +​ + +

      Ready...

      +​ + +​ + + +``` + */ + done(doneCallback: TypeOrArray>, + ...doneCallbacks: Array>>): this; + /** + * Add handlers to be called when the Deferred object is rejected. + * @param failCallback A function, or array of functions, that are called when the Deferred is rejected. + * @param failCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is rejected. + * @see \`{@link https://api.jquery.com/deferred.fail/ }\` + * @since 1.5 + * @example ​ ````Since the jQuery.get method returns a jqXHR object, which is derived from a Deferred, you can attach a success and failure callback using the deferred.done() and deferred.fail() methods. +```javascript +$.get( "test.php" ) + .done(function() { + alert( "$.get succeeded" ); + }) + .fail(function() { + alert( "$.get failed!" ); + }); +``` + */ + fail(failCallback: TypeOrArray>, + ...failCallbacks: Array>>): this; + /** + * Add handlers to be called when the Deferred object generates progress notifications. + * @param progressCallback A function, or array of functions, to be called when the Deferred generates progress notifications. + * @param progressCallbacks Optional additional functions, or arrays of functions, to be called when the Deferred generates + * progress notifications. + * @see \`{@link https://api.jquery.com/deferred.progress/ }\` + * @since 1.7 + */ + progress(progressCallback: TypeOrArray>, + ...progressCallbacks: Array>>): this; + /** + * Return a Deferred's Promise object. + * @param target Object onto which the promise methods have to be attached + * @see \`{@link https://api.jquery.com/deferred.promise/ }\` + * @since 1.5 + * @example ​ ````Create a Deferred and set two timer-based functions to either resolve or reject the Deferred after a random interval. Whichever one fires first "wins" and will call one of the callbacks. The second timeout has no effect since the Deferred is already complete (in a resolved or rejected state) from the first timeout action. Also set a timer-based progress notification function, and call a progress handler that adds "working..." to the document body. +```javascript +function asyncEvent() { + var dfd = jQuery.Deferred(); +​ + // Resolve after a random interval + setTimeout(function() { + dfd.resolve( "hurray" ); + }, Math.floor( 400 + Math.random() * 2000 ) ); +​ + // Reject after a random interval + setTimeout(function() { + dfd.reject( "sorry" ); + }, Math.floor( 400 + Math.random() * 2000 ) ); +​ + // Show a "working..." message every half-second + setTimeout(function working() { + if ( dfd.state() === "pending" ) { + dfd.notify( "working... " ); + setTimeout( working, 500 ); + } + }, 1 ); +​ + // Return the Promise so caller can't change the Deferred + return dfd.promise(); +} +​ +// Attach a done, fail, and progress handler for the asyncEvent +$.when( asyncEvent() ).then( + function( status ) { + alert( status + ", things are going well" ); + }, + function( status ) { + alert( status + ", you fail this time" ); + }, + function( status ) { + $( "body" ).append( status ); + } +); +``` + */ + promise(target: TTarget): this & TTarget; + /** + * Return a Deferred's Promise object. + * @see \`{@link https://api.jquery.com/deferred.promise/ }\` + * @since 1.5 + * @example ​ ````Use the target argument to promote an existing object to a Promise: +```javascript +// Existing object +var obj = { + hello: function( name ) { + alert( "Hello " + name ); + } + }, + // Create a Deferred + defer = $.Deferred(); +​ +// Set object as a promise +defer.promise( obj ); +​ +// Resolve the deferred +defer.resolve( "John" ); +​ +// Use the object as a Promise +obj.done(function( name ) { + obj.hello( name ); // Will alert "Hello John" +}).hello( "Karl" ); // Will alert "Hello Karl" +``` + */ + promise(): this; + /** + * Determine the current state of a Deferred object. + * @see \`{@link https://api.jquery.com/deferred.state/ }\` + * @since 1.7 + */ + state(): 'pending' | 'resolved' | 'rejected'; + + // region pipe + // #region pipe + + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter resolve value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe(function( value ) { + return value * 2; + }); +​ +defer.resolve( 5 ); +filtered.done(function( value ) { + alert( "Value is ( 2*5 = ) 10: " + value ); +}); +``` + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, + failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | AJF, + progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: null, + failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | AJF, + progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter resolve value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe(function( value ) { + return value * 2; + }); +​ +defer.resolve( 5 ); +filtered.done(function( value ) { + alert( "Value is ( 2*5 = ) 10: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, + failFilter: null, + progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: null, + failFilter: null, + progressFilter?: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter resolve value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe(function( value ) { + return value * 2; + }); +​ +defer.resolve( 5 ); +filtered.done(function( value ) { + alert( "Value is ( 2*5 = ) 10: " + value ); +}); +``` + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, + failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | AJF, + progressFilter?: null): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: null, + failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | AJF, + progressFilter?: null): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter resolve value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe(function( value ) { + return value * 2; + }); +​ +defer.resolve( 5 ); +filtered.done(function( value ) { + alert( "Value is ( 2*5 = ) 10: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, + failFilter?: null, + progressFilter?: null): PromiseBase; + + // #endregion + + // region then + // #region then + + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Since the jQuery.get method returns a jqXHR object, which is derived from a Deferred object, we can attach handlers using the .then method. +```javascript +$.get( "test.php" ).then( + function() { + alert( "$.get succeeded" ); + }, function() { + alert( "$.get failed!" ); + } +); +``` + * @example ​ ````Filter the resolve value: +```html + + + + + deferred.then demo + + + +​ + +

      +​ + +​ + + +``` + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.then( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, + failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | ARF, + progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.then( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: null, + failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | ARF, + progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Filter the resolve value: +```html + + + + + deferred.then demo + + + +​ + +

      +​ + +​ + + +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, + failFilter: null, + progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: null, + failFilter: null, + progressFilter?: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Since the jQuery.get method returns a jqXHR object, which is derived from a Deferred object, we can attach handlers using the .then method. +```javascript +$.get( "test.php" ).then( + function() { + alert( "$.get succeeded" ); + }, function() { + alert( "$.get failed!" ); + } +); +``` + * @example ​ ````Filter the resolve value: +```html + + + + + deferred.then demo + + + +​ + +

      +​ + +​ + + +``` + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.then( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, + failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | ARF, + progressFilter?: null): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.then( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: null, + failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | ARF, + progressFilter?: null): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Filter the resolve value: +```html + + + + + deferred.then demo + + + +​ + +

      +​ + +​ + + +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, + failFilter?: null, + progressFilter?: null): PromiseBase; + + // #endregion + + /** + * Add handlers to be called when the Deferred object is rejected. + * @param failFilter A function that is called when the Deferred is rejected. + * @see \`{@link https://api.jquery.com/deferred.catch/ }\` + * @since 3.0 + * @example ​ ````Since the jQuery.get method returns a jqXHR object, which is derived from a Deferred object, we can rejection handlers using the .catch method. +```javascript +$.get( "test.php" ) + .then( function() { + alert( "$.get succeeded" ); + } ) + .catch( function() { + alert( "$.get failed!" ); + } ); +``` + */ + catch( + failFilter?: ((t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | ARF) | null): PromiseBase; + } + + /** + * This object provides a subset of the methods of the Deferred object (then, done, fail, always, pipe, progress, state and promise) to prevent users from changing the state of the Deferred. + * @see \`{@link https://api.jquery.com/Types/#Promise }\` + */ + interface Promise3 extends PromiseBase { } + + /** + * This object provides a subset of the methods of the Deferred object (then, done, fail, always, pipe, progress, state and promise) to prevent users from changing the state of the Deferred. + * @see \`{@link https://api.jquery.com/Types/#Promise }\` + */ + interface Promise2 extends PromiseBase { } + + /** + * This object provides a subset of the methods of the Deferred object (then, done, fail, always, pipe, progress, state and promise) to prevent users from changing the state of the Deferred. + * @see \`{@link https://api.jquery.com/Types/#Promise }\` + */ + interface Promise extends PromiseBase { } + + interface DeferredStatic { + // https://jquery.com/upgrade-guide/3.0/#callback-exit + exceptionHook: any; + /** + * A factory function that returns a chainable utility object with methods to register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function. + * @param beforeStart A function that is called just before the constructor returns. + * @see \`{@link https://api.jquery.com/jQuery.Deferred/ }\` + * @since 1.5 + */ + (beforeStart?: (this: Deferred, deferred: Deferred) => void): Deferred; + } + + interface Deferred { + /** + * Call the progressCallbacks on a Deferred object with the given args. + * @param args Optional arguments that are passed to the progressCallbacks. + * @see \`{@link https://api.jquery.com/deferred.notify/ }\` + * @since 1.7 + */ + notify(...args: TN[]): this; + /** + * Call the progressCallbacks on a Deferred object with the given context and args. + * @param context Context passed to the progressCallbacks as the this object. + * @param args An optional array of arguments that are passed to the progressCallbacks. + * @see \`{@link https://api.jquery.com/deferred.notifyWith/ }\` + * @since 1.7 + */ + notifyWith(context: object, args?: ArrayLike): this; + /** + * Reject a Deferred object and call any failCallbacks with the given args. + * @param args Optional arguments that are passed to the failCallbacks. + * @see \`{@link https://api.jquery.com/deferred.reject/ }\` + * @since 1.5 + */ + reject(...args: TJ[]): this; + /** + * Reject a Deferred object and call any failCallbacks with the given context and args. + * @param context Context passed to the failCallbacks as the this object. + * @param args An optional array of arguments that are passed to the failCallbacks. + * @see \`{@link https://api.jquery.com/deferred.rejectWith/ }\` + * @since 1.5 + */ + rejectWith(context: object, args?: ArrayLike): this; + /** + * Resolve a Deferred object and call any doneCallbacks with the given args. + * @param args Optional arguments that are passed to the doneCallbacks. + * @see \`{@link https://api.jquery.com/deferred.resolve/ }\` + * @since 1.5 + */ + resolve(...args: TR[]): this; + /** + * Resolve a Deferred object and call any doneCallbacks with the given context and args. + * @param context Context passed to the doneCallbacks as the this object. + * @param args An optional array of arguments that are passed to the doneCallbacks. + * @see \`{@link https://api.jquery.com/deferred.resolveWith/ }\` + * @since 1.5 + */ + resolveWith(context: object, args?: ArrayLike): this; + + /** + * Add handlers to be called when the Deferred object is either resolved or rejected. + * @param alwaysCallback A function, or array of functions, that is called when the Deferred is resolved or rejected. + * @param alwaysCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected. + * @see \`{@link https://api.jquery.com/deferred.always/ }\` + * @since 1.6 + * @example ​ ````Since the jQuery.get() method returns a jqXHR object, which is derived from a Deferred object, we can attach a callback for both success and error using the deferred.always() method. +```javascript +$.get( "test.php" ).always(function() { + alert( "$.get completed with success or error callback arguments" ); +}); +``` + */ + always(alwaysCallback: TypeOrArray>, + ...alwaysCallbacks: Array>>): this; + /** + * Add handlers to be called when the Deferred object is resolved. + * @param doneCallback A function, or array of functions, that are called when the Deferred is resolved. + * @param doneCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is resolved. + * @see \`{@link https://api.jquery.com/deferred.done/ }\` + * @since 1.5 + * @example ​ ````Since the jQuery.get method returns a jqXHR object, which is derived from a Deferred object, we can attach a success callback using the .done() method. +```javascript +$.get( "test.php" ).done(function() { + alert( "$.get succeeded" ); +}); +``` + * @example ​ ````Resolve a Deferred object when the user clicks a button, triggering a number of callback functions: +```html + + + + + deferred.done demo + + + +​ + +

      Ready...

      +​ + +​ + + +``` + */ + done(doneCallback: TypeOrArray>, + ...doneCallbacks: Array>>): this; + /** + * Add handlers to be called when the Deferred object is rejected. + * @param failCallback A function, or array of functions, that are called when the Deferred is rejected. + * @param failCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is rejected. + * @see \`{@link https://api.jquery.com/deferred.fail/ }\` + * @since 1.5 + * @example ​ ````Since the jQuery.get method returns a jqXHR object, which is derived from a Deferred, you can attach a success and failure callback using the deferred.done() and deferred.fail() methods. +```javascript +$.get( "test.php" ) + .done(function() { + alert( "$.get succeeded" ); + }) + .fail(function() { + alert( "$.get failed!" ); + }); +``` + */ + fail(failCallback: TypeOrArray>, + ...failCallbacks: Array>>): this; + /** + * Add handlers to be called when the Deferred object generates progress notifications. + * @param progressCallback A function, or array of functions, to be called when the Deferred generates progress notifications. + * @param progressCallbacks Optional additional functions, or arrays of functions, to be called when the Deferred generates + * progress notifications. + * @see \`{@link https://api.jquery.com/deferred.progress/ }\` + * @since 1.7 + */ + progress(progressCallback: TypeOrArray>, + ...progressCallbacks: Array>>): this; + /** + * Return a Deferred's Promise object. + * @param target Object onto which the promise methods have to be attached + * @see \`{@link https://api.jquery.com/deferred.promise/ }\` + * @since 1.5 + * @example ​ ````Use the target argument to promote an existing object to a Promise: +```javascript +// Existing object +var obj = { + hello: function( name ) { + alert( "Hello " + name ); + } + }, + // Create a Deferred + defer = $.Deferred(); +​ +// Set object as a promise +defer.promise( obj ); +​ +// Resolve the deferred +defer.resolve( "John" ); +​ +// Use the object as a Promise +obj.done(function( name ) { + obj.hello( name ); // Will alert "Hello John" +}).hello( "Karl" ); // Will alert "Hello Karl" +``` + */ + promise(target: TTarget): Promise & TTarget; + /** + * Return a Deferred's Promise object. + * @see \`{@link https://api.jquery.com/deferred.promise/ }\` + * @since 1.5 + * @example ​ ````Create a Deferred and set two timer-based functions to either resolve or reject the Deferred after a random interval. Whichever one fires first "wins" and will call one of the callbacks. The second timeout has no effect since the Deferred is already complete (in a resolved or rejected state) from the first timeout action. Also set a timer-based progress notification function, and call a progress handler that adds "working..." to the document body. +```javascript +function asyncEvent() { + var dfd = jQuery.Deferred(); +​ + // Resolve after a random interval + setTimeout(function() { + dfd.resolve( "hurray" ); + }, Math.floor( 400 + Math.random() * 2000 ) ); +​ + // Reject after a random interval + setTimeout(function() { + dfd.reject( "sorry" ); + }, Math.floor( 400 + Math.random() * 2000 ) ); +​ + // Show a "working..." message every half-second + setTimeout(function working() { + if ( dfd.state() === "pending" ) { + dfd.notify( "working... " ); + setTimeout( working, 500 ); + } + }, 1 ); +​ + // Return the Promise so caller can't change the Deferred + return dfd.promise(); +} +​ +// Attach a done, fail, and progress handler for the asyncEvent +$.when( asyncEvent() ).then( + function( status ) { + alert( status + ", things are going well" ); + }, + function( status ) { + alert( status + ", you fail this time" ); + }, + function( status ) { + $( "body" ).append( status ); + } +); +``` + */ + promise(): Promise; + /** + * Determine the current state of a Deferred object. + * @see \`{@link https://api.jquery.com/deferred.state/ }\` + * @since 1.7 + */ + state(): 'pending' | 'resolved' | 'rejected'; + + // region pipe + // #region pipe + + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter resolve value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe(function( value ) { + return value * 2; + }); +​ +defer.resolve( 5 ); +filtered.done(function( value ) { + alert( "Value is ( 2*5 = ) 10: " + value ); +}); +``` + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, + failFilter: (...t: TJ[]) => PromiseBase | Thenable | AJF, + progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: null, + failFilter: (...t: TJ[]) => PromiseBase | Thenable | AJF, + progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter resolve value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe(function( value ) { + return value * 2; + }); +​ +defer.resolve( 5 ); +filtered.done(function( value ) { + alert( "Value is ( 2*5 = ) 10: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, + failFilter: null, + progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: null, + failFilter: null, + progressFilter?: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter resolve value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe(function( value ) { + return value * 2; + }); +​ +defer.resolve( 5 ); +filtered.done(function( value ) { + alert( "Value is ( 2*5 = ) 10: " + value ); +}); +``` + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, + failFilter: (...t: TJ[]) => PromiseBase | Thenable | AJF, + progressFilter?: null): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: null, + failFilter: (...t: TJ[]) => PromiseBase | Thenable | AJF, + progressFilter?: null): PromiseBase; + /** + * Utility method to filter and/or chain Deferreds. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.pipe/ }\` + * @since 1.6 + * @since 1.7 + * @deprecated ​ Deprecated since 1.8. Use \`{@link then }\`. + * + * **Cause**: The `.pipe()` method on a `jQuery.Deferred` object was deprecated as of jQuery 1.8, when the `.then()` method was changed to perform the same function. + * + * **Solution**: In most cases it is sufficient to change all occurrences of `.pipe()` to `.then()`. Ensure that you aren't relying on context/state propagation (e.g., using `this`) or synchronous callback invocation, which were dropped from `.then()` for Promises/A+ interoperability as of jQuery 3.0. + * @example ​ ````Filter resolve value: +```javascript +var defer = $.Deferred(), + filtered = defer.pipe(function( value ) { + return value * 2; + }); +​ +defer.resolve( 5 ); +filtered.done(function( value ) { + alert( "Value is ( 2*5 = ) 10: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.pipe(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + pipe( + doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, + failFilter?: null, + progressFilter?: null): PromiseBase; + + // #endregion + + // region then + // #region then + + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter A function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Since the jQuery.get method returns a jqXHR object, which is derived from a Deferred object, we can attach handlers using the .then method. +```javascript +$.get( "test.php" ).then( + function() { + alert( "$.get succeeded" ); + }, function() { + alert( "$.get failed!" ); + } +); +``` + * @example ​ ````Filter the resolve value: +```html + + + + + deferred.then demo + + + +​ + +

      +​ + +​ + + +``` + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.then( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, + failFilter: (...t: TJ[]) => PromiseBase | Thenable | ARF, + progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter A function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.then( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: null, + failFilter: (...t: TJ[]) => PromiseBase | Thenable | ARF, + progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter A function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Filter the resolve value: +```html + + + + + deferred.then demo + + + +​ + +

      +​ + +​ + + +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, + failFilter: null, + progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter A function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: null, + failFilter: null, + progressFilter?: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Since the jQuery.get method returns a jqXHR object, which is derived from a Deferred object, we can attach handlers using the .then method. +```javascript +$.get( "test.php" ).then( + function() { + alert( "$.get succeeded" ); + }, function() { + alert( "$.get failed!" ); + } +); +``` + * @example ​ ````Filter the resolve value: +```html + + + + + deferred.then demo + + + +​ + +

      +​ + +​ + + +``` + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.then( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, + failFilter: (...t: TJ[]) => PromiseBase | Thenable | ARF, + progressFilter?: null): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Filter reject value: +```javascript +var defer = $.Deferred(), + filtered = defer.then( null, function( value ) { + return value * 3; + }); +​ +defer.reject( 6 ); +filtered.fail(function( value ) { + alert( "Value is ( 3*6 = ) 18: " + value ); +}); +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: null, + failFilter: (...t: TJ[]) => PromiseBase | Thenable | ARF, + progressFilter?: null): PromiseBase; + /** + * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. + * @param doneFilter An optional function that is called when the Deferred is resolved. + * @param failFilter An optional function that is called when the Deferred is rejected. + * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. + * @see \`{@link https://api.jquery.com/deferred.then/ }\` + * @since 1.8 + * @example ​ ````Filter the resolve value: +```html + + + + + deferred.then demo + + + +​ + +

      +​ + +​ + + +``` + * @example ​ ````Chain tasks: +```javascript +var request = $.ajax( url, { dataType: "json" } ), + chained = request.then(function( data ) { + return $.ajax( url2, { data: { user: data.userId } } ); + }); +​ +chained.done(function( data ) { + // data retrieved from url2 as provided by the first request +}); +``` + */ + then( + doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, + failFilter?: null, + progressFilter?: null): PromiseBase; + + // #endregion + + /** + * Add handlers to be called when the Deferred object is rejected. + * @param failFilter A function that is called when the Deferred is rejected. + * @see \`{@link https://api.jquery.com/deferred.catch/ }\` + * @since 3.0 + * @example ​ ````Since the jQuery.get method returns a jqXHR object, which is derived from a Deferred object, we can rejection handlers using the .catch method. +```javascript +$.get( "test.php" ) + .then( function() { + alert( "$.get succeeded" ); + } ) + .catch( function() { + alert( "$.get failed!" ); + } ); +``` + */ + catch( + failFilter?: ((...t: TJ[]) => PromiseBase | Thenable | ARF) | null): PromiseBase; + } + + namespace Deferred { + type CallbackBase = (t: T, u: U, v: V, ...r: R[]) => void; + + interface Callback3 extends CallbackBase { } + + type Callback = (...args: T[]) => void; + + /** + * @deprecated ​ Deprecated. Use \`{@link Callback }\`. + */ + interface DoneCallback extends Callback { } + + /** + * @deprecated ​ Deprecated. Use \`{@link Callback }\`. + */ + interface FailCallback extends Callback { } + + /** + * @deprecated ​ Deprecated. Use \`{@link Callback }\`. + */ + interface AlwaysCallback extends Callback { } + + /** + * @deprecated ​ Deprecated. Use \`{@link Callback }\`. + */ + interface ProgressCallback extends Callback { } + } + + // #endregion + + // region Effects + // #region Effects + + type Duration = number | 'fast' | 'slow'; + + /** + * @see \`{@link https://api.jquery.com/animate/#animate-properties-options }\` + */ + interface EffectsOptions extends PlainObject { + /** + * A function to be called when the animation on an element completes or stops without completing (its Promise object is either resolved or rejected). + */ + always?(this: TElement, animation: Animation, jumpedToEnd: boolean): void; + /** + * A function that is called once the animation on an element is complete. + */ + complete?(this: TElement): void; + /** + * A function to be called when the animation on an element completes (its Promise object is resolved). + */ + done?(this: TElement, animation: Animation, jumpedToEnd: boolean): void; + /** + * A string or number determining how long the animation will run. + */ + duration?: Duration; + /** + * A string indicating which easing function to use for the transition. + */ + easing?: string; + /** + * A function to be called when the animation on an element fails to complete (its Promise object is rejected). + */ + fail?(this: TElement, animation: Animation, jumpedToEnd: boolean): void; + /** + * A function to be called after each step of the animation, only once per animated element regardless of the number of animated properties. + */ + progress?(this: TElement, animation: Animation, progress: number, remainingMs: number): void; + /** + * A Boolean indicating whether to place the animation in the effects queue. If false, the animation will begin immediately. As of jQuery 1.7, the queue option can also accept a string, in which case the animation is added to the queue represented by that string. When a custom queue name is used the animation does not automatically start; you must call .dequeue("queuename") to start it. + */ + queue?: boolean | string; + /** + * An object containing one or more of the CSS properties defined by the properties argument and their corresponding easing functions. + */ + specialEasing?: PlainObject; + /** + * A function to call when the animation on an element begins. + */ + start?(this: TElement, animation: Animation): void; + /** + * A function to be called for each animated property of each animated element. This function provides an opportunity to modify the Tween object to change the value of the property before it is set. + */ + step?(this: TElement, now: number, tween: Tween): void; + } + + // region Animation + // #region Animation + + /** + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + interface AnimationStatic { + /** + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + (element: TElement, props: PlainObject, opts: EffectsOptions): Animation; + /** + * During the initial setup, `jQuery.Animation` will call any callbacks that have been registered through `jQuery.Animation.prefilter( function( element, props, opts ) )`. + * @param callback The prefilter will have `this` set to an animation object, and you can modify any of the `props` or + * `opts` however you need. The prefilter _may_ return its own promise which also implements `stop()`, + * in which case, processing of prefilters stops. If the prefilter is not trying to override the animation + * entirely, it should return `undefined` or some other falsy value. + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#prefilters }\` + * @since 1.8 + */ + prefilter( + callback: (this: Animation, element: TElement, props: PlainObject, opts: EffectsOptions) => Animation | _Falsy | void, + prepend?: boolean + ): void; + /** + * A "Tweener" is a function responsible for creating a tween object, and you might want to override these if you want to implement complex values ( like a clip/transform array matrix ) in a single property. + * + * You can override the default process for creating a tween in order to provide your own tween object by using `jQuery.Animation.tweener( props, callback( prop, value ) )`. + * @param props A space separated list of properties to be passed to your tweener, or `"*"` if it should be called + * for all properties. + * @param callback The callback will be called with `this` being an `Animation` object. The tweener function will + * generally start with `var tween = this.createTween( prop, value );`, but doesn't nessecarily need to + * use the `jQuery.Tween()` factory. + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweeners }\` + * @since 1.8 + */ + tweener(props: string, callback: Tweener): void; + } + + /** + * The promise will be resolved when the animation reaches its end, and rejected when terminated early. The context of callbacks attached to the promise will be the element, and the arguments will be the `Animation` object and a boolean `jumpedToEnd` which when true means the animation was stopped with `gotoEnd`, when `undefined` the animation completed naturally. + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + interface Animation extends Promise3< + Animation, Animation, Animation, + true | undefined, false, number, + never, never, number + > { + /** + * The duration specified in ms + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + duration: number; + /** + * The element being animatied + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + elem: TElement; + /** + * The final value of each property animating + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + props: PlainObject; + /** + * The animation options + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + opts: EffectsOptions; + /** + * The original properties before being filtered + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + originalProps: PlainObject; + /** + * The original options before being filtered + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + originalOpts: EffectsOptions; + /** + * The numeric value of `new Date()` when the animation began + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + startTime: number; + /** + * The animations tweens. + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + tweens: Array>; + /** + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + createTween(propName: string, finalValue: number): Tween; + /** + * Stops the animation early, optionally going to the end. + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#animation-factory }\` + * @since 1.8 + */ + stop(gotoEnd: boolean): this; + } + + /** + * A "Tweener" is a function responsible for creating a tween object, and you might want to override these if you want to implement complex values ( like a clip/transform array matrix ) in a single property. + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweeners }\` + * @since 1.8 + */ + type Tweener = (this: Animation, propName: string, finalValue: number) => Tween; + + /** + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + interface TweenStatic { + /** + * `jQuery.Tween.propHooks[ prop ]` is a hook point that replaces `jQuery.fx.step[ prop ]` (which is being deprecated.) These hooks are used by the tween to get and set values on elements. + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tween-hooks }\` + * @since 1.8 + * @example +```javascript +jQuery.Tween.propHooks[ property ] = { + get: function( tween ) { + // get tween.prop from tween.elem and return it + }, + set: function( tween ) { + // set tween.prop on tween.elem to tween.now + tween.unit + } +} +``` + */ + propHooks: PropHooks; + /** + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + (elem: TElement, options: EffectsOptions, prop: string, end: number, easing?: string, unit?: string): Tween; + } + + /** + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + // This should be a class but doesn't work correctly under the JQuery namespace. Tween should be an inner class of jQuery. + interface Tween { + /** + * The easing used + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + easing: string; + /** + * The element being animated + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + elem: TElement; + /** + * The ending value of the tween + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + end: number; + /** + * The current value of the tween + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + now: number; + /** + * A reference to the animation options + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + options: EffectsOptions; + // Undocumented. Is this intended to be public? + pos?: number; + /** + * The property being animated + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + prop: string; + /** + * The starting value of the tween + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + start: number; + /** + * The CSS unit for the tween + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + unit: string; + /** + * Reads the current value for property from the element + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + cur(): any; + /** + * Updates the value for the property on the animated elemd. + * @param progress A number from 0 to 1. + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tweens }\` + * @since 1.8 + */ + run(progress: number): this; + } + + /** + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tween-hooks }\` + * @since 1.8 + */ + // Workaround for TypeScript 2.3 which does not have support for weak types handling. + type PropHook = { + /** + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tween-hooks }\` + * @since 1.8 + */ + get(tween: Tween): any; + } | { + /** + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tween-hooks }\` + * @since 1.8 + */ + set(tween: Tween): void; + } | { + [key: string]: never; + }; + + /** + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#tween-hooks }\` + * @since 1.8 + */ + interface PropHooks { + [property: string]: PropHook; + } + + // #endregion + + // region Easing + // #region Easing + + type EasingMethod = (percent: number) => number; + + interface Easings { + [name: string]: EasingMethod; + } + + // #endregion + + // region Effects (fx) + // #region Effects (fx) + + interface Effects { + /** + * The rate (in milliseconds) at which animations fire. + * @see \`{@link https://api.jquery.com/jQuery.fx.interval/ }\` + * @since 1.4.3 + * @deprecated ​ Deprecated since 3.0. See \`{@link https://api.jquery.com/jQuery.fx.interval/ }\`. + * + * **Cause**: As of jQuery 3.0 the `jQuery.fx.interval` property can be used to change the animation interval only on browsers that do not support the `window.requestAnimationFrame()` method. That is currently only Internet Explorer 9 and the Android Browser. Once support is dropped for these browsers, the property will serve no purpose and it will be removed. + * + * **Solution**: Find and remove code that changes or uses `jQuery.fx.interval`. If the value is being used by code in your page or a plugin, the code may be making assumptions that are no longer valid. The default value of `jQuery.fx.interval` is `13` (milliseconds), which could be used instead of accessing this property. + * @example ​ ````Cause all animations to run with less frames. +```html + + + + + jQuery.fx.interval demo + + + + +​ +

      +
      +​ + + + +``` + */ + interval: number; + /** + * Globally disable all animations. + * @see \`{@link https://api.jquery.com/jQuery.fx.off/ }\` + * @since 1.3 + * @example ​ ````Toggle animation on and off +```html + + + + + jQuery.fx.off demo + + + + +​ + + +
      +​ + + + +``` + */ + off: boolean; + /** + * @deprecated ​ Deprecated since 1.8. Use \`{@link Tween.propHooks jQuery.Tween.propHooks}\`. + * + * `jQuery.fx.step` functions are being replaced by `jQuery.Tween.propHooks` and may eventually be removed, but are still supported via the default tween propHook. + */ + step: PlainObject>; + /** + * _overridable_ Clears up the `setInterval` + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#plugging-in-a-different-timer-loop }\` + * @since 1.8 + */ + stop(): void; + /** + * Calls `.run()` on each object in the `jQuery.timers` array, removing it from the array if `.run()` returns a falsy value. Calls `jQuery.fx.stop()` whenever there are no timers remaining. + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#plugging-in-a-different-timer-loop }\` + * @since 1.8 + */ + tick(): void; + /** + * _overridable_ Creates a `setInterval` if one doesn't already exist, and pushes `tickFunction` to the `jQuery.timers` array. `tickFunction` should also have `anim`, `elem`, and `queue` properties that reference the animation object, animated element, and queue option to facilitate `jQuery.fn.stop()` + * + * By overriding `fx.timer` and `fx.stop` you should be able to implement any animation tick behaviour you desire. (like using `requestAnimationFrame` instead of `setTimeout`.) + * + * There is an example of overriding the timer loop in \`{@link https://github.com/gnarf37/jquery-requestAnimationFrame jquery.requestAnimationFrame}\` + * @see \`{@link https://gist.github.com/gnarf/54829d408993526fe475#plugging-in-a-different-timer-loop }\` + * @since 1.8 + */ + timer(tickFunction: TickFunction): void; + } + + /** + * @deprecated ​ Deprecated since 1.8. Use \`{@link Tween.propHooks jQuery.Tween.propHooks}\`. + * + * `jQuery.fx.step` functions are being replaced by `jQuery.Tween.propHooks` and may eventually be removed, but are still supported via the default tween propHook. + */ + type AnimationHook = (fx: Tween) => void; + + interface TickFunction { + anim: Animation; + elem: TElement; + queue: boolean | string; + (): any; + } + + // #endregion + + // region Queue + // #region Queue + + // TODO: Is the first element always a string or is that specific to the 'fx' queue? + type Queue = { 0: string; } & Array>; + + type QueueFunction = (this: TElement, next: () => void) => void; + + // #endregion + + // region Speed + // #region Speed + + // Workaround for TypeScript 2.3 which does not have support for weak types handling. + type SpeedSettings = { + /** + * A string or number determining how long the animation will run. + */ + duration: Duration; + } | { + /** + * A string indicating which easing function to use for the transition. + */ + easing: string; + } | { + /** + * A function to call once the animation is complete. + */ + complete(this: TElement): void; + } | { + [key: string]: never; + }; + + // #endregion + + // #endregion + + // region Events + // #region Events + + // region Event + // #region Event + + // This should be a class but doesn't work correctly under the JQuery namespace. Event should be an inner class of jQuery. + + /** + * jQuery's event system normalizes the event object according to W3C standards. The event object is guaranteed to be passed to the event handler (no checks for window.event required). It normalizes the target, relatedTarget, which, metaKey and pageX/Y properties and provides both stopPropagation() and preventDefault() methods. + * + * Those properties are all documented, and accompanied by examples, on the \`{@link http://api.jquery.com/category/events/event-object/ Event object}\` page. + * + * The standard events in the Document Object Model are: `blur`, `focus`, `load`, `resize`, `scroll`, `unload`, `beforeunload`, `click`, `dblclick`, `mousedown`, `mouseup`, `mousemove`, `mouseover`, `mouseout`, `mouseenter`, `mouseleave`, `change`, `select`, `submit`, `keydown`, `keypress`, and `keyup`. Since the DOM event names have predefined meanings for some elements, using them for other purposes is not recommended. jQuery's event model can trigger an event by any name on an element, and it is propagated up the DOM tree to which that element belongs, if any. + * @see \`{@link https://api.jquery.com/category/events/event-object/ }\` + */ + interface EventStatic { + /** + * The jQuery.Event constructor is exposed and can be used when calling trigger. The new operator is optional. + * + * Check \`{@link https://api.jquery.com/trigger/ trigger}\`'s documentation to see how to combine it with your own event object. + * @see \`{@link https://api.jquery.com/category/events/event-object/ }\` + * @since 1.6 + * @example +```javascript +//Create a new jQuery.Event object without the "new" operator. +var e = jQuery.Event( "click" ); +​ +// trigger an artificial click event +jQuery( "body" ).trigger( e ); +``` + * @example +```javascript +// Create a new jQuery.Event object with specified event properties. +var e = jQuery.Event( "keydown", { keyCode: 64 } ); +​ +// trigger an artificial keydown event with keyCode 64 +jQuery( "body" ).trigger( e ); +``` + */ + (event: string, properties?: T): Event & T; + /** + * The jQuery.Event constructor is exposed and can be used when calling trigger. The new operator is optional. + * + * Check \`{@link https://api.jquery.com/trigger/ trigger}\`'s documentation to see how to combine it with your own event object. + * @see \`{@link https://api.jquery.com/category/events/event-object/ }\` + * @since 1.6 + * @example +```javascript +//Create a new jQuery.Event object without the "new" operator. +var e = jQuery.Event( "click" ); +​ +// trigger an artificial click event +jQuery( "body" ).trigger( e ); +``` + * @example +```javascript +// Create a new jQuery.Event object with specified event properties. +var e = jQuery.Event( "keydown", { keyCode: 64 } ); +​ +// trigger an artificial keydown event with keyCode 64 +jQuery( "body" ).trigger( e ); +``` + */ + new (event: string, properties?: T): Event & T; + } + + /** + * jQuery's event system normalizes the event object according to W3C standards. The event object is guaranteed to be passed to the event handler (no checks for window.event required). It normalizes the target, relatedTarget, which, metaKey and pageX/Y properties and provides both stopPropagation() and preventDefault() methods. + * + * Those properties are all documented, and accompanied by examples, on the \`{@link http://api.jquery.com/category/events/event-object/ Event object}\` page. + * + * The standard events in the Document Object Model are: `blur`, `focus`, `load`, `resize`, `scroll`, `unload`, `beforeunload`, `click`, `dblclick`, `mousedown`, `mouseup`, `mousemove`, `mouseover`, `mouseout`, `mouseenter`, `mouseleave`, `change`, `select`, `submit`, `keydown`, `keypress`, and `keyup`. Since the DOM event names have predefined meanings for some elements, using them for other purposes is not recommended. jQuery's event model can trigger an event by any name on an element, and it is propagated up the DOM tree to which that element belongs, if any. + * @see \`{@link https://api.jquery.com/category/events/event-object/ }\` + * @see \`{@link TriggeredEvent }\` + */ + interface Event { + // region Copied properties + // #region Copied properties + + // Event + + bubbles: boolean | undefined; + cancelable: boolean | undefined; + eventPhase: number | undefined; + + // UIEvent + + detail: number | undefined; + view: Window | undefined; + + // MouseEvent + + button: number | undefined; + buttons: number | undefined; + clientX: number | undefined; + clientY: number | undefined; + offsetX: number | undefined; + offsetY: number | undefined; + /** + * The mouse position relative to the left edge of the document. + * @see \`{@link https://api.jquery.com/event.pageX/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageX demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageX: number | undefined; + /** + * The mouse position relative to the top edge of the document. + * @see \`{@link https://api.jquery.com/event.pageY/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageY demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageY: number | undefined; + screenX: number | undefined; + screenY: number | undefined; + /** @deprecated */ + toElement: Element | undefined; + + // PointerEvent + + pointerId: number | undefined; + pointerType: string | undefined; + + // KeyboardEvent + + /** @deprecated */ + char: string | undefined; + /** @deprecated */ + charCode: number | undefined; + key: string | undefined; + /** @deprecated */ + keyCode: number | undefined; + + // TouchEvent + + changedTouches: TouchList | undefined; + targetTouches: TouchList | undefined; + touches: TouchList | undefined; + + // MouseEvent, KeyboardEvent + + /** + * For key or mouse events, this property indicates the specific key or button that was pressed. + * @see \`{@link https://api.jquery.com/event.which/ }\` + * @since 1.1.3 + * @example ​ ````Log which key was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + * @example ​ ````Log which mouse button was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + */ + which: number | undefined; + + // MouseEvent, KeyboardEvent, TouchEvent + + altKey: boolean | undefined; + ctrlKey: boolean | undefined; + /** + * Indicates whether the META key was pressed when the event fired. + * @see \`{@link https://api.jquery.com/event.metaKey/ }\` + * @since 1.0.4 + * @example ​ ````Determine whether the META key was pressed when the event fired. +```html + + + + + event.metaKey demo + + + + +​ + +
      +​ + +​ + + +``` + */ + metaKey: boolean | undefined; + shiftKey: boolean | undefined; + + // #endregion + + /** + * The difference in milliseconds between the time the browser created the event and January 1, 1970. + * @see \`{@link https://api.jquery.com/event.timeStamp/ }\` + * @since 1.2.6 + * @example ​ ````Display the time since the click handler last executed. +```html + + + + + event.timeStamp demo + + + + +​ +
      Click.
      +​ + +​ + + +``` + */ + timeStamp: number; + /** + * Describes the nature of the event. + * @see \`{@link https://api.jquery.com/event.type/ }\` + * @since 1.0 + * @example ​ ````On all anchor clicks, alert the event type. +```javascript +$( "a" ).click(function( event ) { + alert( event.type ); // "click" +}); +``` + */ + type: string; + /** + * Returns whether event.preventDefault() was ever called on this event object. + * @see \`{@link https://api.jquery.com/event.isDefaultPrevented/ }\` + * @since 1.3 + * @example ​ ````Checks whether event.preventDefault() was called. +```javascript +$( "a" ).click(function( event ) { + alert( event.isDefaultPrevented() ); // false + event.preventDefault(); + alert( event.isDefaultPrevented() ); // true +}); +``` + */ + isDefaultPrevented(): boolean; + /** + * Returns whether event.stopImmediatePropagation() was ever called on this event object. + * @see \`{@link https://api.jquery.com/event.isImmediatePropagationStopped/ }\` + * @since 1.3 + * @example ​ ````Checks whether event.stopImmediatePropagation() was called. +```html + + + + + event.isImmediatePropagationStopped demo + + + +​ + +
      + ​ + +​ + + +``` + */ + isImmediatePropagationStopped(): boolean; + /** + * Returns whether event.stopPropagation() was ever called on this event object. + * @see \`{@link https://api.jquery.com/event.isPropagationStopped/ }\` + * @since 1.3 + * @example ​ ````Checks whether event.stopPropagation() was called +```html + + + + + event.isPropagationStopped demo + + + +​ + +
      + ​ + +​ + + +``` + */ + isPropagationStopped(): boolean; + /** + * If this method is called, the default action of the event will not be triggered. + * @see \`{@link https://api.jquery.com/event.preventDefault/ }\` + * @since 1.0 + * @example ​ ````Cancel the default action (navigation) of the click. +```html + + + + + event.preventDefault demo + + + +​ +default click action is prevented +
      +​ + +​ + + +``` + */ + preventDefault(): void; + /** + * Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree. + * @see \`{@link https://api.jquery.com/event.stopImmediatePropagation/ }\` + * @since 1.3 + * @example ​ ````Prevents other event handlers from being called. +```html + + + + + event.stopImmediatePropagation demo + + + + +​ +

      paragraph

      +
      division
      +​ + +​ + + +``` + */ + stopImmediatePropagation(): void; + /** + * Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event. + * @see \`{@link https://api.jquery.com/event.stopPropagation/ }\` + * @since 1.0 + * @example ​ ````Kill the bubbling on the click event. +```javascript +$( "p" ).click(function( event ) { + event.stopPropagation(); + // Do something +}); +``` + */ + stopPropagation(): void; + } + + // #endregion + + /** + * Base type for jQuery events that have been triggered (including events triggered on plain objects). + */ + interface TriggeredEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends Event { + /** + * The current DOM element within the event bubbling phase. + * @see \`{@link https://api.jquery.com/event.currentTarget/ }\` + * @since 1.3 + * @example ​ ````Alert that currentTarget matches the `this` keyword. +```javascript +$( "p" ).click(function( event ) { + alert( event.currentTarget === this ); // true +}); +``` + */ + currentTarget: TCurrentTarget; + /** + * The element where the currently-called jQuery event handler was attached. + * @see \`{@link https://api.jquery.com/event.delegateTarget/ }\` + * @since 1.7 + * @example ​ ````When a button in any box class is clicked, change the box's background color to red. +```javascript +$( ".box" ).on( "click", "button", function( event ) { + $( event.delegateTarget ).css( "background-color", "red" ); +}); +``` + */ + delegateTarget: TDelegateTarget; + /** + * The DOM element that initiated the event. + * @see \`{@link https://api.jquery.com/event.target/ }\` + * @since 1.0 + * @example ​ ````Display the tag's name on click +```html + + + + + event.target demo + + + + +​ +
      +
      +

      + click +

      +
      +​ + +​ + + +``` + * @example ​ ````Implements a simple event delegation: The click handler is added to an unordered list, and the children of its li children are hidden. Clicking one of the li children toggles (see toggle()) their children. +```html + + + + + event.target demo + + + +​ +
        +
      • item 1 +
          +
        • sub item 1-a
        • +
        • sub item 1-b
        • +
        +
      • +
      • item 2 +
          +
        • sub item 2-a
        • +
        • sub item 2-b
        • +
        +
      • +
      +​ + +​ + + +``` + */ + target: TTarget; + + /** + * An optional object of data passed to an event method when the current executing handler is bound. + * @see \`{@link https://api.jquery.com/event.data/ }\` + * @since 1.1 + * @example ​ ````Within a for loop, pass the value of i to the .on() method so that the current iteration's value is preserved. +```html + + + + + event.data demo + + + +​ + + + + + +​ +
      +​ + +​ + + +``` + */ + data: TData; + + /** + * The namespace specified when the event was triggered. + * @see \`{@link https://api.jquery.com/event.namespace/ }\` + * @since 1.4.3 + * @example ​ ````Determine the event namespace used. +```html + + + + + event.namespace demo + + + +​ + +

      +​ + +​ + + +``` + */ + namespace?: string; + originalEvent?: _Event; + /** + * The last value returned by an event handler that was triggered by this event, unless the value was undefined. + * @see \`{@link https://api.jquery.com/event.result/ }\` + * @since 1.3 + * @example ​ ````Display previous handler's return value +```html + + + + + event.result demo + + + +​ + +

      +​ + +​ + + +``` + */ + result?: any; + } + + // region Event + // #region Event + + interface EventBase< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends TriggeredEvent { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. +```javascript +$( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" +}); +``` + */ + relatedTarget?: undefined; + + // Event + + bubbles: boolean; + cancelable: boolean; + eventPhase: number; + + // UIEvent + + detail: undefined; + view: undefined; + + // MouseEvent + + button: undefined; + buttons: undefined; + clientX: undefined; + clientY: undefined; + offsetX: undefined; + offsetY: undefined; + /** + * The mouse position relative to the left edge of the document. + * @see \`{@link https://api.jquery.com/event.pageX/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageX demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageX: undefined; + /** + * The mouse position relative to the top edge of the document. + * @see \`{@link https://api.jquery.com/event.pageY/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageY demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageY: undefined; + screenX: undefined; + screenY: undefined; + /** @deprecated */ + toElement: undefined; + + // PointerEvent + + pointerId: undefined; + pointerType: undefined; + + // KeyboardEvent + + /** @deprecated */ + char: undefined; + /** @deprecated */ + charCode: undefined; + key: undefined; + /** @deprecated */ + keyCode: undefined; + + // TouchEvent + + changedTouches: undefined; + targetTouches: undefined; + touches: undefined; + + // MouseEvent, KeyboardEvent + + /** + * For key or mouse events, this property indicates the specific key or button that was pressed. + * @see \`{@link https://api.jquery.com/event.which/ }\` + * @since 1.1.3 + * @deprecated ​ Deprecated since 3.3. See \`{@link https://github.com/jquery/api.jquery.com/issues/821 }\`. + * @example ​ ````Log which key was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + * @example ​ ````Log which mouse button was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + */ + which: undefined; + + // MouseEvent, KeyboardEvent, TouchEvent + + altKey: undefined; + ctrlKey: undefined; + /** + * Indicates whether the META key was pressed when the event fired. + * @see \`{@link https://api.jquery.com/event.metaKey/ }\` + * @since 1.0.4 + * @example ​ ````Determine whether the META key was pressed when the event fired. +```html + + + + + event.metaKey demo + + + + +​ + +
      +​ + +​ + + +``` + */ + metaKey: undefined; + shiftKey: undefined; + + originalEvent?: _Event; + } + + interface ChangeEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends EventBase { + type: 'change'; + } + + interface ResizeEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends EventBase { + type: 'resize'; + } + + interface ScrollEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends EventBase { + type: 'scroll'; + } + + interface SelectEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends EventBase { + type: 'select'; + } + + interface SubmitEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends EventBase { + type: 'submit'; + } + + // #endregion + + // region UIEvent + // #region UIEvent + + interface UIEventBase< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends TriggeredEvent { + // Event + + bubbles: boolean; + cancelable: boolean; + eventPhase: number; + + // UIEvent + + detail: number; + view: Window; + + originalEvent?: _UIEvent; + } + + // region MouseEvent + // #region MouseEvent + + interface MouseEventBase< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends UIEventBase { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. +```javascript +$( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" +}); +``` + */ + relatedTarget?: EventTarget | null; + + // MouseEvent + + button: number; + buttons: number; + clientX: number; + clientY: number; + offsetX: number; + offsetY: number; + /** + * The mouse position relative to the left edge of the document. + * @see \`{@link https://api.jquery.com/event.pageX/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageX demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageX: number; + /** + * The mouse position relative to the top edge of the document. + * @see \`{@link https://api.jquery.com/event.pageY/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageY demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageY: number; + screenX: number; + screenY: number; + /** @deprecated */ + toElement: Element; + + // PointerEvent + + pointerId: undefined; + pointerType: undefined; + + // KeyboardEvent + + /** @deprecated */ + char: undefined; + /** @deprecated */ + charCode: undefined; + key: undefined; + /** @deprecated */ + keyCode: undefined; + + // TouchEvent + + changedTouches: undefined; + targetTouches: undefined; + touches: undefined; + + // MouseEvent, KeyboardEvent + + /** + * For key or mouse events, this property indicates the specific key or button that was pressed. + * @see \`{@link https://api.jquery.com/event.which/ }\` + * @since 1.1.3 + * @deprecated ​ Deprecated since 3.3. See \`{@link https://github.com/jquery/api.jquery.com/issues/821 }\`. + * @example ​ ````Log which key was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + * @example ​ ````Log which mouse button was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + */ + which: number; + + // MouseEvent, KeyboardEvent, TouchEvent + + altKey: boolean; + ctrlKey: boolean; + /** + * Indicates whether the META key was pressed when the event fired. + * @see \`{@link https://api.jquery.com/event.metaKey/ }\` + * @since 1.0.4 + * @example ​ ````Determine whether the META key was pressed when the event fired. +```html + + + + + event.metaKey demo + + + + +​ + +
      +​ + +​ + + +``` + */ + metaKey: boolean; + shiftKey: boolean; + + originalEvent?: _MouseEvent; + } + + interface ClickEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends MouseEventBase { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. + ```javascript + $( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" + }); + ``` + */ + relatedTarget?: null; + + type: 'click'; + } + + interface ContextMenuEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends MouseEventBase { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. + ```javascript + $( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" + }); + ``` + */ + relatedTarget?: null; + + type: 'contextmenu'; + } + + interface DoubleClickEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends MouseEventBase { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. + ```javascript + $( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" + }); + ``` + */ + relatedTarget?: null; + + type: 'dblclick'; + } + + interface MouseDownEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends MouseEventBase { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. + ```javascript + $( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" + }); + ``` + */ + relatedTarget?: null; + + type: 'mousedown'; + } + + interface MouseEnterEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends MouseEventBase { + // Special handling by jQuery. + type: 'mouseover'; + } + + interface MouseLeaveEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends MouseEventBase { + // Special handling by jQuery. + type: 'mouseout'; + } + + interface MouseMoveEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends MouseEventBase { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. + ```javascript + $( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" + }); + ``` + */ + relatedTarget?: null; + + type: 'mousemove'; + } + + interface MouseOutEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends MouseEventBase { + type: 'mouseout'; + } + + interface MouseOverEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends MouseEventBase { + type: 'mouseover'; + } + + interface MouseUpEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends MouseEventBase { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. + ```javascript + $( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" + }); + ``` + */ + relatedTarget?: null; + + type: 'mouseup'; + } + + // region DragEvent + // #region DragEvent + + interface DragEventBase< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends UIEventBase { + originalEvent?: _DragEvent; + } + + interface DragEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends DragEventBase { + type: 'drag'; + } + + interface DragEndEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends DragEventBase { + type: 'dragend'; + } + + interface DragEnterEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends DragEventBase { + type: 'dragenter'; + } + + interface DragExitEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends DragEventBase { + type: 'dragexit'; + } + + interface DragLeaveEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends DragEventBase { + type: 'dragleave'; + } + + interface DragOverEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends DragEventBase { + type: 'dragover'; + } + + interface DragStartEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends DragEventBase { + type: 'dragstart'; + } + + interface DropEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends DragEventBase { + type: 'drop'; + } + + // #endregion + + // #endregion + + // region KeyboardEvent + // #region KeyboardEvent + + interface KeyboardEventBase< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends UIEventBase { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. +```javascript +$( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" +}); +``` + */ + relatedTarget?: undefined; + + // MouseEvent + + button: undefined; + buttons: undefined; + clientX: undefined; + clientY: undefined; + offsetX: undefined; + offsetY: undefined; + /** + * The mouse position relative to the left edge of the document. + * @see \`{@link https://api.jquery.com/event.pageX/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageX demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageX: undefined; + /** + * The mouse position relative to the top edge of the document. + * @see \`{@link https://api.jquery.com/event.pageY/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageY demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageY: undefined; + screenX: undefined; + screenY: undefined; + /** @deprecated */ + toElement: undefined; + + // PointerEvent + + pointerId: undefined; + pointerType: undefined; + + // KeyboardEvent + + /** @deprecated */ + char: string | undefined; + /** @deprecated */ + charCode: number; + code: string; + key: string; + /** @deprecated */ + keyCode: number; + + // TouchEvent + + changedTouches: undefined; + targetTouches: undefined; + touches: undefined; + + // MouseEvent, KeyboardEvent + + /** + * For key or mouse events, this property indicates the specific key or button that was pressed. + * @see \`{@link https://api.jquery.com/event.which/ }\` + * @since 1.1.3 + * @deprecated ​ Deprecated since 3.3. See \`{@link https://github.com/jquery/api.jquery.com/issues/821 }\`. + * @example ​ ````Log which key was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + * @example ​ ````Log which mouse button was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + */ + which: number; + + // MouseEvent, KeyboardEvent, TouchEvent + + altKey: boolean; + ctrlKey: boolean; + /** + * Indicates whether the META key was pressed when the event fired. + * @see \`{@link https://api.jquery.com/event.metaKey/ }\` + * @since 1.0.4 + * @example ​ ````Determine whether the META key was pressed when the event fired. +```html + + + + + event.metaKey demo + + + + +​ + +
      +​ + +​ + + +``` + */ + metaKey: boolean; + shiftKey: boolean; + + originalEvent?: _KeyboardEvent; + } + + interface KeyDownEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends KeyboardEventBase { + type: 'keydown'; + } + + interface KeyPressEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends KeyboardEventBase { + type: 'keypress'; + } + + interface KeyUpEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends KeyboardEventBase { + type: 'keyup'; + } + + // #endregion + + // region TouchEvent + // #region TouchEvent + + interface TouchEventBase< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends UIEventBase { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. +```javascript +$( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" +}); +``` + */ + relatedTarget?: undefined; + + // MouseEvent + + button: undefined; + buttons: undefined; + clientX: undefined; + clientY: undefined; + offsetX: undefined; + offsetY: undefined; + /** + * The mouse position relative to the left edge of the document. + * @see \`{@link https://api.jquery.com/event.pageX/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageX demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageX: undefined; + /** + * The mouse position relative to the top edge of the document. + * @see \`{@link https://api.jquery.com/event.pageY/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageY demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageY: undefined; + screenX: undefined; + screenY: undefined; + /** @deprecated */ + toElement: undefined; + + // PointerEvent + + pointerId: undefined; + pointerType: undefined; + + // KeyboardEvent + + /** @deprecated */ + char: undefined; + /** @deprecated */ + charCode: undefined; + key: undefined; + /** @deprecated */ + keyCode: undefined; + + // TouchEvent + + changedTouches: TouchList; + targetTouches: TouchList; + touches: TouchList; + + // MouseEvent, KeyboardEvent + + /** + * For key or mouse events, this property indicates the specific key or button that was pressed. + * @see \`{@link https://api.jquery.com/event.which/ }\` + * @since 1.1.3 + * @deprecated ​ Deprecated since 3.3. See \`{@link https://github.com/jquery/api.jquery.com/issues/821 }\`. + * @example ​ ````Log which key was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + * @example ​ ````Log which mouse button was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + */ + which: undefined; + + // MouseEvent, KeyboardEvent, TouchEvent + + altKey: boolean; + ctrlKey: boolean; + /** + * Indicates whether the META key was pressed when the event fired. + * @see \`{@link https://api.jquery.com/event.metaKey/ }\` + * @since 1.0.4 + * @example ​ ````Determine whether the META key was pressed when the event fired. +```html + + + + + event.metaKey demo + + + + +​ + +
      +​ + +​ + + +``` + */ + metaKey: boolean; + shiftKey: boolean; + + originalEvent?: _TouchEvent; + } + + interface TouchCancelEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends TouchEventBase { + type: 'touchcancel'; + } + + interface TouchEndEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends TouchEventBase { + type: 'touchend'; + } + + interface TouchMoveEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends TouchEventBase { + type: 'touchmove'; + } + + interface TouchStartEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends TouchEventBase { + type: 'touchstart'; + } + + // #endregion + + // region FocusEvent + // #region FocusEvent + + interface FocusEventBase< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends UIEventBase { + /** + * The other DOM element involved in the event, if any. + * @see \`{@link https://api.jquery.com/event.relatedTarget/ }\` + * @since 1.1.4 + * @example ​ ````On mouseout of anchors, alert the element type being entered. +```javascript +$( "a" ).mouseout(function( event ) { + alert( event.relatedTarget.nodeName ); // "DIV" +}); +``` + */ + relatedTarget?: EventTarget | null; + + // MouseEvent + + button: undefined; + buttons: undefined; + clientX: undefined; + clientY: undefined; + offsetX: undefined; + offsetY: undefined; + /** + * The mouse position relative to the left edge of the document. + * @see \`{@link https://api.jquery.com/event.pageX/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageX demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageX: undefined; + /** + * The mouse position relative to the top edge of the document. + * @see \`{@link https://api.jquery.com/event.pageY/ }\` + * @since 1.0.4 + * @example ​ ````Show the mouse position relative to the left and top edges of the document (within this iframe). +```html + + + + + event.pageY demo + + + + +​ +
      +​ + +​ + + +``` + */ + pageY: undefined; + screenX: undefined; + screenY: undefined; + /** @deprecated */ + toElement: undefined; + + // PointerEvent + + pointerId: undefined; + pointerType: undefined; + + // KeyboardEvent + + /** @deprecated */ + char: undefined; + /** @deprecated */ + charCode: undefined; + key: undefined; + /** @deprecated */ + keyCode: undefined; + + // TouchEvent + + changedTouches: undefined; + targetTouches: undefined; + touches: undefined; + + // MouseEvent, KeyboardEvent + + /** + * For key or mouse events, this property indicates the specific key or button that was pressed. + * @see \`{@link https://api.jquery.com/event.which/ }\` + * @since 1.1.3 + * @deprecated ​ Deprecated since 3.3. See \`{@link https://github.com/jquery/api.jquery.com/issues/821 }\`. + * @example ​ ````Log which key was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + * @example ​ ````Log which mouse button was depressed. +```html + + + + + event.which demo + + + +​ + +
      +​ + +​ + + +``` + */ + which: undefined; + + // MouseEvent, KeyboardEvent, TouchEvent + + altKey: undefined; + ctrlKey: undefined; + /** + * Indicates whether the META key was pressed when the event fired. + * @see \`{@link https://api.jquery.com/event.metaKey/ }\` + * @since 1.0.4 + * @example ​ ````Determine whether the META key was pressed when the event fired. +```html + + + + + event.metaKey demo + + + + +​ + +
      +​ + +​ + + +``` + */ + metaKey: undefined; + shiftKey: undefined; + + originalEvent?: _FocusEvent; + } + + interface BlurEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends FocusEventBase { + type: 'blur'; + } + + interface FocusEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends FocusEventBase { + type: 'focus'; + } + + interface FocusInEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends FocusEventBase { + type: 'focusin'; + } + + interface FocusOutEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends FocusEventBase { + type: 'focusout'; + } + + // #endregion + + // #endregion + + interface TypeToTriggeredEventMap< + TDelegateTarget, + TData, + TCurrentTarget, + TTarget + > { + // Event + + change: ChangeEvent; + resize: ResizeEvent; + scroll: ScrollEvent; + select: SelectEvent; + submit: SubmitEvent; + + // UIEvent + + // MouseEvent + + click: ClickEvent; + contextmenu: ContextMenuEvent; + dblclick: DoubleClickEvent; + mousedown: MouseDownEvent; + mouseenter: MouseEnterEvent; + mouseleave: MouseLeaveEvent; + mousemove: MouseMoveEvent; + mouseout: MouseOutEvent; + mouseover: MouseOverEvent; + mouseup: MouseUpEvent; + + // DragEvent + + drag: DragEvent; + dragend: DragEndEvent; + dragenter: DragEnterEvent; + dragexit: DragExitEvent; + dragleave: DragLeaveEvent; + dragover: DragOverEvent; + dragstart: DragStartEvent; + drop: DropEvent; + + // KeyboardEvent + + keydown: KeyDownEvent; + keypress: KeyPressEvent; + keyup: KeyUpEvent; + + // TouchEvent + + touchcancel: TouchCancelEvent; + touchend: TouchEndEvent; + touchmove: TouchMoveEvent; + touchstart: TouchStartEvent; + + // FocusEvent + + blur: BlurEvent; + focus: FocusEvent; + focusin: FocusInEvent; + focusout: FocusOutEvent; + + [type: string]: TriggeredEvent; + } + + // Extra parameters can be passed from trigger() + type EventHandlerBase = (this: TContext, t: T, ...args: any[]) => any; + + type EventHandler< + TCurrentTarget, + TData = undefined + > = EventHandlerBase>; + + type TypeEventHandler< + TDelegateTarget, + TData, + TCurrentTarget, + TTarget, + TType extends keyof TypeToTriggeredEventMap + > = EventHandlerBase[TType]>; + + interface TypeEventHandlers< + TDelegateTarget, + TData, + TCurrentTarget, + TTarget + > extends _TypeEventHandlers { + // No idea why it's necessary to include `object` in the union but otherwise TypeScript complains that + // derived types of Event are not assignable to Event. + [type: string]: TypeEventHandler | + false | + undefined | + object; + } + + type _TypeEventHandlers< + TDelegateTarget, + TData, + TCurrentTarget, + TTarget + > = { + [TType in keyof TypeToTriggeredEventMap]?: + TypeEventHandler | + false | + object; + }; + + // region Event extensions + // #region Event extensions + + interface EventExtensions { + /** + * The jQuery special event hooks are a set of per-event-name functions and properties that allow code to control the behavior of event processing within jQuery. The mechanism is similar to `fixHooks` in that the special event information is stored in `jQuery.event.special.NAME`, where `NAME` is the name of the special event. Event names are case sensitive. + * + * As with `fixHooks`, the special event hooks design assumes it will be very rare that two unrelated pieces of code want to process the same event name. Special event authors who need to modify events with existing hooks will need to take precautions to avoid introducing unwanted side-effects by clobbering those hooks. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#special-event-hooks }\` + */ + special: SpecialEventHooks; + } + + // region Special event hooks + // #region Special event hooks + + /** + * The jQuery special event hooks are a set of per-event-name functions and properties that allow code to control the behavior of event processing within jQuery. The mechanism is similar to `fixHooks` in that the special event information is stored in `jQuery.event.special.NAME`, where `NAME` is the name of the special event. Event names are case sensitive. + * + * As with `fixHooks`, the special event hooks design assumes it will be very rare that two unrelated pieces of code want to process the same event name. Special event authors who need to modify events with existing hooks will need to take precautions to avoid introducing unwanted side-effects by clobbering those hooks. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#special-event-hooks }\` + */ + // Workaround for TypeScript 2.3 which does not have support for weak types handling. + type SpecialEventHook = { + /** + * Indicates whether this event type should be bubbled when the `.trigger()` method is called; by default it is `false`, meaning that a triggered event will bubble to the element's parents up to the document (if attached to a document) and then to the window. Note that defining `noBubble` on an event will effectively prevent that event from being used for delegated events with `.trigger()`. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#nobubble-boolean }\` + */ + noBubble: boolean; + } | { + /** + * When defined, these string properties specify that a special event should be handled like another event type until the event is delivered. The `bindType` is used if the event is attached directly, and the `delegateType` is used for delegated events. These types are generally DOM event types, and _should not_ be a special event themselves. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#bindtype-string-delegatetype-string }\` + */ + bindType: string; + } | { + /** + * When defined, these string properties specify that a special event should be handled like another event type until the event is delivered. The `bindType` is used if the event is attached directly, and the `delegateType` is used for delegated events. These types are generally DOM event types, and _should not_ be a special event themselves. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#bindtype-string-delegatetype-string }\` + */ + delegateType: string; + } | { + /** + * The setup hook is called the first time an event of a particular type is attached to an element; this provides the hook an opportunity to do processing that will apply to all events of this type on this element. The `this` keyword will be a reference to the element where the event is being attached and `eventHandle` is jQuery's event handler function. In most cases the `namespaces` argument should not be used, since it only represents the namespaces of the _first_ event being attached; subsequent events may not have this same namespaces. + * + * This hook can perform whatever processing it desires, including attaching its own event handlers to the element or to other elements and recording setup information on the element using the `jQuery.data()` method. If the setup hook wants jQuery to add a browser event (via `addEventListener` or `attachEvent`, depending on browser) it should return `false`. In all other cases, jQuery will not add the browser event, but will continue all its other bookkeeping for the event. This would be appropriate, for example, if the event was never fired by the browser but invoked by `.trigger()`. To attach the jQuery event handler in the setup hook, use the `eventHandle` argument. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#setup-function-data-object-namespaces-eventhandle-function }\` + */ + setup(this: TTarget, data: TData, namespaces: string, eventHandle: EventHandler): void | false; + } | { + /** + * The teardown hook is called when the final event of a particular type is removed from an element. The `this` keyword will be a reference to the element where the event is being cleaned up. This hook should return `false` if it wants jQuery to remove the event from the browser's event system (via `removeEventListener` or `detachEvent`). In most cases, the setup and teardown hooks should return the same value. + * + * If the setup hook attached event handlers or added data to an element through a mechanism such as `jQuery.data()`, the teardown hook should reverse the process and remove them. jQuery will generally remove the data and events when an element is totally removed from the document, but failing to remove data or events on teardown will cause a memory leak if the element stays in the document. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#teardown-function }\` + */ + teardown(this: TTarget): void | false; + } | { + /** + * Each time an event handler is added to an element through an API such as `.on()`, jQuery calls this hook. The `this` keyword will be the element to which the event handler is being added, and the `handleObj` argument is as described in the section above. The return value of this hook is ignored. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#add-function-handleobj }\` + */ + add(this: TTarget, handleObj: HandleObject): void; + } | { + /** + * When an event handler is removed from an element using an API such as `.off()`, this hook is called. The `this` keyword will be the element where the handler is being removed, and the `handleObj` argument is as described in the section above. The return value of this hook is ignored. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#remove-function-handleobj }\` + */ + remove(this: TTarget, handleObj: HandleObject): void; + } | { + /** + * Called when the `.trigger()` or `.triggerHandler()` methods are used to trigger an event for the special type from code, as opposed to events that originate from within the browser. The `this` keyword will be the element being triggered, and the event argument will be a `jQuery.Event` object constructed from the caller's input. At minimum, the event type, data, namespace, and target properties are set on the event. The data argument represents additional data passed by `.trigger()` if present. + * + * The trigger hook is called early in the process of triggering an event, just after the `jQuery.Event` object is constructed and before any handlers have been called. It can process the triggered event in any way, for example by calling `event.stopPropagation()` or `event.preventDefault()` before returning. If the hook returns `false`, jQuery does not perform any further event triggering actions and returns immediately. Otherwise, it performs the normal trigger processing, calling any event handlers for the element and bubbling the event (unless propagation is stopped in advance or `noBubble` was specified for the special event) to call event handlers attached to parent elements. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#trigger-function-event-jquery-event-data-object }\` + */ + trigger(this: TTarget, event: Event, data: TData): void | false; + } | { + /** + * When the `.trigger()` method finishes running all the event handlers for an event, it also looks for and runs any method on the target object by the same name unless of the handlers called `event.preventDefault()`. So, `.trigger( "submit" )` will execute the `submit()` method on the element if one exists. When a `_default` hook is specified, the hook is called just prior to checking for and executing the element's default method. If this hook returns the value `false` the element's default method will be called; otherwise it is not. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#_default-function-event-jquery-event-data-object }\` + */ + _default(event: TriggeredEvent, data: TData): void | false; + } | { + /** + * jQuery calls a handle hook when the event has occurred and jQuery would normally call the user's event handler specified by `.on()` or another event binding method. If the hook exists, jQuery calls it _instead_ of that event handler, passing it the event and any data passed from `.trigger()` if it was not a native event. The `this` keyword is the DOM element being handled, and `event.handleObj` property has the detailed event information. + * + * Based in the information it has, the handle hook should decide whether to call the original handler function which is in `event.handleObj.handler`. It can modify information in the event object before calling the original handler, but _must restore_ that data before returning or subsequent unrelated event handlers may act unpredictably. In most cases, the handle hook should return the result of the original handler, but that is at the discretion of the hook. The handle hook is unique in that it is the only special event function hook that is called under its original special event name when the type is mapped using `bindType` and `delegateType`. For that reason, it is almost always an error to have anything other than a handle hook present if the special event defines a `bindType` and `delegateType`, since those other hooks will never be called. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#handle-function-event-jquery-event-data-object }\` + */ + handle(this: TTarget, event: TriggeredEvent & { handleObj: HandleObject; }, ...data: TData[]): void; + } | { + preDispatch(this: TTarget, event: Event): false | void; + } | { + postDispatch(this: TTarget, event: Event): void; + } | { + [key: string]: never; + }; + + interface SpecialEventHooks { + [event: string]: SpecialEventHook; + } + + /** + * Many of the special event hook functions below are passed a `handleObj` object that provides more information about the event, how it was attached, and its current state. This object and its contents should be treated as read-only data, and only the properties below are documented for use by special event handlers. + * @see \`{@link https://learn.jquery.com/events/event-extensions/#the-handleobj-object }\` + */ + interface HandleObject { + /** + * The type of event, such as `"click"`. When special event mapping is used via `bindType` or `delegateType`, this will be the mapped type. + */ + readonly type: string; + /** + * The original type name regardless of whether it was mapped via `bindType` or `delegateType`. So when a "pushy" event is mapped to "click" its `origType` would be "pushy". + */ + readonly origType: string; + /** + * Namespace(s), if any, provided when the event was attached, such as `"myPlugin"`. When multiple namespaces are given, they are separated by periods and sorted in ascending alphabetical order. If no namespaces are provided, this property is an empty string. + */ + readonly namespace: string; + /** + * For delegated events, this is the selector used to filter descendant elements and determine if the handler should be called. For directly bound events, this property is `null`. + */ + readonly selector: string | undefined | null; + /** + * The data, if any, passed to jQuery during event binding, e.g. `{ myData: 42 }`. If the data argument was omitted or `undefined`, this property is `undefined` as well. + */ + readonly data: TData; + /** + * Event handler function passed to jQuery during event binding. If `false` was passed during event binding, the handler refers to a single shared function that simply returns `false`. + */ + readonly handler: EventHandler; + } + + // #endregion + + // #endregion + + // #endregion + + interface NameValuePair { + name: string; + value: string; + } + + // region Coordinates + // #region Coordinates + + interface Coordinates { + left: number; + top: number; + } + + // Workaround for TypeScript 2.3 which does not have support for weak types handling. + type CoordinatesPartial = + Pick | + Pick | + { [key: string]: never; }; + + // #endregion + + // region Val hooks + // #region Val hooks + + // Workaround for TypeScript 2.3 which does not have support for weak types handling. + type ValHook = { + get(elem: TElement): any; + } | { + set(elem: TElement, value: any): any; + } | { + [key: string]: never; + }; + + interface ValHooks { + // Set to HTMLElement to minimize breaks but should probably be Element. + [nodeName: string]: ValHook; + } + + // #endregion + + type _Falsy = false | null | undefined | 0 | '' | typeof document.all; +} + +declare const jQuery: JQueryStatic; +declare const $: JQueryStatic; + +type _Event = Event; +type _UIEvent = UIEvent; +type _MouseEvent = MouseEvent; +type _DragEvent = DragEvent; +type _KeyboardEvent = KeyboardEvent; +type _TouchEvent = TouchEvent; +type _FocusEvent = FocusEvent; + +// region ES5 compatibility +// #region ES5 compatibility + +// Forward declaration of `Iterable`. +// tslint:disable-next-line:no-empty-interface +interface Iterable { } + +interface SymbolConstructor { + /** + * A String value that is used in the creation of the default string description of an object. + * Called by the built-in method Object.prototype.toString. + */ + readonly toStringTag: symbol; +} + +declare var Symbol: SymbolConstructor; + +// #endregion diff --git a/node_modules/@types/jquery/package.json b/node_modules/@types/jquery/package.json new file mode 100644 index 00000000..ba0d9c63 --- /dev/null +++ b/node_modules/@types/jquery/package.json @@ -0,0 +1,136 @@ +{ + "name": "@types/jquery", + "version": "3.5.5", + "description": "TypeScript definitions for jquery", + "license": "MIT", + "contributors": [ + { + "name": "Leonard Thieu", + "url": "https://github.com/leonard-thieu", + "githubUsername": "leonard-thieu" + }, + { + "name": "Boris Yankov", + "url": "https://github.com/borisyankov", + "githubUsername": "borisyankov" + }, + { + "name": "Christian Hoffmeister", + "url": "https://github.com/choffmeister", + "githubUsername": "choffmeister" + }, + { + "name": "Steve Fenton", + "url": "https://github.com/Steve-Fenton", + "githubUsername": "Steve-Fenton" + }, + { + "name": "Diullei Gomes", + "url": "https://github.com/Diullei", + "githubUsername": "Diullei" + }, + { + "name": "Tass Iliopoulos", + "url": "https://github.com/tasoili", + "githubUsername": "tasoili" + }, + { + "name": "Jason Swearingen", + "url": "https://github.com/jasons-novaleaf", + "githubUsername": "jasons-novaleaf" + }, + { + "name": "Sean Hill", + "url": "https://github.com/seanski", + "githubUsername": "seanski" + }, + { + "name": "Guus Goossens", + "url": "https://github.com/Guuz", + "githubUsername": "Guuz" + }, + { + "name": "Kelly Summerlin", + "url": "https://github.com/ksummerlin", + "githubUsername": "ksummerlin" + }, + { + "name": "Basarat Ali Syed", + "url": "https://github.com/basarat", + "githubUsername": "basarat" + }, + { + "name": "Nicholas Wolverson", + "url": "https://github.com/nwolverson", + "githubUsername": "nwolverson" + }, + { + "name": "Derek Cicerone", + "url": "https://github.com/derekcicerone", + "githubUsername": "derekcicerone" + }, + { + "name": "Andrew Gaspar", + "url": "https://github.com/AndrewGaspar", + "githubUsername": "AndrewGaspar" + }, + { + "name": "Seikichi Kondo", + "url": "https://github.com/seikichi", + "githubUsername": "seikichi" + }, + { + "name": "Benjamin Jackman", + "url": "https://github.com/benjaminjackman", + "githubUsername": "benjaminjackman" + }, + { + "name": "Poul Sorensen", + "url": "https://github.com/s093294", + "githubUsername": "s093294" + }, + { + "name": "Josh Strobl", + "url": "https://github.com/JoshStrobl", + "githubUsername": "JoshStrobl" + }, + { + "name": "John Reilly", + "url": "https://github.com/johnnyreilly", + "githubUsername": "johnnyreilly" + }, + { + "name": "Dick van den Brink", + "url": "https://github.com/DickvdBrink", + "githubUsername": "DickvdBrink" + }, + { + "name": "Thomas Schulz", + "url": "https://github.com/King2500", + "githubUsername": "King2500" + }, + { + "name": "Terry Mun", + "url": "https://github.com/terrymun", + "githubUsername": "terrymun" + }, + { + "name": "Martin Badin", + "url": "https://github.com/martin-badin", + "githubUsername": "martin-badin" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/jquery" + }, + "scripts": {}, + "dependencies": { + "@types/sizzle": "*" + }, + "typesPublisherContentHash": "a02c9cdea2ee3a153561f214a6ee588b209cc5b3e960a1c4e14467ee5e3962d2", + "typeScriptVersion": "3.3" +} \ No newline at end of file diff --git a/node_modules/@types/sizzle/LICENSE b/node_modules/@types/sizzle/LICENSE new file mode 100644 index 00000000..21071075 --- /dev/null +++ b/node_modules/@types/sizzle/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/node_modules/@types/sizzle/README.md b/node_modules/@types/sizzle/README.md new file mode 100644 index 00000000..0507f3e4 --- /dev/null +++ b/node_modules/@types/sizzle/README.md @@ -0,0 +1,16 @@ +# Installation +> `npm install --save @types/sizzle` + +# Summary +This package contains type definitions for sizzle (https://sizzlejs.com). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/sizzle + +Additional Details + * Last updated: Sat, 06 Oct 2018 20:51:02 GMT + * Dependencies: none + * Global values: Sizzle + +# Credits +These definitions were written by Leonard Thieu . diff --git a/node_modules/@types/sizzle/index.d.ts b/node_modules/@types/sizzle/index.d.ts new file mode 100644 index 00000000..37cbeb2a --- /dev/null +++ b/node_modules/@types/sizzle/index.d.ts @@ -0,0 +1,92 @@ +// Type definitions for sizzle 2.3 +// Project: https://sizzlejs.com +// Definitions by: Leonard Thieu +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 + +export as namespace Sizzle; + +declare const Sizzle: SizzleStatic; +export = Sizzle; + +interface SizzleStatic { + selectors: Sizzle.Selectors; + >(selector: string, context: Element | Document | DocumentFragment, results: TArrayLike): TArrayLike; + (selector: string, context?: Element | Document | DocumentFragment): Element[]; + // tslint:disable-next-line:ban-types + compile(selector: string): Function; + matchSelector(element: Element, selector: string): boolean; + matches(selector: string, elements: Element[]): Element[]; +} + +declare namespace Sizzle { + interface Selectors { + cacheLength: number; + match: Selectors.Matches; + find: Selectors.FindFunctions; + preFilter: Selectors.PreFilterFunctions; + filter: Selectors.FilterFunctions; + attrHandle: Selectors.AttrHandleFunctions; + pseudos: Selectors.PseudoFunctions; + setFilters: Selectors.SetFilterFunctions; + createPseudo(fn: Selectors.CreatePseudoFunction): Selectors.PseudoFunction; + } + + namespace Selectors { + interface Matches { + [name: string]: RegExp; + } + + interface FindFunction { + (match: RegExpMatchArray, context: Element | Document, isXML: boolean): Element[] | void; + } + + interface FindFunctions { + [name: string]: FindFunction; + } + + interface PreFilterFunction { + (match: RegExpMatchArray): string[]; + } + + interface PreFilterFunctions { + [name: string]: PreFilterFunction; + } + + interface FilterFunction { + (element: string, ...matches: string[]): boolean; + } + + interface FilterFunctions { + [name: string]: FilterFunction; + } + + interface AttrHandleFunction { + (elem: any, casePreservedName: string, isXML: boolean): string; + } + + interface AttrHandleFunctions { + [name: string]: AttrHandleFunction; + } + + interface PseudoFunction { + (elem: Element): boolean; + } + + interface PseudoFunctions { + [name: string]: PseudoFunction; + } + + interface SetFilterFunction { + (elements: Element[], argument: number, not: boolean): Element[]; + } + + interface SetFilterFunctions { + [name: string]: SetFilterFunction; + } + + interface CreatePseudoFunction { + (...args: any[]): PseudoFunction; + } + } +} diff --git a/node_modules/@types/sizzle/package.json b/node_modules/@types/sizzle/package.json new file mode 100644 index 00000000..93b988b5 --- /dev/null +++ b/node_modules/@types/sizzle/package.json @@ -0,0 +1,22 @@ +{ + "name": "@types/sizzle", + "version": "2.3.2", + "description": "TypeScript definitions for sizzle", + "license": "MIT", + "contributors": [ + { + "name": "Leonard Thieu", + "url": "https://github.com/leonard-thieu", + "githubUsername": "leonard-thieu" + } + ], + "main": "", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git" + }, + "scripts": {}, + "dependencies": {}, + "typesPublisherContentHash": "8d6f2e333bcb6c7fa99469e7e62dcef4c794dc432ce09634cae186cbcc333d0e", + "typeScriptVersion": "2.3" +} \ No newline at end of file diff --git a/node_modules/abbrev/LICENSE b/node_modules/abbrev/LICENSE new file mode 100644 index 00000000..9bcfa9d7 --- /dev/null +++ b/node_modules/abbrev/LICENSE @@ -0,0 +1,46 @@ +This software is dual-licensed under the ISC and MIT licenses. +You may use this software under EITHER of the following licenses. + +---------- + +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------- + +Copyright Isaac Z. Schlueter and Contributors +All rights reserved. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/abbrev/README.md b/node_modules/abbrev/README.md new file mode 100644 index 00000000..99746fe6 --- /dev/null +++ b/node_modules/abbrev/README.md @@ -0,0 +1,23 @@ +# abbrev-js + +Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev). + +Usage: + + var abbrev = require("abbrev"); + abbrev("foo", "fool", "folding", "flop"); + + // returns: + { fl: 'flop' + , flo: 'flop' + , flop: 'flop' + , fol: 'folding' + , fold: 'folding' + , foldi: 'folding' + , foldin: 'folding' + , folding: 'folding' + , foo: 'foo' + , fool: 'fool' + } + +This is handy for command-line scripts, or other cases where you want to be able to accept shorthands. diff --git a/node_modules/abbrev/abbrev.js b/node_modules/abbrev/abbrev.js new file mode 100644 index 00000000..7b1dc5d6 --- /dev/null +++ b/node_modules/abbrev/abbrev.js @@ -0,0 +1,61 @@ +module.exports = exports = abbrev.abbrev = abbrev + +abbrev.monkeyPatch = monkeyPatch + +function monkeyPatch () { + Object.defineProperty(Array.prototype, 'abbrev', { + value: function () { return abbrev(this) }, + enumerable: false, configurable: true, writable: true + }) + + Object.defineProperty(Object.prototype, 'abbrev', { + value: function () { return abbrev(Object.keys(this)) }, + enumerable: false, configurable: true, writable: true + }) +} + +function abbrev (list) { + if (arguments.length !== 1 || !Array.isArray(list)) { + list = Array.prototype.slice.call(arguments, 0) + } + for (var i = 0, l = list.length, args = [] ; i < l ; i ++) { + args[i] = typeof list[i] === "string" ? list[i] : String(list[i]) + } + + // sort them lexicographically, so that they're next to their nearest kin + args = args.sort(lexSort) + + // walk through each, seeing how much it has in common with the next and previous + var abbrevs = {} + , prev = "" + for (var i = 0, l = args.length ; i < l ; i ++) { + var current = args[i] + , next = args[i + 1] || "" + , nextMatches = true + , prevMatches = true + if (current === next) continue + for (var j = 0, cl = current.length ; j < cl ; j ++) { + var curChar = current.charAt(j) + nextMatches = nextMatches && curChar === next.charAt(j) + prevMatches = prevMatches && curChar === prev.charAt(j) + if (!nextMatches && !prevMatches) { + j ++ + break + } + } + prev = current + if (j === cl) { + abbrevs[current] = current + continue + } + for (var a = current.substr(0, j) ; j <= cl ; j ++) { + abbrevs[a] = current + a += current.charAt(j) + } + } + return abbrevs +} + +function lexSort (a, b) { + return a === b ? 0 : a > b ? 1 : -1 +} diff --git a/node_modules/abbrev/package.json b/node_modules/abbrev/package.json new file mode 100644 index 00000000..bf4e8015 --- /dev/null +++ b/node_modules/abbrev/package.json @@ -0,0 +1,21 @@ +{ + "name": "abbrev", + "version": "1.1.1", + "description": "Like ruby's abbrev module, but in js", + "author": "Isaac Z. Schlueter ", + "main": "abbrev.js", + "scripts": { + "test": "tap test.js --100", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "repository": "http://github.com/isaacs/abbrev-js", + "license": "ISC", + "devDependencies": { + "tap": "^10.1" + }, + "files": [ + "abbrev.js" + ] +} diff --git a/node_modules/acorn/AUTHORS b/node_modules/acorn/AUTHORS new file mode 100644 index 00000000..c5ac22cb --- /dev/null +++ b/node_modules/acorn/AUTHORS @@ -0,0 +1,79 @@ +List of Acorn contributors. Updated before every release. + +Adrian Heine +Adrian Rakovsky +Alistair Braidwood +Amila Welihinda +Andres Suarez +Angelo +Aparajita Fishman +Arian Stolwijk +Artem Govorov +Boopesh Mahendran +Bradley Heinz +Brandon Mills +Charles Hughes +Charmander +Chris McKnight +Conrad Irwin +Daniel Tschinder +David Bonnet +Domenico Matteo +ehmicky +Eugene Obrezkov +Felix Maier +Forbes Lindesay +Gilad Peleg +impinball +Ingvar Stepanyan +Jackson Ray Hamilton +Jesse McCarthy +Jiaxing Wang +Joel Kemp +Johannes Herr +John-David Dalton +Jordan Klassen +Jürg Lehni +Kai Cataldo +keeyipchan +Keheliya Gallaba +Kevin Irish +Kevin Kwok +krator +laosb +luckyzeng +Marek +Marijn Haverbeke +Martin Carlberg +Mat Garcia +Mathias Bynens +Mathieu 'p01' Henri +Matthew Bastien +Max Schaefer +Max Zerzouri +Mihai Bazon +Mike Rennie +naoh +Nicholas C. Zakas +Nick Fitzgerald +Olivier Thomann +Oskar Schöldström +Paul Harper +Peter Rust +PlNG +Prayag Verma +ReadmeCritic +r-e-d +Renée Kooi +Richard Gibson +Rich Harris +Sebastian McKenzie +Shahar Soel +Sheel Bedi +Simen Bekkhus +Teddy Katz +Timothy Gu +Toru Nagashima +Victor Homyakov +Wexpo Lyu +zsjforcn diff --git a/node_modules/acorn/CHANGELOG.md b/node_modules/acorn/CHANGELOG.md new file mode 100644 index 00000000..226c154f --- /dev/null +++ b/node_modules/acorn/CHANGELOG.md @@ -0,0 +1,508 @@ +## 5.7.3 (2018-09-10) + +### Bug fixes + +Fix failure to tokenize regexps after expressions like `x.of`. + +Better error message for unterminated template literals. + +## 5.7.2 (2018-08-24) + +### Bug fixes + +Properly handle `allowAwaitOutsideFunction` in for statements. + +Treat function declarations at the top level of modules like let bindings. + +Don't allow async function declarations as the only statement under a label. + +## 5.7.1 (2018-06-15) + +### Bug fixes + +Make sure the walker and bin files are rebuilt on release (the previous release didn't get the up-to-date versions). + +## 5.7.0 (2018-06-15) + +### Bug fixes + +Fix crash in walker when walking a binding-less catch node. + +### New features + +Upgraded to Unicode 11. + +## 5.6.2 (2018-06-05) + +### Bug fixes + +In the walker, go back to allowing the `baseVisitor` argument to be null to default to the default base everywhere. + +## 5.6.1 (2018-06-01) + +### Bug fixes + +Fix regression when passing `null` as fourth argument to `walk.recursive`. + +## 5.6.0 (2018-05-31) + +### Bug fixes + +Fix a bug in the walker that caused a crash when walking an object pattern spread. + +### New features + +Allow U+2028 and U+2029 in string when ECMAVersion >= 10. + +Allow binding-less catch statements when ECMAVersion >= 10. + +Add `allowAwaitOutsideFunction` option for parsing top-level `await`. + +## 5.5.3 (2018-03-08) + +### Bug fixes + +A _second_ republish of the code in 5.5.1, this time with yarn, to hopefully get valid timestamps. + +## 5.5.2 (2018-03-08) + +### Bug fixes + +A republish of the code in 5.5.1 in an attempt to solve an issue with the file timestamps in the npm package being 0. + +## 5.5.1 (2018-03-06) + +### Bug fixes + +Fix regression in walker causing property values in object patterns to be walked as expressions. + +Fix misleading error message for octal escapes in template strings. + +## 5.5.0 (2018-02-27) + +### Bug fixes + +Support object spread in the AST walker. + +### New features + +The identifier character categorization is now based on Unicode version 10. + +Acorn will now validate the content of regular expressions, including new ES9 features. + +## 5.4.1 (2018-02-02) + +### Bug fixes + +5.4.0 somehow accidentally included an old version of walk.js. + +## 5.4.0 (2018-02-01) + +### Bug fixes + +Disallow duplicate or escaped flags on regular expressions. + +Disallow octal escapes in strings in strict mode. + +### New features + +Add support for async iteration. + +Add support for object spread and rest. + +## 5.3.0 (2017-12-28) + +### Bug fixes + +Fix parsing of floating point literals with leading zeroes in loose mode. + +Allow duplicate property names in object patterns. + +Don't allow static class methods named `prototype`. + +Disallow async functions directly under `if` or `else`. + +Parse right-hand-side of `for`/`of` as an assignment expression. + +Stricter parsing of `for`/`in`. + +Don't allow unicode escapes in contextual keywords. + +### New features + +Parsing class members was factored into smaller methods to allow plugins to hook into it. + +## 5.2.1 (2017-10-30) + +### Bug fixes + +Fix a token context corruption bug. + +## 5.2.0 (2017-10-30) + +### Bug fixes + +Fix token context tracking for `class` and `function` in property-name position. + +Make sure `%*` isn't parsed as a valid operator. + +The `full` and `fullAncestor` walkers no longer visit nodes multiple times. + +Allow shorthand properties `get` and `set` to be followed by default values. + +Disallow `super` when not in callee or object position. + +### New features + +Support [`directive` property](https://github.com/estree/estree/compare/b3de58c9997504d6fba04b72f76e6dd1619ee4eb...1da8e603237144f44710360f8feb7a9977e905e0) on directive expression statements. + +## 5.1.2 (2017-09-04) + +### Bug fixes + +Disable parsing of legacy HTML-style comments in modules. + +Fix parsing of async methods whose names are keywords. + +## 5.1.1 (2017-07-06) + +### Bug fixes + +Fix problem with disambiguating regexp and division after a class. + +## 5.1.0 (2017-07-05) + +### Bug fixes + +Fix tokenizing of regexps in an object-desctructuring `for`/`of` loop and after `yield`. + +Parse zero-prefixed numbers with non-octal digits as decimal. + +Allow object/array patterns in rest parameters. + +Don't error when `yield` is used as a property name. + +Allow `async` as a shorthand object property. + +Make the ES module version of the loose parser actually work. + +### New features + +Implement the [template literal revision proposal](https://github.com/tc39/proposal-template-literal-revision) for ES9. + +New walker functions `full` and `fullAncestor`. + +## 5.0.3 (2017-04-01) + +### Bug fixes + +Fix spurious duplicate variable definition errors for named functions. + +## 5.0.2 (2017-03-30) + +### Bug fixes + +A binary operator after a parenthesized arrow expression is no longer incorrectly treated as an error. + +## 5.0.0 (2017-03-28) + +### Bug fixes + +Raise an error for duplicated lexical bindings. + +Fix spurious error when an assignement expression occurred after a spread expression. + +Accept regular expressions after `of` (in `for`/`of`), `yield` (in a generator), and braced arrow functions. + +Allow labels in front or `var` declarations, even in strict mode. + +### Breaking changes + +Parse declarations following `export default` as declaration nodes, not expressions. This means that class and function declarations nodes can now have `null` as their `id`. + +## 4.0.11 (2017-02-07) + +### Bug fixes + +Allow all forms of member expressions to be parenthesized as lvalue. + +## 4.0.10 (2017-02-07) + +### Bug fixes + +Don't expect semicolons after default-exported functions or classes, +even when they are expressions. + +Check for use of `'use strict'` directives in non-simple parameter +functions, even when already in strict mode. + +## 4.0.9 (2017-02-06) + +### Bug fixes + +Fix incorrect error raised for parenthesized simple assignment +targets, so that `(x) = 1` parses again. + +## 4.0.8 (2017-02-03) + +### Bug fixes + +Solve spurious parenthesized pattern errors by temporarily erring on +the side of accepting programs that our delayed errors don't handle +correctly yet. + +## 4.0.7 (2017-02-02) + +### Bug fixes + +Accept invalidly rejected code like `(x).y = 2` again. + +Don't raise an error when a function _inside_ strict code has a +non-simple parameter list. + +## 4.0.6 (2017-02-02) + +### Bug fixes + +Fix exponential behavior (manifesting itself as a complete hang for +even relatively small source files) introduced by the new 'use strict' +check. + +## 4.0.5 (2017-02-02) + +### Bug fixes + +Disallow parenthesized pattern expressions. + +Allow keywords as export names. + +Don't allow the `async` keyword to be parenthesized. + +Properly raise an error when a keyword contains a character escape. + +Allow `"use strict"` to appear after other string literal expressions. + +Disallow labeled declarations. + +## 4.0.4 (2016-12-19) + +### Bug fixes + +Fix issue with loading acorn_loose.js with an AMD loader. + +Fix crash when `export` was followed by a keyword that can't be +exported. + +## 4.0.3 (2016-08-16) + +### Bug fixes + +Allow regular function declarations inside single-statement `if` +branches in loose mode. Forbid them entirely in strict mode. + +Properly parse properties named `async` in ES2017 mode. + +Fix bug where reserved words were broken in ES2017 mode. + +## 4.0.2 (2016-08-11) + +### Bug fixes + +Don't ignore period or 'e' characters after octal numbers. + +Fix broken parsing for call expressions in default parameter values +of arrow functions. + +## 4.0.1 (2016-08-08) + +### Bug fixes + +Fix false positives in duplicated export name errors. + +## 4.0.0 (2016-08-07) + +### Breaking changes + +The default `ecmaVersion` option value is now 7. + +A number of internal method signatures changed, so plugins might need +to be updated. + +### Bug fixes + +The parser now raises errors on duplicated export names. + +`arguments` and `eval` can now be used in shorthand properties. + +Duplicate parameter names in non-simple argument lists now always +produce an error. + +### New features + +The `ecmaVersion` option now also accepts year-style version numbers +(2015, etc). + +Support for `async`/`await` syntax when `ecmaVersion` is >= 8. + +Support for trailing commas in call expressions when `ecmaVersion` +is >= 8. + +## 3.3.0 (2016-07-25) + +### Bug fixes + +Fix bug in tokenizing of regexp operator after a function declaration. + +Fix parser crash when parsing an array pattern with a hole. + +### New features + +Implement check against complex argument lists in functions that +enable strict mode in ES7. + +## 3.2.0 (2016-06-07) + +### Bug fixes + +Improve handling of lack of unicode regexp support in host +environment. + +Properly reject shorthand properties whose name is a keyword. + +Don't crash when the loose parser is called without options object. + +### New features + +Visitors created with `visit.make` now have their base as _prototype_, +rather than copying properties into a fresh object. + +Make it possible to use `visit.ancestor` with a walk state. + +## 3.1.0 (2016-04-18) + +### Bug fixes + +Fix issue where the loose parser created invalid TemplateElement nodes +for unclosed template literals. + +Properly tokenize the division operator directly after a function +expression. + +Allow trailing comma in destructuring arrays. + +### New features + +The walker now allows defining handlers for `CatchClause` nodes. + +## 3.0.4 (2016-02-25) + +### Fixes + +Allow update expressions as left-hand-side of the ES7 exponential +operator. + +## 3.0.2 (2016-02-10) + +### Fixes + +Fix bug that accidentally made `undefined` a reserved word when +parsing ES7. + +## 3.0.0 (2016-02-10) + +### Breaking changes + +The default value of the `ecmaVersion` option is now 6 (used to be 5). + +Support for comprehension syntax (which was dropped from the draft +spec) has been removed. + +### Fixes + +`let` and `yield` are now “contextual keywords”, meaning you can +mostly use them as identifiers in ES5 non-strict code. + +A parenthesized class or function expression after `export default` is +now parsed correctly. + +### New features + +When `ecmaVersion` is set to 7, Acorn will parse the exponentiation +operator (`**`). + +The identifier character ranges are now based on Unicode 8.0.0. + +Plugins can now override the `raiseRecoverable` method to override the +way non-critical errors are handled. + +## 2.7.0 (2016-01-04) + +### Fixes + +Stop allowing rest parameters in setters. + +Make sure the loose parser always attaches a `local` property to +`ImportNamespaceSpecifier` nodes. + +Disallow `y` rexexp flag in ES5. + +Disallow `\00` and `\000` escapes in strict mode. + +Raise an error when an import name is a reserved word. + +## 2.6.4 (2015-11-12) + +### Fixes + +Fix crash in loose parser when parsing invalid object pattern. + +### New features + +Support plugins in the loose parser. + +## 2.6.2 (2015-11-10) + +### Fixes + +Don't crash when no options object is passed. + +## 2.6.0 (2015-11-09) + +### Fixes + +Add `await` as a reserved word in module sources. + +Disallow `yield` in a parameter default value for a generator. + +Forbid using a comma after a rest pattern in an array destructuring. + +### New features + +Support parsing stdin in command-line tool. + +## 2.5.2 (2015-10-27) + +### Fixes + +Fix bug where the walker walked an exported `let` statement as an +expression. + +## 2.5.0 (2015-10-27) + +### Fixes + +Fix tokenizer support in the command-line tool. + +In the loose parser, don't allow non-string-literals as import +sources. + +Stop allowing `new.target` outside of functions. + +Remove legacy `guard` and `guardedHandler` properties from try nodes. + +Stop allowing multiple `__proto__` properties on an object literal in +strict mode. + +Don't allow rest parameters to be non-identifier patterns. + +Check for duplicate paramter names in arrow functions. diff --git a/node_modules/acorn/LICENSE b/node_modules/acorn/LICENSE new file mode 100644 index 00000000..2c0632b6 --- /dev/null +++ b/node_modules/acorn/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2012-2018 by various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/acorn/README.md b/node_modules/acorn/README.md new file mode 100644 index 00000000..de53f513 --- /dev/null +++ b/node_modules/acorn/README.md @@ -0,0 +1,467 @@ +# Acorn + +[![Build Status](https://travis-ci.org/acornjs/acorn.svg?branch=master)](https://travis-ci.org/acornjs/acorn) +[![NPM version](https://img.shields.io/npm/v/acorn.svg)](https://www.npmjs.com/package/acorn) +[![CDNJS](https://img.shields.io/cdnjs/v/acorn.svg)](https://cdnjs.com/libraries/acorn) +[Author funding status: ![maintainer happiness](https://marijnhaverbeke.nl/fund/status_s.png?force)](https://marijnhaverbeke.nl/fund/) + +A tiny, fast JavaScript parser, written completely in JavaScript. + +## Community + +Acorn is open source software released under an +[MIT license](https://github.com/acornjs/acorn/blob/master/LICENSE). + +You are welcome to +[report bugs](https://github.com/acornjs/acorn/issues) or create pull +requests on [github](https://github.com/acornjs/acorn). For questions +and discussion, please use the +[Tern discussion forum](https://discuss.ternjs.net). + +## Installation + +The easiest way to install acorn is with [`npm`][npm]. + +[npm]: https://www.npmjs.com/ + +```sh +npm install acorn +``` + +Alternately, you can download the source and build acorn yourself: + +```sh +git clone https://github.com/acornjs/acorn.git +cd acorn +npm install +npm run build +``` + +## Components + +When run in a CommonJS (node.js) or AMD environment, exported values +appear in the interfaces exposed by the individual files, as usual. +When loaded in the browser (Acorn works in any JS-enabled browser more +recent than IE5) without any kind of module management, a single +global object `acorn` will be defined, and all the exported properties +will be added to that. + +### Main parser + +This is implemented in `dist/acorn.js`, and is what you get when you +`require("acorn")` in node.js. + +**parse**`(input, options)` is used to parse a JavaScript program. +The `input` parameter is a string, `options` can be undefined or an +object setting some of the options listed below. The return value will +be an abstract syntax tree object as specified by the +[ESTree spec][estree]. + +When encountering a syntax error, the parser will raise a +`SyntaxError` object with a meaningful message. The error object will +have a `pos` property that indicates the character offset at which the +error occurred, and a `loc` object that contains a `{line, column}` +object referring to that same position. + +[estree]: https://github.com/estree/estree + +- **ecmaVersion**: Indicates the ECMAScript version to parse. Must be + either 3, 5, 6 (2015), 7 (2016), 8 (2017), 9 (2018) or 10 (2019, partial + support). This influences support for strict mode, the set of + reserved words, and support for new syntax features. Default is 7. + + **NOTE**: Only 'stage 4' (finalized) ECMAScript features are being + implemented by Acorn. + +- **sourceType**: Indicate the mode the code should be parsed in. Can be + either `"script"` or `"module"`. This influences global strict mode + and parsing of `import` and `export` declarations. + +- **onInsertedSemicolon**: If given a callback, that callback will be + called whenever a missing semicolon is inserted by the parser. The + callback will be given the character offset of the point where the + semicolon is inserted as argument, and if `locations` is on, also a + `{line, column}` object representing this position. + +- **onTrailingComma**: Like `onInsertedSemicolon`, but for trailing + commas. + +- **allowReserved**: If `false`, using a reserved word will generate + an error. Defaults to `true` for `ecmaVersion` 3, `false` for higher + versions. When given the value `"never"`, reserved words and + keywords can also not be used as property names (as in Internet + Explorer's old parser). + +- **allowReturnOutsideFunction**: By default, a return statement at + the top level raises an error. Set this to `true` to accept such + code. + +- **allowImportExportEverywhere**: By default, `import` and `export` + declarations can only appear at a program's top level. Setting this + option to `true` allows them anywhere where a statement is allowed. + +- **allowAwaitOutsideFunction**: By default, `await` expressions can only appear inside `async` functions. Setting this option to `true` allows to have top-level `await` expressions. They are still not allowed in non-`async` functions, though. + +- **allowHashBang**: When this is enabled (off by default), if the + code starts with the characters `#!` (as in a shellscript), the + first line will be treated as a comment. + +- **locations**: When `true`, each node has a `loc` object attached + with `start` and `end` subobjects, each of which contains the + one-based line and zero-based column numbers in `{line, column}` + form. Default is `false`. + +- **onToken**: If a function is passed for this option, each found + token will be passed in same format as tokens returned from + `tokenizer().getToken()`. + + If array is passed, each found token is pushed to it. + + Note that you are not allowed to call the parser from the + callback—that will corrupt its internal state. + +- **onComment**: If a function is passed for this option, whenever a + comment is encountered the function will be called with the + following parameters: + + - `block`: `true` if the comment is a block comment, false if it + is a line comment. + - `text`: The content of the comment. + - `start`: Character offset of the start of the comment. + - `end`: Character offset of the end of the comment. + + When the `locations` options is on, the `{line, column}` locations + of the comment’s start and end are passed as two additional + parameters. + + If array is passed for this option, each found comment is pushed + to it as object in Esprima format: + + ```javascript + { + "type": "Line" | "Block", + "value": "comment text", + "start": Number, + "end": Number, + // If `locations` option is on: + "loc": { + "start": {line: Number, column: Number} + "end": {line: Number, column: Number} + }, + // If `ranges` option is on: + "range": [Number, Number] + } + ``` + + Note that you are not allowed to call the parser from the + callback—that will corrupt its internal state. + +- **ranges**: Nodes have their start and end characters offsets + recorded in `start` and `end` properties (directly on the node, + rather than the `loc` object, which holds line/column data. To also + add a [semi-standardized][range] `range` property holding a + `[start, end]` array with the same numbers, set the `ranges` option + to `true`. + +- **program**: It is possible to parse multiple files into a single + AST by passing the tree produced by parsing the first file as the + `program` option in subsequent parses. This will add the toplevel + forms of the parsed file to the "Program" (top) node of an existing + parse tree. + +- **sourceFile**: When the `locations` option is `true`, you can pass + this option to add a `source` attribute in every node’s `loc` + object. Note that the contents of this option are not examined or + processed in any way; you are free to use whatever format you + choose. + +- **directSourceFile**: Like `sourceFile`, but a `sourceFile` property + will be added (regardless of the `location` option) directly to the + nodes, rather than the `loc` object. + +- **preserveParens**: If this option is `true`, parenthesized expressions + are represented by (non-standard) `ParenthesizedExpression` nodes + that have a single `expression` property containing the expression + inside parentheses. + +[range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678 + +**parseExpressionAt**`(input, offset, options)` will parse a single +expression in a string, and return its AST. It will not complain if +there is more of the string left after the expression. + +**getLineInfo**`(input, offset)` can be used to get a `{line, +column}` object for a given program string and character offset. + +**tokenizer**`(input, options)` returns an object with a `getToken` +method that can be called repeatedly to get the next token, a `{start, +end, type, value}` object (with added `loc` property when the +`locations` option is enabled and `range` property when the `ranges` +option is enabled). When the token's type is `tokTypes.eof`, you +should stop calling the method, since it will keep returning that same +token forever. + +In ES6 environment, returned result can be used as any other +protocol-compliant iterable: + +```javascript +for (let token of acorn.tokenizer(str)) { + // iterate over the tokens +} + +// transform code to array of tokens: +var tokens = [...acorn.tokenizer(str)]; +``` + +**tokTypes** holds an object mapping names to the token type objects +that end up in the `type` properties of tokens. + +#### Note on using with [Escodegen][escodegen] + +Escodegen supports generating comments from AST, attached in +Esprima-specific format. In order to simulate same format in +Acorn, consider following example: + +```javascript +var comments = [], tokens = []; + +var ast = acorn.parse('var x = 42; // answer', { + // collect ranges for each node + ranges: true, + // collect comments in Esprima's format + onComment: comments, + // collect token ranges + onToken: tokens +}); + +// attach comments using collected information +escodegen.attachComments(ast, comments, tokens); + +// generate code +console.log(escodegen.generate(ast, {comment: true})); +// > 'var x = 42; // answer' +``` + +[escodegen]: https://github.com/estools/escodegen + +### dist/acorn_loose.js ### + +This file implements an error-tolerant parser. It exposes a single +function. The loose parser is accessible in node.js via `require("acorn/dist/acorn_loose")`. + +**parse_dammit**`(input, options)` takes the same arguments and +returns the same syntax tree as the `parse` function in `acorn.js`, +but never raises an error, and will do its best to parse syntactically +invalid code in as meaningful a way as it can. It'll insert identifier +nodes with name `"✖"` as placeholders in places where it can't make +sense of the input. Depends on `acorn.js`, because it uses the same +tokenizer. + +### dist/walk.js ### + +Implements an abstract syntax tree walker. Will store its interface in +`acorn.walk` when loaded without a module system. + +**simple**`(node, visitors, base, state)` does a 'simple' walk over +a tree. `node` should be the AST node to walk, and `visitors` an +object with properties whose names correspond to node types in the +[ESTree spec][estree]. The properties should contain functions +that will be called with the node object and, if applicable the state +at that point. The last two arguments are optional. `base` is a walker +algorithm, and `state` is a start state. The default walker will +simply visit all statements and expressions and not produce a +meaningful state. (An example of a use of state is to track scope at +each point in the tree.) + +```js +const acorn = require("acorn") +const walk = require("acorn/dist/walk") + +walk.simple(acorn.parse("let x = 10"), { + Literal(node) { + console.log(`Found a literal: ${node.value}`) + } +}) +``` + +**ancestor**`(node, visitors, base, state)` does a 'simple' walk over +a tree, building up an array of ancestor nodes (including the current node) +and passing the array to the callbacks as a third parameter. + +```js +const acorn = require("acorn") +const walk = require("acorn/dist/walk") + +walk.ancestor(acorn.parse("foo('hi')"), { + Literal(_, ancestors) { + console.log("This literal's ancestors are:", + ancestors.map(n => n.type)) + } +}) +``` + +**recursive**`(node, state, functions, base)` does a 'recursive' +walk, where the walker functions are responsible for continuing the +walk on the child nodes of their target node. `state` is the start +state, and `functions` should contain an object that maps node types +to walker functions. Such functions are called with `(node, state, c)` +arguments, and can cause the walk to continue on a sub-node by calling +the `c` argument on it with `(node, state)` arguments. The optional +`base` argument provides the fallback walker functions for node types +that aren't handled in the `functions` object. If not given, the +default walkers will be used. + +**make**`(functions, base)` builds a new walker object by using the +walker functions in `functions` and filling in the missing ones by +taking defaults from `base`. + +**full**`(node, callback, base, state)` does a 'full' +walk over a tree, calling the callback with the arguments (node, state, type) +for each node + +**fullAncestor**`(node, callback, base, state)` does a 'full' walk over +a tree, building up an array of ancestor nodes (including the current node) +and passing the array to the callbacks as a third parameter. + +```js +const acorn = require("acorn") +const walk = require("acorn/dist/walk") + +walk.full(acorn.parse("1 + 1"), node => { + console.log(`There's a ${node.type} node at ${node.ch}`) +}) +``` + +**findNodeAt**`(node, start, end, test, base, state)` tries to +locate a node in a tree at the given start and/or end offsets, which +satisfies the predicate `test`. `start` and `end` can be either `null` +(as wildcard) or a number. `test` may be a string (indicating a node +type) or a function that takes `(nodeType, node)` arguments and +returns a boolean indicating whether this node is interesting. `base` +and `state` are optional, and can be used to specify a custom walker. +Nodes are tested from inner to outer, so if two nodes match the +boundaries, the inner one will be preferred. + +**findNodeAround**`(node, pos, test, base, state)` is a lot like +`findNodeAt`, but will match any node that exists 'around' (spanning) +the given position. + +**findNodeAfter**`(node, pos, test, base, state)` is similar to +`findNodeAround`, but will match all nodes *after* the given position +(testing outer nodes before inner nodes). + +## Command line interface + +The `bin/acorn` utility can be used to parse a file from the command +line. It accepts as arguments its input file and the following +options: + +- `--ecma3|--ecma5|--ecma6|--ecma7|--ecma8|--ecma9|--ecma10`: Sets the ECMAScript version + to parse. Default is version 7. + +- `--module`: Sets the parsing mode to `"module"`. Is set to `"script"` otherwise. + +- `--locations`: Attaches a "loc" object to each node with "start" and + "end" subobjects, each of which contains the one-based line and + zero-based column numbers in `{line, column}` form. + +- `--allow-hash-bang`: If the code starts with the characters #! (as in a shellscript), the first line will be treated as a comment. + +- `--compact`: No whitespace is used in the AST output. + +- `--silent`: Do not output the AST, just return the exit status. + +- `--help`: Print the usage information and quit. + +The utility spits out the syntax tree as JSON data. + +## Build system + +Acorn is written in ECMAScript 6, as a set of small modules, in the +project's `src` directory, and compiled down to bigger ECMAScript 3 +files in `dist` using [Browserify](http://browserify.org) and +[Babel](http://babeljs.io/). If you are already using Babel, you can +consider including the modules directly. + +The command-line test runner (`npm test`) uses the ES6 modules. The +browser-based test page (`test/index.html`) uses the compiled modules. +The `bin/build-acorn.js` script builds the latter from the former. + +If you are working on Acorn, you'll probably want to try the code out +directly, without an intermediate build step. In your scripts, you can +register the Babel require shim like this: + + require("babel-core/register") + +That will allow you to directly `require` the ES6 modules. + +## Plugins + +Acorn is designed support allow plugins which, within reasonable +bounds, redefine the way the parser works. Plugins can add new token +types and new tokenizer contexts (if necessary), and extend methods in +the parser object. This is not a clean, elegant API—using it requires +an understanding of Acorn's internals, and plugins are likely to break +whenever those internals are significantly changed. But still, it is +_possible_, in this way, to create parsers for JavaScript dialects +without forking all of Acorn. And in principle it is even possible to +combine such plugins, so that if you have, for example, a plugin for +parsing types and a plugin for parsing JSX-style XML literals, you +could load them both and parse code with both JSX tags and types. + +A plugin should register itself by adding a property to +`acorn.plugins`, which holds a function. Calling `acorn.parse`, a +`plugins` option can be passed, holding an object mapping plugin names +to configuration values (or just `true` for plugins that don't take +options). After the parser object has been created, the initialization +functions for the chosen plugins are called with `(parser, +configValue)` arguments. They are expected to use the `parser.extend` +method to extend parser methods. For example, the `readToken` method +could be extended like this: + +```javascript +parser.extend("readToken", function(nextMethod) { + return function(code) { + console.log("Reading a token!") + return nextMethod.call(this, code) + } +}) +``` + +The `nextMethod` argument passed to `extend`'s second argument is the +previous value of this method, and should usually be called through to +whenever the extended method does not handle the call itself. + +Similarly, the loose parser allows plugins to register themselves via +`acorn.pluginsLoose`. The extension mechanism is the same as for the +normal parser: + +```javascript +looseParser.extend("readToken", function(nextMethod) { + return function() { + console.log("Reading a token in the loose parser!") + return nextMethod.call(this) + } +}) +``` + +### Existing plugins + + - [`acorn-jsx`](https://github.com/RReverser/acorn-jsx): Parse [Facebook JSX syntax extensions](https://github.com/facebook/jsx) + - [`acorn-objj`](https://github.com/cappuccino/acorn-objj): [Objective-J](http://www.cappuccino-project.org/learn/objective-j.html) language parser built as Acorn plugin + + Plugins for ECMAScript proposals: + + - [`acorn-stage3`](https://github.com/acornjs/acorn-stage3): Parse most stage 3 proposals, bundling: + - [`acorn-async-iteration`](https://github.com/acornjs/acorn-async-iteration): Parse [async iteration proposal](https://github.com/tc39/proposal-async-iteration) + - [`acorn-bigint`](https://github.com/acornjs/acorn-bigint): Parse [BigInt proposal](https://github.com/tc39/proposal-bigint) + - [`acorn-class-fields`](https://github.com/acornjs/acorn-class-fields): Parse [class fields proposal](https://github.com/tc39/proposal-class-fields) + - [`acorn-dynamic-import`](https://github.com/kesne/acorn-dynamic-import): Parse [import() proposal](https://github.com/tc39/proposal-dynamic-import) + - [`acorn-import-meta`](https://github.com/acornjs/acorn-import-meta): Parse [import.meta proposal](https://github.com/tc39/proposal-import-meta) + - [`acorn-numeric-separator`](https://github.com/acornjs/acorn-numeric-separator): Parse [numeric separator proposal](https://github.com/tc39/proposal-numeric-separator) + - [`acorn-optional-catch-binding`](https://github.com/acornjs/acorn-optional-catch-binding): Parse [optional catch binding proposal](https://github.com/tc39/proposal-optional-catch-binding) + - [`acorn-private-methods`](https://github.com/acornjs/acorn-private-methods): parse [private methods, getters and setters proposal](https://github.com/tc39/proposal-private-methods) + - [`acorn5-object-spread`](https://github.com/adrianheine/acorn5-object-spread): Parse [Object Rest/Spread Properties proposal](https://github.com/tc39/proposal-object-rest-spread) + - [`acorn-object-rest-spread`](https://github.com/victor-homyakov/acorn-object-rest-spread): Parse [Object Rest/Spread Properties proposal](https://github.com/tc39/proposal-object-rest-spread) + - [`acorn-es7`](https://github.com/angelozerr/acorn-es7): Parse [decorator syntax proposal](https://github.com/wycats/javascript-decorators) + - [`acorn-static-class-property-initializer`](https://github.com/victor-homyakov/acorn-static-class-property-initializer): Partial support for static class properties from [ES Class Fields & Static Properties Proposal](https://github.com/tc39/proposal-class-public-fields) to support static property initializers in [React components written as ES6+ classes](https://babeljs.io/blog/2015/07/07/react-on-es6-plus) diff --git a/node_modules/acorn/acorn-loose/dist/acorn-loose.js b/node_modules/acorn/acorn-loose/dist/acorn-loose.js new file mode 100644 index 00000000..6652cb67 --- /dev/null +++ b/node_modules/acorn/acorn-loose/dist/acorn-loose.js @@ -0,0 +1,1372 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('acorn')) : + typeof define === 'function' && define.amd ? define(['exports', 'acorn'], factory) : + (global = global || self, factory((global.acorn = global.acorn || {}, global.acorn.loose = {}), global.acorn)); +}(this, function (exports, acorn) { 'use strict'; + + function noop() {} + + var LooseParser = function LooseParser(input, options) { + if ( options === void 0 ) options = {}; + + this.toks = this.constructor.BaseParser.tokenizer(input, options); + this.options = this.toks.options; + this.input = this.toks.input; + this.tok = this.last = {type: acorn.tokTypes.eof, start: 0, end: 0}; + this.tok.validateRegExpFlags = noop; + this.tok.validateRegExpPattern = noop; + if (this.options.locations) { + var here = this.toks.curPosition(); + this.tok.loc = new acorn.SourceLocation(this.toks, here, here); + } + this.ahead = []; // Tokens ahead + this.context = []; // Indentation contexted + this.curIndent = 0; + this.curLineStart = 0; + this.nextLineStart = this.lineEnd(this.curLineStart) + 1; + this.inAsync = false; + this.inFunction = false; + }; + + LooseParser.prototype.startNode = function startNode () { + return new acorn.Node(this.toks, this.tok.start, this.options.locations ? this.tok.loc.start : null) + }; + + LooseParser.prototype.storeCurrentPos = function storeCurrentPos () { + return this.options.locations ? [this.tok.start, this.tok.loc.start] : this.tok.start + }; + + LooseParser.prototype.startNodeAt = function startNodeAt (pos) { + if (this.options.locations) { + return new acorn.Node(this.toks, pos[0], pos[1]) + } else { + return new acorn.Node(this.toks, pos) + } + }; + + LooseParser.prototype.finishNode = function finishNode (node, type) { + node.type = type; + node.end = this.last.end; + if (this.options.locations) + { node.loc.end = this.last.loc.end; } + if (this.options.ranges) + { node.range[1] = this.last.end; } + return node + }; + + LooseParser.prototype.dummyNode = function dummyNode (type) { + var dummy = this.startNode(); + dummy.type = type; + dummy.end = dummy.start; + if (this.options.locations) + { dummy.loc.end = dummy.loc.start; } + if (this.options.ranges) + { dummy.range[1] = dummy.start; } + this.last = {type: acorn.tokTypes.name, start: dummy.start, end: dummy.start, loc: dummy.loc}; + return dummy + }; + + LooseParser.prototype.dummyIdent = function dummyIdent () { + var dummy = this.dummyNode("Identifier"); + dummy.name = "✖"; + return dummy + }; + + LooseParser.prototype.dummyString = function dummyString () { + var dummy = this.dummyNode("Literal"); + dummy.value = dummy.raw = "✖"; + return dummy + }; + + LooseParser.prototype.eat = function eat (type) { + if (this.tok.type === type) { + this.next(); + return true + } else { + return false + } + }; + + LooseParser.prototype.isContextual = function isContextual (name) { + return this.tok.type === acorn.tokTypes.name && this.tok.value === name + }; + + LooseParser.prototype.eatContextual = function eatContextual (name) { + return this.tok.value === name && this.eat(acorn.tokTypes.name) + }; + + LooseParser.prototype.canInsertSemicolon = function canInsertSemicolon () { + return this.tok.type === acorn.tokTypes.eof || this.tok.type === acorn.tokTypes.braceR || + acorn.lineBreak.test(this.input.slice(this.last.end, this.tok.start)) + }; + + LooseParser.prototype.semicolon = function semicolon () { + return this.eat(acorn.tokTypes.semi) + }; + + LooseParser.prototype.expect = function expect (type) { + if (this.eat(type)) { return true } + for (var i = 1; i <= 2; i++) { + if (this.lookAhead(i).type === type) { + for (var j = 0; j < i; j++) { this.next(); } + return true + } + } + }; + + LooseParser.prototype.pushCx = function pushCx () { + this.context.push(this.curIndent); + }; + + LooseParser.prototype.popCx = function popCx () { + this.curIndent = this.context.pop(); + }; + + LooseParser.prototype.lineEnd = function lineEnd (pos) { + while (pos < this.input.length && !acorn.isNewLine(this.input.charCodeAt(pos))) { ++pos; } + return pos + }; + + LooseParser.prototype.indentationAfter = function indentationAfter (pos) { + for (var count = 0;; ++pos) { + var ch = this.input.charCodeAt(pos); + if (ch === 32) { ++count; } + else if (ch === 9) { count += this.options.tabSize; } + else { return count } + } + }; + + LooseParser.prototype.closes = function closes (closeTok, indent, line, blockHeuristic) { + if (this.tok.type === closeTok || this.tok.type === acorn.tokTypes.eof) { return true } + return line !== this.curLineStart && this.curIndent < indent && this.tokenStartsLine() && + (!blockHeuristic || this.nextLineStart >= this.input.length || + this.indentationAfter(this.nextLineStart) < indent) + }; + + LooseParser.prototype.tokenStartsLine = function tokenStartsLine () { + for (var p = this.tok.start - 1; p >= this.curLineStart; --p) { + var ch = this.input.charCodeAt(p); + if (ch !== 9 && ch !== 32) { return false } + } + return true + }; + + LooseParser.prototype.extend = function extend (name, f) { + this[name] = f(this[name]); + }; + + LooseParser.prototype.parse = function parse () { + this.next(); + return this.parseTopLevel() + }; + + LooseParser.extend = function extend () { + var plugins = [], len = arguments.length; + while ( len-- ) plugins[ len ] = arguments[ len ]; + + var cls = this; + for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); } + return cls + }; + + LooseParser.parse = function parse (input, options) { + return new this(input, options).parse() + }; + + // Allows plugins to extend the base parser / tokenizer used + LooseParser.BaseParser = acorn.Parser; + + var lp = LooseParser.prototype; + + function isSpace(ch) { + return (ch < 14 && ch > 8) || ch === 32 || ch === 160 || acorn.isNewLine(ch) + } + + lp.next = function() { + this.last = this.tok; + if (this.ahead.length) + { this.tok = this.ahead.shift(); } + else + { this.tok = this.readToken(); } + + if (this.tok.start >= this.nextLineStart) { + while (this.tok.start >= this.nextLineStart) { + this.curLineStart = this.nextLineStart; + this.nextLineStart = this.lineEnd(this.curLineStart) + 1; + } + this.curIndent = this.indentationAfter(this.curLineStart); + } + }; + + lp.readToken = function() { + for (;;) { + try { + this.toks.next(); + if (this.toks.type === acorn.tokTypes.dot && + this.input.substr(this.toks.end, 1) === "." && + this.options.ecmaVersion >= 6) { + this.toks.end++; + this.toks.type = acorn.tokTypes.ellipsis; + } + return new acorn.Token(this.toks) + } catch (e) { + if (!(e instanceof SyntaxError)) { throw e } + + // Try to skip some text, based on the error message, and then continue + var msg = e.message, pos = e.raisedAt, replace = true; + if (/unterminated/i.test(msg)) { + pos = this.lineEnd(e.pos + 1); + if (/string/.test(msg)) { + replace = {start: e.pos, end: pos, type: acorn.tokTypes.string, value: this.input.slice(e.pos + 1, pos)}; + } else if (/regular expr/i.test(msg)) { + var re = this.input.slice(e.pos, pos); + try { re = new RegExp(re); } catch (e) { /* ignore compilation error due to new syntax */ } + replace = {start: e.pos, end: pos, type: acorn.tokTypes.regexp, value: re}; + } else if (/template/.test(msg)) { + replace = { + start: e.pos, + end: pos, + type: acorn.tokTypes.template, + value: this.input.slice(e.pos, pos) + }; + } else { + replace = false; + } + } else if (/invalid (unicode|regexp|number)|expecting unicode|octal literal|is reserved|directly after number|expected number in radix/i.test(msg)) { + while (pos < this.input.length && !isSpace(this.input.charCodeAt(pos))) { ++pos; } + } else if (/character escape|expected hexadecimal/i.test(msg)) { + while (pos < this.input.length) { + var ch = this.input.charCodeAt(pos++); + if (ch === 34 || ch === 39 || acorn.isNewLine(ch)) { break } + } + } else if (/unexpected character/i.test(msg)) { + pos++; + replace = false; + } else if (/regular expression/i.test(msg)) { + replace = true; + } else { + throw e + } + this.resetTo(pos); + if (replace === true) { replace = {start: pos, end: pos, type: acorn.tokTypes.name, value: "✖"}; } + if (replace) { + if (this.options.locations) + { replace.loc = new acorn.SourceLocation( + this.toks, + acorn.getLineInfo(this.input, replace.start), + acorn.getLineInfo(this.input, replace.end)); } + return replace + } + } + } + }; + + lp.resetTo = function(pos) { + this.toks.pos = pos; + var ch = this.input.charAt(pos - 1); + this.toks.exprAllowed = !ch || /[[{(,;:?/*=+\-~!|&%^<>]/.test(ch) || + /[enwfd]/.test(ch) && + /\b(case|else|return|throw|new|in|(instance|type)?of|delete|void)$/.test(this.input.slice(pos - 10, pos)); + + if (this.options.locations) { + this.toks.curLine = 1; + this.toks.lineStart = acorn.lineBreakG.lastIndex = 0; + var match; + while ((match = acorn.lineBreakG.exec(this.input)) && match.index < pos) { + ++this.toks.curLine; + this.toks.lineStart = match.index + match[0].length; + } + } + }; + + lp.lookAhead = function(n) { + while (n > this.ahead.length) + { this.ahead.push(this.readToken()); } + return this.ahead[n - 1] + }; + + function isDummy(node) { return node.name === "✖" } + + var lp$1 = LooseParser.prototype; + + lp$1.parseTopLevel = function() { + var node = this.startNodeAt(this.options.locations ? [0, acorn.getLineInfo(this.input, 0)] : 0); + node.body = []; + while (this.tok.type !== acorn.tokTypes.eof) { node.body.push(this.parseStatement()); } + this.toks.adaptDirectivePrologue(node.body); + this.last = this.tok; + node.sourceType = this.options.sourceType; + return this.finishNode(node, "Program") + }; + + lp$1.parseStatement = function() { + var starttype = this.tok.type, node = this.startNode(), kind; + + if (this.toks.isLet()) { + starttype = acorn.tokTypes._var; + kind = "let"; + } + + switch (starttype) { + case acorn.tokTypes._break: case acorn.tokTypes._continue: + this.next(); + var isBreak = starttype === acorn.tokTypes._break; + if (this.semicolon() || this.canInsertSemicolon()) { + node.label = null; + } else { + node.label = this.tok.type === acorn.tokTypes.name ? this.parseIdent() : null; + this.semicolon(); + } + return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement") + + case acorn.tokTypes._debugger: + this.next(); + this.semicolon(); + return this.finishNode(node, "DebuggerStatement") + + case acorn.tokTypes._do: + this.next(); + node.body = this.parseStatement(); + node.test = this.eat(acorn.tokTypes._while) ? this.parseParenExpression() : this.dummyIdent(); + this.semicolon(); + return this.finishNode(node, "DoWhileStatement") + + case acorn.tokTypes._for: + this.next(); // `for` keyword + var isAwait = this.options.ecmaVersion >= 9 && this.inAsync && this.eatContextual("await"); + + this.pushCx(); + this.expect(acorn.tokTypes.parenL); + if (this.tok.type === acorn.tokTypes.semi) { return this.parseFor(node, null) } + var isLet = this.toks.isLet(); + if (isLet || this.tok.type === acorn.tokTypes._var || this.tok.type === acorn.tokTypes._const) { + var init$1 = this.parseVar(this.startNode(), true, isLet ? "let" : this.tok.value); + if (init$1.declarations.length === 1 && (this.tok.type === acorn.tokTypes._in || this.isContextual("of"))) { + if (this.options.ecmaVersion >= 9 && this.tok.type !== acorn.tokTypes._in) { + node.await = isAwait; + } + return this.parseForIn(node, init$1) + } + return this.parseFor(node, init$1) + } + var init = this.parseExpression(true); + if (this.tok.type === acorn.tokTypes._in || this.isContextual("of")) { + if (this.options.ecmaVersion >= 9 && this.tok.type !== acorn.tokTypes._in) { + node.await = isAwait; + } + return this.parseForIn(node, this.toAssignable(init)) + } + return this.parseFor(node, init) + + case acorn.tokTypes._function: + this.next(); + return this.parseFunction(node, true) + + case acorn.tokTypes._if: + this.next(); + node.test = this.parseParenExpression(); + node.consequent = this.parseStatement(); + node.alternate = this.eat(acorn.tokTypes._else) ? this.parseStatement() : null; + return this.finishNode(node, "IfStatement") + + case acorn.tokTypes._return: + this.next(); + if (this.eat(acorn.tokTypes.semi) || this.canInsertSemicolon()) { node.argument = null; } + else { node.argument = this.parseExpression(); this.semicolon(); } + return this.finishNode(node, "ReturnStatement") + + case acorn.tokTypes._switch: + var blockIndent = this.curIndent, line = this.curLineStart; + this.next(); + node.discriminant = this.parseParenExpression(); + node.cases = []; + this.pushCx(); + this.expect(acorn.tokTypes.braceL); + + var cur; + while (!this.closes(acorn.tokTypes.braceR, blockIndent, line, true)) { + if (this.tok.type === acorn.tokTypes._case || this.tok.type === acorn.tokTypes._default) { + var isCase = this.tok.type === acorn.tokTypes._case; + if (cur) { this.finishNode(cur, "SwitchCase"); } + node.cases.push(cur = this.startNode()); + cur.consequent = []; + this.next(); + if (isCase) { cur.test = this.parseExpression(); } + else { cur.test = null; } + this.expect(acorn.tokTypes.colon); + } else { + if (!cur) { + node.cases.push(cur = this.startNode()); + cur.consequent = []; + cur.test = null; + } + cur.consequent.push(this.parseStatement()); + } + } + if (cur) { this.finishNode(cur, "SwitchCase"); } + this.popCx(); + this.eat(acorn.tokTypes.braceR); + return this.finishNode(node, "SwitchStatement") + + case acorn.tokTypes._throw: + this.next(); + node.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ThrowStatement") + + case acorn.tokTypes._try: + this.next(); + node.block = this.parseBlock(); + node.handler = null; + if (this.tok.type === acorn.tokTypes._catch) { + var clause = this.startNode(); + this.next(); + if (this.eat(acorn.tokTypes.parenL)) { + clause.param = this.toAssignable(this.parseExprAtom(), true); + this.expect(acorn.tokTypes.parenR); + } else { + clause.param = null; + } + clause.body = this.parseBlock(); + node.handler = this.finishNode(clause, "CatchClause"); + } + node.finalizer = this.eat(acorn.tokTypes._finally) ? this.parseBlock() : null; + if (!node.handler && !node.finalizer) { return node.block } + return this.finishNode(node, "TryStatement") + + case acorn.tokTypes._var: + case acorn.tokTypes._const: + return this.parseVar(node, false, kind || this.tok.value) + + case acorn.tokTypes._while: + this.next(); + node.test = this.parseParenExpression(); + node.body = this.parseStatement(); + return this.finishNode(node, "WhileStatement") + + case acorn.tokTypes._with: + this.next(); + node.object = this.parseParenExpression(); + node.body = this.parseStatement(); + return this.finishNode(node, "WithStatement") + + case acorn.tokTypes.braceL: + return this.parseBlock() + + case acorn.tokTypes.semi: + this.next(); + return this.finishNode(node, "EmptyStatement") + + case acorn.tokTypes._class: + return this.parseClass(true) + + case acorn.tokTypes._import: + if (this.options.ecmaVersion > 10 && this.lookAhead(1).type === acorn.tokTypes.parenL) { + node.expression = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ExpressionStatement") + } + + return this.parseImport() + + case acorn.tokTypes._export: + return this.parseExport() + + default: + if (this.toks.isAsyncFunction()) { + this.next(); + this.next(); + return this.parseFunction(node, true, true) + } + var expr = this.parseExpression(); + if (isDummy(expr)) { + this.next(); + if (this.tok.type === acorn.tokTypes.eof) { return this.finishNode(node, "EmptyStatement") } + return this.parseStatement() + } else if (starttype === acorn.tokTypes.name && expr.type === "Identifier" && this.eat(acorn.tokTypes.colon)) { + node.body = this.parseStatement(); + node.label = expr; + return this.finishNode(node, "LabeledStatement") + } else { + node.expression = expr; + this.semicolon(); + return this.finishNode(node, "ExpressionStatement") + } + } + }; + + lp$1.parseBlock = function() { + var node = this.startNode(); + this.pushCx(); + this.expect(acorn.tokTypes.braceL); + var blockIndent = this.curIndent, line = this.curLineStart; + node.body = []; + while (!this.closes(acorn.tokTypes.braceR, blockIndent, line, true)) + { node.body.push(this.parseStatement()); } + this.popCx(); + this.eat(acorn.tokTypes.braceR); + return this.finishNode(node, "BlockStatement") + }; + + lp$1.parseFor = function(node, init) { + node.init = init; + node.test = node.update = null; + if (this.eat(acorn.tokTypes.semi) && this.tok.type !== acorn.tokTypes.semi) { node.test = this.parseExpression(); } + if (this.eat(acorn.tokTypes.semi) && this.tok.type !== acorn.tokTypes.parenR) { node.update = this.parseExpression(); } + this.popCx(); + this.expect(acorn.tokTypes.parenR); + node.body = this.parseStatement(); + return this.finishNode(node, "ForStatement") + }; + + lp$1.parseForIn = function(node, init) { + var type = this.tok.type === acorn.tokTypes._in ? "ForInStatement" : "ForOfStatement"; + this.next(); + node.left = init; + node.right = this.parseExpression(); + this.popCx(); + this.expect(acorn.tokTypes.parenR); + node.body = this.parseStatement(); + return this.finishNode(node, type) + }; + + lp$1.parseVar = function(node, noIn, kind) { + node.kind = kind; + this.next(); + node.declarations = []; + do { + var decl = this.startNode(); + decl.id = this.options.ecmaVersion >= 6 ? this.toAssignable(this.parseExprAtom(), true) : this.parseIdent(); + decl.init = this.eat(acorn.tokTypes.eq) ? this.parseMaybeAssign(noIn) : null; + node.declarations.push(this.finishNode(decl, "VariableDeclarator")); + } while (this.eat(acorn.tokTypes.comma)) + if (!node.declarations.length) { + var decl$1 = this.startNode(); + decl$1.id = this.dummyIdent(); + node.declarations.push(this.finishNode(decl$1, "VariableDeclarator")); + } + if (!noIn) { this.semicolon(); } + return this.finishNode(node, "VariableDeclaration") + }; + + lp$1.parseClass = function(isStatement) { + var node = this.startNode(); + this.next(); + if (this.tok.type === acorn.tokTypes.name) { node.id = this.parseIdent(); } + else if (isStatement === true) { node.id = this.dummyIdent(); } + else { node.id = null; } + node.superClass = this.eat(acorn.tokTypes._extends) ? this.parseExpression() : null; + node.body = this.startNode(); + node.body.body = []; + this.pushCx(); + var indent = this.curIndent + 1, line = this.curLineStart; + this.eat(acorn.tokTypes.braceL); + if (this.curIndent + 1 < indent) { indent = this.curIndent; line = this.curLineStart; } + while (!this.closes(acorn.tokTypes.braceR, indent, line)) { + if (this.semicolon()) { continue } + var method = this.startNode(), isGenerator = (void 0), isAsync = (void 0); + if (this.options.ecmaVersion >= 6) { + method.static = false; + isGenerator = this.eat(acorn.tokTypes.star); + } + this.parsePropertyName(method); + if (isDummy(method.key)) { if (isDummy(this.parseMaybeAssign())) { this.next(); } this.eat(acorn.tokTypes.comma); continue } + if (method.key.type === "Identifier" && !method.computed && method.key.name === "static" && + (this.tok.type !== acorn.tokTypes.parenL && this.tok.type !== acorn.tokTypes.braceL)) { + method.static = true; + isGenerator = this.eat(acorn.tokTypes.star); + this.parsePropertyName(method); + } else { + method.static = false; + } + if (!method.computed && + method.key.type === "Identifier" && method.key.name === "async" && this.tok.type !== acorn.tokTypes.parenL && + !this.canInsertSemicolon()) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(acorn.tokTypes.star); + this.parsePropertyName(method); + } else { + isAsync = false; + } + if (this.options.ecmaVersion >= 5 && method.key.type === "Identifier" && + !method.computed && (method.key.name === "get" || method.key.name === "set") && + this.tok.type !== acorn.tokTypes.parenL && this.tok.type !== acorn.tokTypes.braceL) { + method.kind = method.key.name; + this.parsePropertyName(method); + method.value = this.parseMethod(false); + } else { + if (!method.computed && !method.static && !isGenerator && !isAsync && ( + method.key.type === "Identifier" && method.key.name === "constructor" || + method.key.type === "Literal" && method.key.value === "constructor")) { + method.kind = "constructor"; + } else { + method.kind = "method"; + } + method.value = this.parseMethod(isGenerator, isAsync); + } + node.body.body.push(this.finishNode(method, "MethodDefinition")); + } + this.popCx(); + if (!this.eat(acorn.tokTypes.braceR)) { + // If there is no closing brace, make the node span to the start + // of the next token (this is useful for Tern) + this.last.end = this.tok.start; + if (this.options.locations) { this.last.loc.end = this.tok.loc.start; } + } + this.semicolon(); + this.finishNode(node.body, "ClassBody"); + return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression") + }; + + lp$1.parseFunction = function(node, isStatement, isAsync) { + var oldInAsync = this.inAsync, oldInFunction = this.inFunction; + this.initFunction(node); + if (this.options.ecmaVersion >= 6) { + node.generator = this.eat(acorn.tokTypes.star); + } + if (this.options.ecmaVersion >= 8) { + node.async = !!isAsync; + } + if (this.tok.type === acorn.tokTypes.name) { node.id = this.parseIdent(); } + else if (isStatement === true) { node.id = this.dummyIdent(); } + this.inAsync = node.async; + this.inFunction = true; + node.params = this.parseFunctionParams(); + node.body = this.parseBlock(); + this.toks.adaptDirectivePrologue(node.body.body); + this.inAsync = oldInAsync; + this.inFunction = oldInFunction; + return this.finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression") + }; + + lp$1.parseExport = function() { + var node = this.startNode(); + this.next(); + if (this.eat(acorn.tokTypes.star)) { + node.source = this.eatContextual("from") ? this.parseExprAtom() : this.dummyString(); + return this.finishNode(node, "ExportAllDeclaration") + } + if (this.eat(acorn.tokTypes._default)) { + // export default (function foo() {}) // This is FunctionExpression. + var isAsync; + if (this.tok.type === acorn.tokTypes._function || (isAsync = this.toks.isAsyncFunction())) { + var fNode = this.startNode(); + this.next(); + if (isAsync) { this.next(); } + node.declaration = this.parseFunction(fNode, "nullableID", isAsync); + } else if (this.tok.type === acorn.tokTypes._class) { + node.declaration = this.parseClass("nullableID"); + } else { + node.declaration = this.parseMaybeAssign(); + this.semicolon(); + } + return this.finishNode(node, "ExportDefaultDeclaration") + } + if (this.tok.type.keyword || this.toks.isLet() || this.toks.isAsyncFunction()) { + node.declaration = this.parseStatement(); + node.specifiers = []; + node.source = null; + } else { + node.declaration = null; + node.specifiers = this.parseExportSpecifierList(); + node.source = this.eatContextual("from") ? this.parseExprAtom() : null; + this.semicolon(); + } + return this.finishNode(node, "ExportNamedDeclaration") + }; + + lp$1.parseImport = function() { + var node = this.startNode(); + this.next(); + if (this.tok.type === acorn.tokTypes.string) { + node.specifiers = []; + node.source = this.parseExprAtom(); + } else { + var elt; + if (this.tok.type === acorn.tokTypes.name && this.tok.value !== "from") { + elt = this.startNode(); + elt.local = this.parseIdent(); + this.finishNode(elt, "ImportDefaultSpecifier"); + this.eat(acorn.tokTypes.comma); + } + node.specifiers = this.parseImportSpecifiers(); + node.source = this.eatContextual("from") && this.tok.type === acorn.tokTypes.string ? this.parseExprAtom() : this.dummyString(); + if (elt) { node.specifiers.unshift(elt); } + } + this.semicolon(); + return this.finishNode(node, "ImportDeclaration") + }; + + lp$1.parseImportSpecifiers = function() { + var elts = []; + if (this.tok.type === acorn.tokTypes.star) { + var elt = this.startNode(); + this.next(); + elt.local = this.eatContextual("as") ? this.parseIdent() : this.dummyIdent(); + elts.push(this.finishNode(elt, "ImportNamespaceSpecifier")); + } else { + var indent = this.curIndent, line = this.curLineStart, continuedLine = this.nextLineStart; + this.pushCx(); + this.eat(acorn.tokTypes.braceL); + if (this.curLineStart > continuedLine) { continuedLine = this.curLineStart; } + while (!this.closes(acorn.tokTypes.braceR, indent + (this.curLineStart <= continuedLine ? 1 : 0), line)) { + var elt$1 = this.startNode(); + if (this.eat(acorn.tokTypes.star)) { + elt$1.local = this.eatContextual("as") ? this.parseIdent() : this.dummyIdent(); + this.finishNode(elt$1, "ImportNamespaceSpecifier"); + } else { + if (this.isContextual("from")) { break } + elt$1.imported = this.parseIdent(); + if (isDummy(elt$1.imported)) { break } + elt$1.local = this.eatContextual("as") ? this.parseIdent() : elt$1.imported; + this.finishNode(elt$1, "ImportSpecifier"); + } + elts.push(elt$1); + this.eat(acorn.tokTypes.comma); + } + this.eat(acorn.tokTypes.braceR); + this.popCx(); + } + return elts + }; + + lp$1.parseExportSpecifierList = function() { + var elts = []; + var indent = this.curIndent, line = this.curLineStart, continuedLine = this.nextLineStart; + this.pushCx(); + this.eat(acorn.tokTypes.braceL); + if (this.curLineStart > continuedLine) { continuedLine = this.curLineStart; } + while (!this.closes(acorn.tokTypes.braceR, indent + (this.curLineStart <= continuedLine ? 1 : 0), line)) { + if (this.isContextual("from")) { break } + var elt = this.startNode(); + elt.local = this.parseIdent(); + if (isDummy(elt.local)) { break } + elt.exported = this.eatContextual("as") ? this.parseIdent() : elt.local; + this.finishNode(elt, "ExportSpecifier"); + elts.push(elt); + this.eat(acorn.tokTypes.comma); + } + this.eat(acorn.tokTypes.braceR); + this.popCx(); + return elts + }; + + var lp$2 = LooseParser.prototype; + + lp$2.checkLVal = function(expr) { + if (!expr) { return expr } + switch (expr.type) { + case "Identifier": + case "MemberExpression": + return expr + + case "ParenthesizedExpression": + expr.expression = this.checkLVal(expr.expression); + return expr + + default: + return this.dummyIdent() + } + }; + + lp$2.parseExpression = function(noIn) { + var start = this.storeCurrentPos(); + var expr = this.parseMaybeAssign(noIn); + if (this.tok.type === acorn.tokTypes.comma) { + var node = this.startNodeAt(start); + node.expressions = [expr]; + while (this.eat(acorn.tokTypes.comma)) { node.expressions.push(this.parseMaybeAssign(noIn)); } + return this.finishNode(node, "SequenceExpression") + } + return expr + }; + + lp$2.parseParenExpression = function() { + this.pushCx(); + this.expect(acorn.tokTypes.parenL); + var val = this.parseExpression(); + this.popCx(); + this.expect(acorn.tokTypes.parenR); + return val + }; + + lp$2.parseMaybeAssign = function(noIn) { + if (this.toks.isContextual("yield")) { + var node = this.startNode(); + this.next(); + if (this.semicolon() || this.canInsertSemicolon() || (this.tok.type !== acorn.tokTypes.star && !this.tok.type.startsExpr)) { + node.delegate = false; + node.argument = null; + } else { + node.delegate = this.eat(acorn.tokTypes.star); + node.argument = this.parseMaybeAssign(); + } + return this.finishNode(node, "YieldExpression") + } + + var start = this.storeCurrentPos(); + var left = this.parseMaybeConditional(noIn); + if (this.tok.type.isAssign) { + var node$1 = this.startNodeAt(start); + node$1.operator = this.tok.value; + node$1.left = this.tok.type === acorn.tokTypes.eq ? this.toAssignable(left) : this.checkLVal(left); + this.next(); + node$1.right = this.parseMaybeAssign(noIn); + return this.finishNode(node$1, "AssignmentExpression") + } + return left + }; + + lp$2.parseMaybeConditional = function(noIn) { + var start = this.storeCurrentPos(); + var expr = this.parseExprOps(noIn); + if (this.eat(acorn.tokTypes.question)) { + var node = this.startNodeAt(start); + node.test = expr; + node.consequent = this.parseMaybeAssign(); + node.alternate = this.expect(acorn.tokTypes.colon) ? this.parseMaybeAssign(noIn) : this.dummyIdent(); + return this.finishNode(node, "ConditionalExpression") + } + return expr + }; + + lp$2.parseExprOps = function(noIn) { + var start = this.storeCurrentPos(); + var indent = this.curIndent, line = this.curLineStart; + return this.parseExprOp(this.parseMaybeUnary(false), start, -1, noIn, indent, line) + }; + + lp$2.parseExprOp = function(left, start, minPrec, noIn, indent, line) { + if (this.curLineStart !== line && this.curIndent < indent && this.tokenStartsLine()) { return left } + var prec = this.tok.type.binop; + if (prec != null && (!noIn || this.tok.type !== acorn.tokTypes._in)) { + if (prec > minPrec) { + var node = this.startNodeAt(start); + node.left = left; + node.operator = this.tok.value; + this.next(); + if (this.curLineStart !== line && this.curIndent < indent && this.tokenStartsLine()) { + node.right = this.dummyIdent(); + } else { + var rightStart = this.storeCurrentPos(); + node.right = this.parseExprOp(this.parseMaybeUnary(false), rightStart, prec, noIn, indent, line); + } + this.finishNode(node, /&&|\|\|/.test(node.operator) ? "LogicalExpression" : "BinaryExpression"); + return this.parseExprOp(node, start, minPrec, noIn, indent, line) + } + } + return left + }; + + lp$2.parseMaybeUnary = function(sawUnary) { + var start = this.storeCurrentPos(), expr; + if (this.options.ecmaVersion >= 8 && this.toks.isContextual("await") && + (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction)) + ) { + expr = this.parseAwait(); + sawUnary = true; + } else if (this.tok.type.prefix) { + var node = this.startNode(), update = this.tok.type === acorn.tokTypes.incDec; + if (!update) { sawUnary = true; } + node.operator = this.tok.value; + node.prefix = true; + this.next(); + node.argument = this.parseMaybeUnary(true); + if (update) { node.argument = this.checkLVal(node.argument); } + expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression"); + } else if (this.tok.type === acorn.tokTypes.ellipsis) { + var node$1 = this.startNode(); + this.next(); + node$1.argument = this.parseMaybeUnary(sawUnary); + expr = this.finishNode(node$1, "SpreadElement"); + } else { + expr = this.parseExprSubscripts(); + while (this.tok.type.postfix && !this.canInsertSemicolon()) { + var node$2 = this.startNodeAt(start); + node$2.operator = this.tok.value; + node$2.prefix = false; + node$2.argument = this.checkLVal(expr); + this.next(); + expr = this.finishNode(node$2, "UpdateExpression"); + } + } + + if (!sawUnary && this.eat(acorn.tokTypes.starstar)) { + var node$3 = this.startNodeAt(start); + node$3.operator = "**"; + node$3.left = expr; + node$3.right = this.parseMaybeUnary(false); + return this.finishNode(node$3, "BinaryExpression") + } + + return expr + }; + + lp$2.parseExprSubscripts = function() { + var start = this.storeCurrentPos(); + return this.parseSubscripts(this.parseExprAtom(), start, false, this.curIndent, this.curLineStart) + }; + + lp$2.parseSubscripts = function(base, start, noCalls, startIndent, line) { + for (;;) { + if (this.curLineStart !== line && this.curIndent <= startIndent && this.tokenStartsLine()) { + if (this.tok.type === acorn.tokTypes.dot && this.curIndent === startIndent) + { --startIndent; } + else + { return base } + } + + var maybeAsyncArrow = base.type === "Identifier" && base.name === "async" && !this.canInsertSemicolon(); + + if (this.eat(acorn.tokTypes.dot)) { + var node = this.startNodeAt(start); + node.object = base; + if (this.curLineStart !== line && this.curIndent <= startIndent && this.tokenStartsLine()) + { node.property = this.dummyIdent(); } + else + { node.property = this.parsePropertyAccessor() || this.dummyIdent(); } + node.computed = false; + base = this.finishNode(node, "MemberExpression"); + } else if (this.tok.type === acorn.tokTypes.bracketL) { + this.pushCx(); + this.next(); + var node$1 = this.startNodeAt(start); + node$1.object = base; + node$1.property = this.parseExpression(); + node$1.computed = true; + this.popCx(); + this.expect(acorn.tokTypes.bracketR); + base = this.finishNode(node$1, "MemberExpression"); + } else if (!noCalls && this.tok.type === acorn.tokTypes.parenL) { + var exprList = this.parseExprList(acorn.tokTypes.parenR); + if (maybeAsyncArrow && this.eat(acorn.tokTypes.arrow)) + { return this.parseArrowExpression(this.startNodeAt(start), exprList, true) } + var node$2 = this.startNodeAt(start); + node$2.callee = base; + node$2.arguments = exprList; + base = this.finishNode(node$2, "CallExpression"); + } else if (this.tok.type === acorn.tokTypes.backQuote) { + var node$3 = this.startNodeAt(start); + node$3.tag = base; + node$3.quasi = this.parseTemplate(); + base = this.finishNode(node$3, "TaggedTemplateExpression"); + } else { + return base + } + } + }; + + lp$2.parseExprAtom = function() { + var node; + switch (this.tok.type) { + case acorn.tokTypes._this: + case acorn.tokTypes._super: + var type = this.tok.type === acorn.tokTypes._this ? "ThisExpression" : "Super"; + node = this.startNode(); + this.next(); + return this.finishNode(node, type) + + case acorn.tokTypes.name: + var start = this.storeCurrentPos(); + var id = this.parseIdent(); + var isAsync = false; + if (id.name === "async" && !this.canInsertSemicolon()) { + if (this.eat(acorn.tokTypes._function)) + { return this.parseFunction(this.startNodeAt(start), false, true) } + if (this.tok.type === acorn.tokTypes.name) { + id = this.parseIdent(); + isAsync = true; + } + } + return this.eat(acorn.tokTypes.arrow) ? this.parseArrowExpression(this.startNodeAt(start), [id], isAsync) : id + + case acorn.tokTypes.regexp: + node = this.startNode(); + var val = this.tok.value; + node.regex = {pattern: val.pattern, flags: val.flags}; + node.value = val.value; + node.raw = this.input.slice(this.tok.start, this.tok.end); + this.next(); + return this.finishNode(node, "Literal") + + case acorn.tokTypes.num: case acorn.tokTypes.string: + node = this.startNode(); + node.value = this.tok.value; + node.raw = this.input.slice(this.tok.start, this.tok.end); + if (this.tok.type === acorn.tokTypes.num && node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1); } + this.next(); + return this.finishNode(node, "Literal") + + case acorn.tokTypes._null: case acorn.tokTypes._true: case acorn.tokTypes._false: + node = this.startNode(); + node.value = this.tok.type === acorn.tokTypes._null ? null : this.tok.type === acorn.tokTypes._true; + node.raw = this.tok.type.keyword; + this.next(); + return this.finishNode(node, "Literal") + + case acorn.tokTypes.parenL: + var parenStart = this.storeCurrentPos(); + this.next(); + var inner = this.parseExpression(); + this.expect(acorn.tokTypes.parenR); + if (this.eat(acorn.tokTypes.arrow)) { + // (a,)=>a // SequenceExpression makes dummy in the last hole. Drop the dummy. + var params = inner.expressions || [inner]; + if (params.length && isDummy(params[params.length - 1])) + { params.pop(); } + return this.parseArrowExpression(this.startNodeAt(parenStart), params) + } + if (this.options.preserveParens) { + var par = this.startNodeAt(parenStart); + par.expression = inner; + inner = this.finishNode(par, "ParenthesizedExpression"); + } + return inner + + case acorn.tokTypes.bracketL: + node = this.startNode(); + node.elements = this.parseExprList(acorn.tokTypes.bracketR, true); + return this.finishNode(node, "ArrayExpression") + + case acorn.tokTypes.braceL: + return this.parseObj() + + case acorn.tokTypes._class: + return this.parseClass(false) + + case acorn.tokTypes._function: + node = this.startNode(); + this.next(); + return this.parseFunction(node, false) + + case acorn.tokTypes._new: + return this.parseNew() + + case acorn.tokTypes.backQuote: + return this.parseTemplate() + + case acorn.tokTypes._import: + if (this.options.ecmaVersion > 10) { + return this.parseDynamicImport() + } else { + return this.dummyIdent() + } + + default: + return this.dummyIdent() + } + }; + + lp$2.parseDynamicImport = function() { + var node = this.startNode(); + this.next(); + return this.finishNode(node, "Import") + }; + + lp$2.parseNew = function() { + var node = this.startNode(), startIndent = this.curIndent, line = this.curLineStart; + var meta = this.parseIdent(true); + if (this.options.ecmaVersion >= 6 && this.eat(acorn.tokTypes.dot)) { + node.meta = meta; + node.property = this.parseIdent(true); + return this.finishNode(node, "MetaProperty") + } + var start = this.storeCurrentPos(); + node.callee = this.parseSubscripts(this.parseExprAtom(), start, true, startIndent, line); + if (this.tok.type === acorn.tokTypes.parenL) { + node.arguments = this.parseExprList(acorn.tokTypes.parenR); + } else { + node.arguments = []; + } + return this.finishNode(node, "NewExpression") + }; + + lp$2.parseTemplateElement = function() { + var elem = this.startNode(); + + // The loose parser accepts invalid unicode escapes even in untagged templates. + if (this.tok.type === acorn.tokTypes.invalidTemplate) { + elem.value = { + raw: this.tok.value, + cooked: null + }; + } else { + elem.value = { + raw: this.input.slice(this.tok.start, this.tok.end).replace(/\r\n?/g, "\n"), + cooked: this.tok.value + }; + } + this.next(); + elem.tail = this.tok.type === acorn.tokTypes.backQuote; + return this.finishNode(elem, "TemplateElement") + }; + + lp$2.parseTemplate = function() { + var node = this.startNode(); + this.next(); + node.expressions = []; + var curElt = this.parseTemplateElement(); + node.quasis = [curElt]; + while (!curElt.tail) { + this.next(); + node.expressions.push(this.parseExpression()); + if (this.expect(acorn.tokTypes.braceR)) { + curElt = this.parseTemplateElement(); + } else { + curElt = this.startNode(); + curElt.value = {cooked: "", raw: ""}; + curElt.tail = true; + this.finishNode(curElt, "TemplateElement"); + } + node.quasis.push(curElt); + } + this.expect(acorn.tokTypes.backQuote); + return this.finishNode(node, "TemplateLiteral") + }; + + lp$2.parseObj = function() { + var node = this.startNode(); + node.properties = []; + this.pushCx(); + var indent = this.curIndent + 1, line = this.curLineStart; + this.eat(acorn.tokTypes.braceL); + if (this.curIndent + 1 < indent) { indent = this.curIndent; line = this.curLineStart; } + while (!this.closes(acorn.tokTypes.braceR, indent, line)) { + var prop = this.startNode(), isGenerator = (void 0), isAsync = (void 0), start = (void 0); + if (this.options.ecmaVersion >= 9 && this.eat(acorn.tokTypes.ellipsis)) { + prop.argument = this.parseMaybeAssign(); + node.properties.push(this.finishNode(prop, "SpreadElement")); + this.eat(acorn.tokTypes.comma); + continue + } + if (this.options.ecmaVersion >= 6) { + start = this.storeCurrentPos(); + prop.method = false; + prop.shorthand = false; + isGenerator = this.eat(acorn.tokTypes.star); + } + this.parsePropertyName(prop); + if (this.toks.isAsyncProp(prop)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(acorn.tokTypes.star); + this.parsePropertyName(prop); + } else { + isAsync = false; + } + if (isDummy(prop.key)) { if (isDummy(this.parseMaybeAssign())) { this.next(); } this.eat(acorn.tokTypes.comma); continue } + if (this.eat(acorn.tokTypes.colon)) { + prop.kind = "init"; + prop.value = this.parseMaybeAssign(); + } else if (this.options.ecmaVersion >= 6 && (this.tok.type === acorn.tokTypes.parenL || this.tok.type === acorn.tokTypes.braceL)) { + prop.kind = "init"; + prop.method = true; + prop.value = this.parseMethod(isGenerator, isAsync); + } else if (this.options.ecmaVersion >= 5 && prop.key.type === "Identifier" && + !prop.computed && (prop.key.name === "get" || prop.key.name === "set") && + (this.tok.type !== acorn.tokTypes.comma && this.tok.type !== acorn.tokTypes.braceR && this.tok.type !== acorn.tokTypes.eq)) { + prop.kind = prop.key.name; + this.parsePropertyName(prop); + prop.value = this.parseMethod(false); + } else { + prop.kind = "init"; + if (this.options.ecmaVersion >= 6) { + if (this.eat(acorn.tokTypes.eq)) { + var assign = this.startNodeAt(start); + assign.operator = "="; + assign.left = prop.key; + assign.right = this.parseMaybeAssign(); + prop.value = this.finishNode(assign, "AssignmentExpression"); + } else { + prop.value = prop.key; + } + } else { + prop.value = this.dummyIdent(); + } + prop.shorthand = true; + } + node.properties.push(this.finishNode(prop, "Property")); + this.eat(acorn.tokTypes.comma); + } + this.popCx(); + if (!this.eat(acorn.tokTypes.braceR)) { + // If there is no closing brace, make the node span to the start + // of the next token (this is useful for Tern) + this.last.end = this.tok.start; + if (this.options.locations) { this.last.loc.end = this.tok.loc.start; } + } + return this.finishNode(node, "ObjectExpression") + }; + + lp$2.parsePropertyName = function(prop) { + if (this.options.ecmaVersion >= 6) { + if (this.eat(acorn.tokTypes.bracketL)) { + prop.computed = true; + prop.key = this.parseExpression(); + this.expect(acorn.tokTypes.bracketR); + return + } else { + prop.computed = false; + } + } + var key = (this.tok.type === acorn.tokTypes.num || this.tok.type === acorn.tokTypes.string) ? this.parseExprAtom() : this.parseIdent(); + prop.key = key || this.dummyIdent(); + }; + + lp$2.parsePropertyAccessor = function() { + if (this.tok.type === acorn.tokTypes.name || this.tok.type.keyword) { return this.parseIdent() } + }; + + lp$2.parseIdent = function() { + var name = this.tok.type === acorn.tokTypes.name ? this.tok.value : this.tok.type.keyword; + if (!name) { return this.dummyIdent() } + var node = this.startNode(); + this.next(); + node.name = name; + return this.finishNode(node, "Identifier") + }; + + lp$2.initFunction = function(node) { + node.id = null; + node.params = []; + if (this.options.ecmaVersion >= 6) { + node.generator = false; + node.expression = false; + } + if (this.options.ecmaVersion >= 8) + { node.async = false; } + }; + + // Convert existing expression atom to assignable pattern + // if possible. + + lp$2.toAssignable = function(node, binding) { + if (!node || node.type === "Identifier" || (node.type === "MemberExpression" && !binding)) ; else if (node.type === "ParenthesizedExpression") { + this.toAssignable(node.expression, binding); + } else if (this.options.ecmaVersion < 6) { + return this.dummyIdent() + } else if (node.type === "ObjectExpression") { + node.type = "ObjectPattern"; + for (var i = 0, list = node.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this.toAssignable(prop, binding); + } + } else if (node.type === "ArrayExpression") { + node.type = "ArrayPattern"; + this.toAssignableList(node.elements, binding); + } else if (node.type === "Property") { + this.toAssignable(node.value, binding); + } else if (node.type === "SpreadElement") { + node.type = "RestElement"; + this.toAssignable(node.argument, binding); + } else if (node.type === "AssignmentExpression") { + node.type = "AssignmentPattern"; + delete node.operator; + } else { + return this.dummyIdent() + } + return node + }; + + lp$2.toAssignableList = function(exprList, binding) { + for (var i = 0, list = exprList; i < list.length; i += 1) + { + var expr = list[i]; + + this.toAssignable(expr, binding); + } + return exprList + }; + + lp$2.parseFunctionParams = function(params) { + params = this.parseExprList(acorn.tokTypes.parenR); + return this.toAssignableList(params, true) + }; + + lp$2.parseMethod = function(isGenerator, isAsync) { + var node = this.startNode(), oldInAsync = this.inAsync, oldInFunction = this.inFunction; + this.initFunction(node); + if (this.options.ecmaVersion >= 6) + { node.generator = !!isGenerator; } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + this.inAsync = node.async; + this.inFunction = true; + node.params = this.parseFunctionParams(); + node.body = this.parseBlock(); + this.toks.adaptDirectivePrologue(node.body.body); + this.inAsync = oldInAsync; + this.inFunction = oldInFunction; + return this.finishNode(node, "FunctionExpression") + }; + + lp$2.parseArrowExpression = function(node, params, isAsync) { + var oldInAsync = this.inAsync, oldInFunction = this.inFunction; + this.initFunction(node); + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + this.inAsync = node.async; + this.inFunction = true; + node.params = this.toAssignableList(params, true); + node.expression = this.tok.type !== acorn.tokTypes.braceL; + if (node.expression) { + node.body = this.parseMaybeAssign(); + } else { + node.body = this.parseBlock(); + this.toks.adaptDirectivePrologue(node.body.body); + } + this.inAsync = oldInAsync; + this.inFunction = oldInFunction; + return this.finishNode(node, "ArrowFunctionExpression") + }; + + lp$2.parseExprList = function(close, allowEmpty) { + this.pushCx(); + var indent = this.curIndent, line = this.curLineStart, elts = []; + this.next(); // Opening bracket + while (!this.closes(close, indent + 1, line)) { + if (this.eat(acorn.tokTypes.comma)) { + elts.push(allowEmpty ? null : this.dummyIdent()); + continue + } + var elt = this.parseMaybeAssign(); + if (isDummy(elt)) { + if (this.closes(close, indent, line)) { break } + this.next(); + } else { + elts.push(elt); + } + this.eat(acorn.tokTypes.comma); + } + this.popCx(); + if (!this.eat(close)) { + // If there is no closing brace, make the node span to the start + // of the next token (this is useful for Tern) + this.last.end = this.tok.start; + if (this.options.locations) { this.last.loc.end = this.tok.loc.start; } + } + return elts + }; + + lp$2.parseAwait = function() { + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeUnary(); + return this.finishNode(node, "AwaitExpression") + }; + + // Acorn: Loose parser + + acorn.defaultOptions.tabSize = 4; + + function parse(input, options) { + return LooseParser.parse(input, options) + } + + exports.LooseParser = LooseParser; + exports.parse = parse; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/acorn/acorn-loose/dist/acorn-loose.js.map b/node_modules/acorn/acorn-loose/dist/acorn-loose.js.map new file mode 100644 index 00000000..86491c1e --- /dev/null +++ b/node_modules/acorn/acorn-loose/dist/acorn-loose.js.map @@ -0,0 +1 @@ +{"version":3,"file":"acorn-loose.js","sources":["../src/state.js","../src/tokenize.js","../src/parseutil.js","../src/statement.js","../src/expression.js","../src/index.js"],"sourcesContent":["import {Parser, SourceLocation, tokTypes as tt, Node, lineBreak, isNewLine} from \"acorn\"\n\nfunction noop() {}\n\nexport class LooseParser {\n constructor(input, options = {}) {\n this.toks = this.constructor.BaseParser.tokenizer(input, options)\n this.options = this.toks.options\n this.input = this.toks.input\n this.tok = this.last = {type: tt.eof, start: 0, end: 0}\n this.tok.validateRegExpFlags = noop\n this.tok.validateRegExpPattern = noop\n if (this.options.locations) {\n let here = this.toks.curPosition()\n this.tok.loc = new SourceLocation(this.toks, here, here)\n }\n this.ahead = [] // Tokens ahead\n this.context = [] // Indentation contexted\n this.curIndent = 0\n this.curLineStart = 0\n this.nextLineStart = this.lineEnd(this.curLineStart) + 1\n this.inAsync = false\n this.inFunction = false\n }\n\n startNode() {\n return new Node(this.toks, this.tok.start, this.options.locations ? this.tok.loc.start : null)\n }\n\n storeCurrentPos() {\n return this.options.locations ? [this.tok.start, this.tok.loc.start] : this.tok.start\n }\n\n startNodeAt(pos) {\n if (this.options.locations) {\n return new Node(this.toks, pos[0], pos[1])\n } else {\n return new Node(this.toks, pos)\n }\n }\n\n finishNode(node, type) {\n node.type = type\n node.end = this.last.end\n if (this.options.locations)\n node.loc.end = this.last.loc.end\n if (this.options.ranges)\n node.range[1] = this.last.end\n return node\n }\n\n dummyNode(type) {\n let dummy = this.startNode()\n dummy.type = type\n dummy.end = dummy.start\n if (this.options.locations)\n dummy.loc.end = dummy.loc.start\n if (this.options.ranges)\n dummy.range[1] = dummy.start\n this.last = {type: tt.name, start: dummy.start, end: dummy.start, loc: dummy.loc}\n return dummy\n }\n\n dummyIdent() {\n let dummy = this.dummyNode(\"Identifier\")\n dummy.name = \"✖\"\n return dummy\n }\n\n dummyString() {\n let dummy = this.dummyNode(\"Literal\")\n dummy.value = dummy.raw = \"✖\"\n return dummy\n }\n\n eat(type) {\n if (this.tok.type === type) {\n this.next()\n return true\n } else {\n return false\n }\n }\n\n isContextual(name) {\n return this.tok.type === tt.name && this.tok.value === name\n }\n\n eatContextual(name) {\n return this.tok.value === name && this.eat(tt.name)\n }\n\n canInsertSemicolon() {\n return this.tok.type === tt.eof || this.tok.type === tt.braceR ||\n lineBreak.test(this.input.slice(this.last.end, this.tok.start))\n }\n\n semicolon() {\n return this.eat(tt.semi)\n }\n\n expect(type) {\n if (this.eat(type)) return true\n for (let i = 1; i <= 2; i++) {\n if (this.lookAhead(i).type === type) {\n for (let j = 0; j < i; j++) this.next()\n return true\n }\n }\n }\n\n pushCx() {\n this.context.push(this.curIndent)\n }\n\n popCx() {\n this.curIndent = this.context.pop()\n }\n\n lineEnd(pos) {\n while (pos < this.input.length && !isNewLine(this.input.charCodeAt(pos))) ++pos\n return pos\n }\n\n indentationAfter(pos) {\n for (let count = 0;; ++pos) {\n let ch = this.input.charCodeAt(pos)\n if (ch === 32) ++count\n else if (ch === 9) count += this.options.tabSize\n else return count\n }\n }\n\n closes(closeTok, indent, line, blockHeuristic) {\n if (this.tok.type === closeTok || this.tok.type === tt.eof) return true\n return line !== this.curLineStart && this.curIndent < indent && this.tokenStartsLine() &&\n (!blockHeuristic || this.nextLineStart >= this.input.length ||\n this.indentationAfter(this.nextLineStart) < indent)\n }\n\n tokenStartsLine() {\n for (let p = this.tok.start - 1; p >= this.curLineStart; --p) {\n let ch = this.input.charCodeAt(p)\n if (ch !== 9 && ch !== 32) return false\n }\n return true\n }\n\n extend(name, f) {\n this[name] = f(this[name])\n }\n\n parse() {\n this.next()\n return this.parseTopLevel()\n }\n\n static extend(...plugins) {\n let cls = this\n for (let i = 0; i < plugins.length; i++) cls = plugins[i](cls)\n return cls\n }\n\n static parse(input, options) {\n return new this(input, options).parse()\n }\n}\n\n// Allows plugins to extend the base parser / tokenizer used\nLooseParser.BaseParser = Parser\n","import {tokTypes as tt, Token, isNewLine, SourceLocation, getLineInfo, lineBreakG} from \"acorn\"\nimport {LooseParser} from \"./state\"\n\nconst lp = LooseParser.prototype\n\nfunction isSpace(ch) {\n return (ch < 14 && ch > 8) || ch === 32 || ch === 160 || isNewLine(ch)\n}\n\nlp.next = function() {\n this.last = this.tok\n if (this.ahead.length)\n this.tok = this.ahead.shift()\n else\n this.tok = this.readToken()\n\n if (this.tok.start >= this.nextLineStart) {\n while (this.tok.start >= this.nextLineStart) {\n this.curLineStart = this.nextLineStart\n this.nextLineStart = this.lineEnd(this.curLineStart) + 1\n }\n this.curIndent = this.indentationAfter(this.curLineStart)\n }\n}\n\nlp.readToken = function() {\n for (;;) {\n try {\n this.toks.next()\n if (this.toks.type === tt.dot &&\n this.input.substr(this.toks.end, 1) === \".\" &&\n this.options.ecmaVersion >= 6) {\n this.toks.end++\n this.toks.type = tt.ellipsis\n }\n return new Token(this.toks)\n } catch (e) {\n if (!(e instanceof SyntaxError)) throw e\n\n // Try to skip some text, based on the error message, and then continue\n let msg = e.message, pos = e.raisedAt, replace = true\n if (/unterminated/i.test(msg)) {\n pos = this.lineEnd(e.pos + 1)\n if (/string/.test(msg)) {\n replace = {start: e.pos, end: pos, type: tt.string, value: this.input.slice(e.pos + 1, pos)}\n } else if (/regular expr/i.test(msg)) {\n let re = this.input.slice(e.pos, pos)\n try { re = new RegExp(re) } catch (e) { /* ignore compilation error due to new syntax */ }\n replace = {start: e.pos, end: pos, type: tt.regexp, value: re}\n } else if (/template/.test(msg)) {\n replace = {\n start: e.pos,\n end: pos,\n type: tt.template,\n value: this.input.slice(e.pos, pos)\n }\n } else {\n replace = false\n }\n } else if (/invalid (unicode|regexp|number)|expecting unicode|octal literal|is reserved|directly after number|expected number in radix/i.test(msg)) {\n while (pos < this.input.length && !isSpace(this.input.charCodeAt(pos))) ++pos\n } else if (/character escape|expected hexadecimal/i.test(msg)) {\n while (pos < this.input.length) {\n let ch = this.input.charCodeAt(pos++)\n if (ch === 34 || ch === 39 || isNewLine(ch)) break\n }\n } else if (/unexpected character/i.test(msg)) {\n pos++\n replace = false\n } else if (/regular expression/i.test(msg)) {\n replace = true\n } else {\n throw e\n }\n this.resetTo(pos)\n if (replace === true) replace = {start: pos, end: pos, type: tt.name, value: \"✖\"}\n if (replace) {\n if (this.options.locations)\n replace.loc = new SourceLocation(\n this.toks,\n getLineInfo(this.input, replace.start),\n getLineInfo(this.input, replace.end))\n return replace\n }\n }\n }\n}\n\nlp.resetTo = function(pos) {\n this.toks.pos = pos\n let ch = this.input.charAt(pos - 1)\n this.toks.exprAllowed = !ch || /[[{(,;:?/*=+\\-~!|&%^<>]/.test(ch) ||\n /[enwfd]/.test(ch) &&\n /\\b(case|else|return|throw|new|in|(instance|type)?of|delete|void)$/.test(this.input.slice(pos - 10, pos))\n\n if (this.options.locations) {\n this.toks.curLine = 1\n this.toks.lineStart = lineBreakG.lastIndex = 0\n let match\n while ((match = lineBreakG.exec(this.input)) && match.index < pos) {\n ++this.toks.curLine\n this.toks.lineStart = match.index + match[0].length\n }\n }\n}\n\nlp.lookAhead = function(n) {\n while (n > this.ahead.length)\n this.ahead.push(this.readToken())\n return this.ahead[n - 1]\n}\n","export function isDummy(node) { return node.name === \"✖\" }\n","import {LooseParser} from \"./state\"\nimport {isDummy} from \"./parseutil\"\nimport {getLineInfo, tokTypes as tt} from \"acorn\"\n\nconst lp = LooseParser.prototype\n\nlp.parseTopLevel = function() {\n let node = this.startNodeAt(this.options.locations ? [0, getLineInfo(this.input, 0)] : 0)\n node.body = []\n while (this.tok.type !== tt.eof) node.body.push(this.parseStatement())\n this.toks.adaptDirectivePrologue(node.body)\n this.last = this.tok\n if (this.options.ecmaVersion >= 6) {\n node.sourceType = this.options.sourceType\n }\n return this.finishNode(node, \"Program\")\n}\n\nlp.parseStatement = function() {\n let starttype = this.tok.type, node = this.startNode(), kind\n\n if (this.toks.isLet()) {\n starttype = tt._var\n kind = \"let\"\n }\n\n switch (starttype) {\n case tt._break: case tt._continue:\n this.next()\n let isBreak = starttype === tt._break\n if (this.semicolon() || this.canInsertSemicolon()) {\n node.label = null\n } else {\n node.label = this.tok.type === tt.name ? this.parseIdent() : null\n this.semicolon()\n }\n return this.finishNode(node, isBreak ? \"BreakStatement\" : \"ContinueStatement\")\n\n case tt._debugger:\n this.next()\n this.semicolon()\n return this.finishNode(node, \"DebuggerStatement\")\n\n case tt._do:\n this.next()\n node.body = this.parseStatement()\n node.test = this.eat(tt._while) ? this.parseParenExpression() : this.dummyIdent()\n this.semicolon()\n return this.finishNode(node, \"DoWhileStatement\")\n\n case tt._for:\n this.next() // `for` keyword\n let isAwait = this.options.ecmaVersion >= 9 && this.inAsync && this.eatContextual(\"await\")\n\n this.pushCx()\n this.expect(tt.parenL)\n if (this.tok.type === tt.semi) return this.parseFor(node, null)\n let isLet = this.toks.isLet()\n if (isLet || this.tok.type === tt._var || this.tok.type === tt._const) {\n let init = this.parseVar(this.startNode(), true, isLet ? \"let\" : this.tok.value)\n if (init.declarations.length === 1 && (this.tok.type === tt._in || this.isContextual(\"of\"))) {\n if (this.options.ecmaVersion >= 9 && this.tok.type !== tt._in) {\n node.await = isAwait\n }\n return this.parseForIn(node, init)\n }\n return this.parseFor(node, init)\n }\n let init = this.parseExpression(true)\n if (this.tok.type === tt._in || this.isContextual(\"of\")) {\n if (this.options.ecmaVersion >= 9 && this.tok.type !== tt._in) {\n node.await = isAwait\n }\n return this.parseForIn(node, this.toAssignable(init))\n }\n return this.parseFor(node, init)\n\n case tt._function:\n this.next()\n return this.parseFunction(node, true)\n\n case tt._if:\n this.next()\n node.test = this.parseParenExpression()\n node.consequent = this.parseStatement()\n node.alternate = this.eat(tt._else) ? this.parseStatement() : null\n return this.finishNode(node, \"IfStatement\")\n\n case tt._return:\n this.next()\n if (this.eat(tt.semi) || this.canInsertSemicolon()) node.argument = null\n else { node.argument = this.parseExpression(); this.semicolon() }\n return this.finishNode(node, \"ReturnStatement\")\n\n case tt._switch:\n let blockIndent = this.curIndent, line = this.curLineStart\n this.next()\n node.discriminant = this.parseParenExpression()\n node.cases = []\n this.pushCx()\n this.expect(tt.braceL)\n\n let cur\n while (!this.closes(tt.braceR, blockIndent, line, true)) {\n if (this.tok.type === tt._case || this.tok.type === tt._default) {\n let isCase = this.tok.type === tt._case\n if (cur) this.finishNode(cur, \"SwitchCase\")\n node.cases.push(cur = this.startNode())\n cur.consequent = []\n this.next()\n if (isCase) cur.test = this.parseExpression()\n else cur.test = null\n this.expect(tt.colon)\n } else {\n if (!cur) {\n node.cases.push(cur = this.startNode())\n cur.consequent = []\n cur.test = null\n }\n cur.consequent.push(this.parseStatement())\n }\n }\n if (cur) this.finishNode(cur, \"SwitchCase\")\n this.popCx()\n this.eat(tt.braceR)\n return this.finishNode(node, \"SwitchStatement\")\n\n case tt._throw:\n this.next()\n node.argument = this.parseExpression()\n this.semicolon()\n return this.finishNode(node, \"ThrowStatement\")\n\n case tt._try:\n this.next()\n node.block = this.parseBlock()\n node.handler = null\n if (this.tok.type === tt._catch) {\n let clause = this.startNode()\n this.next()\n if (this.eat(tt.parenL)) {\n clause.param = this.toAssignable(this.parseExprAtom(), true)\n this.expect(tt.parenR)\n } else {\n clause.param = null\n }\n clause.body = this.parseBlock()\n node.handler = this.finishNode(clause, \"CatchClause\")\n }\n node.finalizer = this.eat(tt._finally) ? this.parseBlock() : null\n if (!node.handler && !node.finalizer) return node.block\n return this.finishNode(node, \"TryStatement\")\n\n case tt._var:\n case tt._const:\n return this.parseVar(node, false, kind || this.tok.value)\n\n case tt._while:\n this.next()\n node.test = this.parseParenExpression()\n node.body = this.parseStatement()\n return this.finishNode(node, \"WhileStatement\")\n\n case tt._with:\n this.next()\n node.object = this.parseParenExpression()\n node.body = this.parseStatement()\n return this.finishNode(node, \"WithStatement\")\n\n case tt.braceL:\n return this.parseBlock()\n\n case tt.semi:\n this.next()\n return this.finishNode(node, \"EmptyStatement\")\n\n case tt._class:\n return this.parseClass(true)\n\n case tt._import:\n return this.parseImport()\n\n case tt._export:\n return this.parseExport()\n\n default:\n if (this.toks.isAsyncFunction()) {\n this.next()\n this.next()\n return this.parseFunction(node, true, true)\n }\n let expr = this.parseExpression()\n if (isDummy(expr)) {\n this.next()\n if (this.tok.type === tt.eof) return this.finishNode(node, \"EmptyStatement\")\n return this.parseStatement()\n } else if (starttype === tt.name && expr.type === \"Identifier\" && this.eat(tt.colon)) {\n node.body = this.parseStatement()\n node.label = expr\n return this.finishNode(node, \"LabeledStatement\")\n } else {\n node.expression = expr\n this.semicolon()\n return this.finishNode(node, \"ExpressionStatement\")\n }\n }\n}\n\nlp.parseBlock = function() {\n let node = this.startNode()\n this.pushCx()\n this.expect(tt.braceL)\n let blockIndent = this.curIndent, line = this.curLineStart\n node.body = []\n while (!this.closes(tt.braceR, blockIndent, line, true))\n node.body.push(this.parseStatement())\n this.popCx()\n this.eat(tt.braceR)\n return this.finishNode(node, \"BlockStatement\")\n}\n\nlp.parseFor = function(node, init) {\n node.init = init\n node.test = node.update = null\n if (this.eat(tt.semi) && this.tok.type !== tt.semi) node.test = this.parseExpression()\n if (this.eat(tt.semi) && this.tok.type !== tt.parenR) node.update = this.parseExpression()\n this.popCx()\n this.expect(tt.parenR)\n node.body = this.parseStatement()\n return this.finishNode(node, \"ForStatement\")\n}\n\nlp.parseForIn = function(node, init) {\n let type = this.tok.type === tt._in ? \"ForInStatement\" : \"ForOfStatement\"\n this.next()\n node.left = init\n node.right = this.parseExpression()\n this.popCx()\n this.expect(tt.parenR)\n node.body = this.parseStatement()\n return this.finishNode(node, type)\n}\n\nlp.parseVar = function(node, noIn, kind) {\n node.kind = kind\n this.next()\n node.declarations = []\n do {\n let decl = this.startNode()\n decl.id = this.options.ecmaVersion >= 6 ? this.toAssignable(this.parseExprAtom(), true) : this.parseIdent()\n decl.init = this.eat(tt.eq) ? this.parseMaybeAssign(noIn) : null\n node.declarations.push(this.finishNode(decl, \"VariableDeclarator\"))\n } while (this.eat(tt.comma))\n if (!node.declarations.length) {\n let decl = this.startNode()\n decl.id = this.dummyIdent()\n node.declarations.push(this.finishNode(decl, \"VariableDeclarator\"))\n }\n if (!noIn) this.semicolon()\n return this.finishNode(node, \"VariableDeclaration\")\n}\n\nlp.parseClass = function(isStatement) {\n let node = this.startNode()\n this.next()\n if (this.tok.type === tt.name) node.id = this.parseIdent()\n else if (isStatement === true) node.id = this.dummyIdent()\n else node.id = null\n node.superClass = this.eat(tt._extends) ? this.parseExpression() : null\n node.body = this.startNode()\n node.body.body = []\n this.pushCx()\n let indent = this.curIndent + 1, line = this.curLineStart\n this.eat(tt.braceL)\n if (this.curIndent + 1 < indent) { indent = this.curIndent; line = this.curLineStart }\n while (!this.closes(tt.braceR, indent, line)) {\n if (this.semicolon()) continue\n let method = this.startNode(), isGenerator, isAsync\n if (this.options.ecmaVersion >= 6) {\n method.static = false\n isGenerator = this.eat(tt.star)\n }\n this.parsePropertyName(method)\n if (isDummy(method.key)) { if (isDummy(this.parseMaybeAssign())) this.next(); this.eat(tt.comma); continue }\n if (method.key.type === \"Identifier\" && !method.computed && method.key.name === \"static\" &&\n (this.tok.type !== tt.parenL && this.tok.type !== tt.braceL)) {\n method.static = true\n isGenerator = this.eat(tt.star)\n this.parsePropertyName(method)\n } else {\n method.static = false\n }\n if (!method.computed &&\n method.key.type === \"Identifier\" && method.key.name === \"async\" && this.tok.type !== tt.parenL &&\n !this.canInsertSemicolon()) {\n isAsync = true\n isGenerator = this.options.ecmaVersion >= 9 && this.eat(tt.star)\n this.parsePropertyName(method)\n } else {\n isAsync = false\n }\n if (this.options.ecmaVersion >= 5 && method.key.type === \"Identifier\" &&\n !method.computed && (method.key.name === \"get\" || method.key.name === \"set\") &&\n this.tok.type !== tt.parenL && this.tok.type !== tt.braceL) {\n method.kind = method.key.name\n this.parsePropertyName(method)\n method.value = this.parseMethod(false)\n } else {\n if (!method.computed && !method.static && !isGenerator && !isAsync && (\n method.key.type === \"Identifier\" && method.key.name === \"constructor\" ||\n method.key.type === \"Literal\" && method.key.value === \"constructor\")) {\n method.kind = \"constructor\"\n } else {\n method.kind = \"method\"\n }\n method.value = this.parseMethod(isGenerator, isAsync)\n }\n node.body.body.push(this.finishNode(method, \"MethodDefinition\"))\n }\n this.popCx()\n if (!this.eat(tt.braceR)) {\n // If there is no closing brace, make the node span to the start\n // of the next token (this is useful for Tern)\n this.last.end = this.tok.start\n if (this.options.locations) this.last.loc.end = this.tok.loc.start\n }\n this.semicolon()\n this.finishNode(node.body, \"ClassBody\")\n return this.finishNode(node, isStatement ? \"ClassDeclaration\" : \"ClassExpression\")\n}\n\nlp.parseFunction = function(node, isStatement, isAsync) {\n let oldInAsync = this.inAsync, oldInFunction = this.inFunction\n this.initFunction(node)\n if (this.options.ecmaVersion >= 6) {\n node.generator = this.eat(tt.star)\n }\n if (this.options.ecmaVersion >= 8) {\n node.async = !!isAsync\n }\n if (this.tok.type === tt.name) node.id = this.parseIdent()\n else if (isStatement === true) node.id = this.dummyIdent()\n this.inAsync = node.async\n this.inFunction = true\n node.params = this.parseFunctionParams()\n node.body = this.parseBlock()\n this.toks.adaptDirectivePrologue(node.body.body)\n this.inAsync = oldInAsync\n this.inFunction = oldInFunction\n return this.finishNode(node, isStatement ? \"FunctionDeclaration\" : \"FunctionExpression\")\n}\n\nlp.parseExport = function() {\n let node = this.startNode()\n this.next()\n if (this.eat(tt.star)) {\n node.source = this.eatContextual(\"from\") ? this.parseExprAtom() : this.dummyString()\n return this.finishNode(node, \"ExportAllDeclaration\")\n }\n if (this.eat(tt._default)) {\n // export default (function foo() {}) // This is FunctionExpression.\n let isAsync\n if (this.tok.type === tt._function || (isAsync = this.toks.isAsyncFunction())) {\n let fNode = this.startNode()\n this.next()\n if (isAsync) this.next()\n node.declaration = this.parseFunction(fNode, \"nullableID\", isAsync)\n } else if (this.tok.type === tt._class) {\n node.declaration = this.parseClass(\"nullableID\")\n } else {\n node.declaration = this.parseMaybeAssign()\n this.semicolon()\n }\n return this.finishNode(node, \"ExportDefaultDeclaration\")\n }\n if (this.tok.type.keyword || this.toks.isLet() || this.toks.isAsyncFunction()) {\n node.declaration = this.parseStatement()\n node.specifiers = []\n node.source = null\n } else {\n node.declaration = null\n node.specifiers = this.parseExportSpecifierList()\n node.source = this.eatContextual(\"from\") ? this.parseExprAtom() : null\n this.semicolon()\n }\n return this.finishNode(node, \"ExportNamedDeclaration\")\n}\n\nlp.parseImport = function() {\n let node = this.startNode()\n this.next()\n if (this.tok.type === tt.string) {\n node.specifiers = []\n node.source = this.parseExprAtom()\n } else {\n let elt\n if (this.tok.type === tt.name && this.tok.value !== \"from\") {\n elt = this.startNode()\n elt.local = this.parseIdent()\n this.finishNode(elt, \"ImportDefaultSpecifier\")\n this.eat(tt.comma)\n }\n node.specifiers = this.parseImportSpecifiers()\n node.source = this.eatContextual(\"from\") && this.tok.type === tt.string ? this.parseExprAtom() : this.dummyString()\n if (elt) node.specifiers.unshift(elt)\n }\n this.semicolon()\n return this.finishNode(node, \"ImportDeclaration\")\n}\n\nlp.parseImportSpecifiers = function() {\n let elts = []\n if (this.tok.type === tt.star) {\n let elt = this.startNode()\n this.next()\n elt.local = this.eatContextual(\"as\") ? this.parseIdent() : this.dummyIdent()\n elts.push(this.finishNode(elt, \"ImportNamespaceSpecifier\"))\n } else {\n let indent = this.curIndent, line = this.curLineStart, continuedLine = this.nextLineStart\n this.pushCx()\n this.eat(tt.braceL)\n if (this.curLineStart > continuedLine) continuedLine = this.curLineStart\n while (!this.closes(tt.braceR, indent + (this.curLineStart <= continuedLine ? 1 : 0), line)) {\n let elt = this.startNode()\n if (this.eat(tt.star)) {\n elt.local = this.eatContextual(\"as\") ? this.parseIdent() : this.dummyIdent()\n this.finishNode(elt, \"ImportNamespaceSpecifier\")\n } else {\n if (this.isContextual(\"from\")) break\n elt.imported = this.parseIdent()\n if (isDummy(elt.imported)) break\n elt.local = this.eatContextual(\"as\") ? this.parseIdent() : elt.imported\n this.finishNode(elt, \"ImportSpecifier\")\n }\n elts.push(elt)\n this.eat(tt.comma)\n }\n this.eat(tt.braceR)\n this.popCx()\n }\n return elts\n}\n\nlp.parseExportSpecifierList = function() {\n let elts = []\n let indent = this.curIndent, line = this.curLineStart, continuedLine = this.nextLineStart\n this.pushCx()\n this.eat(tt.braceL)\n if (this.curLineStart > continuedLine) continuedLine = this.curLineStart\n while (!this.closes(tt.braceR, indent + (this.curLineStart <= continuedLine ? 1 : 0), line)) {\n if (this.isContextual(\"from\")) break\n let elt = this.startNode()\n elt.local = this.parseIdent()\n if (isDummy(elt.local)) break\n elt.exported = this.eatContextual(\"as\") ? this.parseIdent() : elt.local\n this.finishNode(elt, \"ExportSpecifier\")\n elts.push(elt)\n this.eat(tt.comma)\n }\n this.eat(tt.braceR)\n this.popCx()\n return elts\n}\n","import {LooseParser} from \"./state\"\nimport {isDummy} from \"./parseutil\"\nimport {tokTypes as tt} from \"acorn\"\n\nconst lp = LooseParser.prototype\n\nlp.checkLVal = function(expr) {\n if (!expr) return expr\n switch (expr.type) {\n case \"Identifier\":\n case \"MemberExpression\":\n return expr\n\n case \"ParenthesizedExpression\":\n expr.expression = this.checkLVal(expr.expression)\n return expr\n\n default:\n return this.dummyIdent()\n }\n}\n\nlp.parseExpression = function(noIn) {\n let start = this.storeCurrentPos()\n let expr = this.parseMaybeAssign(noIn)\n if (this.tok.type === tt.comma) {\n let node = this.startNodeAt(start)\n node.expressions = [expr]\n while (this.eat(tt.comma)) node.expressions.push(this.parseMaybeAssign(noIn))\n return this.finishNode(node, \"SequenceExpression\")\n }\n return expr\n}\n\nlp.parseParenExpression = function() {\n this.pushCx()\n this.expect(tt.parenL)\n let val = this.parseExpression()\n this.popCx()\n this.expect(tt.parenR)\n return val\n}\n\nlp.parseMaybeAssign = function(noIn) {\n if (this.toks.isContextual(\"yield\")) {\n let node = this.startNode()\n this.next()\n if (this.semicolon() || this.canInsertSemicolon() || (this.tok.type !== tt.star && !this.tok.type.startsExpr)) {\n node.delegate = false\n node.argument = null\n } else {\n node.delegate = this.eat(tt.star)\n node.argument = this.parseMaybeAssign()\n }\n return this.finishNode(node, \"YieldExpression\")\n }\n\n let start = this.storeCurrentPos()\n let left = this.parseMaybeConditional(noIn)\n if (this.tok.type.isAssign) {\n let node = this.startNodeAt(start)\n node.operator = this.tok.value\n node.left = this.tok.type === tt.eq ? this.toAssignable(left) : this.checkLVal(left)\n this.next()\n node.right = this.parseMaybeAssign(noIn)\n return this.finishNode(node, \"AssignmentExpression\")\n }\n return left\n}\n\nlp.parseMaybeConditional = function(noIn) {\n let start = this.storeCurrentPos()\n let expr = this.parseExprOps(noIn)\n if (this.eat(tt.question)) {\n let node = this.startNodeAt(start)\n node.test = expr\n node.consequent = this.parseMaybeAssign()\n node.alternate = this.expect(tt.colon) ? this.parseMaybeAssign(noIn) : this.dummyIdent()\n return this.finishNode(node, \"ConditionalExpression\")\n }\n return expr\n}\n\nlp.parseExprOps = function(noIn) {\n let start = this.storeCurrentPos()\n let indent = this.curIndent, line = this.curLineStart\n return this.parseExprOp(this.parseMaybeUnary(false), start, -1, noIn, indent, line)\n}\n\nlp.parseExprOp = function(left, start, minPrec, noIn, indent, line) {\n if (this.curLineStart !== line && this.curIndent < indent && this.tokenStartsLine()) return left\n let prec = this.tok.type.binop\n if (prec != null && (!noIn || this.tok.type !== tt._in)) {\n if (prec > minPrec) {\n let node = this.startNodeAt(start)\n node.left = left\n node.operator = this.tok.value\n this.next()\n if (this.curLineStart !== line && this.curIndent < indent && this.tokenStartsLine()) {\n node.right = this.dummyIdent()\n } else {\n let rightStart = this.storeCurrentPos()\n node.right = this.parseExprOp(this.parseMaybeUnary(false), rightStart, prec, noIn, indent, line)\n }\n this.finishNode(node, /&&|\\|\\|/.test(node.operator) ? \"LogicalExpression\" : \"BinaryExpression\")\n return this.parseExprOp(node, start, minPrec, noIn, indent, line)\n }\n }\n return left\n}\n\nlp.parseMaybeUnary = function(sawUnary) {\n let start = this.storeCurrentPos(), expr\n if (this.options.ecmaVersion >= 8 && this.toks.isContextual(\"await\") &&\n (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction))\n ) {\n expr = this.parseAwait()\n sawUnary = true\n } else if (this.tok.type.prefix) {\n let node = this.startNode(), update = this.tok.type === tt.incDec\n if (!update) sawUnary = true\n node.operator = this.tok.value\n node.prefix = true\n this.next()\n node.argument = this.parseMaybeUnary(true)\n if (update) node.argument = this.checkLVal(node.argument)\n expr = this.finishNode(node, update ? \"UpdateExpression\" : \"UnaryExpression\")\n } else if (this.tok.type === tt.ellipsis) {\n let node = this.startNode()\n this.next()\n node.argument = this.parseMaybeUnary(sawUnary)\n expr = this.finishNode(node, \"SpreadElement\")\n } else {\n expr = this.parseExprSubscripts()\n while (this.tok.type.postfix && !this.canInsertSemicolon()) {\n let node = this.startNodeAt(start)\n node.operator = this.tok.value\n node.prefix = false\n node.argument = this.checkLVal(expr)\n this.next()\n expr = this.finishNode(node, \"UpdateExpression\")\n }\n }\n\n if (!sawUnary && this.eat(tt.starstar)) {\n let node = this.startNodeAt(start)\n node.operator = \"**\"\n node.left = expr\n node.right = this.parseMaybeUnary(false)\n return this.finishNode(node, \"BinaryExpression\")\n }\n\n return expr\n}\n\nlp.parseExprSubscripts = function() {\n let start = this.storeCurrentPos()\n return this.parseSubscripts(this.parseExprAtom(), start, false, this.curIndent, this.curLineStart)\n}\n\nlp.parseSubscripts = function(base, start, noCalls, startIndent, line) {\n for (;;) {\n if (this.curLineStart !== line && this.curIndent <= startIndent && this.tokenStartsLine()) {\n if (this.tok.type === tt.dot && this.curIndent === startIndent)\n --startIndent\n else\n return base\n }\n\n let maybeAsyncArrow = base.type === \"Identifier\" && base.name === \"async\" && !this.canInsertSemicolon()\n\n if (this.eat(tt.dot)) {\n let node = this.startNodeAt(start)\n node.object = base\n if (this.curLineStart !== line && this.curIndent <= startIndent && this.tokenStartsLine())\n node.property = this.dummyIdent()\n else\n node.property = this.parsePropertyAccessor() || this.dummyIdent()\n node.computed = false\n base = this.finishNode(node, \"MemberExpression\")\n } else if (this.tok.type === tt.bracketL) {\n this.pushCx()\n this.next()\n let node = this.startNodeAt(start)\n node.object = base\n node.property = this.parseExpression()\n node.computed = true\n this.popCx()\n this.expect(tt.bracketR)\n base = this.finishNode(node, \"MemberExpression\")\n } else if (!noCalls && this.tok.type === tt.parenL) {\n let exprList = this.parseExprList(tt.parenR)\n if (maybeAsyncArrow && this.eat(tt.arrow))\n return this.parseArrowExpression(this.startNodeAt(start), exprList, true)\n let node = this.startNodeAt(start)\n node.callee = base\n node.arguments = exprList\n base = this.finishNode(node, \"CallExpression\")\n } else if (this.tok.type === tt.backQuote) {\n let node = this.startNodeAt(start)\n node.tag = base\n node.quasi = this.parseTemplate()\n base = this.finishNode(node, \"TaggedTemplateExpression\")\n } else {\n return base\n }\n }\n}\n\nlp.parseExprAtom = function() {\n let node\n switch (this.tok.type) {\n case tt._this:\n case tt._super:\n let type = this.tok.type === tt._this ? \"ThisExpression\" : \"Super\"\n node = this.startNode()\n this.next()\n return this.finishNode(node, type)\n\n case tt.name:\n let start = this.storeCurrentPos()\n let id = this.parseIdent()\n let isAsync = false\n if (id.name === \"async\" && !this.canInsertSemicolon()) {\n if (this.eat(tt._function))\n return this.parseFunction(this.startNodeAt(start), false, true)\n if (this.tok.type === tt.name) {\n id = this.parseIdent()\n isAsync = true\n }\n }\n return this.eat(tt.arrow) ? this.parseArrowExpression(this.startNodeAt(start), [id], isAsync) : id\n\n case tt.regexp:\n node = this.startNode()\n let val = this.tok.value\n node.regex = {pattern: val.pattern, flags: val.flags}\n node.value = val.value\n node.raw = this.input.slice(this.tok.start, this.tok.end)\n this.next()\n return this.finishNode(node, \"Literal\")\n\n case tt.num: case tt.string:\n node = this.startNode()\n node.value = this.tok.value\n node.raw = this.input.slice(this.tok.start, this.tok.end)\n this.next()\n return this.finishNode(node, \"Literal\")\n\n case tt._null: case tt._true: case tt._false:\n node = this.startNode()\n node.value = this.tok.type === tt._null ? null : this.tok.type === tt._true\n node.raw = this.tok.type.keyword\n this.next()\n return this.finishNode(node, \"Literal\")\n\n case tt.parenL:\n let parenStart = this.storeCurrentPos()\n this.next()\n let inner = this.parseExpression()\n this.expect(tt.parenR)\n if (this.eat(tt.arrow)) {\n // (a,)=>a // SequenceExpression makes dummy in the last hole. Drop the dummy.\n let params = inner.expressions || [inner]\n if (params.length && isDummy(params[params.length - 1]))\n params.pop()\n return this.parseArrowExpression(this.startNodeAt(parenStart), params)\n }\n if (this.options.preserveParens) {\n let par = this.startNodeAt(parenStart)\n par.expression = inner\n inner = this.finishNode(par, \"ParenthesizedExpression\")\n }\n return inner\n\n case tt.bracketL:\n node = this.startNode()\n node.elements = this.parseExprList(tt.bracketR, true)\n return this.finishNode(node, \"ArrayExpression\")\n\n case tt.braceL:\n return this.parseObj()\n\n case tt._class:\n return this.parseClass(false)\n\n case tt._function:\n node = this.startNode()\n this.next()\n return this.parseFunction(node, false)\n\n case tt._new:\n return this.parseNew()\n\n case tt.backQuote:\n return this.parseTemplate()\n\n default:\n return this.dummyIdent()\n }\n}\n\nlp.parseNew = function() {\n let node = this.startNode(), startIndent = this.curIndent, line = this.curLineStart\n let meta = this.parseIdent(true)\n if (this.options.ecmaVersion >= 6 && this.eat(tt.dot)) {\n node.meta = meta\n node.property = this.parseIdent(true)\n return this.finishNode(node, \"MetaProperty\")\n }\n let start = this.storeCurrentPos()\n node.callee = this.parseSubscripts(this.parseExprAtom(), start, true, startIndent, line)\n if (this.tok.type === tt.parenL) {\n node.arguments = this.parseExprList(tt.parenR)\n } else {\n node.arguments = []\n }\n return this.finishNode(node, \"NewExpression\")\n}\n\nlp.parseTemplateElement = function() {\n let elem = this.startNode()\n\n // The loose parser accepts invalid unicode escapes even in untagged templates.\n if (this.tok.type === tt.invalidTemplate) {\n elem.value = {\n raw: this.tok.value,\n cooked: null\n }\n } else {\n elem.value = {\n raw: this.input.slice(this.tok.start, this.tok.end).replace(/\\r\\n?/g, \"\\n\"),\n cooked: this.tok.value\n }\n }\n this.next()\n elem.tail = this.tok.type === tt.backQuote\n return this.finishNode(elem, \"TemplateElement\")\n}\n\nlp.parseTemplate = function() {\n let node = this.startNode()\n this.next()\n node.expressions = []\n let curElt = this.parseTemplateElement()\n node.quasis = [curElt]\n while (!curElt.tail) {\n this.next()\n node.expressions.push(this.parseExpression())\n if (this.expect(tt.braceR)) {\n curElt = this.parseTemplateElement()\n } else {\n curElt = this.startNode()\n curElt.value = {cooked: \"\", raw: \"\"}\n curElt.tail = true\n this.finishNode(curElt, \"TemplateElement\")\n }\n node.quasis.push(curElt)\n }\n this.expect(tt.backQuote)\n return this.finishNode(node, \"TemplateLiteral\")\n}\n\nlp.parseObj = function() {\n let node = this.startNode()\n node.properties = []\n this.pushCx()\n let indent = this.curIndent + 1, line = this.curLineStart\n this.eat(tt.braceL)\n if (this.curIndent + 1 < indent) { indent = this.curIndent; line = this.curLineStart }\n while (!this.closes(tt.braceR, indent, line)) {\n let prop = this.startNode(), isGenerator, isAsync, start\n if (this.options.ecmaVersion >= 9 && this.eat(tt.ellipsis)) {\n prop.argument = this.parseMaybeAssign()\n node.properties.push(this.finishNode(prop, \"SpreadElement\"))\n this.eat(tt.comma)\n continue\n }\n if (this.options.ecmaVersion >= 6) {\n start = this.storeCurrentPos()\n prop.method = false\n prop.shorthand = false\n isGenerator = this.eat(tt.star)\n }\n this.parsePropertyName(prop)\n if (this.toks.isAsyncProp(prop)) {\n isAsync = true\n isGenerator = this.options.ecmaVersion >= 9 && this.eat(tt.star)\n this.parsePropertyName(prop)\n } else {\n isAsync = false\n }\n if (isDummy(prop.key)) { if (isDummy(this.parseMaybeAssign())) this.next(); this.eat(tt.comma); continue }\n if (this.eat(tt.colon)) {\n prop.kind = \"init\"\n prop.value = this.parseMaybeAssign()\n } else if (this.options.ecmaVersion >= 6 && (this.tok.type === tt.parenL || this.tok.type === tt.braceL)) {\n prop.kind = \"init\"\n prop.method = true\n prop.value = this.parseMethod(isGenerator, isAsync)\n } else if (this.options.ecmaVersion >= 5 && prop.key.type === \"Identifier\" &&\n !prop.computed && (prop.key.name === \"get\" || prop.key.name === \"set\") &&\n (this.tok.type !== tt.comma && this.tok.type !== tt.braceR && this.tok.type !== tt.eq)) {\n prop.kind = prop.key.name\n this.parsePropertyName(prop)\n prop.value = this.parseMethod(false)\n } else {\n prop.kind = \"init\"\n if (this.options.ecmaVersion >= 6) {\n if (this.eat(tt.eq)) {\n let assign = this.startNodeAt(start)\n assign.operator = \"=\"\n assign.left = prop.key\n assign.right = this.parseMaybeAssign()\n prop.value = this.finishNode(assign, \"AssignmentExpression\")\n } else {\n prop.value = prop.key\n }\n } else {\n prop.value = this.dummyIdent()\n }\n prop.shorthand = true\n }\n node.properties.push(this.finishNode(prop, \"Property\"))\n this.eat(tt.comma)\n }\n this.popCx()\n if (!this.eat(tt.braceR)) {\n // If there is no closing brace, make the node span to the start\n // of the next token (this is useful for Tern)\n this.last.end = this.tok.start\n if (this.options.locations) this.last.loc.end = this.tok.loc.start\n }\n return this.finishNode(node, \"ObjectExpression\")\n}\n\nlp.parsePropertyName = function(prop) {\n if (this.options.ecmaVersion >= 6) {\n if (this.eat(tt.bracketL)) {\n prop.computed = true\n prop.key = this.parseExpression()\n this.expect(tt.bracketR)\n return\n } else {\n prop.computed = false\n }\n }\n let key = (this.tok.type === tt.num || this.tok.type === tt.string) ? this.parseExprAtom() : this.parseIdent()\n prop.key = key || this.dummyIdent()\n}\n\nlp.parsePropertyAccessor = function() {\n if (this.tok.type === tt.name || this.tok.type.keyword) return this.parseIdent()\n}\n\nlp.parseIdent = function() {\n let name = this.tok.type === tt.name ? this.tok.value : this.tok.type.keyword\n if (!name) return this.dummyIdent()\n let node = this.startNode()\n this.next()\n node.name = name\n return this.finishNode(node, \"Identifier\")\n}\n\nlp.initFunction = function(node) {\n node.id = null\n node.params = []\n if (this.options.ecmaVersion >= 6) {\n node.generator = false\n node.expression = false\n }\n if (this.options.ecmaVersion >= 8)\n node.async = false\n}\n\n// Convert existing expression atom to assignable pattern\n// if possible.\n\nlp.toAssignable = function(node, binding) {\n if (!node || node.type === \"Identifier\" || (node.type === \"MemberExpression\" && !binding)) {\n // Okay\n } else if (node.type === \"ParenthesizedExpression\") {\n this.toAssignable(node.expression, binding)\n } else if (this.options.ecmaVersion < 6) {\n return this.dummyIdent()\n } else if (node.type === \"ObjectExpression\") {\n node.type = \"ObjectPattern\"\n for (let prop of node.properties)\n this.toAssignable(prop, binding)\n } else if (node.type === \"ArrayExpression\") {\n node.type = \"ArrayPattern\"\n this.toAssignableList(node.elements, binding)\n } else if (node.type === \"Property\") {\n this.toAssignable(node.value, binding)\n } else if (node.type === \"SpreadElement\") {\n node.type = \"RestElement\"\n this.toAssignable(node.argument, binding)\n } else if (node.type === \"AssignmentExpression\") {\n node.type = \"AssignmentPattern\"\n delete node.operator\n } else {\n return this.dummyIdent()\n }\n return node\n}\n\nlp.toAssignableList = function(exprList, binding) {\n for (let expr of exprList)\n this.toAssignable(expr, binding)\n return exprList\n}\n\nlp.parseFunctionParams = function(params) {\n params = this.parseExprList(tt.parenR)\n return this.toAssignableList(params, true)\n}\n\nlp.parseMethod = function(isGenerator, isAsync) {\n let node = this.startNode(), oldInAsync = this.inAsync, oldInFunction = this.inFunction\n this.initFunction(node)\n if (this.options.ecmaVersion >= 6)\n node.generator = !!isGenerator\n if (this.options.ecmaVersion >= 8)\n node.async = !!isAsync\n this.inAsync = node.async\n this.inFunction = true\n node.params = this.parseFunctionParams()\n node.body = this.parseBlock()\n this.toks.adaptDirectivePrologue(node.body.body)\n this.inAsync = oldInAsync\n this.inFunction = oldInFunction\n return this.finishNode(node, \"FunctionExpression\")\n}\n\nlp.parseArrowExpression = function(node, params, isAsync) {\n let oldInAsync = this.inAsync, oldInFunction = this.inFunction\n this.initFunction(node)\n if (this.options.ecmaVersion >= 8)\n node.async = !!isAsync\n this.inAsync = node.async\n this.inFunction = true\n node.params = this.toAssignableList(params, true)\n node.expression = this.tok.type !== tt.braceL\n if (node.expression) {\n node.body = this.parseMaybeAssign()\n } else {\n node.body = this.parseBlock()\n this.toks.adaptDirectivePrologue(node.body.body)\n }\n this.inAsync = oldInAsync\n this.inFunction = oldInFunction\n return this.finishNode(node, \"ArrowFunctionExpression\")\n}\n\nlp.parseExprList = function(close, allowEmpty) {\n this.pushCx()\n let indent = this.curIndent, line = this.curLineStart, elts = []\n this.next() // Opening bracket\n while (!this.closes(close, indent + 1, line)) {\n if (this.eat(tt.comma)) {\n elts.push(allowEmpty ? null : this.dummyIdent())\n continue\n }\n let elt = this.parseMaybeAssign()\n if (isDummy(elt)) {\n if (this.closes(close, indent, line)) break\n this.next()\n } else {\n elts.push(elt)\n }\n this.eat(tt.comma)\n }\n this.popCx()\n if (!this.eat(close)) {\n // If there is no closing brace, make the node span to the start\n // of the next token (this is useful for Tern)\n this.last.end = this.tok.start\n if (this.options.locations) this.last.loc.end = this.tok.loc.start\n }\n return elts\n}\n\nlp.parseAwait = function() {\n let node = this.startNode()\n this.next()\n node.argument = this.parseMaybeUnary()\n return this.finishNode(node, \"AwaitExpression\")\n}\n","// Acorn: Loose parser\n//\n// This module provides an alternative parser that exposes that same\n// interface as the main module's `parse` function, but will try to\n// parse anything as JavaScript, repairing syntax error the best it\n// can. There are circumstances in which it will raise an error and\n// give up, but they are very rare. The resulting AST will be a mostly\n// valid JavaScript AST (as per the [Mozilla parser API][api], except\n// that:\n//\n// - Return outside functions is allowed\n//\n// - Label consistency (no conflicts, break only to existing labels)\n// is not enforced.\n//\n// - Bogus Identifier nodes with a name of `\"✖\"` are inserted whenever\n// the parser got too confused to return anything meaningful.\n//\n// [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API\n//\n// The expected use for this is to *first* try `acorn.parse`, and only\n// if that fails switch to the loose parser. The loose parser might\n// parse badly indented code incorrectly, so **don't** use it as your\n// default parser.\n//\n// Quite a lot of acorn.js is duplicated here. The alternative was to\n// add a *lot* of extra cruft to that file, making it less readable\n// and slower. Copying and editing the code allowed me to make\n// invasive changes and simplifications without creating a complicated\n// tangle.\n\nimport {defaultOptions} from \"acorn\"\nimport {LooseParser} from \"./state\"\nimport \"./tokenize\"\nimport \"./statement\"\nimport \"./expression\"\n\nexport {LooseParser} from \"./state\"\n\ndefaultOptions.tabSize = 4\n\nexport function parse(input, options) {\n return LooseParser.parse(input, options)\n}\n"],"names":["tt","SourceLocation","Node","lineBreak","let","this","isNewLine","Parser","const","Token","getLineInfo","lineBreakG","lp","init","decl","elt","node","defaultOptions"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/acorn/acorn-loose/dist/acorn-loose.mjs b/node_modules/acorn/acorn-loose/dist/acorn-loose.mjs new file mode 100644 index 00000000..2f7c698d --- /dev/null +++ b/node_modules/acorn/acorn-loose/dist/acorn-loose.mjs @@ -0,0 +1,1363 @@ +import { tokTypes, SourceLocation, Node, lineBreak, isNewLine, Parser, Token, getLineInfo, lineBreakG, defaultOptions } from 'acorn'; + +function noop() {} + +var LooseParser = function LooseParser(input, options) { + if ( options === void 0 ) options = {}; + + this.toks = this.constructor.BaseParser.tokenizer(input, options); + this.options = this.toks.options; + this.input = this.toks.input; + this.tok = this.last = {type: tokTypes.eof, start: 0, end: 0}; + this.tok.validateRegExpFlags = noop; + this.tok.validateRegExpPattern = noop; + if (this.options.locations) { + var here = this.toks.curPosition(); + this.tok.loc = new SourceLocation(this.toks, here, here); + } + this.ahead = []; // Tokens ahead + this.context = []; // Indentation contexted + this.curIndent = 0; + this.curLineStart = 0; + this.nextLineStart = this.lineEnd(this.curLineStart) + 1; + this.inAsync = false; + this.inFunction = false; +}; + +LooseParser.prototype.startNode = function startNode () { + return new Node(this.toks, this.tok.start, this.options.locations ? this.tok.loc.start : null) +}; + +LooseParser.prototype.storeCurrentPos = function storeCurrentPos () { + return this.options.locations ? [this.tok.start, this.tok.loc.start] : this.tok.start +}; + +LooseParser.prototype.startNodeAt = function startNodeAt (pos) { + if (this.options.locations) { + return new Node(this.toks, pos[0], pos[1]) + } else { + return new Node(this.toks, pos) + } +}; + +LooseParser.prototype.finishNode = function finishNode (node, type) { + node.type = type; + node.end = this.last.end; + if (this.options.locations) + { node.loc.end = this.last.loc.end; } + if (this.options.ranges) + { node.range[1] = this.last.end; } + return node +}; + +LooseParser.prototype.dummyNode = function dummyNode (type) { + var dummy = this.startNode(); + dummy.type = type; + dummy.end = dummy.start; + if (this.options.locations) + { dummy.loc.end = dummy.loc.start; } + if (this.options.ranges) + { dummy.range[1] = dummy.start; } + this.last = {type: tokTypes.name, start: dummy.start, end: dummy.start, loc: dummy.loc}; + return dummy +}; + +LooseParser.prototype.dummyIdent = function dummyIdent () { + var dummy = this.dummyNode("Identifier"); + dummy.name = "✖"; + return dummy +}; + +LooseParser.prototype.dummyString = function dummyString () { + var dummy = this.dummyNode("Literal"); + dummy.value = dummy.raw = "✖"; + return dummy +}; + +LooseParser.prototype.eat = function eat (type) { + if (this.tok.type === type) { + this.next(); + return true + } else { + return false + } +}; + +LooseParser.prototype.isContextual = function isContextual (name) { + return this.tok.type === tokTypes.name && this.tok.value === name +}; + +LooseParser.prototype.eatContextual = function eatContextual (name) { + return this.tok.value === name && this.eat(tokTypes.name) +}; + +LooseParser.prototype.canInsertSemicolon = function canInsertSemicolon () { + return this.tok.type === tokTypes.eof || this.tok.type === tokTypes.braceR || + lineBreak.test(this.input.slice(this.last.end, this.tok.start)) +}; + +LooseParser.prototype.semicolon = function semicolon () { + return this.eat(tokTypes.semi) +}; + +LooseParser.prototype.expect = function expect (type) { + if (this.eat(type)) { return true } + for (var i = 1; i <= 2; i++) { + if (this.lookAhead(i).type === type) { + for (var j = 0; j < i; j++) { this.next(); } + return true + } + } +}; + +LooseParser.prototype.pushCx = function pushCx () { + this.context.push(this.curIndent); +}; + +LooseParser.prototype.popCx = function popCx () { + this.curIndent = this.context.pop(); +}; + +LooseParser.prototype.lineEnd = function lineEnd (pos) { + while (pos < this.input.length && !isNewLine(this.input.charCodeAt(pos))) { ++pos; } + return pos +}; + +LooseParser.prototype.indentationAfter = function indentationAfter (pos) { + for (var count = 0;; ++pos) { + var ch = this.input.charCodeAt(pos); + if (ch === 32) { ++count; } + else if (ch === 9) { count += this.options.tabSize; } + else { return count } + } +}; + +LooseParser.prototype.closes = function closes (closeTok, indent, line, blockHeuristic) { + if (this.tok.type === closeTok || this.tok.type === tokTypes.eof) { return true } + return line !== this.curLineStart && this.curIndent < indent && this.tokenStartsLine() && + (!blockHeuristic || this.nextLineStart >= this.input.length || + this.indentationAfter(this.nextLineStart) < indent) +}; + +LooseParser.prototype.tokenStartsLine = function tokenStartsLine () { + for (var p = this.tok.start - 1; p >= this.curLineStart; --p) { + var ch = this.input.charCodeAt(p); + if (ch !== 9 && ch !== 32) { return false } + } + return true +}; + +LooseParser.prototype.extend = function extend (name, f) { + this[name] = f(this[name]); +}; + +LooseParser.prototype.parse = function parse () { + this.next(); + return this.parseTopLevel() +}; + +LooseParser.extend = function extend () { + var plugins = [], len = arguments.length; + while ( len-- ) plugins[ len ] = arguments[ len ]; + + var cls = this; + for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); } + return cls +}; + +LooseParser.parse = function parse (input, options) { + return new this(input, options).parse() +}; + +// Allows plugins to extend the base parser / tokenizer used +LooseParser.BaseParser = Parser; + +var lp = LooseParser.prototype; + +function isSpace(ch) { + return (ch < 14 && ch > 8) || ch === 32 || ch === 160 || isNewLine(ch) +} + +lp.next = function() { + this.last = this.tok; + if (this.ahead.length) + { this.tok = this.ahead.shift(); } + else + { this.tok = this.readToken(); } + + if (this.tok.start >= this.nextLineStart) { + while (this.tok.start >= this.nextLineStart) { + this.curLineStart = this.nextLineStart; + this.nextLineStart = this.lineEnd(this.curLineStart) + 1; + } + this.curIndent = this.indentationAfter(this.curLineStart); + } +}; + +lp.readToken = function() { + for (;;) { + try { + this.toks.next(); + if (this.toks.type === tokTypes.dot && + this.input.substr(this.toks.end, 1) === "." && + this.options.ecmaVersion >= 6) { + this.toks.end++; + this.toks.type = tokTypes.ellipsis; + } + return new Token(this.toks) + } catch (e) { + if (!(e instanceof SyntaxError)) { throw e } + + // Try to skip some text, based on the error message, and then continue + var msg = e.message, pos = e.raisedAt, replace = true; + if (/unterminated/i.test(msg)) { + pos = this.lineEnd(e.pos + 1); + if (/string/.test(msg)) { + replace = {start: e.pos, end: pos, type: tokTypes.string, value: this.input.slice(e.pos + 1, pos)}; + } else if (/regular expr/i.test(msg)) { + var re = this.input.slice(e.pos, pos); + try { re = new RegExp(re); } catch (e) { /* ignore compilation error due to new syntax */ } + replace = {start: e.pos, end: pos, type: tokTypes.regexp, value: re}; + } else if (/template/.test(msg)) { + replace = { + start: e.pos, + end: pos, + type: tokTypes.template, + value: this.input.slice(e.pos, pos) + }; + } else { + replace = false; + } + } else if (/invalid (unicode|regexp|number)|expecting unicode|octal literal|is reserved|directly after number|expected number in radix/i.test(msg)) { + while (pos < this.input.length && !isSpace(this.input.charCodeAt(pos))) { ++pos; } + } else if (/character escape|expected hexadecimal/i.test(msg)) { + while (pos < this.input.length) { + var ch = this.input.charCodeAt(pos++); + if (ch === 34 || ch === 39 || isNewLine(ch)) { break } + } + } else if (/unexpected character/i.test(msg)) { + pos++; + replace = false; + } else if (/regular expression/i.test(msg)) { + replace = true; + } else { + throw e + } + this.resetTo(pos); + if (replace === true) { replace = {start: pos, end: pos, type: tokTypes.name, value: "✖"}; } + if (replace) { + if (this.options.locations) + { replace.loc = new SourceLocation( + this.toks, + getLineInfo(this.input, replace.start), + getLineInfo(this.input, replace.end)); } + return replace + } + } + } +}; + +lp.resetTo = function(pos) { + this.toks.pos = pos; + var ch = this.input.charAt(pos - 1); + this.toks.exprAllowed = !ch || /[[{(,;:?/*=+\-~!|&%^<>]/.test(ch) || + /[enwfd]/.test(ch) && + /\b(case|else|return|throw|new|in|(instance|type)?of|delete|void)$/.test(this.input.slice(pos - 10, pos)); + + if (this.options.locations) { + this.toks.curLine = 1; + this.toks.lineStart = lineBreakG.lastIndex = 0; + var match; + while ((match = lineBreakG.exec(this.input)) && match.index < pos) { + ++this.toks.curLine; + this.toks.lineStart = match.index + match[0].length; + } + } +}; + +lp.lookAhead = function(n) { + while (n > this.ahead.length) + { this.ahead.push(this.readToken()); } + return this.ahead[n - 1] +}; + +function isDummy(node) { return node.name === "✖" } + +var lp$1 = LooseParser.prototype; + +lp$1.parseTopLevel = function() { + var node = this.startNodeAt(this.options.locations ? [0, getLineInfo(this.input, 0)] : 0); + node.body = []; + while (this.tok.type !== tokTypes.eof) { node.body.push(this.parseStatement()); } + this.toks.adaptDirectivePrologue(node.body); + this.last = this.tok; + node.sourceType = this.options.sourceType; + return this.finishNode(node, "Program") +}; + +lp$1.parseStatement = function() { + var starttype = this.tok.type, node = this.startNode(), kind; + + if (this.toks.isLet()) { + starttype = tokTypes._var; + kind = "let"; + } + + switch (starttype) { + case tokTypes._break: case tokTypes._continue: + this.next(); + var isBreak = starttype === tokTypes._break; + if (this.semicolon() || this.canInsertSemicolon()) { + node.label = null; + } else { + node.label = this.tok.type === tokTypes.name ? this.parseIdent() : null; + this.semicolon(); + } + return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement") + + case tokTypes._debugger: + this.next(); + this.semicolon(); + return this.finishNode(node, "DebuggerStatement") + + case tokTypes._do: + this.next(); + node.body = this.parseStatement(); + node.test = this.eat(tokTypes._while) ? this.parseParenExpression() : this.dummyIdent(); + this.semicolon(); + return this.finishNode(node, "DoWhileStatement") + + case tokTypes._for: + this.next(); // `for` keyword + var isAwait = this.options.ecmaVersion >= 9 && this.inAsync && this.eatContextual("await"); + + this.pushCx(); + this.expect(tokTypes.parenL); + if (this.tok.type === tokTypes.semi) { return this.parseFor(node, null) } + var isLet = this.toks.isLet(); + if (isLet || this.tok.type === tokTypes._var || this.tok.type === tokTypes._const) { + var init$1 = this.parseVar(this.startNode(), true, isLet ? "let" : this.tok.value); + if (init$1.declarations.length === 1 && (this.tok.type === tokTypes._in || this.isContextual("of"))) { + if (this.options.ecmaVersion >= 9 && this.tok.type !== tokTypes._in) { + node.await = isAwait; + } + return this.parseForIn(node, init$1) + } + return this.parseFor(node, init$1) + } + var init = this.parseExpression(true); + if (this.tok.type === tokTypes._in || this.isContextual("of")) { + if (this.options.ecmaVersion >= 9 && this.tok.type !== tokTypes._in) { + node.await = isAwait; + } + return this.parseForIn(node, this.toAssignable(init)) + } + return this.parseFor(node, init) + + case tokTypes._function: + this.next(); + return this.parseFunction(node, true) + + case tokTypes._if: + this.next(); + node.test = this.parseParenExpression(); + node.consequent = this.parseStatement(); + node.alternate = this.eat(tokTypes._else) ? this.parseStatement() : null; + return this.finishNode(node, "IfStatement") + + case tokTypes._return: + this.next(); + if (this.eat(tokTypes.semi) || this.canInsertSemicolon()) { node.argument = null; } + else { node.argument = this.parseExpression(); this.semicolon(); } + return this.finishNode(node, "ReturnStatement") + + case tokTypes._switch: + var blockIndent = this.curIndent, line = this.curLineStart; + this.next(); + node.discriminant = this.parseParenExpression(); + node.cases = []; + this.pushCx(); + this.expect(tokTypes.braceL); + + var cur; + while (!this.closes(tokTypes.braceR, blockIndent, line, true)) { + if (this.tok.type === tokTypes._case || this.tok.type === tokTypes._default) { + var isCase = this.tok.type === tokTypes._case; + if (cur) { this.finishNode(cur, "SwitchCase"); } + node.cases.push(cur = this.startNode()); + cur.consequent = []; + this.next(); + if (isCase) { cur.test = this.parseExpression(); } + else { cur.test = null; } + this.expect(tokTypes.colon); + } else { + if (!cur) { + node.cases.push(cur = this.startNode()); + cur.consequent = []; + cur.test = null; + } + cur.consequent.push(this.parseStatement()); + } + } + if (cur) { this.finishNode(cur, "SwitchCase"); } + this.popCx(); + this.eat(tokTypes.braceR); + return this.finishNode(node, "SwitchStatement") + + case tokTypes._throw: + this.next(); + node.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ThrowStatement") + + case tokTypes._try: + this.next(); + node.block = this.parseBlock(); + node.handler = null; + if (this.tok.type === tokTypes._catch) { + var clause = this.startNode(); + this.next(); + if (this.eat(tokTypes.parenL)) { + clause.param = this.toAssignable(this.parseExprAtom(), true); + this.expect(tokTypes.parenR); + } else { + clause.param = null; + } + clause.body = this.parseBlock(); + node.handler = this.finishNode(clause, "CatchClause"); + } + node.finalizer = this.eat(tokTypes._finally) ? this.parseBlock() : null; + if (!node.handler && !node.finalizer) { return node.block } + return this.finishNode(node, "TryStatement") + + case tokTypes._var: + case tokTypes._const: + return this.parseVar(node, false, kind || this.tok.value) + + case tokTypes._while: + this.next(); + node.test = this.parseParenExpression(); + node.body = this.parseStatement(); + return this.finishNode(node, "WhileStatement") + + case tokTypes._with: + this.next(); + node.object = this.parseParenExpression(); + node.body = this.parseStatement(); + return this.finishNode(node, "WithStatement") + + case tokTypes.braceL: + return this.parseBlock() + + case tokTypes.semi: + this.next(); + return this.finishNode(node, "EmptyStatement") + + case tokTypes._class: + return this.parseClass(true) + + case tokTypes._import: + if (this.options.ecmaVersion > 10 && this.lookAhead(1).type === tokTypes.parenL) { + node.expression = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ExpressionStatement") + } + + return this.parseImport() + + case tokTypes._export: + return this.parseExport() + + default: + if (this.toks.isAsyncFunction()) { + this.next(); + this.next(); + return this.parseFunction(node, true, true) + } + var expr = this.parseExpression(); + if (isDummy(expr)) { + this.next(); + if (this.tok.type === tokTypes.eof) { return this.finishNode(node, "EmptyStatement") } + return this.parseStatement() + } else if (starttype === tokTypes.name && expr.type === "Identifier" && this.eat(tokTypes.colon)) { + node.body = this.parseStatement(); + node.label = expr; + return this.finishNode(node, "LabeledStatement") + } else { + node.expression = expr; + this.semicolon(); + return this.finishNode(node, "ExpressionStatement") + } + } +}; + +lp$1.parseBlock = function() { + var node = this.startNode(); + this.pushCx(); + this.expect(tokTypes.braceL); + var blockIndent = this.curIndent, line = this.curLineStart; + node.body = []; + while (!this.closes(tokTypes.braceR, blockIndent, line, true)) + { node.body.push(this.parseStatement()); } + this.popCx(); + this.eat(tokTypes.braceR); + return this.finishNode(node, "BlockStatement") +}; + +lp$1.parseFor = function(node, init) { + node.init = init; + node.test = node.update = null; + if (this.eat(tokTypes.semi) && this.tok.type !== tokTypes.semi) { node.test = this.parseExpression(); } + if (this.eat(tokTypes.semi) && this.tok.type !== tokTypes.parenR) { node.update = this.parseExpression(); } + this.popCx(); + this.expect(tokTypes.parenR); + node.body = this.parseStatement(); + return this.finishNode(node, "ForStatement") +}; + +lp$1.parseForIn = function(node, init) { + var type = this.tok.type === tokTypes._in ? "ForInStatement" : "ForOfStatement"; + this.next(); + node.left = init; + node.right = this.parseExpression(); + this.popCx(); + this.expect(tokTypes.parenR); + node.body = this.parseStatement(); + return this.finishNode(node, type) +}; + +lp$1.parseVar = function(node, noIn, kind) { + node.kind = kind; + this.next(); + node.declarations = []; + do { + var decl = this.startNode(); + decl.id = this.options.ecmaVersion >= 6 ? this.toAssignable(this.parseExprAtom(), true) : this.parseIdent(); + decl.init = this.eat(tokTypes.eq) ? this.parseMaybeAssign(noIn) : null; + node.declarations.push(this.finishNode(decl, "VariableDeclarator")); + } while (this.eat(tokTypes.comma)) + if (!node.declarations.length) { + var decl$1 = this.startNode(); + decl$1.id = this.dummyIdent(); + node.declarations.push(this.finishNode(decl$1, "VariableDeclarator")); + } + if (!noIn) { this.semicolon(); } + return this.finishNode(node, "VariableDeclaration") +}; + +lp$1.parseClass = function(isStatement) { + var node = this.startNode(); + this.next(); + if (this.tok.type === tokTypes.name) { node.id = this.parseIdent(); } + else if (isStatement === true) { node.id = this.dummyIdent(); } + else { node.id = null; } + node.superClass = this.eat(tokTypes._extends) ? this.parseExpression() : null; + node.body = this.startNode(); + node.body.body = []; + this.pushCx(); + var indent = this.curIndent + 1, line = this.curLineStart; + this.eat(tokTypes.braceL); + if (this.curIndent + 1 < indent) { indent = this.curIndent; line = this.curLineStart; } + while (!this.closes(tokTypes.braceR, indent, line)) { + if (this.semicolon()) { continue } + var method = this.startNode(), isGenerator = (void 0), isAsync = (void 0); + if (this.options.ecmaVersion >= 6) { + method.static = false; + isGenerator = this.eat(tokTypes.star); + } + this.parsePropertyName(method); + if (isDummy(method.key)) { if (isDummy(this.parseMaybeAssign())) { this.next(); } this.eat(tokTypes.comma); continue } + if (method.key.type === "Identifier" && !method.computed && method.key.name === "static" && + (this.tok.type !== tokTypes.parenL && this.tok.type !== tokTypes.braceL)) { + method.static = true; + isGenerator = this.eat(tokTypes.star); + this.parsePropertyName(method); + } else { + method.static = false; + } + if (!method.computed && + method.key.type === "Identifier" && method.key.name === "async" && this.tok.type !== tokTypes.parenL && + !this.canInsertSemicolon()) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(tokTypes.star); + this.parsePropertyName(method); + } else { + isAsync = false; + } + if (this.options.ecmaVersion >= 5 && method.key.type === "Identifier" && + !method.computed && (method.key.name === "get" || method.key.name === "set") && + this.tok.type !== tokTypes.parenL && this.tok.type !== tokTypes.braceL) { + method.kind = method.key.name; + this.parsePropertyName(method); + method.value = this.parseMethod(false); + } else { + if (!method.computed && !method.static && !isGenerator && !isAsync && ( + method.key.type === "Identifier" && method.key.name === "constructor" || + method.key.type === "Literal" && method.key.value === "constructor")) { + method.kind = "constructor"; + } else { + method.kind = "method"; + } + method.value = this.parseMethod(isGenerator, isAsync); + } + node.body.body.push(this.finishNode(method, "MethodDefinition")); + } + this.popCx(); + if (!this.eat(tokTypes.braceR)) { + // If there is no closing brace, make the node span to the start + // of the next token (this is useful for Tern) + this.last.end = this.tok.start; + if (this.options.locations) { this.last.loc.end = this.tok.loc.start; } + } + this.semicolon(); + this.finishNode(node.body, "ClassBody"); + return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression") +}; + +lp$1.parseFunction = function(node, isStatement, isAsync) { + var oldInAsync = this.inAsync, oldInFunction = this.inFunction; + this.initFunction(node); + if (this.options.ecmaVersion >= 6) { + node.generator = this.eat(tokTypes.star); + } + if (this.options.ecmaVersion >= 8) { + node.async = !!isAsync; + } + if (this.tok.type === tokTypes.name) { node.id = this.parseIdent(); } + else if (isStatement === true) { node.id = this.dummyIdent(); } + this.inAsync = node.async; + this.inFunction = true; + node.params = this.parseFunctionParams(); + node.body = this.parseBlock(); + this.toks.adaptDirectivePrologue(node.body.body); + this.inAsync = oldInAsync; + this.inFunction = oldInFunction; + return this.finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression") +}; + +lp$1.parseExport = function() { + var node = this.startNode(); + this.next(); + if (this.eat(tokTypes.star)) { + node.source = this.eatContextual("from") ? this.parseExprAtom() : this.dummyString(); + return this.finishNode(node, "ExportAllDeclaration") + } + if (this.eat(tokTypes._default)) { + // export default (function foo() {}) // This is FunctionExpression. + var isAsync; + if (this.tok.type === tokTypes._function || (isAsync = this.toks.isAsyncFunction())) { + var fNode = this.startNode(); + this.next(); + if (isAsync) { this.next(); } + node.declaration = this.parseFunction(fNode, "nullableID", isAsync); + } else if (this.tok.type === tokTypes._class) { + node.declaration = this.parseClass("nullableID"); + } else { + node.declaration = this.parseMaybeAssign(); + this.semicolon(); + } + return this.finishNode(node, "ExportDefaultDeclaration") + } + if (this.tok.type.keyword || this.toks.isLet() || this.toks.isAsyncFunction()) { + node.declaration = this.parseStatement(); + node.specifiers = []; + node.source = null; + } else { + node.declaration = null; + node.specifiers = this.parseExportSpecifierList(); + node.source = this.eatContextual("from") ? this.parseExprAtom() : null; + this.semicolon(); + } + return this.finishNode(node, "ExportNamedDeclaration") +}; + +lp$1.parseImport = function() { + var node = this.startNode(); + this.next(); + if (this.tok.type === tokTypes.string) { + node.specifiers = []; + node.source = this.parseExprAtom(); + } else { + var elt; + if (this.tok.type === tokTypes.name && this.tok.value !== "from") { + elt = this.startNode(); + elt.local = this.parseIdent(); + this.finishNode(elt, "ImportDefaultSpecifier"); + this.eat(tokTypes.comma); + } + node.specifiers = this.parseImportSpecifiers(); + node.source = this.eatContextual("from") && this.tok.type === tokTypes.string ? this.parseExprAtom() : this.dummyString(); + if (elt) { node.specifiers.unshift(elt); } + } + this.semicolon(); + return this.finishNode(node, "ImportDeclaration") +}; + +lp$1.parseImportSpecifiers = function() { + var elts = []; + if (this.tok.type === tokTypes.star) { + var elt = this.startNode(); + this.next(); + elt.local = this.eatContextual("as") ? this.parseIdent() : this.dummyIdent(); + elts.push(this.finishNode(elt, "ImportNamespaceSpecifier")); + } else { + var indent = this.curIndent, line = this.curLineStart, continuedLine = this.nextLineStart; + this.pushCx(); + this.eat(tokTypes.braceL); + if (this.curLineStart > continuedLine) { continuedLine = this.curLineStart; } + while (!this.closes(tokTypes.braceR, indent + (this.curLineStart <= continuedLine ? 1 : 0), line)) { + var elt$1 = this.startNode(); + if (this.eat(tokTypes.star)) { + elt$1.local = this.eatContextual("as") ? this.parseIdent() : this.dummyIdent(); + this.finishNode(elt$1, "ImportNamespaceSpecifier"); + } else { + if (this.isContextual("from")) { break } + elt$1.imported = this.parseIdent(); + if (isDummy(elt$1.imported)) { break } + elt$1.local = this.eatContextual("as") ? this.parseIdent() : elt$1.imported; + this.finishNode(elt$1, "ImportSpecifier"); + } + elts.push(elt$1); + this.eat(tokTypes.comma); + } + this.eat(tokTypes.braceR); + this.popCx(); + } + return elts +}; + +lp$1.parseExportSpecifierList = function() { + var elts = []; + var indent = this.curIndent, line = this.curLineStart, continuedLine = this.nextLineStart; + this.pushCx(); + this.eat(tokTypes.braceL); + if (this.curLineStart > continuedLine) { continuedLine = this.curLineStart; } + while (!this.closes(tokTypes.braceR, indent + (this.curLineStart <= continuedLine ? 1 : 0), line)) { + if (this.isContextual("from")) { break } + var elt = this.startNode(); + elt.local = this.parseIdent(); + if (isDummy(elt.local)) { break } + elt.exported = this.eatContextual("as") ? this.parseIdent() : elt.local; + this.finishNode(elt, "ExportSpecifier"); + elts.push(elt); + this.eat(tokTypes.comma); + } + this.eat(tokTypes.braceR); + this.popCx(); + return elts +}; + +var lp$2 = LooseParser.prototype; + +lp$2.checkLVal = function(expr) { + if (!expr) { return expr } + switch (expr.type) { + case "Identifier": + case "MemberExpression": + return expr + + case "ParenthesizedExpression": + expr.expression = this.checkLVal(expr.expression); + return expr + + default: + return this.dummyIdent() + } +}; + +lp$2.parseExpression = function(noIn) { + var start = this.storeCurrentPos(); + var expr = this.parseMaybeAssign(noIn); + if (this.tok.type === tokTypes.comma) { + var node = this.startNodeAt(start); + node.expressions = [expr]; + while (this.eat(tokTypes.comma)) { node.expressions.push(this.parseMaybeAssign(noIn)); } + return this.finishNode(node, "SequenceExpression") + } + return expr +}; + +lp$2.parseParenExpression = function() { + this.pushCx(); + this.expect(tokTypes.parenL); + var val = this.parseExpression(); + this.popCx(); + this.expect(tokTypes.parenR); + return val +}; + +lp$2.parseMaybeAssign = function(noIn) { + if (this.toks.isContextual("yield")) { + var node = this.startNode(); + this.next(); + if (this.semicolon() || this.canInsertSemicolon() || (this.tok.type !== tokTypes.star && !this.tok.type.startsExpr)) { + node.delegate = false; + node.argument = null; + } else { + node.delegate = this.eat(tokTypes.star); + node.argument = this.parseMaybeAssign(); + } + return this.finishNode(node, "YieldExpression") + } + + var start = this.storeCurrentPos(); + var left = this.parseMaybeConditional(noIn); + if (this.tok.type.isAssign) { + var node$1 = this.startNodeAt(start); + node$1.operator = this.tok.value; + node$1.left = this.tok.type === tokTypes.eq ? this.toAssignable(left) : this.checkLVal(left); + this.next(); + node$1.right = this.parseMaybeAssign(noIn); + return this.finishNode(node$1, "AssignmentExpression") + } + return left +}; + +lp$2.parseMaybeConditional = function(noIn) { + var start = this.storeCurrentPos(); + var expr = this.parseExprOps(noIn); + if (this.eat(tokTypes.question)) { + var node = this.startNodeAt(start); + node.test = expr; + node.consequent = this.parseMaybeAssign(); + node.alternate = this.expect(tokTypes.colon) ? this.parseMaybeAssign(noIn) : this.dummyIdent(); + return this.finishNode(node, "ConditionalExpression") + } + return expr +}; + +lp$2.parseExprOps = function(noIn) { + var start = this.storeCurrentPos(); + var indent = this.curIndent, line = this.curLineStart; + return this.parseExprOp(this.parseMaybeUnary(false), start, -1, noIn, indent, line) +}; + +lp$2.parseExprOp = function(left, start, minPrec, noIn, indent, line) { + if (this.curLineStart !== line && this.curIndent < indent && this.tokenStartsLine()) { return left } + var prec = this.tok.type.binop; + if (prec != null && (!noIn || this.tok.type !== tokTypes._in)) { + if (prec > minPrec) { + var node = this.startNodeAt(start); + node.left = left; + node.operator = this.tok.value; + this.next(); + if (this.curLineStart !== line && this.curIndent < indent && this.tokenStartsLine()) { + node.right = this.dummyIdent(); + } else { + var rightStart = this.storeCurrentPos(); + node.right = this.parseExprOp(this.parseMaybeUnary(false), rightStart, prec, noIn, indent, line); + } + this.finishNode(node, /&&|\|\|/.test(node.operator) ? "LogicalExpression" : "BinaryExpression"); + return this.parseExprOp(node, start, minPrec, noIn, indent, line) + } + } + return left +}; + +lp$2.parseMaybeUnary = function(sawUnary) { + var start = this.storeCurrentPos(), expr; + if (this.options.ecmaVersion >= 8 && this.toks.isContextual("await") && + (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction)) + ) { + expr = this.parseAwait(); + sawUnary = true; + } else if (this.tok.type.prefix) { + var node = this.startNode(), update = this.tok.type === tokTypes.incDec; + if (!update) { sawUnary = true; } + node.operator = this.tok.value; + node.prefix = true; + this.next(); + node.argument = this.parseMaybeUnary(true); + if (update) { node.argument = this.checkLVal(node.argument); } + expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression"); + } else if (this.tok.type === tokTypes.ellipsis) { + var node$1 = this.startNode(); + this.next(); + node$1.argument = this.parseMaybeUnary(sawUnary); + expr = this.finishNode(node$1, "SpreadElement"); + } else { + expr = this.parseExprSubscripts(); + while (this.tok.type.postfix && !this.canInsertSemicolon()) { + var node$2 = this.startNodeAt(start); + node$2.operator = this.tok.value; + node$2.prefix = false; + node$2.argument = this.checkLVal(expr); + this.next(); + expr = this.finishNode(node$2, "UpdateExpression"); + } + } + + if (!sawUnary && this.eat(tokTypes.starstar)) { + var node$3 = this.startNodeAt(start); + node$3.operator = "**"; + node$3.left = expr; + node$3.right = this.parseMaybeUnary(false); + return this.finishNode(node$3, "BinaryExpression") + } + + return expr +}; + +lp$2.parseExprSubscripts = function() { + var start = this.storeCurrentPos(); + return this.parseSubscripts(this.parseExprAtom(), start, false, this.curIndent, this.curLineStart) +}; + +lp$2.parseSubscripts = function(base, start, noCalls, startIndent, line) { + for (;;) { + if (this.curLineStart !== line && this.curIndent <= startIndent && this.tokenStartsLine()) { + if (this.tok.type === tokTypes.dot && this.curIndent === startIndent) + { --startIndent; } + else + { return base } + } + + var maybeAsyncArrow = base.type === "Identifier" && base.name === "async" && !this.canInsertSemicolon(); + + if (this.eat(tokTypes.dot)) { + var node = this.startNodeAt(start); + node.object = base; + if (this.curLineStart !== line && this.curIndent <= startIndent && this.tokenStartsLine()) + { node.property = this.dummyIdent(); } + else + { node.property = this.parsePropertyAccessor() || this.dummyIdent(); } + node.computed = false; + base = this.finishNode(node, "MemberExpression"); + } else if (this.tok.type === tokTypes.bracketL) { + this.pushCx(); + this.next(); + var node$1 = this.startNodeAt(start); + node$1.object = base; + node$1.property = this.parseExpression(); + node$1.computed = true; + this.popCx(); + this.expect(tokTypes.bracketR); + base = this.finishNode(node$1, "MemberExpression"); + } else if (!noCalls && this.tok.type === tokTypes.parenL) { + var exprList = this.parseExprList(tokTypes.parenR); + if (maybeAsyncArrow && this.eat(tokTypes.arrow)) + { return this.parseArrowExpression(this.startNodeAt(start), exprList, true) } + var node$2 = this.startNodeAt(start); + node$2.callee = base; + node$2.arguments = exprList; + base = this.finishNode(node$2, "CallExpression"); + } else if (this.tok.type === tokTypes.backQuote) { + var node$3 = this.startNodeAt(start); + node$3.tag = base; + node$3.quasi = this.parseTemplate(); + base = this.finishNode(node$3, "TaggedTemplateExpression"); + } else { + return base + } + } +}; + +lp$2.parseExprAtom = function() { + var node; + switch (this.tok.type) { + case tokTypes._this: + case tokTypes._super: + var type = this.tok.type === tokTypes._this ? "ThisExpression" : "Super"; + node = this.startNode(); + this.next(); + return this.finishNode(node, type) + + case tokTypes.name: + var start = this.storeCurrentPos(); + var id = this.parseIdent(); + var isAsync = false; + if (id.name === "async" && !this.canInsertSemicolon()) { + if (this.eat(tokTypes._function)) + { return this.parseFunction(this.startNodeAt(start), false, true) } + if (this.tok.type === tokTypes.name) { + id = this.parseIdent(); + isAsync = true; + } + } + return this.eat(tokTypes.arrow) ? this.parseArrowExpression(this.startNodeAt(start), [id], isAsync) : id + + case tokTypes.regexp: + node = this.startNode(); + var val = this.tok.value; + node.regex = {pattern: val.pattern, flags: val.flags}; + node.value = val.value; + node.raw = this.input.slice(this.tok.start, this.tok.end); + this.next(); + return this.finishNode(node, "Literal") + + case tokTypes.num: case tokTypes.string: + node = this.startNode(); + node.value = this.tok.value; + node.raw = this.input.slice(this.tok.start, this.tok.end); + if (this.tok.type === tokTypes.num && node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1); } + this.next(); + return this.finishNode(node, "Literal") + + case tokTypes._null: case tokTypes._true: case tokTypes._false: + node = this.startNode(); + node.value = this.tok.type === tokTypes._null ? null : this.tok.type === tokTypes._true; + node.raw = this.tok.type.keyword; + this.next(); + return this.finishNode(node, "Literal") + + case tokTypes.parenL: + var parenStart = this.storeCurrentPos(); + this.next(); + var inner = this.parseExpression(); + this.expect(tokTypes.parenR); + if (this.eat(tokTypes.arrow)) { + // (a,)=>a // SequenceExpression makes dummy in the last hole. Drop the dummy. + var params = inner.expressions || [inner]; + if (params.length && isDummy(params[params.length - 1])) + { params.pop(); } + return this.parseArrowExpression(this.startNodeAt(parenStart), params) + } + if (this.options.preserveParens) { + var par = this.startNodeAt(parenStart); + par.expression = inner; + inner = this.finishNode(par, "ParenthesizedExpression"); + } + return inner + + case tokTypes.bracketL: + node = this.startNode(); + node.elements = this.parseExprList(tokTypes.bracketR, true); + return this.finishNode(node, "ArrayExpression") + + case tokTypes.braceL: + return this.parseObj() + + case tokTypes._class: + return this.parseClass(false) + + case tokTypes._function: + node = this.startNode(); + this.next(); + return this.parseFunction(node, false) + + case tokTypes._new: + return this.parseNew() + + case tokTypes.backQuote: + return this.parseTemplate() + + case tokTypes._import: + if (this.options.ecmaVersion > 10) { + return this.parseDynamicImport() + } else { + return this.dummyIdent() + } + + default: + return this.dummyIdent() + } +}; + +lp$2.parseDynamicImport = function() { + var node = this.startNode(); + this.next(); + return this.finishNode(node, "Import") +}; + +lp$2.parseNew = function() { + var node = this.startNode(), startIndent = this.curIndent, line = this.curLineStart; + var meta = this.parseIdent(true); + if (this.options.ecmaVersion >= 6 && this.eat(tokTypes.dot)) { + node.meta = meta; + node.property = this.parseIdent(true); + return this.finishNode(node, "MetaProperty") + } + var start = this.storeCurrentPos(); + node.callee = this.parseSubscripts(this.parseExprAtom(), start, true, startIndent, line); + if (this.tok.type === tokTypes.parenL) { + node.arguments = this.parseExprList(tokTypes.parenR); + } else { + node.arguments = []; + } + return this.finishNode(node, "NewExpression") +}; + +lp$2.parseTemplateElement = function() { + var elem = this.startNode(); + + // The loose parser accepts invalid unicode escapes even in untagged templates. + if (this.tok.type === tokTypes.invalidTemplate) { + elem.value = { + raw: this.tok.value, + cooked: null + }; + } else { + elem.value = { + raw: this.input.slice(this.tok.start, this.tok.end).replace(/\r\n?/g, "\n"), + cooked: this.tok.value + }; + } + this.next(); + elem.tail = this.tok.type === tokTypes.backQuote; + return this.finishNode(elem, "TemplateElement") +}; + +lp$2.parseTemplate = function() { + var node = this.startNode(); + this.next(); + node.expressions = []; + var curElt = this.parseTemplateElement(); + node.quasis = [curElt]; + while (!curElt.tail) { + this.next(); + node.expressions.push(this.parseExpression()); + if (this.expect(tokTypes.braceR)) { + curElt = this.parseTemplateElement(); + } else { + curElt = this.startNode(); + curElt.value = {cooked: "", raw: ""}; + curElt.tail = true; + this.finishNode(curElt, "TemplateElement"); + } + node.quasis.push(curElt); + } + this.expect(tokTypes.backQuote); + return this.finishNode(node, "TemplateLiteral") +}; + +lp$2.parseObj = function() { + var node = this.startNode(); + node.properties = []; + this.pushCx(); + var indent = this.curIndent + 1, line = this.curLineStart; + this.eat(tokTypes.braceL); + if (this.curIndent + 1 < indent) { indent = this.curIndent; line = this.curLineStart; } + while (!this.closes(tokTypes.braceR, indent, line)) { + var prop = this.startNode(), isGenerator = (void 0), isAsync = (void 0), start = (void 0); + if (this.options.ecmaVersion >= 9 && this.eat(tokTypes.ellipsis)) { + prop.argument = this.parseMaybeAssign(); + node.properties.push(this.finishNode(prop, "SpreadElement")); + this.eat(tokTypes.comma); + continue + } + if (this.options.ecmaVersion >= 6) { + start = this.storeCurrentPos(); + prop.method = false; + prop.shorthand = false; + isGenerator = this.eat(tokTypes.star); + } + this.parsePropertyName(prop); + if (this.toks.isAsyncProp(prop)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(tokTypes.star); + this.parsePropertyName(prop); + } else { + isAsync = false; + } + if (isDummy(prop.key)) { if (isDummy(this.parseMaybeAssign())) { this.next(); } this.eat(tokTypes.comma); continue } + if (this.eat(tokTypes.colon)) { + prop.kind = "init"; + prop.value = this.parseMaybeAssign(); + } else if (this.options.ecmaVersion >= 6 && (this.tok.type === tokTypes.parenL || this.tok.type === tokTypes.braceL)) { + prop.kind = "init"; + prop.method = true; + prop.value = this.parseMethod(isGenerator, isAsync); + } else if (this.options.ecmaVersion >= 5 && prop.key.type === "Identifier" && + !prop.computed && (prop.key.name === "get" || prop.key.name === "set") && + (this.tok.type !== tokTypes.comma && this.tok.type !== tokTypes.braceR && this.tok.type !== tokTypes.eq)) { + prop.kind = prop.key.name; + this.parsePropertyName(prop); + prop.value = this.parseMethod(false); + } else { + prop.kind = "init"; + if (this.options.ecmaVersion >= 6) { + if (this.eat(tokTypes.eq)) { + var assign = this.startNodeAt(start); + assign.operator = "="; + assign.left = prop.key; + assign.right = this.parseMaybeAssign(); + prop.value = this.finishNode(assign, "AssignmentExpression"); + } else { + prop.value = prop.key; + } + } else { + prop.value = this.dummyIdent(); + } + prop.shorthand = true; + } + node.properties.push(this.finishNode(prop, "Property")); + this.eat(tokTypes.comma); + } + this.popCx(); + if (!this.eat(tokTypes.braceR)) { + // If there is no closing brace, make the node span to the start + // of the next token (this is useful for Tern) + this.last.end = this.tok.start; + if (this.options.locations) { this.last.loc.end = this.tok.loc.start; } + } + return this.finishNode(node, "ObjectExpression") +}; + +lp$2.parsePropertyName = function(prop) { + if (this.options.ecmaVersion >= 6) { + if (this.eat(tokTypes.bracketL)) { + prop.computed = true; + prop.key = this.parseExpression(); + this.expect(tokTypes.bracketR); + return + } else { + prop.computed = false; + } + } + var key = (this.tok.type === tokTypes.num || this.tok.type === tokTypes.string) ? this.parseExprAtom() : this.parseIdent(); + prop.key = key || this.dummyIdent(); +}; + +lp$2.parsePropertyAccessor = function() { + if (this.tok.type === tokTypes.name || this.tok.type.keyword) { return this.parseIdent() } +}; + +lp$2.parseIdent = function() { + var name = this.tok.type === tokTypes.name ? this.tok.value : this.tok.type.keyword; + if (!name) { return this.dummyIdent() } + var node = this.startNode(); + this.next(); + node.name = name; + return this.finishNode(node, "Identifier") +}; + +lp$2.initFunction = function(node) { + node.id = null; + node.params = []; + if (this.options.ecmaVersion >= 6) { + node.generator = false; + node.expression = false; + } + if (this.options.ecmaVersion >= 8) + { node.async = false; } +}; + +// Convert existing expression atom to assignable pattern +// if possible. + +lp$2.toAssignable = function(node, binding) { + if (!node || node.type === "Identifier" || (node.type === "MemberExpression" && !binding)) ; else if (node.type === "ParenthesizedExpression") { + this.toAssignable(node.expression, binding); + } else if (this.options.ecmaVersion < 6) { + return this.dummyIdent() + } else if (node.type === "ObjectExpression") { + node.type = "ObjectPattern"; + for (var i = 0, list = node.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this.toAssignable(prop, binding); + } + } else if (node.type === "ArrayExpression") { + node.type = "ArrayPattern"; + this.toAssignableList(node.elements, binding); + } else if (node.type === "Property") { + this.toAssignable(node.value, binding); + } else if (node.type === "SpreadElement") { + node.type = "RestElement"; + this.toAssignable(node.argument, binding); + } else if (node.type === "AssignmentExpression") { + node.type = "AssignmentPattern"; + delete node.operator; + } else { + return this.dummyIdent() + } + return node +}; + +lp$2.toAssignableList = function(exprList, binding) { + for (var i = 0, list = exprList; i < list.length; i += 1) + { + var expr = list[i]; + + this.toAssignable(expr, binding); + } + return exprList +}; + +lp$2.parseFunctionParams = function(params) { + params = this.parseExprList(tokTypes.parenR); + return this.toAssignableList(params, true) +}; + +lp$2.parseMethod = function(isGenerator, isAsync) { + var node = this.startNode(), oldInAsync = this.inAsync, oldInFunction = this.inFunction; + this.initFunction(node); + if (this.options.ecmaVersion >= 6) + { node.generator = !!isGenerator; } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + this.inAsync = node.async; + this.inFunction = true; + node.params = this.parseFunctionParams(); + node.body = this.parseBlock(); + this.toks.adaptDirectivePrologue(node.body.body); + this.inAsync = oldInAsync; + this.inFunction = oldInFunction; + return this.finishNode(node, "FunctionExpression") +}; + +lp$2.parseArrowExpression = function(node, params, isAsync) { + var oldInAsync = this.inAsync, oldInFunction = this.inFunction; + this.initFunction(node); + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + this.inAsync = node.async; + this.inFunction = true; + node.params = this.toAssignableList(params, true); + node.expression = this.tok.type !== tokTypes.braceL; + if (node.expression) { + node.body = this.parseMaybeAssign(); + } else { + node.body = this.parseBlock(); + this.toks.adaptDirectivePrologue(node.body.body); + } + this.inAsync = oldInAsync; + this.inFunction = oldInFunction; + return this.finishNode(node, "ArrowFunctionExpression") +}; + +lp$2.parseExprList = function(close, allowEmpty) { + this.pushCx(); + var indent = this.curIndent, line = this.curLineStart, elts = []; + this.next(); // Opening bracket + while (!this.closes(close, indent + 1, line)) { + if (this.eat(tokTypes.comma)) { + elts.push(allowEmpty ? null : this.dummyIdent()); + continue + } + var elt = this.parseMaybeAssign(); + if (isDummy(elt)) { + if (this.closes(close, indent, line)) { break } + this.next(); + } else { + elts.push(elt); + } + this.eat(tokTypes.comma); + } + this.popCx(); + if (!this.eat(close)) { + // If there is no closing brace, make the node span to the start + // of the next token (this is useful for Tern) + this.last.end = this.tok.start; + if (this.options.locations) { this.last.loc.end = this.tok.loc.start; } + } + return elts +}; + +lp$2.parseAwait = function() { + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeUnary(); + return this.finishNode(node, "AwaitExpression") +}; + +// Acorn: Loose parser + +defaultOptions.tabSize = 4; + +function parse(input, options) { + return LooseParser.parse(input, options) +} + +export { LooseParser, parse }; diff --git a/node_modules/acorn/acorn-loose/dist/acorn-loose.mjs.map b/node_modules/acorn/acorn-loose/dist/acorn-loose.mjs.map new file mode 100644 index 00000000..02933073 --- /dev/null +++ b/node_modules/acorn/acorn-loose/dist/acorn-loose.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"acorn-loose.mjs","sources":["../src/state.js","../src/tokenize.js","../src/parseutil.js","../src/statement.js","../src/expression.js","../src/index.js"],"sourcesContent":["import {Parser, SourceLocation, tokTypes as tt, Node, lineBreak, isNewLine} from \"acorn\"\n\nfunction noop() {}\n\nexport class LooseParser {\n constructor(input, options = {}) {\n this.toks = this.constructor.BaseParser.tokenizer(input, options)\n this.options = this.toks.options\n this.input = this.toks.input\n this.tok = this.last = {type: tt.eof, start: 0, end: 0}\n this.tok.validateRegExpFlags = noop\n this.tok.validateRegExpPattern = noop\n if (this.options.locations) {\n let here = this.toks.curPosition()\n this.tok.loc = new SourceLocation(this.toks, here, here)\n }\n this.ahead = [] // Tokens ahead\n this.context = [] // Indentation contexted\n this.curIndent = 0\n this.curLineStart = 0\n this.nextLineStart = this.lineEnd(this.curLineStart) + 1\n this.inAsync = false\n this.inFunction = false\n }\n\n startNode() {\n return new Node(this.toks, this.tok.start, this.options.locations ? this.tok.loc.start : null)\n }\n\n storeCurrentPos() {\n return this.options.locations ? [this.tok.start, this.tok.loc.start] : this.tok.start\n }\n\n startNodeAt(pos) {\n if (this.options.locations) {\n return new Node(this.toks, pos[0], pos[1])\n } else {\n return new Node(this.toks, pos)\n }\n }\n\n finishNode(node, type) {\n node.type = type\n node.end = this.last.end\n if (this.options.locations)\n node.loc.end = this.last.loc.end\n if (this.options.ranges)\n node.range[1] = this.last.end\n return node\n }\n\n dummyNode(type) {\n let dummy = this.startNode()\n dummy.type = type\n dummy.end = dummy.start\n if (this.options.locations)\n dummy.loc.end = dummy.loc.start\n if (this.options.ranges)\n dummy.range[1] = dummy.start\n this.last = {type: tt.name, start: dummy.start, end: dummy.start, loc: dummy.loc}\n return dummy\n }\n\n dummyIdent() {\n let dummy = this.dummyNode(\"Identifier\")\n dummy.name = \"✖\"\n return dummy\n }\n\n dummyString() {\n let dummy = this.dummyNode(\"Literal\")\n dummy.value = dummy.raw = \"✖\"\n return dummy\n }\n\n eat(type) {\n if (this.tok.type === type) {\n this.next()\n return true\n } else {\n return false\n }\n }\n\n isContextual(name) {\n return this.tok.type === tt.name && this.tok.value === name\n }\n\n eatContextual(name) {\n return this.tok.value === name && this.eat(tt.name)\n }\n\n canInsertSemicolon() {\n return this.tok.type === tt.eof || this.tok.type === tt.braceR ||\n lineBreak.test(this.input.slice(this.last.end, this.tok.start))\n }\n\n semicolon() {\n return this.eat(tt.semi)\n }\n\n expect(type) {\n if (this.eat(type)) return true\n for (let i = 1; i <= 2; i++) {\n if (this.lookAhead(i).type === type) {\n for (let j = 0; j < i; j++) this.next()\n return true\n }\n }\n }\n\n pushCx() {\n this.context.push(this.curIndent)\n }\n\n popCx() {\n this.curIndent = this.context.pop()\n }\n\n lineEnd(pos) {\n while (pos < this.input.length && !isNewLine(this.input.charCodeAt(pos))) ++pos\n return pos\n }\n\n indentationAfter(pos) {\n for (let count = 0;; ++pos) {\n let ch = this.input.charCodeAt(pos)\n if (ch === 32) ++count\n else if (ch === 9) count += this.options.tabSize\n else return count\n }\n }\n\n closes(closeTok, indent, line, blockHeuristic) {\n if (this.tok.type === closeTok || this.tok.type === tt.eof) return true\n return line !== this.curLineStart && this.curIndent < indent && this.tokenStartsLine() &&\n (!blockHeuristic || this.nextLineStart >= this.input.length ||\n this.indentationAfter(this.nextLineStart) < indent)\n }\n\n tokenStartsLine() {\n for (let p = this.tok.start - 1; p >= this.curLineStart; --p) {\n let ch = this.input.charCodeAt(p)\n if (ch !== 9 && ch !== 32) return false\n }\n return true\n }\n\n extend(name, f) {\n this[name] = f(this[name])\n }\n\n parse() {\n this.next()\n return this.parseTopLevel()\n }\n\n static extend(...plugins) {\n let cls = this\n for (let i = 0; i < plugins.length; i++) cls = plugins[i](cls)\n return cls\n }\n\n static parse(input, options) {\n return new this(input, options).parse()\n }\n}\n\n// Allows plugins to extend the base parser / tokenizer used\nLooseParser.BaseParser = Parser\n","import {tokTypes as tt, Token, isNewLine, SourceLocation, getLineInfo, lineBreakG} from \"acorn\"\nimport {LooseParser} from \"./state\"\n\nconst lp = LooseParser.prototype\n\nfunction isSpace(ch) {\n return (ch < 14 && ch > 8) || ch === 32 || ch === 160 || isNewLine(ch)\n}\n\nlp.next = function() {\n this.last = this.tok\n if (this.ahead.length)\n this.tok = this.ahead.shift()\n else\n this.tok = this.readToken()\n\n if (this.tok.start >= this.nextLineStart) {\n while (this.tok.start >= this.nextLineStart) {\n this.curLineStart = this.nextLineStart\n this.nextLineStart = this.lineEnd(this.curLineStart) + 1\n }\n this.curIndent = this.indentationAfter(this.curLineStart)\n }\n}\n\nlp.readToken = function() {\n for (;;) {\n try {\n this.toks.next()\n if (this.toks.type === tt.dot &&\n this.input.substr(this.toks.end, 1) === \".\" &&\n this.options.ecmaVersion >= 6) {\n this.toks.end++\n this.toks.type = tt.ellipsis\n }\n return new Token(this.toks)\n } catch (e) {\n if (!(e instanceof SyntaxError)) throw e\n\n // Try to skip some text, based on the error message, and then continue\n let msg = e.message, pos = e.raisedAt, replace = true\n if (/unterminated/i.test(msg)) {\n pos = this.lineEnd(e.pos + 1)\n if (/string/.test(msg)) {\n replace = {start: e.pos, end: pos, type: tt.string, value: this.input.slice(e.pos + 1, pos)}\n } else if (/regular expr/i.test(msg)) {\n let re = this.input.slice(e.pos, pos)\n try { re = new RegExp(re) } catch (e) { /* ignore compilation error due to new syntax */ }\n replace = {start: e.pos, end: pos, type: tt.regexp, value: re}\n } else if (/template/.test(msg)) {\n replace = {\n start: e.pos,\n end: pos,\n type: tt.template,\n value: this.input.slice(e.pos, pos)\n }\n } else {\n replace = false\n }\n } else if (/invalid (unicode|regexp|number)|expecting unicode|octal literal|is reserved|directly after number|expected number in radix/i.test(msg)) {\n while (pos < this.input.length && !isSpace(this.input.charCodeAt(pos))) ++pos\n } else if (/character escape|expected hexadecimal/i.test(msg)) {\n while (pos < this.input.length) {\n let ch = this.input.charCodeAt(pos++)\n if (ch === 34 || ch === 39 || isNewLine(ch)) break\n }\n } else if (/unexpected character/i.test(msg)) {\n pos++\n replace = false\n } else if (/regular expression/i.test(msg)) {\n replace = true\n } else {\n throw e\n }\n this.resetTo(pos)\n if (replace === true) replace = {start: pos, end: pos, type: tt.name, value: \"✖\"}\n if (replace) {\n if (this.options.locations)\n replace.loc = new SourceLocation(\n this.toks,\n getLineInfo(this.input, replace.start),\n getLineInfo(this.input, replace.end))\n return replace\n }\n }\n }\n}\n\nlp.resetTo = function(pos) {\n this.toks.pos = pos\n let ch = this.input.charAt(pos - 1)\n this.toks.exprAllowed = !ch || /[[{(,;:?/*=+\\-~!|&%^<>]/.test(ch) ||\n /[enwfd]/.test(ch) &&\n /\\b(case|else|return|throw|new|in|(instance|type)?of|delete|void)$/.test(this.input.slice(pos - 10, pos))\n\n if (this.options.locations) {\n this.toks.curLine = 1\n this.toks.lineStart = lineBreakG.lastIndex = 0\n let match\n while ((match = lineBreakG.exec(this.input)) && match.index < pos) {\n ++this.toks.curLine\n this.toks.lineStart = match.index + match[0].length\n }\n }\n}\n\nlp.lookAhead = function(n) {\n while (n > this.ahead.length)\n this.ahead.push(this.readToken())\n return this.ahead[n - 1]\n}\n","export function isDummy(node) { return node.name === \"✖\" }\n","import {LooseParser} from \"./state\"\nimport {isDummy} from \"./parseutil\"\nimport {getLineInfo, tokTypes as tt} from \"acorn\"\n\nconst lp = LooseParser.prototype\n\nlp.parseTopLevel = function() {\n let node = this.startNodeAt(this.options.locations ? [0, getLineInfo(this.input, 0)] : 0)\n node.body = []\n while (this.tok.type !== tt.eof) node.body.push(this.parseStatement())\n this.toks.adaptDirectivePrologue(node.body)\n this.last = this.tok\n if (this.options.ecmaVersion >= 6) {\n node.sourceType = this.options.sourceType\n }\n return this.finishNode(node, \"Program\")\n}\n\nlp.parseStatement = function() {\n let starttype = this.tok.type, node = this.startNode(), kind\n\n if (this.toks.isLet()) {\n starttype = tt._var\n kind = \"let\"\n }\n\n switch (starttype) {\n case tt._break: case tt._continue:\n this.next()\n let isBreak = starttype === tt._break\n if (this.semicolon() || this.canInsertSemicolon()) {\n node.label = null\n } else {\n node.label = this.tok.type === tt.name ? this.parseIdent() : null\n this.semicolon()\n }\n return this.finishNode(node, isBreak ? \"BreakStatement\" : \"ContinueStatement\")\n\n case tt._debugger:\n this.next()\n this.semicolon()\n return this.finishNode(node, \"DebuggerStatement\")\n\n case tt._do:\n this.next()\n node.body = this.parseStatement()\n node.test = this.eat(tt._while) ? this.parseParenExpression() : this.dummyIdent()\n this.semicolon()\n return this.finishNode(node, \"DoWhileStatement\")\n\n case tt._for:\n this.next() // `for` keyword\n let isAwait = this.options.ecmaVersion >= 9 && this.inAsync && this.eatContextual(\"await\")\n\n this.pushCx()\n this.expect(tt.parenL)\n if (this.tok.type === tt.semi) return this.parseFor(node, null)\n let isLet = this.toks.isLet()\n if (isLet || this.tok.type === tt._var || this.tok.type === tt._const) {\n let init = this.parseVar(this.startNode(), true, isLet ? \"let\" : this.tok.value)\n if (init.declarations.length === 1 && (this.tok.type === tt._in || this.isContextual(\"of\"))) {\n if (this.options.ecmaVersion >= 9 && this.tok.type !== tt._in) {\n node.await = isAwait\n }\n return this.parseForIn(node, init)\n }\n return this.parseFor(node, init)\n }\n let init = this.parseExpression(true)\n if (this.tok.type === tt._in || this.isContextual(\"of\")) {\n if (this.options.ecmaVersion >= 9 && this.tok.type !== tt._in) {\n node.await = isAwait\n }\n return this.parseForIn(node, this.toAssignable(init))\n }\n return this.parseFor(node, init)\n\n case tt._function:\n this.next()\n return this.parseFunction(node, true)\n\n case tt._if:\n this.next()\n node.test = this.parseParenExpression()\n node.consequent = this.parseStatement()\n node.alternate = this.eat(tt._else) ? this.parseStatement() : null\n return this.finishNode(node, \"IfStatement\")\n\n case tt._return:\n this.next()\n if (this.eat(tt.semi) || this.canInsertSemicolon()) node.argument = null\n else { node.argument = this.parseExpression(); this.semicolon() }\n return this.finishNode(node, \"ReturnStatement\")\n\n case tt._switch:\n let blockIndent = this.curIndent, line = this.curLineStart\n this.next()\n node.discriminant = this.parseParenExpression()\n node.cases = []\n this.pushCx()\n this.expect(tt.braceL)\n\n let cur\n while (!this.closes(tt.braceR, blockIndent, line, true)) {\n if (this.tok.type === tt._case || this.tok.type === tt._default) {\n let isCase = this.tok.type === tt._case\n if (cur) this.finishNode(cur, \"SwitchCase\")\n node.cases.push(cur = this.startNode())\n cur.consequent = []\n this.next()\n if (isCase) cur.test = this.parseExpression()\n else cur.test = null\n this.expect(tt.colon)\n } else {\n if (!cur) {\n node.cases.push(cur = this.startNode())\n cur.consequent = []\n cur.test = null\n }\n cur.consequent.push(this.parseStatement())\n }\n }\n if (cur) this.finishNode(cur, \"SwitchCase\")\n this.popCx()\n this.eat(tt.braceR)\n return this.finishNode(node, \"SwitchStatement\")\n\n case tt._throw:\n this.next()\n node.argument = this.parseExpression()\n this.semicolon()\n return this.finishNode(node, \"ThrowStatement\")\n\n case tt._try:\n this.next()\n node.block = this.parseBlock()\n node.handler = null\n if (this.tok.type === tt._catch) {\n let clause = this.startNode()\n this.next()\n if (this.eat(tt.parenL)) {\n clause.param = this.toAssignable(this.parseExprAtom(), true)\n this.expect(tt.parenR)\n } else {\n clause.param = null\n }\n clause.body = this.parseBlock()\n node.handler = this.finishNode(clause, \"CatchClause\")\n }\n node.finalizer = this.eat(tt._finally) ? this.parseBlock() : null\n if (!node.handler && !node.finalizer) return node.block\n return this.finishNode(node, \"TryStatement\")\n\n case tt._var:\n case tt._const:\n return this.parseVar(node, false, kind || this.tok.value)\n\n case tt._while:\n this.next()\n node.test = this.parseParenExpression()\n node.body = this.parseStatement()\n return this.finishNode(node, \"WhileStatement\")\n\n case tt._with:\n this.next()\n node.object = this.parseParenExpression()\n node.body = this.parseStatement()\n return this.finishNode(node, \"WithStatement\")\n\n case tt.braceL:\n return this.parseBlock()\n\n case tt.semi:\n this.next()\n return this.finishNode(node, \"EmptyStatement\")\n\n case tt._class:\n return this.parseClass(true)\n\n case tt._import:\n return this.parseImport()\n\n case tt._export:\n return this.parseExport()\n\n default:\n if (this.toks.isAsyncFunction()) {\n this.next()\n this.next()\n return this.parseFunction(node, true, true)\n }\n let expr = this.parseExpression()\n if (isDummy(expr)) {\n this.next()\n if (this.tok.type === tt.eof) return this.finishNode(node, \"EmptyStatement\")\n return this.parseStatement()\n } else if (starttype === tt.name && expr.type === \"Identifier\" && this.eat(tt.colon)) {\n node.body = this.parseStatement()\n node.label = expr\n return this.finishNode(node, \"LabeledStatement\")\n } else {\n node.expression = expr\n this.semicolon()\n return this.finishNode(node, \"ExpressionStatement\")\n }\n }\n}\n\nlp.parseBlock = function() {\n let node = this.startNode()\n this.pushCx()\n this.expect(tt.braceL)\n let blockIndent = this.curIndent, line = this.curLineStart\n node.body = []\n while (!this.closes(tt.braceR, blockIndent, line, true))\n node.body.push(this.parseStatement())\n this.popCx()\n this.eat(tt.braceR)\n return this.finishNode(node, \"BlockStatement\")\n}\n\nlp.parseFor = function(node, init) {\n node.init = init\n node.test = node.update = null\n if (this.eat(tt.semi) && this.tok.type !== tt.semi) node.test = this.parseExpression()\n if (this.eat(tt.semi) && this.tok.type !== tt.parenR) node.update = this.parseExpression()\n this.popCx()\n this.expect(tt.parenR)\n node.body = this.parseStatement()\n return this.finishNode(node, \"ForStatement\")\n}\n\nlp.parseForIn = function(node, init) {\n let type = this.tok.type === tt._in ? \"ForInStatement\" : \"ForOfStatement\"\n this.next()\n node.left = init\n node.right = this.parseExpression()\n this.popCx()\n this.expect(tt.parenR)\n node.body = this.parseStatement()\n return this.finishNode(node, type)\n}\n\nlp.parseVar = function(node, noIn, kind) {\n node.kind = kind\n this.next()\n node.declarations = []\n do {\n let decl = this.startNode()\n decl.id = this.options.ecmaVersion >= 6 ? this.toAssignable(this.parseExprAtom(), true) : this.parseIdent()\n decl.init = this.eat(tt.eq) ? this.parseMaybeAssign(noIn) : null\n node.declarations.push(this.finishNode(decl, \"VariableDeclarator\"))\n } while (this.eat(tt.comma))\n if (!node.declarations.length) {\n let decl = this.startNode()\n decl.id = this.dummyIdent()\n node.declarations.push(this.finishNode(decl, \"VariableDeclarator\"))\n }\n if (!noIn) this.semicolon()\n return this.finishNode(node, \"VariableDeclaration\")\n}\n\nlp.parseClass = function(isStatement) {\n let node = this.startNode()\n this.next()\n if (this.tok.type === tt.name) node.id = this.parseIdent()\n else if (isStatement === true) node.id = this.dummyIdent()\n else node.id = null\n node.superClass = this.eat(tt._extends) ? this.parseExpression() : null\n node.body = this.startNode()\n node.body.body = []\n this.pushCx()\n let indent = this.curIndent + 1, line = this.curLineStart\n this.eat(tt.braceL)\n if (this.curIndent + 1 < indent) { indent = this.curIndent; line = this.curLineStart }\n while (!this.closes(tt.braceR, indent, line)) {\n if (this.semicolon()) continue\n let method = this.startNode(), isGenerator, isAsync\n if (this.options.ecmaVersion >= 6) {\n method.static = false\n isGenerator = this.eat(tt.star)\n }\n this.parsePropertyName(method)\n if (isDummy(method.key)) { if (isDummy(this.parseMaybeAssign())) this.next(); this.eat(tt.comma); continue }\n if (method.key.type === \"Identifier\" && !method.computed && method.key.name === \"static\" &&\n (this.tok.type !== tt.parenL && this.tok.type !== tt.braceL)) {\n method.static = true\n isGenerator = this.eat(tt.star)\n this.parsePropertyName(method)\n } else {\n method.static = false\n }\n if (!method.computed &&\n method.key.type === \"Identifier\" && method.key.name === \"async\" && this.tok.type !== tt.parenL &&\n !this.canInsertSemicolon()) {\n isAsync = true\n isGenerator = this.options.ecmaVersion >= 9 && this.eat(tt.star)\n this.parsePropertyName(method)\n } else {\n isAsync = false\n }\n if (this.options.ecmaVersion >= 5 && method.key.type === \"Identifier\" &&\n !method.computed && (method.key.name === \"get\" || method.key.name === \"set\") &&\n this.tok.type !== tt.parenL && this.tok.type !== tt.braceL) {\n method.kind = method.key.name\n this.parsePropertyName(method)\n method.value = this.parseMethod(false)\n } else {\n if (!method.computed && !method.static && !isGenerator && !isAsync && (\n method.key.type === \"Identifier\" && method.key.name === \"constructor\" ||\n method.key.type === \"Literal\" && method.key.value === \"constructor\")) {\n method.kind = \"constructor\"\n } else {\n method.kind = \"method\"\n }\n method.value = this.parseMethod(isGenerator, isAsync)\n }\n node.body.body.push(this.finishNode(method, \"MethodDefinition\"))\n }\n this.popCx()\n if (!this.eat(tt.braceR)) {\n // If there is no closing brace, make the node span to the start\n // of the next token (this is useful for Tern)\n this.last.end = this.tok.start\n if (this.options.locations) this.last.loc.end = this.tok.loc.start\n }\n this.semicolon()\n this.finishNode(node.body, \"ClassBody\")\n return this.finishNode(node, isStatement ? \"ClassDeclaration\" : \"ClassExpression\")\n}\n\nlp.parseFunction = function(node, isStatement, isAsync) {\n let oldInAsync = this.inAsync, oldInFunction = this.inFunction\n this.initFunction(node)\n if (this.options.ecmaVersion >= 6) {\n node.generator = this.eat(tt.star)\n }\n if (this.options.ecmaVersion >= 8) {\n node.async = !!isAsync\n }\n if (this.tok.type === tt.name) node.id = this.parseIdent()\n else if (isStatement === true) node.id = this.dummyIdent()\n this.inAsync = node.async\n this.inFunction = true\n node.params = this.parseFunctionParams()\n node.body = this.parseBlock()\n this.toks.adaptDirectivePrologue(node.body.body)\n this.inAsync = oldInAsync\n this.inFunction = oldInFunction\n return this.finishNode(node, isStatement ? \"FunctionDeclaration\" : \"FunctionExpression\")\n}\n\nlp.parseExport = function() {\n let node = this.startNode()\n this.next()\n if (this.eat(tt.star)) {\n node.source = this.eatContextual(\"from\") ? this.parseExprAtom() : this.dummyString()\n return this.finishNode(node, \"ExportAllDeclaration\")\n }\n if (this.eat(tt._default)) {\n // export default (function foo() {}) // This is FunctionExpression.\n let isAsync\n if (this.tok.type === tt._function || (isAsync = this.toks.isAsyncFunction())) {\n let fNode = this.startNode()\n this.next()\n if (isAsync) this.next()\n node.declaration = this.parseFunction(fNode, \"nullableID\", isAsync)\n } else if (this.tok.type === tt._class) {\n node.declaration = this.parseClass(\"nullableID\")\n } else {\n node.declaration = this.parseMaybeAssign()\n this.semicolon()\n }\n return this.finishNode(node, \"ExportDefaultDeclaration\")\n }\n if (this.tok.type.keyword || this.toks.isLet() || this.toks.isAsyncFunction()) {\n node.declaration = this.parseStatement()\n node.specifiers = []\n node.source = null\n } else {\n node.declaration = null\n node.specifiers = this.parseExportSpecifierList()\n node.source = this.eatContextual(\"from\") ? this.parseExprAtom() : null\n this.semicolon()\n }\n return this.finishNode(node, \"ExportNamedDeclaration\")\n}\n\nlp.parseImport = function() {\n let node = this.startNode()\n this.next()\n if (this.tok.type === tt.string) {\n node.specifiers = []\n node.source = this.parseExprAtom()\n } else {\n let elt\n if (this.tok.type === tt.name && this.tok.value !== \"from\") {\n elt = this.startNode()\n elt.local = this.parseIdent()\n this.finishNode(elt, \"ImportDefaultSpecifier\")\n this.eat(tt.comma)\n }\n node.specifiers = this.parseImportSpecifiers()\n node.source = this.eatContextual(\"from\") && this.tok.type === tt.string ? this.parseExprAtom() : this.dummyString()\n if (elt) node.specifiers.unshift(elt)\n }\n this.semicolon()\n return this.finishNode(node, \"ImportDeclaration\")\n}\n\nlp.parseImportSpecifiers = function() {\n let elts = []\n if (this.tok.type === tt.star) {\n let elt = this.startNode()\n this.next()\n elt.local = this.eatContextual(\"as\") ? this.parseIdent() : this.dummyIdent()\n elts.push(this.finishNode(elt, \"ImportNamespaceSpecifier\"))\n } else {\n let indent = this.curIndent, line = this.curLineStart, continuedLine = this.nextLineStart\n this.pushCx()\n this.eat(tt.braceL)\n if (this.curLineStart > continuedLine) continuedLine = this.curLineStart\n while (!this.closes(tt.braceR, indent + (this.curLineStart <= continuedLine ? 1 : 0), line)) {\n let elt = this.startNode()\n if (this.eat(tt.star)) {\n elt.local = this.eatContextual(\"as\") ? this.parseIdent() : this.dummyIdent()\n this.finishNode(elt, \"ImportNamespaceSpecifier\")\n } else {\n if (this.isContextual(\"from\")) break\n elt.imported = this.parseIdent()\n if (isDummy(elt.imported)) break\n elt.local = this.eatContextual(\"as\") ? this.parseIdent() : elt.imported\n this.finishNode(elt, \"ImportSpecifier\")\n }\n elts.push(elt)\n this.eat(tt.comma)\n }\n this.eat(tt.braceR)\n this.popCx()\n }\n return elts\n}\n\nlp.parseExportSpecifierList = function() {\n let elts = []\n let indent = this.curIndent, line = this.curLineStart, continuedLine = this.nextLineStart\n this.pushCx()\n this.eat(tt.braceL)\n if (this.curLineStart > continuedLine) continuedLine = this.curLineStart\n while (!this.closes(tt.braceR, indent + (this.curLineStart <= continuedLine ? 1 : 0), line)) {\n if (this.isContextual(\"from\")) break\n let elt = this.startNode()\n elt.local = this.parseIdent()\n if (isDummy(elt.local)) break\n elt.exported = this.eatContextual(\"as\") ? this.parseIdent() : elt.local\n this.finishNode(elt, \"ExportSpecifier\")\n elts.push(elt)\n this.eat(tt.comma)\n }\n this.eat(tt.braceR)\n this.popCx()\n return elts\n}\n","import {LooseParser} from \"./state\"\nimport {isDummy} from \"./parseutil\"\nimport {tokTypes as tt} from \"acorn\"\n\nconst lp = LooseParser.prototype\n\nlp.checkLVal = function(expr) {\n if (!expr) return expr\n switch (expr.type) {\n case \"Identifier\":\n case \"MemberExpression\":\n return expr\n\n case \"ParenthesizedExpression\":\n expr.expression = this.checkLVal(expr.expression)\n return expr\n\n default:\n return this.dummyIdent()\n }\n}\n\nlp.parseExpression = function(noIn) {\n let start = this.storeCurrentPos()\n let expr = this.parseMaybeAssign(noIn)\n if (this.tok.type === tt.comma) {\n let node = this.startNodeAt(start)\n node.expressions = [expr]\n while (this.eat(tt.comma)) node.expressions.push(this.parseMaybeAssign(noIn))\n return this.finishNode(node, \"SequenceExpression\")\n }\n return expr\n}\n\nlp.parseParenExpression = function() {\n this.pushCx()\n this.expect(tt.parenL)\n let val = this.parseExpression()\n this.popCx()\n this.expect(tt.parenR)\n return val\n}\n\nlp.parseMaybeAssign = function(noIn) {\n if (this.toks.isContextual(\"yield\")) {\n let node = this.startNode()\n this.next()\n if (this.semicolon() || this.canInsertSemicolon() || (this.tok.type !== tt.star && !this.tok.type.startsExpr)) {\n node.delegate = false\n node.argument = null\n } else {\n node.delegate = this.eat(tt.star)\n node.argument = this.parseMaybeAssign()\n }\n return this.finishNode(node, \"YieldExpression\")\n }\n\n let start = this.storeCurrentPos()\n let left = this.parseMaybeConditional(noIn)\n if (this.tok.type.isAssign) {\n let node = this.startNodeAt(start)\n node.operator = this.tok.value\n node.left = this.tok.type === tt.eq ? this.toAssignable(left) : this.checkLVal(left)\n this.next()\n node.right = this.parseMaybeAssign(noIn)\n return this.finishNode(node, \"AssignmentExpression\")\n }\n return left\n}\n\nlp.parseMaybeConditional = function(noIn) {\n let start = this.storeCurrentPos()\n let expr = this.parseExprOps(noIn)\n if (this.eat(tt.question)) {\n let node = this.startNodeAt(start)\n node.test = expr\n node.consequent = this.parseMaybeAssign()\n node.alternate = this.expect(tt.colon) ? this.parseMaybeAssign(noIn) : this.dummyIdent()\n return this.finishNode(node, \"ConditionalExpression\")\n }\n return expr\n}\n\nlp.parseExprOps = function(noIn) {\n let start = this.storeCurrentPos()\n let indent = this.curIndent, line = this.curLineStart\n return this.parseExprOp(this.parseMaybeUnary(false), start, -1, noIn, indent, line)\n}\n\nlp.parseExprOp = function(left, start, minPrec, noIn, indent, line) {\n if (this.curLineStart !== line && this.curIndent < indent && this.tokenStartsLine()) return left\n let prec = this.tok.type.binop\n if (prec != null && (!noIn || this.tok.type !== tt._in)) {\n if (prec > minPrec) {\n let node = this.startNodeAt(start)\n node.left = left\n node.operator = this.tok.value\n this.next()\n if (this.curLineStart !== line && this.curIndent < indent && this.tokenStartsLine()) {\n node.right = this.dummyIdent()\n } else {\n let rightStart = this.storeCurrentPos()\n node.right = this.parseExprOp(this.parseMaybeUnary(false), rightStart, prec, noIn, indent, line)\n }\n this.finishNode(node, /&&|\\|\\|/.test(node.operator) ? \"LogicalExpression\" : \"BinaryExpression\")\n return this.parseExprOp(node, start, minPrec, noIn, indent, line)\n }\n }\n return left\n}\n\nlp.parseMaybeUnary = function(sawUnary) {\n let start = this.storeCurrentPos(), expr\n if (this.options.ecmaVersion >= 8 && this.toks.isContextual(\"await\") &&\n (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction))\n ) {\n expr = this.parseAwait()\n sawUnary = true\n } else if (this.tok.type.prefix) {\n let node = this.startNode(), update = this.tok.type === tt.incDec\n if (!update) sawUnary = true\n node.operator = this.tok.value\n node.prefix = true\n this.next()\n node.argument = this.parseMaybeUnary(true)\n if (update) node.argument = this.checkLVal(node.argument)\n expr = this.finishNode(node, update ? \"UpdateExpression\" : \"UnaryExpression\")\n } else if (this.tok.type === tt.ellipsis) {\n let node = this.startNode()\n this.next()\n node.argument = this.parseMaybeUnary(sawUnary)\n expr = this.finishNode(node, \"SpreadElement\")\n } else {\n expr = this.parseExprSubscripts()\n while (this.tok.type.postfix && !this.canInsertSemicolon()) {\n let node = this.startNodeAt(start)\n node.operator = this.tok.value\n node.prefix = false\n node.argument = this.checkLVal(expr)\n this.next()\n expr = this.finishNode(node, \"UpdateExpression\")\n }\n }\n\n if (!sawUnary && this.eat(tt.starstar)) {\n let node = this.startNodeAt(start)\n node.operator = \"**\"\n node.left = expr\n node.right = this.parseMaybeUnary(false)\n return this.finishNode(node, \"BinaryExpression\")\n }\n\n return expr\n}\n\nlp.parseExprSubscripts = function() {\n let start = this.storeCurrentPos()\n return this.parseSubscripts(this.parseExprAtom(), start, false, this.curIndent, this.curLineStart)\n}\n\nlp.parseSubscripts = function(base, start, noCalls, startIndent, line) {\n for (;;) {\n if (this.curLineStart !== line && this.curIndent <= startIndent && this.tokenStartsLine()) {\n if (this.tok.type === tt.dot && this.curIndent === startIndent)\n --startIndent\n else\n return base\n }\n\n let maybeAsyncArrow = base.type === \"Identifier\" && base.name === \"async\" && !this.canInsertSemicolon()\n\n if (this.eat(tt.dot)) {\n let node = this.startNodeAt(start)\n node.object = base\n if (this.curLineStart !== line && this.curIndent <= startIndent && this.tokenStartsLine())\n node.property = this.dummyIdent()\n else\n node.property = this.parsePropertyAccessor() || this.dummyIdent()\n node.computed = false\n base = this.finishNode(node, \"MemberExpression\")\n } else if (this.tok.type === tt.bracketL) {\n this.pushCx()\n this.next()\n let node = this.startNodeAt(start)\n node.object = base\n node.property = this.parseExpression()\n node.computed = true\n this.popCx()\n this.expect(tt.bracketR)\n base = this.finishNode(node, \"MemberExpression\")\n } else if (!noCalls && this.tok.type === tt.parenL) {\n let exprList = this.parseExprList(tt.parenR)\n if (maybeAsyncArrow && this.eat(tt.arrow))\n return this.parseArrowExpression(this.startNodeAt(start), exprList, true)\n let node = this.startNodeAt(start)\n node.callee = base\n node.arguments = exprList\n base = this.finishNode(node, \"CallExpression\")\n } else if (this.tok.type === tt.backQuote) {\n let node = this.startNodeAt(start)\n node.tag = base\n node.quasi = this.parseTemplate()\n base = this.finishNode(node, \"TaggedTemplateExpression\")\n } else {\n return base\n }\n }\n}\n\nlp.parseExprAtom = function() {\n let node\n switch (this.tok.type) {\n case tt._this:\n case tt._super:\n let type = this.tok.type === tt._this ? \"ThisExpression\" : \"Super\"\n node = this.startNode()\n this.next()\n return this.finishNode(node, type)\n\n case tt.name:\n let start = this.storeCurrentPos()\n let id = this.parseIdent()\n let isAsync = false\n if (id.name === \"async\" && !this.canInsertSemicolon()) {\n if (this.eat(tt._function))\n return this.parseFunction(this.startNodeAt(start), false, true)\n if (this.tok.type === tt.name) {\n id = this.parseIdent()\n isAsync = true\n }\n }\n return this.eat(tt.arrow) ? this.parseArrowExpression(this.startNodeAt(start), [id], isAsync) : id\n\n case tt.regexp:\n node = this.startNode()\n let val = this.tok.value\n node.regex = {pattern: val.pattern, flags: val.flags}\n node.value = val.value\n node.raw = this.input.slice(this.tok.start, this.tok.end)\n this.next()\n return this.finishNode(node, \"Literal\")\n\n case tt.num: case tt.string:\n node = this.startNode()\n node.value = this.tok.value\n node.raw = this.input.slice(this.tok.start, this.tok.end)\n this.next()\n return this.finishNode(node, \"Literal\")\n\n case tt._null: case tt._true: case tt._false:\n node = this.startNode()\n node.value = this.tok.type === tt._null ? null : this.tok.type === tt._true\n node.raw = this.tok.type.keyword\n this.next()\n return this.finishNode(node, \"Literal\")\n\n case tt.parenL:\n let parenStart = this.storeCurrentPos()\n this.next()\n let inner = this.parseExpression()\n this.expect(tt.parenR)\n if (this.eat(tt.arrow)) {\n // (a,)=>a // SequenceExpression makes dummy in the last hole. Drop the dummy.\n let params = inner.expressions || [inner]\n if (params.length && isDummy(params[params.length - 1]))\n params.pop()\n return this.parseArrowExpression(this.startNodeAt(parenStart), params)\n }\n if (this.options.preserveParens) {\n let par = this.startNodeAt(parenStart)\n par.expression = inner\n inner = this.finishNode(par, \"ParenthesizedExpression\")\n }\n return inner\n\n case tt.bracketL:\n node = this.startNode()\n node.elements = this.parseExprList(tt.bracketR, true)\n return this.finishNode(node, \"ArrayExpression\")\n\n case tt.braceL:\n return this.parseObj()\n\n case tt._class:\n return this.parseClass(false)\n\n case tt._function:\n node = this.startNode()\n this.next()\n return this.parseFunction(node, false)\n\n case tt._new:\n return this.parseNew()\n\n case tt.backQuote:\n return this.parseTemplate()\n\n default:\n return this.dummyIdent()\n }\n}\n\nlp.parseNew = function() {\n let node = this.startNode(), startIndent = this.curIndent, line = this.curLineStart\n let meta = this.parseIdent(true)\n if (this.options.ecmaVersion >= 6 && this.eat(tt.dot)) {\n node.meta = meta\n node.property = this.parseIdent(true)\n return this.finishNode(node, \"MetaProperty\")\n }\n let start = this.storeCurrentPos()\n node.callee = this.parseSubscripts(this.parseExprAtom(), start, true, startIndent, line)\n if (this.tok.type === tt.parenL) {\n node.arguments = this.parseExprList(tt.parenR)\n } else {\n node.arguments = []\n }\n return this.finishNode(node, \"NewExpression\")\n}\n\nlp.parseTemplateElement = function() {\n let elem = this.startNode()\n\n // The loose parser accepts invalid unicode escapes even in untagged templates.\n if (this.tok.type === tt.invalidTemplate) {\n elem.value = {\n raw: this.tok.value,\n cooked: null\n }\n } else {\n elem.value = {\n raw: this.input.slice(this.tok.start, this.tok.end).replace(/\\r\\n?/g, \"\\n\"),\n cooked: this.tok.value\n }\n }\n this.next()\n elem.tail = this.tok.type === tt.backQuote\n return this.finishNode(elem, \"TemplateElement\")\n}\n\nlp.parseTemplate = function() {\n let node = this.startNode()\n this.next()\n node.expressions = []\n let curElt = this.parseTemplateElement()\n node.quasis = [curElt]\n while (!curElt.tail) {\n this.next()\n node.expressions.push(this.parseExpression())\n if (this.expect(tt.braceR)) {\n curElt = this.parseTemplateElement()\n } else {\n curElt = this.startNode()\n curElt.value = {cooked: \"\", raw: \"\"}\n curElt.tail = true\n this.finishNode(curElt, \"TemplateElement\")\n }\n node.quasis.push(curElt)\n }\n this.expect(tt.backQuote)\n return this.finishNode(node, \"TemplateLiteral\")\n}\n\nlp.parseObj = function() {\n let node = this.startNode()\n node.properties = []\n this.pushCx()\n let indent = this.curIndent + 1, line = this.curLineStart\n this.eat(tt.braceL)\n if (this.curIndent + 1 < indent) { indent = this.curIndent; line = this.curLineStart }\n while (!this.closes(tt.braceR, indent, line)) {\n let prop = this.startNode(), isGenerator, isAsync, start\n if (this.options.ecmaVersion >= 9 && this.eat(tt.ellipsis)) {\n prop.argument = this.parseMaybeAssign()\n node.properties.push(this.finishNode(prop, \"SpreadElement\"))\n this.eat(tt.comma)\n continue\n }\n if (this.options.ecmaVersion >= 6) {\n start = this.storeCurrentPos()\n prop.method = false\n prop.shorthand = false\n isGenerator = this.eat(tt.star)\n }\n this.parsePropertyName(prop)\n if (this.toks.isAsyncProp(prop)) {\n isAsync = true\n isGenerator = this.options.ecmaVersion >= 9 && this.eat(tt.star)\n this.parsePropertyName(prop)\n } else {\n isAsync = false\n }\n if (isDummy(prop.key)) { if (isDummy(this.parseMaybeAssign())) this.next(); this.eat(tt.comma); continue }\n if (this.eat(tt.colon)) {\n prop.kind = \"init\"\n prop.value = this.parseMaybeAssign()\n } else if (this.options.ecmaVersion >= 6 && (this.tok.type === tt.parenL || this.tok.type === tt.braceL)) {\n prop.kind = \"init\"\n prop.method = true\n prop.value = this.parseMethod(isGenerator, isAsync)\n } else if (this.options.ecmaVersion >= 5 && prop.key.type === \"Identifier\" &&\n !prop.computed && (prop.key.name === \"get\" || prop.key.name === \"set\") &&\n (this.tok.type !== tt.comma && this.tok.type !== tt.braceR && this.tok.type !== tt.eq)) {\n prop.kind = prop.key.name\n this.parsePropertyName(prop)\n prop.value = this.parseMethod(false)\n } else {\n prop.kind = \"init\"\n if (this.options.ecmaVersion >= 6) {\n if (this.eat(tt.eq)) {\n let assign = this.startNodeAt(start)\n assign.operator = \"=\"\n assign.left = prop.key\n assign.right = this.parseMaybeAssign()\n prop.value = this.finishNode(assign, \"AssignmentExpression\")\n } else {\n prop.value = prop.key\n }\n } else {\n prop.value = this.dummyIdent()\n }\n prop.shorthand = true\n }\n node.properties.push(this.finishNode(prop, \"Property\"))\n this.eat(tt.comma)\n }\n this.popCx()\n if (!this.eat(tt.braceR)) {\n // If there is no closing brace, make the node span to the start\n // of the next token (this is useful for Tern)\n this.last.end = this.tok.start\n if (this.options.locations) this.last.loc.end = this.tok.loc.start\n }\n return this.finishNode(node, \"ObjectExpression\")\n}\n\nlp.parsePropertyName = function(prop) {\n if (this.options.ecmaVersion >= 6) {\n if (this.eat(tt.bracketL)) {\n prop.computed = true\n prop.key = this.parseExpression()\n this.expect(tt.bracketR)\n return\n } else {\n prop.computed = false\n }\n }\n let key = (this.tok.type === tt.num || this.tok.type === tt.string) ? this.parseExprAtom() : this.parseIdent()\n prop.key = key || this.dummyIdent()\n}\n\nlp.parsePropertyAccessor = function() {\n if (this.tok.type === tt.name || this.tok.type.keyword) return this.parseIdent()\n}\n\nlp.parseIdent = function() {\n let name = this.tok.type === tt.name ? this.tok.value : this.tok.type.keyword\n if (!name) return this.dummyIdent()\n let node = this.startNode()\n this.next()\n node.name = name\n return this.finishNode(node, \"Identifier\")\n}\n\nlp.initFunction = function(node) {\n node.id = null\n node.params = []\n if (this.options.ecmaVersion >= 6) {\n node.generator = false\n node.expression = false\n }\n if (this.options.ecmaVersion >= 8)\n node.async = false\n}\n\n// Convert existing expression atom to assignable pattern\n// if possible.\n\nlp.toAssignable = function(node, binding) {\n if (!node || node.type === \"Identifier\" || (node.type === \"MemberExpression\" && !binding)) {\n // Okay\n } else if (node.type === \"ParenthesizedExpression\") {\n this.toAssignable(node.expression, binding)\n } else if (this.options.ecmaVersion < 6) {\n return this.dummyIdent()\n } else if (node.type === \"ObjectExpression\") {\n node.type = \"ObjectPattern\"\n for (let prop of node.properties)\n this.toAssignable(prop, binding)\n } else if (node.type === \"ArrayExpression\") {\n node.type = \"ArrayPattern\"\n this.toAssignableList(node.elements, binding)\n } else if (node.type === \"Property\") {\n this.toAssignable(node.value, binding)\n } else if (node.type === \"SpreadElement\") {\n node.type = \"RestElement\"\n this.toAssignable(node.argument, binding)\n } else if (node.type === \"AssignmentExpression\") {\n node.type = \"AssignmentPattern\"\n delete node.operator\n } else {\n return this.dummyIdent()\n }\n return node\n}\n\nlp.toAssignableList = function(exprList, binding) {\n for (let expr of exprList)\n this.toAssignable(expr, binding)\n return exprList\n}\n\nlp.parseFunctionParams = function(params) {\n params = this.parseExprList(tt.parenR)\n return this.toAssignableList(params, true)\n}\n\nlp.parseMethod = function(isGenerator, isAsync) {\n let node = this.startNode(), oldInAsync = this.inAsync, oldInFunction = this.inFunction\n this.initFunction(node)\n if (this.options.ecmaVersion >= 6)\n node.generator = !!isGenerator\n if (this.options.ecmaVersion >= 8)\n node.async = !!isAsync\n this.inAsync = node.async\n this.inFunction = true\n node.params = this.parseFunctionParams()\n node.body = this.parseBlock()\n this.toks.adaptDirectivePrologue(node.body.body)\n this.inAsync = oldInAsync\n this.inFunction = oldInFunction\n return this.finishNode(node, \"FunctionExpression\")\n}\n\nlp.parseArrowExpression = function(node, params, isAsync) {\n let oldInAsync = this.inAsync, oldInFunction = this.inFunction\n this.initFunction(node)\n if (this.options.ecmaVersion >= 8)\n node.async = !!isAsync\n this.inAsync = node.async\n this.inFunction = true\n node.params = this.toAssignableList(params, true)\n node.expression = this.tok.type !== tt.braceL\n if (node.expression) {\n node.body = this.parseMaybeAssign()\n } else {\n node.body = this.parseBlock()\n this.toks.adaptDirectivePrologue(node.body.body)\n }\n this.inAsync = oldInAsync\n this.inFunction = oldInFunction\n return this.finishNode(node, \"ArrowFunctionExpression\")\n}\n\nlp.parseExprList = function(close, allowEmpty) {\n this.pushCx()\n let indent = this.curIndent, line = this.curLineStart, elts = []\n this.next() // Opening bracket\n while (!this.closes(close, indent + 1, line)) {\n if (this.eat(tt.comma)) {\n elts.push(allowEmpty ? null : this.dummyIdent())\n continue\n }\n let elt = this.parseMaybeAssign()\n if (isDummy(elt)) {\n if (this.closes(close, indent, line)) break\n this.next()\n } else {\n elts.push(elt)\n }\n this.eat(tt.comma)\n }\n this.popCx()\n if (!this.eat(close)) {\n // If there is no closing brace, make the node span to the start\n // of the next token (this is useful for Tern)\n this.last.end = this.tok.start\n if (this.options.locations) this.last.loc.end = this.tok.loc.start\n }\n return elts\n}\n\nlp.parseAwait = function() {\n let node = this.startNode()\n this.next()\n node.argument = this.parseMaybeUnary()\n return this.finishNode(node, \"AwaitExpression\")\n}\n","// Acorn: Loose parser\n//\n// This module provides an alternative parser that exposes that same\n// interface as the main module's `parse` function, but will try to\n// parse anything as JavaScript, repairing syntax error the best it\n// can. There are circumstances in which it will raise an error and\n// give up, but they are very rare. The resulting AST will be a mostly\n// valid JavaScript AST (as per the [Mozilla parser API][api], except\n// that:\n//\n// - Return outside functions is allowed\n//\n// - Label consistency (no conflicts, break only to existing labels)\n// is not enforced.\n//\n// - Bogus Identifier nodes with a name of `\"✖\"` are inserted whenever\n// the parser got too confused to return anything meaningful.\n//\n// [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API\n//\n// The expected use for this is to *first* try `acorn.parse`, and only\n// if that fails switch to the loose parser. The loose parser might\n// parse badly indented code incorrectly, so **don't** use it as your\n// default parser.\n//\n// Quite a lot of acorn.js is duplicated here. The alternative was to\n// add a *lot* of extra cruft to that file, making it less readable\n// and slower. Copying and editing the code allowed me to make\n// invasive changes and simplifications without creating a complicated\n// tangle.\n\nimport {defaultOptions} from \"acorn\"\nimport {LooseParser} from \"./state\"\nimport \"./tokenize\"\nimport \"./statement\"\nimport \"./expression\"\n\nexport {LooseParser} from \"./state\"\n\ndefaultOptions.tabSize = 4\n\nexport function parse(input, options) {\n return LooseParser.parse(input, options)\n}\n"],"names":["tt","let","this","const","lp","init","decl","elt","node"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/acorn/acorn-walk/dist/walk.js b/node_modules/acorn/acorn-walk/dist/walk.js new file mode 100644 index 00000000..7aaab9ce --- /dev/null +++ b/node_modules/acorn/acorn-walk/dist/walk.js @@ -0,0 +1,461 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory((global.acorn = global.acorn || {}, global.acorn.walk = {}))); +}(this, function (exports) { 'use strict'; + + // AST walker module for Mozilla Parser API compatible trees + + // A simple walk is one where you simply specify callbacks to be + // called on specific nodes. The last two arguments are optional. A + // simple use would be + // + // walk.simple(myTree, { + // Expression: function(node) { ... } + // }); + // + // to do something with all expressions. All Parser API node types + // can be used to identify node types, as well as Expression and + // Statement, which denote categories of nodes. + // + // The base argument can be used to pass a custom (recursive) + // walker, and state can be used to give this walked an initial + // state. + + function simple(node, visitors, baseVisitor, state, override) { + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type, found = visitors[type]; + baseVisitor[type](node, st, c); + if (found) { found(node, st); } + })(node, state, override); + } + + // An ancestor walk keeps an array of ancestor nodes (including the + // current node) and passes them to the callback as third parameter + // (and also as state parameter when no other state is present). + function ancestor(node, visitors, baseVisitor, state, override) { + var ancestors = []; + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type, found = visitors[type]; + var isNew = node !== ancestors[ancestors.length - 1]; + if (isNew) { ancestors.push(node); } + baseVisitor[type](node, st, c); + if (found) { found(node, st || ancestors, ancestors); } + if (isNew) { ancestors.pop(); } + })(node, state, override); + } + + // A recursive walk is one where your functions override the default + // walkers. They can modify and replace the state parameter that's + // threaded through the walk, and can opt how and whether to walk + // their child nodes (by calling their third argument on these + // nodes). + function recursive(node, state, funcs, baseVisitor, override) { + var visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor + ;(function c(node, st, override) { + visitor[override || node.type](node, st, c); + })(node, state, override); + } + + function makeTest(test) { + if (typeof test === "string") + { return function (type) { return type === test; } } + else if (!test) + { return function () { return true; } } + else + { return test } + } + + var Found = function Found(node, state) { this.node = node; this.state = state; }; + + // A full walk triggers the callback on each node + function full(node, callback, baseVisitor, state, override) { + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type; + baseVisitor[type](node, st, c); + if (!override) { callback(node, st, type); } + })(node, state, override); + } + + // An fullAncestor walk is like an ancestor walk, but triggers + // the callback on each node + function fullAncestor(node, callback, baseVisitor, state) { + if (!baseVisitor) { baseVisitor = base; } + var ancestors = [] + ;(function c(node, st, override) { + var type = override || node.type; + var isNew = node !== ancestors[ancestors.length - 1]; + if (isNew) { ancestors.push(node); } + baseVisitor[type](node, st, c); + if (!override) { callback(node, st || ancestors, ancestors, type); } + if (isNew) { ancestors.pop(); } + })(node, state); + } + + // Find a node with a given start, end, and type (all are optional, + // null can be used as wildcard). Returns a {node, state} object, or + // undefined when it doesn't find a matching node. + function findNodeAt(node, start, end, test, baseVisitor, state) { + if (!baseVisitor) { baseVisitor = base; } + test = makeTest(test); + try { + (function c(node, st, override) { + var type = override || node.type; + if ((start == null || node.start <= start) && + (end == null || node.end >= end)) + { baseVisitor[type](node, st, c); } + if ((start == null || node.start === start) && + (end == null || node.end === end) && + test(type, node)) + { throw new Found(node, st) } + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } + } + + // Find the innermost node of a given type that contains the given + // position. Interface similar to findNodeAt. + function findNodeAround(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + try { + (function c(node, st, override) { + var type = override || node.type; + if (node.start > pos || node.end < pos) { return } + baseVisitor[type](node, st, c); + if (test(type, node)) { throw new Found(node, st) } + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } + } + + // Find the outermost matching node after a given position. + function findNodeAfter(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + try { + (function c(node, st, override) { + if (node.end < pos) { return } + var type = override || node.type; + if (node.start >= pos && test(type, node)) { throw new Found(node, st) } + baseVisitor[type](node, st, c); + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } + } + + // Find the outermost matching node before a given position. + function findNodeBefore(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + var max + ;(function c(node, st, override) { + if (node.start > pos) { return } + var type = override || node.type; + if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node)) + { max = new Found(node, st); } + baseVisitor[type](node, st, c); + })(node, state); + return max + } + + // Fallback to an Object.create polyfill for older environments. + var create = Object.create || function(proto) { + function Ctor() {} + Ctor.prototype = proto; + return new Ctor + }; + + // Used to create a custom walker. Will fill in all missing node + // type properties with the defaults. + function make(funcs, baseVisitor) { + var visitor = create(baseVisitor || base); + for (var type in funcs) { visitor[type] = funcs[type]; } + return visitor + } + + function skipThrough(node, st, c) { c(node, st); } + function ignore(_node, _st, _c) {} + + // Node walkers. + + var base = {}; + + base.Program = base.BlockStatement = function (node, st, c) { + for (var i = 0, list = node.body; i < list.length; i += 1) + { + var stmt = list[i]; + + c(stmt, st, "Statement"); + } + }; + base.Statement = skipThrough; + base.EmptyStatement = ignore; + base.ExpressionStatement = base.ParenthesizedExpression = + function (node, st, c) { return c(node.expression, st, "Expression"); }; + base.IfStatement = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.consequent, st, "Statement"); + if (node.alternate) { c(node.alternate, st, "Statement"); } + }; + base.LabeledStatement = function (node, st, c) { return c(node.body, st, "Statement"); }; + base.BreakStatement = base.ContinueStatement = ignore; + base.WithStatement = function (node, st, c) { + c(node.object, st, "Expression"); + c(node.body, st, "Statement"); + }; + base.SwitchStatement = function (node, st, c) { + c(node.discriminant, st, "Expression"); + for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) { + var cs = list$1[i$1]; + + if (cs.test) { c(cs.test, st, "Expression"); } + for (var i = 0, list = cs.consequent; i < list.length; i += 1) + { + var cons = list[i]; + + c(cons, st, "Statement"); + } + } + }; + base.SwitchCase = function (node, st, c) { + if (node.test) { c(node.test, st, "Expression"); } + for (var i = 0, list = node.consequent; i < list.length; i += 1) + { + var cons = list[i]; + + c(cons, st, "Statement"); + } + }; + base.ReturnStatement = base.YieldExpression = base.AwaitExpression = function (node, st, c) { + if (node.argument) { c(node.argument, st, "Expression"); } + }; + base.ThrowStatement = base.SpreadElement = + function (node, st, c) { return c(node.argument, st, "Expression"); }; + base.TryStatement = function (node, st, c) { + c(node.block, st, "Statement"); + if (node.handler) { c(node.handler, st); } + if (node.finalizer) { c(node.finalizer, st, "Statement"); } + }; + base.CatchClause = function (node, st, c) { + if (node.param) { c(node.param, st, "Pattern"); } + c(node.body, st, "Statement"); + }; + base.WhileStatement = base.DoWhileStatement = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.body, st, "Statement"); + }; + base.ForStatement = function (node, st, c) { + if (node.init) { c(node.init, st, "ForInit"); } + if (node.test) { c(node.test, st, "Expression"); } + if (node.update) { c(node.update, st, "Expression"); } + c(node.body, st, "Statement"); + }; + base.ForInStatement = base.ForOfStatement = function (node, st, c) { + c(node.left, st, "ForInit"); + c(node.right, st, "Expression"); + c(node.body, st, "Statement"); + }; + base.ForInit = function (node, st, c) { + if (node.type === "VariableDeclaration") { c(node, st); } + else { c(node, st, "Expression"); } + }; + base.DebuggerStatement = ignore; + + base.FunctionDeclaration = function (node, st, c) { return c(node, st, "Function"); }; + base.VariableDeclaration = function (node, st, c) { + for (var i = 0, list = node.declarations; i < list.length; i += 1) + { + var decl = list[i]; + + c(decl, st); + } + }; + base.VariableDeclarator = function (node, st, c) { + c(node.id, st, "Pattern"); + if (node.init) { c(node.init, st, "Expression"); } + }; + + base.Function = function (node, st, c) { + if (node.id) { c(node.id, st, "Pattern"); } + for (var i = 0, list = node.params; i < list.length; i += 1) + { + var param = list[i]; + + c(param, st, "Pattern"); + } + c(node.body, st, node.expression ? "Expression" : "Statement"); + }; + + base.Pattern = function (node, st, c) { + if (node.type === "Identifier") + { c(node, st, "VariablePattern"); } + else if (node.type === "MemberExpression") + { c(node, st, "MemberPattern"); } + else + { c(node, st); } + }; + base.VariablePattern = ignore; + base.MemberPattern = skipThrough; + base.RestElement = function (node, st, c) { return c(node.argument, st, "Pattern"); }; + base.ArrayPattern = function (node, st, c) { + for (var i = 0, list = node.elements; i < list.length; i += 1) { + var elt = list[i]; + + if (elt) { c(elt, st, "Pattern"); } + } + }; + base.ObjectPattern = function (node, st, c) { + for (var i = 0, list = node.properties; i < list.length; i += 1) { + var prop = list[i]; + + if (prop.type === "Property") { + if (prop.computed) { c(prop.key, st, "Expression"); } + c(prop.value, st, "Pattern"); + } else if (prop.type === "RestElement") { + c(prop.argument, st, "Pattern"); + } + } + }; + + base.Expression = skipThrough; + base.ThisExpression = base.Super = base.MetaProperty = ignore; + base.ArrayExpression = function (node, st, c) { + for (var i = 0, list = node.elements; i < list.length; i += 1) { + var elt = list[i]; + + if (elt) { c(elt, st, "Expression"); } + } + }; + base.ObjectExpression = function (node, st, c) { + for (var i = 0, list = node.properties; i < list.length; i += 1) + { + var prop = list[i]; + + c(prop, st); + } + }; + base.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration; + base.SequenceExpression = function (node, st, c) { + for (var i = 0, list = node.expressions; i < list.length; i += 1) + { + var expr = list[i]; + + c(expr, st, "Expression"); + } + }; + base.TemplateLiteral = function (node, st, c) { + for (var i = 0, list = node.quasis; i < list.length; i += 1) + { + var quasi = list[i]; + + c(quasi, st); + } + + for (var i$1 = 0, list$1 = node.expressions; i$1 < list$1.length; i$1 += 1) + { + var expr = list$1[i$1]; + + c(expr, st, "Expression"); + } + }; + base.TemplateElement = ignore; + base.UnaryExpression = base.UpdateExpression = function (node, st, c) { + c(node.argument, st, "Expression"); + }; + base.BinaryExpression = base.LogicalExpression = function (node, st, c) { + c(node.left, st, "Expression"); + c(node.right, st, "Expression"); + }; + base.AssignmentExpression = base.AssignmentPattern = function (node, st, c) { + c(node.left, st, "Pattern"); + c(node.right, st, "Expression"); + }; + base.ConditionalExpression = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.consequent, st, "Expression"); + c(node.alternate, st, "Expression"); + }; + base.NewExpression = base.CallExpression = function (node, st, c) { + c(node.callee, st, "Expression"); + if (node.arguments) + { for (var i = 0, list = node.arguments; i < list.length; i += 1) + { + var arg = list[i]; + + c(arg, st, "Expression"); + } } + }; + base.MemberExpression = function (node, st, c) { + c(node.object, st, "Expression"); + if (node.computed) { c(node.property, st, "Expression"); } + }; + base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) { + if (node.declaration) + { c(node.declaration, st, node.type === "ExportNamedDeclaration" || node.declaration.id ? "Statement" : "Expression"); } + if (node.source) { c(node.source, st, "Expression"); } + }; + base.ExportAllDeclaration = function (node, st, c) { + c(node.source, st, "Expression"); + }; + base.ImportDeclaration = function (node, st, c) { + for (var i = 0, list = node.specifiers; i < list.length; i += 1) + { + var spec = list[i]; + + c(spec, st); + } + c(node.source, st, "Expression"); + }; + base.ImportExpression = function (node, st, c) { + c(node.source, st, "Expression"); + }; + base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.Literal = ignore; + + base.TaggedTemplateExpression = function (node, st, c) { + c(node.tag, st, "Expression"); + c(node.quasi, st, "Expression"); + }; + base.ClassDeclaration = base.ClassExpression = function (node, st, c) { return c(node, st, "Class"); }; + base.Class = function (node, st, c) { + if (node.id) { c(node.id, st, "Pattern"); } + if (node.superClass) { c(node.superClass, st, "Expression"); } + c(node.body, st); + }; + base.ClassBody = function (node, st, c) { + for (var i = 0, list = node.body; i < list.length; i += 1) + { + var elt = list[i]; + + c(elt, st); + } + }; + base.MethodDefinition = base.Property = function (node, st, c) { + if (node.computed) { c(node.key, st, "Expression"); } + c(node.value, st, "Expression"); + }; + + exports.ancestor = ancestor; + exports.base = base; + exports.findNodeAfter = findNodeAfter; + exports.findNodeAround = findNodeAround; + exports.findNodeAt = findNodeAt; + exports.findNodeBefore = findNodeBefore; + exports.full = full; + exports.fullAncestor = fullAncestor; + exports.make = make; + exports.recursive = recursive; + exports.simple = simple; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/acorn/acorn-walk/dist/walk.js.map b/node_modules/acorn/acorn-walk/dist/walk.js.map new file mode 100644 index 00000000..5590a292 --- /dev/null +++ b/node_modules/acorn/acorn-walk/dist/walk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"walk.js","sources":["../src/index.js"],"sourcesContent":["// AST walker module for Mozilla Parser API compatible trees\n\n// A simple walk is one where you simply specify callbacks to be\n// called on specific nodes. The last two arguments are optional. A\n// simple use would be\n//\n// walk.simple(myTree, {\n// Expression: function(node) { ... }\n// });\n//\n// to do something with all expressions. All Parser API node types\n// can be used to identify node types, as well as Expression and\n// Statement, which denote categories of nodes.\n//\n// The base argument can be used to pass a custom (recursive)\n// walker, and state can be used to give this walked an initial\n// state.\n\nexport function simple(node, visitors, baseVisitor, state, override) {\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type, found = visitors[type]\n baseVisitor[type](node, st, c)\n if (found) found(node, st)\n })(node, state, override)\n}\n\n// An ancestor walk keeps an array of ancestor nodes (including the\n// current node) and passes them to the callback as third parameter\n// (and also as state parameter when no other state is present).\nexport function ancestor(node, visitors, baseVisitor, state) {\n let ancestors = []\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type, found = visitors[type]\n let isNew = node !== ancestors[ancestors.length - 1]\n if (isNew) ancestors.push(node)\n baseVisitor[type](node, st, c)\n if (found) found(node, st || ancestors, ancestors)\n if (isNew) ancestors.pop()\n })(node, state)\n}\n\n// A recursive walk is one where your functions override the default\n// walkers. They can modify and replace the state parameter that's\n// threaded through the walk, and can opt how and whether to walk\n// their child nodes (by calling their third argument on these\n// nodes).\nexport function recursive(node, state, funcs, baseVisitor, override) {\n let visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor\n ;(function c(node, st, override) {\n visitor[override || node.type](node, st, c)\n })(node, state, override)\n}\n\nfunction makeTest(test) {\n if (typeof test === \"string\")\n return type => type === test\n else if (!test)\n return () => true\n else\n return test\n}\n\nclass Found {\n constructor(node, state) { this.node = node; this.state = state }\n}\n\n// A full walk triggers the callback on each node\nexport function full(node, callback, baseVisitor, state, override) {\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type\n baseVisitor[type](node, st, c)\n if (!override) callback(node, st, type)\n })(node, state, override)\n}\n\n// An fullAncestor walk is like an ancestor walk, but triggers\n// the callback on each node\nexport function fullAncestor(node, callback, baseVisitor, state) {\n if (!baseVisitor) baseVisitor = base\n let ancestors = []\n ;(function c(node, st, override) {\n let type = override || node.type\n let isNew = node !== ancestors[ancestors.length - 1]\n if (isNew) ancestors.push(node)\n baseVisitor[type](node, st, c)\n if (!override) callback(node, st || ancestors, ancestors, type)\n if (isNew) ancestors.pop()\n })(node, state)\n}\n\n// Find a node with a given start, end, and type (all are optional,\n// null can be used as wildcard). Returns a {node, state} object, or\n// undefined when it doesn't find a matching node.\nexport function findNodeAt(node, start, end, test, baseVisitor, state) {\n if (!baseVisitor) baseVisitor = base\n test = makeTest(test)\n try {\n (function c(node, st, override) {\n let type = override || node.type\n if ((start == null || node.start <= start) &&\n (end == null || node.end >= end))\n baseVisitor[type](node, st, c)\n if ((start == null || node.start === start) &&\n (end == null || node.end === end) &&\n test(type, node))\n throw new Found(node, st)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the innermost node of a given type that contains the given\n// position. Interface similar to findNodeAt.\nexport function findNodeAround(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n try {\n (function c(node, st, override) {\n let type = override || node.type\n if (node.start > pos || node.end < pos) return\n baseVisitor[type](node, st, c)\n if (test(type, node)) throw new Found(node, st)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the outermost matching node after a given position.\nexport function findNodeAfter(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n try {\n (function c(node, st, override) {\n if (node.end < pos) return\n let type = override || node.type\n if (node.start >= pos && test(type, node)) throw new Found(node, st)\n baseVisitor[type](node, st, c)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the outermost matching node before a given position.\nexport function findNodeBefore(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n let max\n ;(function c(node, st, override) {\n if (node.start > pos) return\n let type = override || node.type\n if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node))\n max = new Found(node, st)\n baseVisitor[type](node, st, c)\n })(node, state)\n return max\n}\n\n// Fallback to an Object.create polyfill for older environments.\nconst create = Object.create || function(proto) {\n function Ctor() {}\n Ctor.prototype = proto\n return new Ctor\n}\n\n// Used to create a custom walker. Will fill in all missing node\n// type properties with the defaults.\nexport function make(funcs, baseVisitor) {\n let visitor = create(baseVisitor || base)\n for (let type in funcs) visitor[type] = funcs[type]\n return visitor\n}\n\nfunction skipThrough(node, st, c) { c(node, st) }\nfunction ignore(_node, _st, _c) {}\n\n// Node walkers.\n\nexport const base = {}\n\nbase.Program = base.BlockStatement = (node, st, c) => {\n for (let stmt of node.body)\n c(stmt, st, \"Statement\")\n}\nbase.Statement = skipThrough\nbase.EmptyStatement = ignore\nbase.ExpressionStatement = base.ParenthesizedExpression =\n (node, st, c) => c(node.expression, st, \"Expression\")\nbase.IfStatement = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.consequent, st, \"Statement\")\n if (node.alternate) c(node.alternate, st, \"Statement\")\n}\nbase.LabeledStatement = (node, st, c) => c(node.body, st, \"Statement\")\nbase.BreakStatement = base.ContinueStatement = ignore\nbase.WithStatement = (node, st, c) => {\n c(node.object, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.SwitchStatement = (node, st, c) => {\n c(node.discriminant, st, \"Expression\")\n for (let cs of node.cases) {\n if (cs.test) c(cs.test, st, \"Expression\")\n for (let cons of cs.consequent)\n c(cons, st, \"Statement\")\n }\n}\nbase.SwitchCase = (node, st, c) => {\n if (node.test) c(node.test, st, \"Expression\")\n for (let cons of node.consequent)\n c(cons, st, \"Statement\")\n}\nbase.ReturnStatement = base.YieldExpression = base.AwaitExpression = (node, st, c) => {\n if (node.argument) c(node.argument, st, \"Expression\")\n}\nbase.ThrowStatement = base.SpreadElement =\n (node, st, c) => c(node.argument, st, \"Expression\")\nbase.TryStatement = (node, st, c) => {\n c(node.block, st, \"Statement\")\n if (node.handler) c(node.handler, st)\n if (node.finalizer) c(node.finalizer, st, \"Statement\")\n}\nbase.CatchClause = (node, st, c) => {\n if (node.param) c(node.param, st, \"Pattern\")\n c(node.body, st, \"Statement\")\n}\nbase.WhileStatement = base.DoWhileStatement = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForStatement = (node, st, c) => {\n if (node.init) c(node.init, st, \"ForInit\")\n if (node.test) c(node.test, st, \"Expression\")\n if (node.update) c(node.update, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForInStatement = base.ForOfStatement = (node, st, c) => {\n c(node.left, st, \"ForInit\")\n c(node.right, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForInit = (node, st, c) => {\n if (node.type === \"VariableDeclaration\") c(node, st)\n else c(node, st, \"Expression\")\n}\nbase.DebuggerStatement = ignore\n\nbase.FunctionDeclaration = (node, st, c) => c(node, st, \"Function\")\nbase.VariableDeclaration = (node, st, c) => {\n for (let decl of node.declarations)\n c(decl, st)\n}\nbase.VariableDeclarator = (node, st, c) => {\n c(node.id, st, \"Pattern\")\n if (node.init) c(node.init, st, \"Expression\")\n}\n\nbase.Function = (node, st, c) => {\n if (node.id) c(node.id, st, \"Pattern\")\n for (let param of node.params)\n c(param, st, \"Pattern\")\n c(node.body, st, node.expression ? \"Expression\" : \"Statement\")\n}\n\nbase.Pattern = (node, st, c) => {\n if (node.type === \"Identifier\")\n c(node, st, \"VariablePattern\")\n else if (node.type === \"MemberExpression\")\n c(node, st, \"MemberPattern\")\n else\n c(node, st)\n}\nbase.VariablePattern = ignore\nbase.MemberPattern = skipThrough\nbase.RestElement = (node, st, c) => c(node.argument, st, \"Pattern\")\nbase.ArrayPattern = (node, st, c) => {\n for (let elt of node.elements) {\n if (elt) c(elt, st, \"Pattern\")\n }\n}\nbase.ObjectPattern = (node, st, c) => {\n for (let prop of node.properties) {\n if (prop.type === \"Property\") {\n if (prop.computed) c(prop.key, st, \"Expression\")\n c(prop.value, st, \"Pattern\")\n } else if (prop.type === \"RestElement\") {\n c(prop.argument, st, \"Pattern\")\n }\n }\n}\n\nbase.Expression = skipThrough\nbase.ThisExpression = base.Super = base.MetaProperty = ignore\nbase.ArrayExpression = (node, st, c) => {\n for (let elt of node.elements) {\n if (elt) c(elt, st, \"Expression\")\n }\n}\nbase.ObjectExpression = (node, st, c) => {\n for (let prop of node.properties)\n c(prop, st)\n}\nbase.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration\nbase.SequenceExpression = (node, st, c) => {\n for (let expr of node.expressions)\n c(expr, st, \"Expression\")\n}\nbase.TemplateLiteral = (node, st, c) => {\n for (let quasi of node.quasis)\n c(quasi, st)\n\n for (let expr of node.expressions)\n c(expr, st, \"Expression\")\n}\nbase.TemplateElement = ignore\nbase.UnaryExpression = base.UpdateExpression = (node, st, c) => {\n c(node.argument, st, \"Expression\")\n}\nbase.BinaryExpression = base.LogicalExpression = (node, st, c) => {\n c(node.left, st, \"Expression\")\n c(node.right, st, \"Expression\")\n}\nbase.AssignmentExpression = base.AssignmentPattern = (node, st, c) => {\n c(node.left, st, \"Pattern\")\n c(node.right, st, \"Expression\")\n}\nbase.ConditionalExpression = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.consequent, st, \"Expression\")\n c(node.alternate, st, \"Expression\")\n}\nbase.NewExpression = base.CallExpression = (node, st, c) => {\n c(node.callee, st, \"Expression\")\n if (node.arguments)\n for (let arg of node.arguments)\n c(arg, st, \"Expression\")\n}\nbase.MemberExpression = (node, st, c) => {\n c(node.object, st, \"Expression\")\n if (node.computed) c(node.property, st, \"Expression\")\n}\nbase.ExportNamedDeclaration = base.ExportDefaultDeclaration = (node, st, c) => {\n if (node.declaration)\n c(node.declaration, st, node.type === \"ExportNamedDeclaration\" || node.declaration.id ? \"Statement\" : \"Expression\")\n if (node.source) c(node.source, st, \"Expression\")\n}\nbase.ExportAllDeclaration = (node, st, c) => {\n c(node.source, st, \"Expression\")\n}\nbase.ImportDeclaration = (node, st, c) => {\n for (let spec of node.specifiers)\n c(spec, st)\n c(node.source, st, \"Expression\")\n}\nbase.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.Literal = ignore\n\nbase.TaggedTemplateExpression = (node, st, c) => {\n c(node.tag, st, \"Expression\")\n c(node.quasi, st, \"Expression\")\n}\nbase.ClassDeclaration = base.ClassExpression = (node, st, c) => c(node, st, \"Class\")\nbase.Class = (node, st, c) => {\n if (node.id) c(node.id, st, \"Pattern\")\n if (node.superClass) c(node.superClass, st, \"Expression\")\n c(node.body, st)\n}\nbase.ClassBody = (node, st, c) => {\n for (let elt of node.body)\n c(elt, st)\n}\nbase.MethodDefinition = base.Property = (node, st, c) => {\n if (node.computed) c(node.key, st, \"Expression\")\n c(node.value, st, \"Expression\")\n}\n"],"names":["let","const"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/acorn/acorn-walk/dist/walk.mjs b/node_modules/acorn/acorn-walk/dist/walk.mjs new file mode 100644 index 00000000..2b5b05a0 --- /dev/null +++ b/node_modules/acorn/acorn-walk/dist/walk.mjs @@ -0,0 +1,441 @@ +// AST walker module for Mozilla Parser API compatible trees + +// A simple walk is one where you simply specify callbacks to be +// called on specific nodes. The last two arguments are optional. A +// simple use would be +// +// walk.simple(myTree, { +// Expression: function(node) { ... } +// }); +// +// to do something with all expressions. All Parser API node types +// can be used to identify node types, as well as Expression and +// Statement, which denote categories of nodes. +// +// The base argument can be used to pass a custom (recursive) +// walker, and state can be used to give this walked an initial +// state. + +function simple(node, visitors, baseVisitor, state, override) { + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type, found = visitors[type]; + baseVisitor[type](node, st, c); + if (found) { found(node, st); } + })(node, state, override); +} + +// An ancestor walk keeps an array of ancestor nodes (including the +// current node) and passes them to the callback as third parameter +// (and also as state parameter when no other state is present). +function ancestor(node, visitors, baseVisitor, state, override) { + var ancestors = []; + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type, found = visitors[type]; + var isNew = node !== ancestors[ancestors.length - 1]; + if (isNew) { ancestors.push(node); } + baseVisitor[type](node, st, c); + if (found) { found(node, st || ancestors, ancestors); } + if (isNew) { ancestors.pop(); } + })(node, state, override); +} + +// A recursive walk is one where your functions override the default +// walkers. They can modify and replace the state parameter that's +// threaded through the walk, and can opt how and whether to walk +// their child nodes (by calling their third argument on these +// nodes). +function recursive(node, state, funcs, baseVisitor, override) { + var visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor + ;(function c(node, st, override) { + visitor[override || node.type](node, st, c); + })(node, state, override); +} + +function makeTest(test) { + if (typeof test === "string") + { return function (type) { return type === test; } } + else if (!test) + { return function () { return true; } } + else + { return test } +} + +var Found = function Found(node, state) { this.node = node; this.state = state; }; + +// A full walk triggers the callback on each node +function full(node, callback, baseVisitor, state, override) { + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type; + baseVisitor[type](node, st, c); + if (!override) { callback(node, st, type); } + })(node, state, override); +} + +// An fullAncestor walk is like an ancestor walk, but triggers +// the callback on each node +function fullAncestor(node, callback, baseVisitor, state) { + if (!baseVisitor) { baseVisitor = base; } + var ancestors = [] + ;(function c(node, st, override) { + var type = override || node.type; + var isNew = node !== ancestors[ancestors.length - 1]; + if (isNew) { ancestors.push(node); } + baseVisitor[type](node, st, c); + if (!override) { callback(node, st || ancestors, ancestors, type); } + if (isNew) { ancestors.pop(); } + })(node, state); +} + +// Find a node with a given start, end, and type (all are optional, +// null can be used as wildcard). Returns a {node, state} object, or +// undefined when it doesn't find a matching node. +function findNodeAt(node, start, end, test, baseVisitor, state) { + if (!baseVisitor) { baseVisitor = base; } + test = makeTest(test); + try { + (function c(node, st, override) { + var type = override || node.type; + if ((start == null || node.start <= start) && + (end == null || node.end >= end)) + { baseVisitor[type](node, st, c); } + if ((start == null || node.start === start) && + (end == null || node.end === end) && + test(type, node)) + { throw new Found(node, st) } + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } +} + +// Find the innermost node of a given type that contains the given +// position. Interface similar to findNodeAt. +function findNodeAround(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + try { + (function c(node, st, override) { + var type = override || node.type; + if (node.start > pos || node.end < pos) { return } + baseVisitor[type](node, st, c); + if (test(type, node)) { throw new Found(node, st) } + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } +} + +// Find the outermost matching node after a given position. +function findNodeAfter(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + try { + (function c(node, st, override) { + if (node.end < pos) { return } + var type = override || node.type; + if (node.start >= pos && test(type, node)) { throw new Found(node, st) } + baseVisitor[type](node, st, c); + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } +} + +// Find the outermost matching node before a given position. +function findNodeBefore(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + var max + ;(function c(node, st, override) { + if (node.start > pos) { return } + var type = override || node.type; + if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node)) + { max = new Found(node, st); } + baseVisitor[type](node, st, c); + })(node, state); + return max +} + +// Fallback to an Object.create polyfill for older environments. +var create = Object.create || function(proto) { + function Ctor() {} + Ctor.prototype = proto; + return new Ctor +}; + +// Used to create a custom walker. Will fill in all missing node +// type properties with the defaults. +function make(funcs, baseVisitor) { + var visitor = create(baseVisitor || base); + for (var type in funcs) { visitor[type] = funcs[type]; } + return visitor +} + +function skipThrough(node, st, c) { c(node, st); } +function ignore(_node, _st, _c) {} + +// Node walkers. + +var base = {}; + +base.Program = base.BlockStatement = function (node, st, c) { + for (var i = 0, list = node.body; i < list.length; i += 1) + { + var stmt = list[i]; + + c(stmt, st, "Statement"); + } +}; +base.Statement = skipThrough; +base.EmptyStatement = ignore; +base.ExpressionStatement = base.ParenthesizedExpression = + function (node, st, c) { return c(node.expression, st, "Expression"); }; +base.IfStatement = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.consequent, st, "Statement"); + if (node.alternate) { c(node.alternate, st, "Statement"); } +}; +base.LabeledStatement = function (node, st, c) { return c(node.body, st, "Statement"); }; +base.BreakStatement = base.ContinueStatement = ignore; +base.WithStatement = function (node, st, c) { + c(node.object, st, "Expression"); + c(node.body, st, "Statement"); +}; +base.SwitchStatement = function (node, st, c) { + c(node.discriminant, st, "Expression"); + for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) { + var cs = list$1[i$1]; + + if (cs.test) { c(cs.test, st, "Expression"); } + for (var i = 0, list = cs.consequent; i < list.length; i += 1) + { + var cons = list[i]; + + c(cons, st, "Statement"); + } + } +}; +base.SwitchCase = function (node, st, c) { + if (node.test) { c(node.test, st, "Expression"); } + for (var i = 0, list = node.consequent; i < list.length; i += 1) + { + var cons = list[i]; + + c(cons, st, "Statement"); + } +}; +base.ReturnStatement = base.YieldExpression = base.AwaitExpression = function (node, st, c) { + if (node.argument) { c(node.argument, st, "Expression"); } +}; +base.ThrowStatement = base.SpreadElement = + function (node, st, c) { return c(node.argument, st, "Expression"); }; +base.TryStatement = function (node, st, c) { + c(node.block, st, "Statement"); + if (node.handler) { c(node.handler, st); } + if (node.finalizer) { c(node.finalizer, st, "Statement"); } +}; +base.CatchClause = function (node, st, c) { + if (node.param) { c(node.param, st, "Pattern"); } + c(node.body, st, "Statement"); +}; +base.WhileStatement = base.DoWhileStatement = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.body, st, "Statement"); +}; +base.ForStatement = function (node, st, c) { + if (node.init) { c(node.init, st, "ForInit"); } + if (node.test) { c(node.test, st, "Expression"); } + if (node.update) { c(node.update, st, "Expression"); } + c(node.body, st, "Statement"); +}; +base.ForInStatement = base.ForOfStatement = function (node, st, c) { + c(node.left, st, "ForInit"); + c(node.right, st, "Expression"); + c(node.body, st, "Statement"); +}; +base.ForInit = function (node, st, c) { + if (node.type === "VariableDeclaration") { c(node, st); } + else { c(node, st, "Expression"); } +}; +base.DebuggerStatement = ignore; + +base.FunctionDeclaration = function (node, st, c) { return c(node, st, "Function"); }; +base.VariableDeclaration = function (node, st, c) { + for (var i = 0, list = node.declarations; i < list.length; i += 1) + { + var decl = list[i]; + + c(decl, st); + } +}; +base.VariableDeclarator = function (node, st, c) { + c(node.id, st, "Pattern"); + if (node.init) { c(node.init, st, "Expression"); } +}; + +base.Function = function (node, st, c) { + if (node.id) { c(node.id, st, "Pattern"); } + for (var i = 0, list = node.params; i < list.length; i += 1) + { + var param = list[i]; + + c(param, st, "Pattern"); + } + c(node.body, st, node.expression ? "Expression" : "Statement"); +}; + +base.Pattern = function (node, st, c) { + if (node.type === "Identifier") + { c(node, st, "VariablePattern"); } + else if (node.type === "MemberExpression") + { c(node, st, "MemberPattern"); } + else + { c(node, st); } +}; +base.VariablePattern = ignore; +base.MemberPattern = skipThrough; +base.RestElement = function (node, st, c) { return c(node.argument, st, "Pattern"); }; +base.ArrayPattern = function (node, st, c) { + for (var i = 0, list = node.elements; i < list.length; i += 1) { + var elt = list[i]; + + if (elt) { c(elt, st, "Pattern"); } + } +}; +base.ObjectPattern = function (node, st, c) { + for (var i = 0, list = node.properties; i < list.length; i += 1) { + var prop = list[i]; + + if (prop.type === "Property") { + if (prop.computed) { c(prop.key, st, "Expression"); } + c(prop.value, st, "Pattern"); + } else if (prop.type === "RestElement") { + c(prop.argument, st, "Pattern"); + } + } +}; + +base.Expression = skipThrough; +base.ThisExpression = base.Super = base.MetaProperty = ignore; +base.ArrayExpression = function (node, st, c) { + for (var i = 0, list = node.elements; i < list.length; i += 1) { + var elt = list[i]; + + if (elt) { c(elt, st, "Expression"); } + } +}; +base.ObjectExpression = function (node, st, c) { + for (var i = 0, list = node.properties; i < list.length; i += 1) + { + var prop = list[i]; + + c(prop, st); + } +}; +base.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration; +base.SequenceExpression = function (node, st, c) { + for (var i = 0, list = node.expressions; i < list.length; i += 1) + { + var expr = list[i]; + + c(expr, st, "Expression"); + } +}; +base.TemplateLiteral = function (node, st, c) { + for (var i = 0, list = node.quasis; i < list.length; i += 1) + { + var quasi = list[i]; + + c(quasi, st); + } + + for (var i$1 = 0, list$1 = node.expressions; i$1 < list$1.length; i$1 += 1) + { + var expr = list$1[i$1]; + + c(expr, st, "Expression"); + } +}; +base.TemplateElement = ignore; +base.UnaryExpression = base.UpdateExpression = function (node, st, c) { + c(node.argument, st, "Expression"); +}; +base.BinaryExpression = base.LogicalExpression = function (node, st, c) { + c(node.left, st, "Expression"); + c(node.right, st, "Expression"); +}; +base.AssignmentExpression = base.AssignmentPattern = function (node, st, c) { + c(node.left, st, "Pattern"); + c(node.right, st, "Expression"); +}; +base.ConditionalExpression = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.consequent, st, "Expression"); + c(node.alternate, st, "Expression"); +}; +base.NewExpression = base.CallExpression = function (node, st, c) { + c(node.callee, st, "Expression"); + if (node.arguments) + { for (var i = 0, list = node.arguments; i < list.length; i += 1) + { + var arg = list[i]; + + c(arg, st, "Expression"); + } } +}; +base.MemberExpression = function (node, st, c) { + c(node.object, st, "Expression"); + if (node.computed) { c(node.property, st, "Expression"); } +}; +base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) { + if (node.declaration) + { c(node.declaration, st, node.type === "ExportNamedDeclaration" || node.declaration.id ? "Statement" : "Expression"); } + if (node.source) { c(node.source, st, "Expression"); } +}; +base.ExportAllDeclaration = function (node, st, c) { + c(node.source, st, "Expression"); +}; +base.ImportDeclaration = function (node, st, c) { + for (var i = 0, list = node.specifiers; i < list.length; i += 1) + { + var spec = list[i]; + + c(spec, st); + } + c(node.source, st, "Expression"); +}; +base.ImportExpression = function (node, st, c) { + c(node.source, st, "Expression"); +}; +base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.Literal = ignore; + +base.TaggedTemplateExpression = function (node, st, c) { + c(node.tag, st, "Expression"); + c(node.quasi, st, "Expression"); +}; +base.ClassDeclaration = base.ClassExpression = function (node, st, c) { return c(node, st, "Class"); }; +base.Class = function (node, st, c) { + if (node.id) { c(node.id, st, "Pattern"); } + if (node.superClass) { c(node.superClass, st, "Expression"); } + c(node.body, st); +}; +base.ClassBody = function (node, st, c) { + for (var i = 0, list = node.body; i < list.length; i += 1) + { + var elt = list[i]; + + c(elt, st); + } +}; +base.MethodDefinition = base.Property = function (node, st, c) { + if (node.computed) { c(node.key, st, "Expression"); } + c(node.value, st, "Expression"); +}; + +export { ancestor, base, findNodeAfter, findNodeAround, findNodeAt, findNodeBefore, full, fullAncestor, make, recursive, simple }; diff --git a/node_modules/acorn/acorn-walk/dist/walk.mjs.map b/node_modules/acorn/acorn-walk/dist/walk.mjs.map new file mode 100644 index 00000000..2a94219c --- /dev/null +++ b/node_modules/acorn/acorn-walk/dist/walk.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"walk.mjs","sources":["../src/index.js"],"sourcesContent":["// AST walker module for Mozilla Parser API compatible trees\n\n// A simple walk is one where you simply specify callbacks to be\n// called on specific nodes. The last two arguments are optional. A\n// simple use would be\n//\n// walk.simple(myTree, {\n// Expression: function(node) { ... }\n// });\n//\n// to do something with all expressions. All Parser API node types\n// can be used to identify node types, as well as Expression and\n// Statement, which denote categories of nodes.\n//\n// The base argument can be used to pass a custom (recursive)\n// walker, and state can be used to give this walked an initial\n// state.\n\nexport function simple(node, visitors, baseVisitor, state, override) {\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type, found = visitors[type]\n baseVisitor[type](node, st, c)\n if (found) found(node, st)\n })(node, state, override)\n}\n\n// An ancestor walk keeps an array of ancestor nodes (including the\n// current node) and passes them to the callback as third parameter\n// (and also as state parameter when no other state is present).\nexport function ancestor(node, visitors, baseVisitor, state) {\n let ancestors = []\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type, found = visitors[type]\n let isNew = node !== ancestors[ancestors.length - 1]\n if (isNew) ancestors.push(node)\n baseVisitor[type](node, st, c)\n if (found) found(node, st || ancestors, ancestors)\n if (isNew) ancestors.pop()\n })(node, state)\n}\n\n// A recursive walk is one where your functions override the default\n// walkers. They can modify and replace the state parameter that's\n// threaded through the walk, and can opt how and whether to walk\n// their child nodes (by calling their third argument on these\n// nodes).\nexport function recursive(node, state, funcs, baseVisitor, override) {\n let visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor\n ;(function c(node, st, override) {\n visitor[override || node.type](node, st, c)\n })(node, state, override)\n}\n\nfunction makeTest(test) {\n if (typeof test === \"string\")\n return type => type === test\n else if (!test)\n return () => true\n else\n return test\n}\n\nclass Found {\n constructor(node, state) { this.node = node; this.state = state }\n}\n\n// A full walk triggers the callback on each node\nexport function full(node, callback, baseVisitor, state, override) {\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type\n baseVisitor[type](node, st, c)\n if (!override) callback(node, st, type)\n })(node, state, override)\n}\n\n// An fullAncestor walk is like an ancestor walk, but triggers\n// the callback on each node\nexport function fullAncestor(node, callback, baseVisitor, state) {\n if (!baseVisitor) baseVisitor = base\n let ancestors = []\n ;(function c(node, st, override) {\n let type = override || node.type\n let isNew = node !== ancestors[ancestors.length - 1]\n if (isNew) ancestors.push(node)\n baseVisitor[type](node, st, c)\n if (!override) callback(node, st || ancestors, ancestors, type)\n if (isNew) ancestors.pop()\n })(node, state)\n}\n\n// Find a node with a given start, end, and type (all are optional,\n// null can be used as wildcard). Returns a {node, state} object, or\n// undefined when it doesn't find a matching node.\nexport function findNodeAt(node, start, end, test, baseVisitor, state) {\n if (!baseVisitor) baseVisitor = base\n test = makeTest(test)\n try {\n (function c(node, st, override) {\n let type = override || node.type\n if ((start == null || node.start <= start) &&\n (end == null || node.end >= end))\n baseVisitor[type](node, st, c)\n if ((start == null || node.start === start) &&\n (end == null || node.end === end) &&\n test(type, node))\n throw new Found(node, st)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the innermost node of a given type that contains the given\n// position. Interface similar to findNodeAt.\nexport function findNodeAround(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n try {\n (function c(node, st, override) {\n let type = override || node.type\n if (node.start > pos || node.end < pos) return\n baseVisitor[type](node, st, c)\n if (test(type, node)) throw new Found(node, st)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the outermost matching node after a given position.\nexport function findNodeAfter(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n try {\n (function c(node, st, override) {\n if (node.end < pos) return\n let type = override || node.type\n if (node.start >= pos && test(type, node)) throw new Found(node, st)\n baseVisitor[type](node, st, c)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the outermost matching node before a given position.\nexport function findNodeBefore(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n let max\n ;(function c(node, st, override) {\n if (node.start > pos) return\n let type = override || node.type\n if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node))\n max = new Found(node, st)\n baseVisitor[type](node, st, c)\n })(node, state)\n return max\n}\n\n// Fallback to an Object.create polyfill for older environments.\nconst create = Object.create || function(proto) {\n function Ctor() {}\n Ctor.prototype = proto\n return new Ctor\n}\n\n// Used to create a custom walker. Will fill in all missing node\n// type properties with the defaults.\nexport function make(funcs, baseVisitor) {\n let visitor = create(baseVisitor || base)\n for (let type in funcs) visitor[type] = funcs[type]\n return visitor\n}\n\nfunction skipThrough(node, st, c) { c(node, st) }\nfunction ignore(_node, _st, _c) {}\n\n// Node walkers.\n\nexport const base = {}\n\nbase.Program = base.BlockStatement = (node, st, c) => {\n for (let stmt of node.body)\n c(stmt, st, \"Statement\")\n}\nbase.Statement = skipThrough\nbase.EmptyStatement = ignore\nbase.ExpressionStatement = base.ParenthesizedExpression =\n (node, st, c) => c(node.expression, st, \"Expression\")\nbase.IfStatement = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.consequent, st, \"Statement\")\n if (node.alternate) c(node.alternate, st, \"Statement\")\n}\nbase.LabeledStatement = (node, st, c) => c(node.body, st, \"Statement\")\nbase.BreakStatement = base.ContinueStatement = ignore\nbase.WithStatement = (node, st, c) => {\n c(node.object, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.SwitchStatement = (node, st, c) => {\n c(node.discriminant, st, \"Expression\")\n for (let cs of node.cases) {\n if (cs.test) c(cs.test, st, \"Expression\")\n for (let cons of cs.consequent)\n c(cons, st, \"Statement\")\n }\n}\nbase.SwitchCase = (node, st, c) => {\n if (node.test) c(node.test, st, \"Expression\")\n for (let cons of node.consequent)\n c(cons, st, \"Statement\")\n}\nbase.ReturnStatement = base.YieldExpression = base.AwaitExpression = (node, st, c) => {\n if (node.argument) c(node.argument, st, \"Expression\")\n}\nbase.ThrowStatement = base.SpreadElement =\n (node, st, c) => c(node.argument, st, \"Expression\")\nbase.TryStatement = (node, st, c) => {\n c(node.block, st, \"Statement\")\n if (node.handler) c(node.handler, st)\n if (node.finalizer) c(node.finalizer, st, \"Statement\")\n}\nbase.CatchClause = (node, st, c) => {\n if (node.param) c(node.param, st, \"Pattern\")\n c(node.body, st, \"Statement\")\n}\nbase.WhileStatement = base.DoWhileStatement = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForStatement = (node, st, c) => {\n if (node.init) c(node.init, st, \"ForInit\")\n if (node.test) c(node.test, st, \"Expression\")\n if (node.update) c(node.update, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForInStatement = base.ForOfStatement = (node, st, c) => {\n c(node.left, st, \"ForInit\")\n c(node.right, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForInit = (node, st, c) => {\n if (node.type === \"VariableDeclaration\") c(node, st)\n else c(node, st, \"Expression\")\n}\nbase.DebuggerStatement = ignore\n\nbase.FunctionDeclaration = (node, st, c) => c(node, st, \"Function\")\nbase.VariableDeclaration = (node, st, c) => {\n for (let decl of node.declarations)\n c(decl, st)\n}\nbase.VariableDeclarator = (node, st, c) => {\n c(node.id, st, \"Pattern\")\n if (node.init) c(node.init, st, \"Expression\")\n}\n\nbase.Function = (node, st, c) => {\n if (node.id) c(node.id, st, \"Pattern\")\n for (let param of node.params)\n c(param, st, \"Pattern\")\n c(node.body, st, node.expression ? \"Expression\" : \"Statement\")\n}\n\nbase.Pattern = (node, st, c) => {\n if (node.type === \"Identifier\")\n c(node, st, \"VariablePattern\")\n else if (node.type === \"MemberExpression\")\n c(node, st, \"MemberPattern\")\n else\n c(node, st)\n}\nbase.VariablePattern = ignore\nbase.MemberPattern = skipThrough\nbase.RestElement = (node, st, c) => c(node.argument, st, \"Pattern\")\nbase.ArrayPattern = (node, st, c) => {\n for (let elt of node.elements) {\n if (elt) c(elt, st, \"Pattern\")\n }\n}\nbase.ObjectPattern = (node, st, c) => {\n for (let prop of node.properties) {\n if (prop.type === \"Property\") {\n if (prop.computed) c(prop.key, st, \"Expression\")\n c(prop.value, st, \"Pattern\")\n } else if (prop.type === \"RestElement\") {\n c(prop.argument, st, \"Pattern\")\n }\n }\n}\n\nbase.Expression = skipThrough\nbase.ThisExpression = base.Super = base.MetaProperty = ignore\nbase.ArrayExpression = (node, st, c) => {\n for (let elt of node.elements) {\n if (elt) c(elt, st, \"Expression\")\n }\n}\nbase.ObjectExpression = (node, st, c) => {\n for (let prop of node.properties)\n c(prop, st)\n}\nbase.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration\nbase.SequenceExpression = (node, st, c) => {\n for (let expr of node.expressions)\n c(expr, st, \"Expression\")\n}\nbase.TemplateLiteral = (node, st, c) => {\n for (let quasi of node.quasis)\n c(quasi, st)\n\n for (let expr of node.expressions)\n c(expr, st, \"Expression\")\n}\nbase.TemplateElement = ignore\nbase.UnaryExpression = base.UpdateExpression = (node, st, c) => {\n c(node.argument, st, \"Expression\")\n}\nbase.BinaryExpression = base.LogicalExpression = (node, st, c) => {\n c(node.left, st, \"Expression\")\n c(node.right, st, \"Expression\")\n}\nbase.AssignmentExpression = base.AssignmentPattern = (node, st, c) => {\n c(node.left, st, \"Pattern\")\n c(node.right, st, \"Expression\")\n}\nbase.ConditionalExpression = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.consequent, st, \"Expression\")\n c(node.alternate, st, \"Expression\")\n}\nbase.NewExpression = base.CallExpression = (node, st, c) => {\n c(node.callee, st, \"Expression\")\n if (node.arguments)\n for (let arg of node.arguments)\n c(arg, st, \"Expression\")\n}\nbase.MemberExpression = (node, st, c) => {\n c(node.object, st, \"Expression\")\n if (node.computed) c(node.property, st, \"Expression\")\n}\nbase.ExportNamedDeclaration = base.ExportDefaultDeclaration = (node, st, c) => {\n if (node.declaration)\n c(node.declaration, st, node.type === \"ExportNamedDeclaration\" || node.declaration.id ? \"Statement\" : \"Expression\")\n if (node.source) c(node.source, st, \"Expression\")\n}\nbase.ExportAllDeclaration = (node, st, c) => {\n c(node.source, st, \"Expression\")\n}\nbase.ImportDeclaration = (node, st, c) => {\n for (let spec of node.specifiers)\n c(spec, st)\n c(node.source, st, \"Expression\")\n}\nbase.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.Literal = ignore\n\nbase.TaggedTemplateExpression = (node, st, c) => {\n c(node.tag, st, \"Expression\")\n c(node.quasi, st, \"Expression\")\n}\nbase.ClassDeclaration = base.ClassExpression = (node, st, c) => c(node, st, \"Class\")\nbase.Class = (node, st, c) => {\n if (node.id) c(node.id, st, \"Pattern\")\n if (node.superClass) c(node.superClass, st, \"Expression\")\n c(node.body, st)\n}\nbase.ClassBody = (node, st, c) => {\n for (let elt of node.body)\n c(elt, st)\n}\nbase.MethodDefinition = base.Property = (node, st, c) => {\n if (node.computed) c(node.key, st, \"Expression\")\n c(node.value, st, \"Expression\")\n}\n"],"names":["let","const"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/acorn/acorn/dist/acorn.js b/node_modules/acorn/acorn/dist/acorn.js new file mode 100644 index 00000000..52644f28 --- /dev/null +++ b/node_modules/acorn/acorn/dist/acorn.js @@ -0,0 +1,4992 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.acorn = {})); +}(this, function (exports) { 'use strict'; + + // Reserved word lists for various dialects of the language + + var reservedWords = { + 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile", + 5: "class enum extends super const export import", + 6: "enum", + strict: "implements interface let package private protected public static yield", + strictBind: "eval arguments" + }; + + // And the keywords + + var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this"; + + var keywords = { + 5: ecma5AndLessKeywords, + "5module": ecma5AndLessKeywords + " export import", + 6: ecma5AndLessKeywords + " const class extends export import super" + }; + + var keywordRelationalOperator = /^in(stanceof)?$/; + + // ## Character categories + + // Big ugly regular expressions that match characters in the + // whitespace, identifier, and identifier-start categories. These + // are only applied when a character is found to actually have a + // code point above 128. + // Generated by `bin/generate-identifier-regex.js`. + var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7c6\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab67\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; + var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; + + var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); + var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); + + nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; + + // These are a run-length and offset encoded representation of the + // >0xffff code points that are a valid part of identifiers. The + // offset starts at 0x10000, and each pair of numbers represents an + // offset to the next range, and then a size of the range. They were + // generated by bin/generate-identifier-regex.js + + // eslint-disable-next-line comma-spacing + var astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,477,28,11,0,9,21,155,22,13,52,76,44,33,24,27,35,30,0,12,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,0,33,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,230,43,117,63,32,0,161,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,270,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,754,9486,286,50,2,18,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,2357,44,11,6,17,0,370,43,1301,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,15,7472,3104,541]; + + // eslint-disable-next-line comma-spacing + var astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,525,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,4,9,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,232,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1014,0,2,54,8,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,262,6,10,9,419,13,1495,6,110,6,6,9,792487,239]; + + // This has a complexity linear to the value of the code. The + // assumption is that looking up astral identifier characters is + // rare. + function isInAstralSet(code, set) { + var pos = 0x10000; + for (var i = 0; i < set.length; i += 2) { + pos += set[i]; + if (pos > code) { return false } + pos += set[i + 1]; + if (pos >= code) { return true } + } + } + + // Test whether a given character code starts an identifier. + + function isIdentifierStart(code, astral) { + if (code < 65) { return code === 36 } + if (code < 91) { return true } + if (code < 97) { return code === 95 } + if (code < 123) { return true } + if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) } + if (astral === false) { return false } + return isInAstralSet(code, astralIdentifierStartCodes) + } + + // Test whether a given character is part of an identifier. + + function isIdentifierChar(code, astral) { + if (code < 48) { return code === 36 } + if (code < 58) { return true } + if (code < 65) { return false } + if (code < 91) { return true } + if (code < 97) { return code === 95 } + if (code < 123) { return true } + if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) } + if (astral === false) { return false } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes) + } + + // ## Token types + + // The assignment of fine-grained, information-carrying type objects + // allows the tokenizer to store the information it has about a + // token in a way that is very cheap for the parser to look up. + + // All token type variables start with an underscore, to make them + // easy to recognize. + + // The `beforeExpr` property is used to disambiguate between regular + // expressions and divisions. It is set on all token types that can + // be followed by an expression (thus, a slash after them would be a + // regular expression). + // + // The `startsExpr` property is used to check if the token ends a + // `yield` expression. It is set on all token types that either can + // directly start an expression (like a quotation mark) or can + // continue an expression (like the body of a string). + // + // `isLoop` marks a keyword as starting a loop, which is important + // to know when parsing a label, in order to allow or disallow + // continue jumps to that label. + + var TokenType = function TokenType(label, conf) { + if ( conf === void 0 ) conf = {}; + + this.label = label; + this.keyword = conf.keyword; + this.beforeExpr = !!conf.beforeExpr; + this.startsExpr = !!conf.startsExpr; + this.isLoop = !!conf.isLoop; + this.isAssign = !!conf.isAssign; + this.prefix = !!conf.prefix; + this.postfix = !!conf.postfix; + this.binop = conf.binop || null; + this.updateContext = null; + }; + + function binop(name, prec) { + return new TokenType(name, {beforeExpr: true, binop: prec}) + } + var beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true}; + + // Map keyword names to token types. + + var keywords$1 = {}; + + // Succinct definitions of keyword token types + function kw(name, options) { + if ( options === void 0 ) options = {}; + + options.keyword = name; + return keywords$1[name] = new TokenType(name, options) + } + + var types = { + num: new TokenType("num", startsExpr), + regexp: new TokenType("regexp", startsExpr), + string: new TokenType("string", startsExpr), + name: new TokenType("name", startsExpr), + eof: new TokenType("eof"), + + // Punctuation token types. + bracketL: new TokenType("[", {beforeExpr: true, startsExpr: true}), + bracketR: new TokenType("]"), + braceL: new TokenType("{", {beforeExpr: true, startsExpr: true}), + braceR: new TokenType("}"), + parenL: new TokenType("(", {beforeExpr: true, startsExpr: true}), + parenR: new TokenType(")"), + comma: new TokenType(",", beforeExpr), + semi: new TokenType(";", beforeExpr), + colon: new TokenType(":", beforeExpr), + dot: new TokenType("."), + question: new TokenType("?", beforeExpr), + arrow: new TokenType("=>", beforeExpr), + template: new TokenType("template"), + invalidTemplate: new TokenType("invalidTemplate"), + ellipsis: new TokenType("...", beforeExpr), + backQuote: new TokenType("`", startsExpr), + dollarBraceL: new TokenType("${", {beforeExpr: true, startsExpr: true}), + + // Operators. These carry several kinds of properties to help the + // parser use them properly (the presence of these properties is + // what categorizes them as operators). + // + // `binop`, when present, specifies that this operator is a binary + // operator, and will refer to its precedence. + // + // `prefix` and `postfix` mark the operator as a prefix or postfix + // unary operator. + // + // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as + // binary operators with a very low precedence, that should result + // in AssignmentExpression nodes. + + eq: new TokenType("=", {beforeExpr: true, isAssign: true}), + assign: new TokenType("_=", {beforeExpr: true, isAssign: true}), + incDec: new TokenType("++/--", {prefix: true, postfix: true, startsExpr: true}), + prefix: new TokenType("!/~", {beforeExpr: true, prefix: true, startsExpr: true}), + logicalOR: binop("||", 1), + logicalAND: binop("&&", 2), + bitwiseOR: binop("|", 3), + bitwiseXOR: binop("^", 4), + bitwiseAND: binop("&", 5), + equality: binop("==/!=/===/!==", 6), + relational: binop("/<=/>=", 7), + bitShift: binop("<>/>>>", 8), + plusMin: new TokenType("+/-", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}), + modulo: binop("%", 10), + star: binop("*", 10), + slash: binop("/", 10), + starstar: new TokenType("**", {beforeExpr: true}), + + // Keyword token types. + _break: kw("break"), + _case: kw("case", beforeExpr), + _catch: kw("catch"), + _continue: kw("continue"), + _debugger: kw("debugger"), + _default: kw("default", beforeExpr), + _do: kw("do", {isLoop: true, beforeExpr: true}), + _else: kw("else", beforeExpr), + _finally: kw("finally"), + _for: kw("for", {isLoop: true}), + _function: kw("function", startsExpr), + _if: kw("if"), + _return: kw("return", beforeExpr), + _switch: kw("switch"), + _throw: kw("throw", beforeExpr), + _try: kw("try"), + _var: kw("var"), + _const: kw("const"), + _while: kw("while", {isLoop: true}), + _with: kw("with"), + _new: kw("new", {beforeExpr: true, startsExpr: true}), + _this: kw("this", startsExpr), + _super: kw("super", startsExpr), + _class: kw("class", startsExpr), + _extends: kw("extends", beforeExpr), + _export: kw("export"), + _import: kw("import", startsExpr), + _null: kw("null", startsExpr), + _true: kw("true", startsExpr), + _false: kw("false", startsExpr), + _in: kw("in", {beforeExpr: true, binop: 7}), + _instanceof: kw("instanceof", {beforeExpr: true, binop: 7}), + _typeof: kw("typeof", {beforeExpr: true, prefix: true, startsExpr: true}), + _void: kw("void", {beforeExpr: true, prefix: true, startsExpr: true}), + _delete: kw("delete", {beforeExpr: true, prefix: true, startsExpr: true}) + }; + + // Matches a whole line break (where CRLF is considered a single + // line break). Used to count lines. + + var lineBreak = /\r\n?|\n|\u2028|\u2029/; + var lineBreakG = new RegExp(lineBreak.source, "g"); + + function isNewLine(code, ecma2019String) { + return code === 10 || code === 13 || (!ecma2019String && (code === 0x2028 || code === 0x2029)) + } + + var nonASCIIwhitespace = /[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/; + + var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g; + + var ref = Object.prototype; + var hasOwnProperty = ref.hasOwnProperty; + var toString = ref.toString; + + // Checks if an object has a property. + + function has(obj, propName) { + return hasOwnProperty.call(obj, propName) + } + + var isArray = Array.isArray || (function (obj) { return ( + toString.call(obj) === "[object Array]" + ); }); + + function wordsRegexp(words) { + return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$") + } + + // These are used when `options.locations` is on, for the + // `startLoc` and `endLoc` properties. + + var Position = function Position(line, col) { + this.line = line; + this.column = col; + }; + + Position.prototype.offset = function offset (n) { + return new Position(this.line, this.column + n) + }; + + var SourceLocation = function SourceLocation(p, start, end) { + this.start = start; + this.end = end; + if (p.sourceFile !== null) { this.source = p.sourceFile; } + }; + + // The `getLineInfo` function is mostly useful when the + // `locations` option is off (for performance reasons) and you + // want to find the line/column position for a given character + // offset. `input` should be the code string that the offset refers + // into. + + function getLineInfo(input, offset) { + for (var line = 1, cur = 0;;) { + lineBreakG.lastIndex = cur; + var match = lineBreakG.exec(input); + if (match && match.index < offset) { + ++line; + cur = match.index + match[0].length; + } else { + return new Position(line, offset - cur) + } + } + } + + // A second optional argument can be given to further configure + // the parser process. These options are recognized: + + var defaultOptions = { + // `ecmaVersion` indicates the ECMAScript version to parse. Must be + // either 3, 5, 6 (2015), 7 (2016), 8 (2017), 9 (2018), or 10 + // (2019). This influences support for strict mode, the set of + // reserved words, and support for new syntax features. The default + // is 9. + ecmaVersion: 9, + // `sourceType` indicates the mode the code should be parsed in. + // Can be either `"script"` or `"module"`. This influences global + // strict mode and parsing of `import` and `export` declarations. + sourceType: "script", + // `onInsertedSemicolon` can be a callback that will be called + // when a semicolon is automatically inserted. It will be passed + // the position of the comma as an offset, and if `locations` is + // enabled, it is given the location as a `{line, column}` object + // as second argument. + onInsertedSemicolon: null, + // `onTrailingComma` is similar to `onInsertedSemicolon`, but for + // trailing commas. + onTrailingComma: null, + // By default, reserved words are only enforced if ecmaVersion >= 5. + // Set `allowReserved` to a boolean value to explicitly turn this on + // an off. When this option has the value "never", reserved words + // and keywords can also not be used as property names. + allowReserved: null, + // When enabled, a return at the top level is not considered an + // error. + allowReturnOutsideFunction: false, + // When enabled, import/export statements are not constrained to + // appearing at the top of the program. + allowImportExportEverywhere: false, + // When enabled, await identifiers are allowed to appear at the top-level scope, + // but they are still not allowed in non-async functions. + allowAwaitOutsideFunction: false, + // When enabled, hashbang directive in the beginning of file + // is allowed and treated as a line comment. + allowHashBang: false, + // When `locations` is on, `loc` properties holding objects with + // `start` and `end` properties in `{line, column}` form (with + // line being 1-based and column 0-based) will be attached to the + // nodes. + locations: false, + // A function can be passed as `onToken` option, which will + // cause Acorn to call that function with object in the same + // format as tokens returned from `tokenizer().getToken()`. Note + // that you are not allowed to call the parser from the + // callback—that will corrupt its internal state. + onToken: null, + // A function can be passed as `onComment` option, which will + // cause Acorn to call that function with `(block, text, start, + // end)` parameters whenever a comment is skipped. `block` is a + // boolean indicating whether this is a block (`/* */`) comment, + // `text` is the content of the comment, and `start` and `end` are + // character offsets that denote the start and end of the comment. + // When the `locations` option is on, two more parameters are + // passed, the full `{line, column}` locations of the start and + // end of the comments. Note that you are not allowed to call the + // parser from the callback—that will corrupt its internal state. + onComment: null, + // Nodes have their start and end characters offsets recorded in + // `start` and `end` properties (directly on the node, rather than + // the `loc` object, which holds line/column data. To also add a + // [semi-standardized][range] `range` property holding a `[start, + // end]` array with the same numbers, set the `ranges` option to + // `true`. + // + // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678 + ranges: false, + // It is possible to parse multiple files into a single AST by + // passing the tree produced by parsing the first file as + // `program` option in subsequent parses. This will add the + // toplevel forms of the parsed file to the `Program` (top) node + // of an existing parse tree. + program: null, + // When `locations` is on, you can pass this to record the source + // file in every node's `loc` object. + sourceFile: null, + // This value, if given, is stored in every node, whether + // `locations` is on or off. + directSourceFile: null, + // When enabled, parenthesized expressions are represented by + // (non-standard) ParenthesizedExpression nodes + preserveParens: false + }; + + // Interpret and default an options object + + function getOptions(opts) { + var options = {}; + + for (var opt in defaultOptions) + { options[opt] = opts && has(opts, opt) ? opts[opt] : defaultOptions[opt]; } + + if (options.ecmaVersion >= 2015) + { options.ecmaVersion -= 2009; } + + if (options.allowReserved == null) + { options.allowReserved = options.ecmaVersion < 5; } + + if (isArray(options.onToken)) { + var tokens = options.onToken; + options.onToken = function (token) { return tokens.push(token); }; + } + if (isArray(options.onComment)) + { options.onComment = pushComment(options, options.onComment); } + + return options + } + + function pushComment(options, array) { + return function(block, text, start, end, startLoc, endLoc) { + var comment = { + type: block ? "Block" : "Line", + value: text, + start: start, + end: end + }; + if (options.locations) + { comment.loc = new SourceLocation(this, startLoc, endLoc); } + if (options.ranges) + { comment.range = [start, end]; } + array.push(comment); + } + } + + // Each scope gets a bitset that may contain these flags + var + SCOPE_TOP = 1, + SCOPE_FUNCTION = 2, + SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION, + SCOPE_ASYNC = 4, + SCOPE_GENERATOR = 8, + SCOPE_ARROW = 16, + SCOPE_SIMPLE_CATCH = 32, + SCOPE_SUPER = 64, + SCOPE_DIRECT_SUPER = 128; + + function functionFlags(async, generator) { + return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0) + } + + // Used in checkLVal and declareName to determine the type of a binding + var + BIND_NONE = 0, // Not a binding + BIND_VAR = 1, // Var-style binding + BIND_LEXICAL = 2, // Let- or const-style binding + BIND_FUNCTION = 3, // Function declaration + BIND_SIMPLE_CATCH = 4, // Simple (identifier pattern) catch binding + BIND_OUTSIDE = 5; // Special case for function names as bound inside the function + + var Parser = function Parser(options, input, startPos) { + this.options = options = getOptions(options); + this.sourceFile = options.sourceFile; + this.keywords = wordsRegexp(keywords[options.ecmaVersion >= 6 ? 6 : options.sourceType === "module" ? "5module" : 5]); + var reserved = ""; + if (options.allowReserved !== true) { + for (var v = options.ecmaVersion;; v--) + { if (reserved = reservedWords[v]) { break } } + if (options.sourceType === "module") { reserved += " await"; } + } + this.reservedWords = wordsRegexp(reserved); + var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict; + this.reservedWordsStrict = wordsRegexp(reservedStrict); + this.reservedWordsStrictBind = wordsRegexp(reservedStrict + " " + reservedWords.strictBind); + this.input = String(input); + + // Used to signal to callers of `readWord1` whether the word + // contained any escape sequences. This is needed because words with + // escape sequences must not be interpreted as keywords. + this.containsEsc = false; + + // Set up token state + + // The current position of the tokenizer in the input. + if (startPos) { + this.pos = startPos; + this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1; + this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; + } else { + this.pos = this.lineStart = 0; + this.curLine = 1; + } + + // Properties of the current token: + // Its type + this.type = types.eof; + // For tokens that include more information than their type, the value + this.value = null; + // Its start and end offset + this.start = this.end = this.pos; + // And, if locations are used, the {line, column} object + // corresponding to those offsets + this.startLoc = this.endLoc = this.curPosition(); + + // Position information for the previous token + this.lastTokEndLoc = this.lastTokStartLoc = null; + this.lastTokStart = this.lastTokEnd = this.pos; + + // The context stack is used to superficially track syntactic + // context to predict whether a regular expression is allowed in a + // given position. + this.context = this.initialContext(); + this.exprAllowed = true; + + // Figure out if it's a module code. + this.inModule = options.sourceType === "module"; + this.strict = this.inModule || this.strictDirective(this.pos); + + // Used to signify the start of a potential arrow function + this.potentialArrowAt = -1; + + // Positions to delayed-check that yield/await does not exist in default parameters. + this.yieldPos = this.awaitPos = this.awaitIdentPos = 0; + // Labels in scope. + this.labels = []; + // Thus-far undefined exports. + this.undefinedExports = {}; + + // If enabled, skip leading hashbang line. + if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === "#!") + { this.skipLineComment(2); } + + // Scope tracking for duplicate variable names (see scope.js) + this.scopeStack = []; + this.enterScope(SCOPE_TOP); + + // For RegExp validation + this.regexpState = null; + }; + + var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true } }; + + Parser.prototype.parse = function parse () { + var node = this.options.program || this.startNode(); + this.nextToken(); + return this.parseTopLevel(node) + }; + + prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 }; + prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 }; + prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 }; + prototypeAccessors.allowSuper.get = function () { return (this.currentThisScope().flags & SCOPE_SUPER) > 0 }; + prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 }; + prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) }; + + // Switch to a getter for 7.0.0. + Parser.prototype.inNonArrowFunction = function inNonArrowFunction () { return (this.currentThisScope().flags & SCOPE_FUNCTION) > 0 }; + + Parser.extend = function extend () { + var plugins = [], len = arguments.length; + while ( len-- ) plugins[ len ] = arguments[ len ]; + + var cls = this; + for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); } + return cls + }; + + Parser.parse = function parse (input, options) { + return new this(options, input).parse() + }; + + Parser.parseExpressionAt = function parseExpressionAt (input, pos, options) { + var parser = new this(options, input, pos); + parser.nextToken(); + return parser.parseExpression() + }; + + Parser.tokenizer = function tokenizer (input, options) { + return new this(options, input) + }; + + Object.defineProperties( Parser.prototype, prototypeAccessors ); + + var pp = Parser.prototype; + + // ## Parser utilities + + var literal = /^(?:'((?:\\.|[^'])*?)'|"((?:\\.|[^"])*?)")/; + pp.strictDirective = function(start) { + for (;;) { + // Try to find string literal. + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this.input)[0].length; + var match = literal.exec(this.input.slice(start)); + if (!match) { return false } + if ((match[1] || match[2]) === "use strict") { return true } + start += match[0].length; + + // Skip semicolon, if any. + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this.input)[0].length; + if (this.input[start] === ";") + { start++; } + } + }; + + // Predicate that tests whether the next token is of the given + // type, and if yes, consumes it as a side effect. + + pp.eat = function(type) { + if (this.type === type) { + this.next(); + return true + } else { + return false + } + }; + + // Tests whether parsed token is a contextual keyword. + + pp.isContextual = function(name) { + return this.type === types.name && this.value === name && !this.containsEsc + }; + + // Consumes contextual keyword if possible. + + pp.eatContextual = function(name) { + if (!this.isContextual(name)) { return false } + this.next(); + return true + }; + + // Asserts that following token is given contextual keyword. + + pp.expectContextual = function(name) { + if (!this.eatContextual(name)) { this.unexpected(); } + }; + + // Test whether a semicolon can be inserted at the current position. + + pp.canInsertSemicolon = function() { + return this.type === types.eof || + this.type === types.braceR || + lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) + }; + + pp.insertSemicolon = function() { + if (this.canInsertSemicolon()) { + if (this.options.onInsertedSemicolon) + { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); } + return true + } + }; + + // Consume a semicolon, or, failing that, see if we are allowed to + // pretend that there is a semicolon at this position. + + pp.semicolon = function() { + if (!this.eat(types.semi) && !this.insertSemicolon()) { this.unexpected(); } + }; + + pp.afterTrailingComma = function(tokType, notNext) { + if (this.type === tokType) { + if (this.options.onTrailingComma) + { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); } + if (!notNext) + { this.next(); } + return true + } + }; + + // Expect a token of a given type. If found, consume it, otherwise, + // raise an unexpected token error. + + pp.expect = function(type) { + this.eat(type) || this.unexpected(); + }; + + // Raise an unexpected token error. + + pp.unexpected = function(pos) { + this.raise(pos != null ? pos : this.start, "Unexpected token"); + }; + + function DestructuringErrors() { + this.shorthandAssign = + this.trailingComma = + this.parenthesizedAssign = + this.parenthesizedBind = + this.doubleProto = + -1; + } + + pp.checkPatternErrors = function(refDestructuringErrors, isAssign) { + if (!refDestructuringErrors) { return } + if (refDestructuringErrors.trailingComma > -1) + { this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); } + var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind; + if (parens > -1) { this.raiseRecoverable(parens, "Parenthesized pattern"); } + }; + + pp.checkExpressionErrors = function(refDestructuringErrors, andThrow) { + if (!refDestructuringErrors) { return false } + var shorthandAssign = refDestructuringErrors.shorthandAssign; + var doubleProto = refDestructuringErrors.doubleProto; + if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 } + if (shorthandAssign >= 0) + { this.raise(shorthandAssign, "Shorthand property assignments are valid only in destructuring patterns"); } + if (doubleProto >= 0) + { this.raiseRecoverable(doubleProto, "Redefinition of __proto__ property"); } + }; + + pp.checkYieldAwaitInDefaultParams = function() { + if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos)) + { this.raise(this.yieldPos, "Yield expression cannot be a default value"); } + if (this.awaitPos) + { this.raise(this.awaitPos, "Await expression cannot be a default value"); } + }; + + pp.isSimpleAssignTarget = function(expr) { + if (expr.type === "ParenthesizedExpression") + { return this.isSimpleAssignTarget(expr.expression) } + return expr.type === "Identifier" || expr.type === "MemberExpression" + }; + + var pp$1 = Parser.prototype; + + // ### Statement parsing + + // Parse a program. Initializes the parser, reads any number of + // statements, and wraps them in a Program node. Optionally takes a + // `program` argument. If present, the statements will be appended + // to its body instead of creating a new node. + + pp$1.parseTopLevel = function(node) { + var exports = {}; + if (!node.body) { node.body = []; } + while (this.type !== types.eof) { + var stmt = this.parseStatement(null, true, exports); + node.body.push(stmt); + } + if (this.inModule) + { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1) + { + var name = list[i]; + + this.raiseRecoverable(this.undefinedExports[name].start, ("Export '" + name + "' is not defined")); + } } + this.adaptDirectivePrologue(node.body); + this.next(); + node.sourceType = this.options.sourceType; + return this.finishNode(node, "Program") + }; + + var loopLabel = {kind: "loop"}, switchLabel = {kind: "switch"}; + + pp$1.isLet = function(context) { + if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { return false } + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + // For ambiguous cases, determine if a LexicalDeclaration (or only a + // Statement) is allowed here. If context is not empty then only a Statement + // is allowed. However, `let [` is an explicit negative lookahead for + // ExpressionStatement, so special-case it first. + if (nextCh === 91) { return true } // '[' + if (context) { return false } + + if (nextCh === 123) { return true } // '{' + if (isIdentifierStart(nextCh, true)) { + var pos = next + 1; + while (isIdentifierChar(this.input.charCodeAt(pos), true)) { ++pos; } + var ident = this.input.slice(next, pos); + if (!keywordRelationalOperator.test(ident)) { return true } + } + return false + }; + + // check 'async [no LineTerminator here] function' + // - 'async /*foo*/ function' is OK. + // - 'async /*\n*/ function' is invalid. + pp$1.isAsyncFunction = function() { + if (this.options.ecmaVersion < 8 || !this.isContextual("async")) + { return false } + + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length; + return !lineBreak.test(this.input.slice(this.pos, next)) && + this.input.slice(next, next + 8) === "function" && + (next + 8 === this.input.length || !isIdentifierChar(this.input.charAt(next + 8))) + }; + + // Parse a single statement. + // + // If expecting a statement and finding a slash operator, parse a + // regular expression literal. This is to handle cases like + // `if (foo) /blah/.exec(foo)`, where looking at the previous token + // does not help. + + pp$1.parseStatement = function(context, topLevel, exports) { + var starttype = this.type, node = this.startNode(), kind; + + if (this.isLet(context)) { + starttype = types._var; + kind = "let"; + } + + // Most types of statements are recognized by the keyword they + // start with. Many are trivial to parse, some require a bit of + // complexity. + + switch (starttype) { + case types._break: case types._continue: return this.parseBreakContinueStatement(node, starttype.keyword) + case types._debugger: return this.parseDebuggerStatement(node) + case types._do: return this.parseDoStatement(node) + case types._for: return this.parseForStatement(node) + case types._function: + // Function as sole body of either an if statement or a labeled statement + // works, but not when it is part of a labeled statement that is the sole + // body of an if statement. + if ((context && (this.strict || context !== "if" && context !== "label")) && this.options.ecmaVersion >= 6) { this.unexpected(); } + return this.parseFunctionStatement(node, false, !context) + case types._class: + if (context) { this.unexpected(); } + return this.parseClass(node, true) + case types._if: return this.parseIfStatement(node) + case types._return: return this.parseReturnStatement(node) + case types._switch: return this.parseSwitchStatement(node) + case types._throw: return this.parseThrowStatement(node) + case types._try: return this.parseTryStatement(node) + case types._const: case types._var: + kind = kind || this.value; + if (context && kind !== "var") { this.unexpected(); } + return this.parseVarStatement(node, kind) + case types._while: return this.parseWhileStatement(node) + case types._with: return this.parseWithStatement(node) + case types.braceL: return this.parseBlock(true, node) + case types.semi: return this.parseEmptyStatement(node) + case types._export: + case types._import: + if (this.options.ecmaVersion > 10 && starttype === types._import) { + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + if (nextCh === 40) // '(' + { return this.parseExpressionStatement(node, this.parseExpression()) } + } + + if (!this.options.allowImportExportEverywhere) { + if (!topLevel) + { this.raise(this.start, "'import' and 'export' may only appear at the top level"); } + if (!this.inModule) + { this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); } + } + return starttype === types._import ? this.parseImport(node) : this.parseExport(node, exports) + + // If the statement does not start with a statement keyword or a + // brace, it's an ExpressionStatement or LabeledStatement. We + // simply start parsing an expression, and afterwards, if the + // next token is a colon and the expression was a simple + // Identifier node, we switch to interpreting it as a label. + default: + if (this.isAsyncFunction()) { + if (context) { this.unexpected(); } + this.next(); + return this.parseFunctionStatement(node, true, !context) + } + + var maybeName = this.value, expr = this.parseExpression(); + if (starttype === types.name && expr.type === "Identifier" && this.eat(types.colon)) + { return this.parseLabeledStatement(node, maybeName, expr, context) } + else { return this.parseExpressionStatement(node, expr) } + } + }; + + pp$1.parseBreakContinueStatement = function(node, keyword) { + var isBreak = keyword === "break"; + this.next(); + if (this.eat(types.semi) || this.insertSemicolon()) { node.label = null; } + else if (this.type !== types.name) { this.unexpected(); } + else { + node.label = this.parseIdent(); + this.semicolon(); + } + + // Verify that there is an actual destination to break or + // continue to. + var i = 0; + for (; i < this.labels.length; ++i) { + var lab = this.labels[i]; + if (node.label == null || lab.name === node.label.name) { + if (lab.kind != null && (isBreak || lab.kind === "loop")) { break } + if (node.label && isBreak) { break } + } + } + if (i === this.labels.length) { this.raise(node.start, "Unsyntactic " + keyword); } + return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement") + }; + + pp$1.parseDebuggerStatement = function(node) { + this.next(); + this.semicolon(); + return this.finishNode(node, "DebuggerStatement") + }; + + pp$1.parseDoStatement = function(node) { + this.next(); + this.labels.push(loopLabel); + node.body = this.parseStatement("do"); + this.labels.pop(); + this.expect(types._while); + node.test = this.parseParenExpression(); + if (this.options.ecmaVersion >= 6) + { this.eat(types.semi); } + else + { this.semicolon(); } + return this.finishNode(node, "DoWhileStatement") + }; + + // Disambiguating between a `for` and a `for`/`in` or `for`/`of` + // loop is non-trivial. Basically, we have to parse the init `var` + // statement or expression, disallowing the `in` operator (see + // the second parameter to `parseExpression`), and then check + // whether the next token is `in` or `of`. When there is no init + // part (semicolon immediately after the opening parenthesis), it + // is a regular `for` loop. + + pp$1.parseForStatement = function(node) { + this.next(); + var awaitAt = (this.options.ecmaVersion >= 9 && (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction)) && this.eatContextual("await")) ? this.lastTokStart : -1; + this.labels.push(loopLabel); + this.enterScope(0); + this.expect(types.parenL); + if (this.type === types.semi) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, null) + } + var isLet = this.isLet(); + if (this.type === types._var || this.type === types._const || isLet) { + var init$1 = this.startNode(), kind = isLet ? "let" : this.value; + this.next(); + this.parseVar(init$1, true, kind); + this.finishNode(init$1, "VariableDeclaration"); + if ((this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types._in) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + } else { node.await = awaitAt > -1; } + } + return this.parseForIn(node, init$1) + } + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, init$1) + } + var refDestructuringErrors = new DestructuringErrors; + var init = this.parseExpression(true, refDestructuringErrors); + if (this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types._in) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + } else { node.await = awaitAt > -1; } + } + this.toAssignable(init, false, refDestructuringErrors); + this.checkLVal(init); + return this.parseForIn(node, init) + } else { + this.checkExpressionErrors(refDestructuringErrors, true); + } + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, init) + }; + + pp$1.parseFunctionStatement = function(node, isAsync, declarationPosition) { + this.next(); + return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync) + }; + + pp$1.parseIfStatement = function(node) { + this.next(); + node.test = this.parseParenExpression(); + // allow function declarations in branches, but only in non-strict mode + node.consequent = this.parseStatement("if"); + node.alternate = this.eat(types._else) ? this.parseStatement("if") : null; + return this.finishNode(node, "IfStatement") + }; + + pp$1.parseReturnStatement = function(node) { + if (!this.inFunction && !this.options.allowReturnOutsideFunction) + { this.raise(this.start, "'return' outside of function"); } + this.next(); + + // In `return` (and `break`/`continue`), the keywords with + // optional arguments, we eagerly look for a semicolon or the + // possibility to insert one. + + if (this.eat(types.semi) || this.insertSemicolon()) { node.argument = null; } + else { node.argument = this.parseExpression(); this.semicolon(); } + return this.finishNode(node, "ReturnStatement") + }; + + pp$1.parseSwitchStatement = function(node) { + this.next(); + node.discriminant = this.parseParenExpression(); + node.cases = []; + this.expect(types.braceL); + this.labels.push(switchLabel); + this.enterScope(0); + + // Statements under must be grouped (by label) in SwitchCase + // nodes. `cur` is used to keep the node that we are currently + // adding statements to. + + var cur; + for (var sawDefault = false; this.type !== types.braceR;) { + if (this.type === types._case || this.type === types._default) { + var isCase = this.type === types._case; + if (cur) { this.finishNode(cur, "SwitchCase"); } + node.cases.push(cur = this.startNode()); + cur.consequent = []; + this.next(); + if (isCase) { + cur.test = this.parseExpression(); + } else { + if (sawDefault) { this.raiseRecoverable(this.lastTokStart, "Multiple default clauses"); } + sawDefault = true; + cur.test = null; + } + this.expect(types.colon); + } else { + if (!cur) { this.unexpected(); } + cur.consequent.push(this.parseStatement(null)); + } + } + this.exitScope(); + if (cur) { this.finishNode(cur, "SwitchCase"); } + this.next(); // Closing brace + this.labels.pop(); + return this.finishNode(node, "SwitchStatement") + }; + + pp$1.parseThrowStatement = function(node) { + this.next(); + if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) + { this.raise(this.lastTokEnd, "Illegal newline after throw"); } + node.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ThrowStatement") + }; + + // Reused empty array added for node fields that are always empty. + + var empty = []; + + pp$1.parseTryStatement = function(node) { + this.next(); + node.block = this.parseBlock(); + node.handler = null; + if (this.type === types._catch) { + var clause = this.startNode(); + this.next(); + if (this.eat(types.parenL)) { + clause.param = this.parseBindingAtom(); + var simple = clause.param.type === "Identifier"; + this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0); + this.checkLVal(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL); + this.expect(types.parenR); + } else { + if (this.options.ecmaVersion < 10) { this.unexpected(); } + clause.param = null; + this.enterScope(0); + } + clause.body = this.parseBlock(false); + this.exitScope(); + node.handler = this.finishNode(clause, "CatchClause"); + } + node.finalizer = this.eat(types._finally) ? this.parseBlock() : null; + if (!node.handler && !node.finalizer) + { this.raise(node.start, "Missing catch or finally clause"); } + return this.finishNode(node, "TryStatement") + }; + + pp$1.parseVarStatement = function(node, kind) { + this.next(); + this.parseVar(node, false, kind); + this.semicolon(); + return this.finishNode(node, "VariableDeclaration") + }; + + pp$1.parseWhileStatement = function(node) { + this.next(); + node.test = this.parseParenExpression(); + this.labels.push(loopLabel); + node.body = this.parseStatement("while"); + this.labels.pop(); + return this.finishNode(node, "WhileStatement") + }; + + pp$1.parseWithStatement = function(node) { + if (this.strict) { this.raise(this.start, "'with' in strict mode"); } + this.next(); + node.object = this.parseParenExpression(); + node.body = this.parseStatement("with"); + return this.finishNode(node, "WithStatement") + }; + + pp$1.parseEmptyStatement = function(node) { + this.next(); + return this.finishNode(node, "EmptyStatement") + }; + + pp$1.parseLabeledStatement = function(node, maybeName, expr, context) { + for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1) + { + var label = list[i$1]; + + if (label.name === maybeName) + { this.raise(expr.start, "Label '" + maybeName + "' is already declared"); + } } + var kind = this.type.isLoop ? "loop" : this.type === types._switch ? "switch" : null; + for (var i = this.labels.length - 1; i >= 0; i--) { + var label$1 = this.labels[i]; + if (label$1.statementStart === node.start) { + // Update information about previous labels on this node + label$1.statementStart = this.start; + label$1.kind = kind; + } else { break } + } + this.labels.push({name: maybeName, kind: kind, statementStart: this.start}); + node.body = this.parseStatement(context ? context.indexOf("label") === -1 ? context + "label" : context : "label"); + this.labels.pop(); + node.label = expr; + return this.finishNode(node, "LabeledStatement") + }; + + pp$1.parseExpressionStatement = function(node, expr) { + node.expression = expr; + this.semicolon(); + return this.finishNode(node, "ExpressionStatement") + }; + + // Parse a semicolon-enclosed block of statements, handling `"use + // strict"` declarations when `allowStrict` is true (used for + // function bodies). + + pp$1.parseBlock = function(createNewLexicalScope, node) { + if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true; + if ( node === void 0 ) node = this.startNode(); + + node.body = []; + this.expect(types.braceL); + if (createNewLexicalScope) { this.enterScope(0); } + while (!this.eat(types.braceR)) { + var stmt = this.parseStatement(null); + node.body.push(stmt); + } + if (createNewLexicalScope) { this.exitScope(); } + return this.finishNode(node, "BlockStatement") + }; + + // Parse a regular `for` loop. The disambiguation code in + // `parseStatement` will already have parsed the init statement or + // expression. + + pp$1.parseFor = function(node, init) { + node.init = init; + this.expect(types.semi); + node.test = this.type === types.semi ? null : this.parseExpression(); + this.expect(types.semi); + node.update = this.type === types.parenR ? null : this.parseExpression(); + this.expect(types.parenR); + node.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node, "ForStatement") + }; + + // Parse a `for`/`in` and `for`/`of` loop, which are almost + // same from parser's perspective. + + pp$1.parseForIn = function(node, init) { + var isForIn = this.type === types._in; + this.next(); + + if ( + init.type === "VariableDeclaration" && + init.declarations[0].init != null && + ( + !isForIn || + this.options.ecmaVersion < 8 || + this.strict || + init.kind !== "var" || + init.declarations[0].id.type !== "Identifier" + ) + ) { + this.raise( + init.start, + ((isForIn ? "for-in" : "for-of") + " loop variable declaration may not have an initializer") + ); + } else if (init.type === "AssignmentPattern") { + this.raise(init.start, "Invalid left-hand side in for-loop"); + } + node.left = init; + node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign(); + this.expect(types.parenR); + node.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node, isForIn ? "ForInStatement" : "ForOfStatement") + }; + + // Parse a list of variable declarations. + + pp$1.parseVar = function(node, isFor, kind) { + node.declarations = []; + node.kind = kind; + for (;;) { + var decl = this.startNode(); + this.parseVarId(decl, kind); + if (this.eat(types.eq)) { + decl.init = this.parseMaybeAssign(isFor); + } else if (kind === "const" && !(this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of")))) { + this.unexpected(); + } else if (decl.id.type !== "Identifier" && !(isFor && (this.type === types._in || this.isContextual("of")))) { + this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value"); + } else { + decl.init = null; + } + node.declarations.push(this.finishNode(decl, "VariableDeclarator")); + if (!this.eat(types.comma)) { break } + } + return node + }; + + pp$1.parseVarId = function(decl, kind) { + decl.id = this.parseBindingAtom(); + this.checkLVal(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false); + }; + + var FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4; + + // Parse a function declaration or literal (depending on the + // `statement & FUNC_STATEMENT`). + + // Remove `allowExpressionBody` for 7.0.0, as it is only called with false + pp$1.parseFunction = function(node, statement, allowExpressionBody, isAsync) { + this.initFunction(node); + if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) { + if (this.type === types.star && (statement & FUNC_HANGING_STATEMENT)) + { this.unexpected(); } + node.generator = this.eat(types.star); + } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + if (statement & FUNC_STATEMENT) { + node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types.name ? null : this.parseIdent(); + if (node.id && !(statement & FUNC_HANGING_STATEMENT)) + // If it is a regular function declaration in sloppy mode, then it is + // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding + // mode depends on properties of the current scope (see + // treatFunctionsAsVar). + { this.checkLVal(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); } + } + + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + this.enterScope(functionFlags(node.async, node.generator)); + + if (!(statement & FUNC_STATEMENT)) + { node.id = this.type === types.name ? this.parseIdent() : null; } + + this.parseFunctionParams(node); + this.parseFunctionBody(node, allowExpressionBody, false); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node, (statement & FUNC_STATEMENT) ? "FunctionDeclaration" : "FunctionExpression") + }; + + pp$1.parseFunctionParams = function(node) { + this.expect(types.parenL); + node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + }; + + // Parse a class declaration or literal (depending on the + // `isStatement` parameter). + + pp$1.parseClass = function(node, isStatement) { + this.next(); + + // ecma-262 14.6 Class Definitions + // A class definition is always strict mode code. + var oldStrict = this.strict; + this.strict = true; + + this.parseClassId(node, isStatement); + this.parseClassSuper(node); + var classBody = this.startNode(); + var hadConstructor = false; + classBody.body = []; + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + var element = this.parseClassElement(node.superClass !== null); + if (element) { + classBody.body.push(element); + if (element.type === "MethodDefinition" && element.kind === "constructor") { + if (hadConstructor) { this.raise(element.start, "Duplicate constructor in the same class"); } + hadConstructor = true; + } + } + } + node.body = this.finishNode(classBody, "ClassBody"); + this.strict = oldStrict; + return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression") + }; + + pp$1.parseClassElement = function(constructorAllowsSuper) { + var this$1 = this; + + if (this.eat(types.semi)) { return null } + + var method = this.startNode(); + var tryContextual = function (k, noLineBreak) { + if ( noLineBreak === void 0 ) noLineBreak = false; + + var start = this$1.start, startLoc = this$1.startLoc; + if (!this$1.eatContextual(k)) { return false } + if (this$1.type !== types.parenL && (!noLineBreak || !this$1.canInsertSemicolon())) { return true } + if (method.key) { this$1.unexpected(); } + method.computed = false; + method.key = this$1.startNodeAt(start, startLoc); + method.key.name = k; + this$1.finishNode(method.key, "Identifier"); + return false + }; + + method.kind = "method"; + method.static = tryContextual("static"); + var isGenerator = this.eat(types.star); + var isAsync = false; + if (!isGenerator) { + if (this.options.ecmaVersion >= 8 && tryContextual("async", true)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(types.star); + } else if (tryContextual("get")) { + method.kind = "get"; + } else if (tryContextual("set")) { + method.kind = "set"; + } + } + if (!method.key) { this.parsePropertyName(method); } + var key = method.key; + var allowsDirectSuper = false; + if (!method.computed && !method.static && (key.type === "Identifier" && key.name === "constructor" || + key.type === "Literal" && key.value === "constructor")) { + if (method.kind !== "method") { this.raise(key.start, "Constructor can't have get/set modifier"); } + if (isGenerator) { this.raise(key.start, "Constructor can't be a generator"); } + if (isAsync) { this.raise(key.start, "Constructor can't be an async method"); } + method.kind = "constructor"; + allowsDirectSuper = constructorAllowsSuper; + } else if (method.static && key.type === "Identifier" && key.name === "prototype") { + this.raise(key.start, "Classes may not have a static property named prototype"); + } + this.parseClassMethod(method, isGenerator, isAsync, allowsDirectSuper); + if (method.kind === "get" && method.value.params.length !== 0) + { this.raiseRecoverable(method.value.start, "getter should have no params"); } + if (method.kind === "set" && method.value.params.length !== 1) + { this.raiseRecoverable(method.value.start, "setter should have exactly one param"); } + if (method.kind === "set" && method.value.params[0].type === "RestElement") + { this.raiseRecoverable(method.value.params[0].start, "Setter cannot use rest params"); } + return method + }; + + pp$1.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) { + method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper); + return this.finishNode(method, "MethodDefinition") + }; + + pp$1.parseClassId = function(node, isStatement) { + if (this.type === types.name) { + node.id = this.parseIdent(); + if (isStatement) + { this.checkLVal(node.id, BIND_LEXICAL, false); } + } else { + if (isStatement === true) + { this.unexpected(); } + node.id = null; + } + }; + + pp$1.parseClassSuper = function(node) { + node.superClass = this.eat(types._extends) ? this.parseExprSubscripts() : null; + }; + + // Parses module export declaration. + + pp$1.parseExport = function(node, exports) { + this.next(); + // export * from '...' + if (this.eat(types.star)) { + this.expectContextual("from"); + if (this.type !== types.string) { this.unexpected(); } + node.source = this.parseExprAtom(); + this.semicolon(); + return this.finishNode(node, "ExportAllDeclaration") + } + if (this.eat(types._default)) { // export default ... + this.checkExport(exports, "default", this.lastTokStart); + var isAsync; + if (this.type === types._function || (isAsync = this.isAsyncFunction())) { + var fNode = this.startNode(); + this.next(); + if (isAsync) { this.next(); } + node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync); + } else if (this.type === types._class) { + var cNode = this.startNode(); + node.declaration = this.parseClass(cNode, "nullableID"); + } else { + node.declaration = this.parseMaybeAssign(); + this.semicolon(); + } + return this.finishNode(node, "ExportDefaultDeclaration") + } + // export var|const|let|function|class ... + if (this.shouldParseExportStatement()) { + node.declaration = this.parseStatement(null); + if (node.declaration.type === "VariableDeclaration") + { this.checkVariableExport(exports, node.declaration.declarations); } + else + { this.checkExport(exports, node.declaration.id.name, node.declaration.id.start); } + node.specifiers = []; + node.source = null; + } else { // export { x, y as z } [from '...'] + node.declaration = null; + node.specifiers = this.parseExportSpecifiers(exports); + if (this.eatContextual("from")) { + if (this.type !== types.string) { this.unexpected(); } + node.source = this.parseExprAtom(); + } else { + for (var i = 0, list = node.specifiers; i < list.length; i += 1) { + // check for keywords used as local names + var spec = list[i]; + + this.checkUnreserved(spec.local); + // check if export is defined + this.checkLocalExport(spec.local); + } + + node.source = null; + } + this.semicolon(); + } + return this.finishNode(node, "ExportNamedDeclaration") + }; + + pp$1.checkExport = function(exports, name, pos) { + if (!exports) { return } + if (has(exports, name)) + { this.raiseRecoverable(pos, "Duplicate export '" + name + "'"); } + exports[name] = true; + }; + + pp$1.checkPatternExport = function(exports, pat) { + var type = pat.type; + if (type === "Identifier") + { this.checkExport(exports, pat.name, pat.start); } + else if (type === "ObjectPattern") + { for (var i = 0, list = pat.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this.checkPatternExport(exports, prop); + } } + else if (type === "ArrayPattern") + { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) { + var elt = list$1[i$1]; + + if (elt) { this.checkPatternExport(exports, elt); } + } } + else if (type === "Property") + { this.checkPatternExport(exports, pat.value); } + else if (type === "AssignmentPattern") + { this.checkPatternExport(exports, pat.left); } + else if (type === "RestElement") + { this.checkPatternExport(exports, pat.argument); } + else if (type === "ParenthesizedExpression") + { this.checkPatternExport(exports, pat.expression); } + }; + + pp$1.checkVariableExport = function(exports, decls) { + if (!exports) { return } + for (var i = 0, list = decls; i < list.length; i += 1) + { + var decl = list[i]; + + this.checkPatternExport(exports, decl.id); + } + }; + + pp$1.shouldParseExportStatement = function() { + return this.type.keyword === "var" || + this.type.keyword === "const" || + this.type.keyword === "class" || + this.type.keyword === "function" || + this.isLet() || + this.isAsyncFunction() + }; + + // Parses a comma-separated list of module exports. + + pp$1.parseExportSpecifiers = function(exports) { + var nodes = [], first = true; + // export { x, y as z } [from '...'] + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + if (!first) { + this.expect(types.comma); + if (this.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var node = this.startNode(); + node.local = this.parseIdent(true); + node.exported = this.eatContextual("as") ? this.parseIdent(true) : node.local; + this.checkExport(exports, node.exported.name, node.exported.start); + nodes.push(this.finishNode(node, "ExportSpecifier")); + } + return nodes + }; + + // Parses import declaration. + + pp$1.parseImport = function(node) { + this.next(); + // import '...' + if (this.type === types.string) { + node.specifiers = empty; + node.source = this.parseExprAtom(); + } else { + node.specifiers = this.parseImportSpecifiers(); + this.expectContextual("from"); + node.source = this.type === types.string ? this.parseExprAtom() : this.unexpected(); + } + this.semicolon(); + return this.finishNode(node, "ImportDeclaration") + }; + + // Parses a comma-separated list of module imports. + + pp$1.parseImportSpecifiers = function() { + var nodes = [], first = true; + if (this.type === types.name) { + // import defaultObj, { x, y as z } from '...' + var node = this.startNode(); + node.local = this.parseIdent(); + this.checkLVal(node.local, BIND_LEXICAL); + nodes.push(this.finishNode(node, "ImportDefaultSpecifier")); + if (!this.eat(types.comma)) { return nodes } + } + if (this.type === types.star) { + var node$1 = this.startNode(); + this.next(); + this.expectContextual("as"); + node$1.local = this.parseIdent(); + this.checkLVal(node$1.local, BIND_LEXICAL); + nodes.push(this.finishNode(node$1, "ImportNamespaceSpecifier")); + return nodes + } + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + if (!first) { + this.expect(types.comma); + if (this.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var node$2 = this.startNode(); + node$2.imported = this.parseIdent(true); + if (this.eatContextual("as")) { + node$2.local = this.parseIdent(); + } else { + this.checkUnreserved(node$2.imported); + node$2.local = node$2.imported; + } + this.checkLVal(node$2.local, BIND_LEXICAL); + nodes.push(this.finishNode(node$2, "ImportSpecifier")); + } + return nodes + }; + + // Set `ExpressionStatement#directive` property for directive prologues. + pp$1.adaptDirectivePrologue = function(statements) { + for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) { + statements[i].directive = statements[i].expression.raw.slice(1, -1); + } + }; + pp$1.isDirectiveCandidate = function(statement) { + return ( + statement.type === "ExpressionStatement" && + statement.expression.type === "Literal" && + typeof statement.expression.value === "string" && + // Reject parenthesized strings. + (this.input[statement.start] === "\"" || this.input[statement.start] === "'") + ) + }; + + var pp$2 = Parser.prototype; + + // Convert existing expression atom to assignable pattern + // if possible. + + pp$2.toAssignable = function(node, isBinding, refDestructuringErrors) { + if (this.options.ecmaVersion >= 6 && node) { + switch (node.type) { + case "Identifier": + if (this.inAsync && node.name === "await") + { this.raise(node.start, "Cannot use 'await' as identifier inside an async function"); } + break + + case "ObjectPattern": + case "ArrayPattern": + case "RestElement": + break + + case "ObjectExpression": + node.type = "ObjectPattern"; + if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + for (var i = 0, list = node.properties; i < list.length; i += 1) { + var prop = list[i]; + + this.toAssignable(prop, isBinding); + // Early error: + // AssignmentRestProperty[Yield, Await] : + // `...` DestructuringAssignmentTarget[Yield, Await] + // + // It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|. + if ( + prop.type === "RestElement" && + (prop.argument.type === "ArrayPattern" || prop.argument.type === "ObjectPattern") + ) { + this.raise(prop.argument.start, "Unexpected token"); + } + } + break + + case "Property": + // AssignmentProperty has type === "Property" + if (node.kind !== "init") { this.raise(node.key.start, "Object pattern can't contain getter or setter"); } + this.toAssignable(node.value, isBinding); + break + + case "ArrayExpression": + node.type = "ArrayPattern"; + if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + this.toAssignableList(node.elements, isBinding); + break + + case "SpreadElement": + node.type = "RestElement"; + this.toAssignable(node.argument, isBinding); + if (node.argument.type === "AssignmentPattern") + { this.raise(node.argument.start, "Rest elements cannot have a default value"); } + break + + case "AssignmentExpression": + if (node.operator !== "=") { this.raise(node.left.end, "Only '=' operator can be used for specifying default value."); } + node.type = "AssignmentPattern"; + delete node.operator; + this.toAssignable(node.left, isBinding); + // falls through to AssignmentPattern + + case "AssignmentPattern": + break + + case "ParenthesizedExpression": + this.toAssignable(node.expression, isBinding, refDestructuringErrors); + break + + case "MemberExpression": + if (!isBinding) { break } + + default: + this.raise(node.start, "Assigning to rvalue"); + } + } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + return node + }; + + // Convert list of expression atoms to binding list. + + pp$2.toAssignableList = function(exprList, isBinding) { + var end = exprList.length; + for (var i = 0; i < end; i++) { + var elt = exprList[i]; + if (elt) { this.toAssignable(elt, isBinding); } + } + if (end) { + var last = exprList[end - 1]; + if (this.options.ecmaVersion === 6 && isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier") + { this.unexpected(last.argument.start); } + } + return exprList + }; + + // Parses spread element. + + pp$2.parseSpread = function(refDestructuringErrors) { + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeAssign(false, refDestructuringErrors); + return this.finishNode(node, "SpreadElement") + }; + + pp$2.parseRestBinding = function() { + var node = this.startNode(); + this.next(); + + // RestElement inside of a function parameter must be an identifier + if (this.options.ecmaVersion === 6 && this.type !== types.name) + { this.unexpected(); } + + node.argument = this.parseBindingAtom(); + + return this.finishNode(node, "RestElement") + }; + + // Parses lvalue (assignable) atom. + + pp$2.parseBindingAtom = function() { + if (this.options.ecmaVersion >= 6) { + switch (this.type) { + case types.bracketL: + var node = this.startNode(); + this.next(); + node.elements = this.parseBindingList(types.bracketR, true, true); + return this.finishNode(node, "ArrayPattern") + + case types.braceL: + return this.parseObj(true) + } + } + return this.parseIdent() + }; + + pp$2.parseBindingList = function(close, allowEmpty, allowTrailingComma) { + var elts = [], first = true; + while (!this.eat(close)) { + if (first) { first = false; } + else { this.expect(types.comma); } + if (allowEmpty && this.type === types.comma) { + elts.push(null); + } else if (allowTrailingComma && this.afterTrailingComma(close)) { + break + } else if (this.type === types.ellipsis) { + var rest = this.parseRestBinding(); + this.parseBindingListItem(rest); + elts.push(rest); + if (this.type === types.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); } + this.expect(close); + break + } else { + var elem = this.parseMaybeDefault(this.start, this.startLoc); + this.parseBindingListItem(elem); + elts.push(elem); + } + } + return elts + }; + + pp$2.parseBindingListItem = function(param) { + return param + }; + + // Parses assignment pattern around given atom if possible. + + pp$2.parseMaybeDefault = function(startPos, startLoc, left) { + left = left || this.parseBindingAtom(); + if (this.options.ecmaVersion < 6 || !this.eat(types.eq)) { return left } + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.right = this.parseMaybeAssign(); + return this.finishNode(node, "AssignmentPattern") + }; + + // Verify that a node is an lval — something that can be assigned + // to. + // bindingType can be either: + // 'var' indicating that the lval creates a 'var' binding + // 'let' indicating that the lval creates a lexical ('let' or 'const') binding + // 'none' indicating that the binding should be checked for illegal identifiers, but not for duplicate references + + pp$2.checkLVal = function(expr, bindingType, checkClashes) { + if ( bindingType === void 0 ) bindingType = BIND_NONE; + + switch (expr.type) { + case "Identifier": + if (bindingType === BIND_LEXICAL && expr.name === "let") + { this.raiseRecoverable(expr.start, "let is disallowed as a lexically bound name"); } + if (this.strict && this.reservedWordsStrictBind.test(expr.name)) + { this.raiseRecoverable(expr.start, (bindingType ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); } + if (checkClashes) { + if (has(checkClashes, expr.name)) + { this.raiseRecoverable(expr.start, "Argument name clash"); } + checkClashes[expr.name] = true; + } + if (bindingType !== BIND_NONE && bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); } + break + + case "MemberExpression": + if (bindingType) { this.raiseRecoverable(expr.start, "Binding member expression"); } + break + + case "ObjectPattern": + for (var i = 0, list = expr.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this.checkLVal(prop, bindingType, checkClashes); + } + break + + case "Property": + // AssignmentProperty has type === "Property" + this.checkLVal(expr.value, bindingType, checkClashes); + break + + case "ArrayPattern": + for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) { + var elem = list$1[i$1]; + + if (elem) { this.checkLVal(elem, bindingType, checkClashes); } + } + break + + case "AssignmentPattern": + this.checkLVal(expr.left, bindingType, checkClashes); + break + + case "RestElement": + this.checkLVal(expr.argument, bindingType, checkClashes); + break + + case "ParenthesizedExpression": + this.checkLVal(expr.expression, bindingType, checkClashes); + break + + default: + this.raise(expr.start, (bindingType ? "Binding" : "Assigning to") + " rvalue"); + } + }; + + // A recursive descent parser operates by defining functions for all + + var pp$3 = Parser.prototype; + + // Check if property name clashes with already added. + // Object/class getters and setters are not allowed to clash — + // either with each other or with an init property — and in + // strict mode, init properties are also not allowed to be repeated. + + pp$3.checkPropClash = function(prop, propHash, refDestructuringErrors) { + if (this.options.ecmaVersion >= 9 && prop.type === "SpreadElement") + { return } + if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand)) + { return } + var key = prop.key; + var name; + switch (key.type) { + case "Identifier": name = key.name; break + case "Literal": name = String(key.value); break + default: return + } + var kind = prop.kind; + if (this.options.ecmaVersion >= 6) { + if (name === "__proto__" && kind === "init") { + if (propHash.proto) { + if (refDestructuringErrors && refDestructuringErrors.doubleProto < 0) { refDestructuringErrors.doubleProto = key.start; } + // Backwards-compat kludge. Can be removed in version 6.0 + else { this.raiseRecoverable(key.start, "Redefinition of __proto__ property"); } + } + propHash.proto = true; + } + return + } + name = "$" + name; + var other = propHash[name]; + if (other) { + var redefinition; + if (kind === "init") { + redefinition = this.strict && other.init || other.get || other.set; + } else { + redefinition = other.init || other[kind]; + } + if (redefinition) + { this.raiseRecoverable(key.start, "Redefinition of property"); } + } else { + other = propHash[name] = { + init: false, + get: false, + set: false + }; + } + other[kind] = true; + }; + + // ### Expression parsing + + // These nest, from the most general expression type at the top to + // 'atomic', nondivisible expression types at the bottom. Most of + // the functions will simply let the function(s) below them parse, + // and, *if* the syntactic construct they handle is present, wrap + // the AST node that the inner parser gave them in another node. + + // Parse a full expression. The optional arguments are used to + // forbid the `in` operator (in for loops initalization expressions) + // and provide reference for storing '=' operator inside shorthand + // property assignment in contexts where both object expression + // and object pattern might appear (so it's possible to raise + // delayed syntax error at correct position). + + pp$3.parseExpression = function(noIn, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeAssign(noIn, refDestructuringErrors); + if (this.type === types.comma) { + var node = this.startNodeAt(startPos, startLoc); + node.expressions = [expr]; + while (this.eat(types.comma)) { node.expressions.push(this.parseMaybeAssign(noIn, refDestructuringErrors)); } + return this.finishNode(node, "SequenceExpression") + } + return expr + }; + + // Parse an assignment expression. This includes applications of + // operators like `+=`. + + pp$3.parseMaybeAssign = function(noIn, refDestructuringErrors, afterLeftParse) { + if (this.isContextual("yield")) { + if (this.inGenerator) { return this.parseYield(noIn) } + // The tokenizer will assume an expression is allowed after + // `yield`, but this isn't that kind of yield + else { this.exprAllowed = false; } + } + + var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldShorthandAssign = -1; + if (refDestructuringErrors) { + oldParenAssign = refDestructuringErrors.parenthesizedAssign; + oldTrailingComma = refDestructuringErrors.trailingComma; + oldShorthandAssign = refDestructuringErrors.shorthandAssign; + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.shorthandAssign = -1; + } else { + refDestructuringErrors = new DestructuringErrors; + ownDestructuringErrors = true; + } + + var startPos = this.start, startLoc = this.startLoc; + if (this.type === types.parenL || this.type === types.name) + { this.potentialArrowAt = this.start; } + var left = this.parseMaybeConditional(noIn, refDestructuringErrors); + if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); } + if (this.type.isAssign) { + var node = this.startNodeAt(startPos, startLoc); + node.operator = this.value; + node.left = this.type === types.eq ? this.toAssignable(left, false, refDestructuringErrors) : left; + if (!ownDestructuringErrors) { DestructuringErrors.call(refDestructuringErrors); } + refDestructuringErrors.shorthandAssign = -1; // reset because shorthand default was used correctly + this.checkLVal(left); + this.next(); + node.right = this.parseMaybeAssign(noIn); + return this.finishNode(node, "AssignmentExpression") + } else { + if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); } + } + if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; } + if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; } + if (oldShorthandAssign > -1) { refDestructuringErrors.shorthandAssign = oldShorthandAssign; } + return left + }; + + // Parse a ternary conditional (`?:`) operator. + + pp$3.parseMaybeConditional = function(noIn, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprOps(noIn, refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + if (this.eat(types.question)) { + var node = this.startNodeAt(startPos, startLoc); + node.test = expr; + node.consequent = this.parseMaybeAssign(); + this.expect(types.colon); + node.alternate = this.parseMaybeAssign(noIn); + return this.finishNode(node, "ConditionalExpression") + } + return expr + }; + + // Start the precedence parser. + + pp$3.parseExprOps = function(noIn, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeUnary(refDestructuringErrors, false); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + return expr.start === startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, noIn) + }; + + // Parse binary operators with the operator precedence parsing + // algorithm. `left` is the left-hand side of the operator. + // `minPrec` provides context that allows the function to stop and + // defer further parser to one of its callers when it encounters an + // operator that has a lower precedence than the set it is parsing. + + pp$3.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, noIn) { + var prec = this.type.binop; + if (prec != null && (!noIn || this.type !== types._in)) { + if (prec > minPrec) { + var logical = this.type === types.logicalOR || this.type === types.logicalAND; + var op = this.value; + this.next(); + var startPos = this.start, startLoc = this.startLoc; + var right = this.parseExprOp(this.parseMaybeUnary(null, false), startPos, startLoc, prec, noIn); + var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical); + return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn) + } + } + return left + }; + + pp$3.buildBinary = function(startPos, startLoc, left, right, op, logical) { + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.operator = op; + node.right = right; + return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression") + }; + + // Parse unary operators, both prefix and postfix. + + pp$3.parseMaybeUnary = function(refDestructuringErrors, sawUnary) { + var startPos = this.start, startLoc = this.startLoc, expr; + if (this.isContextual("await") && (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction))) { + expr = this.parseAwait(); + sawUnary = true; + } else if (this.type.prefix) { + var node = this.startNode(), update = this.type === types.incDec; + node.operator = this.value; + node.prefix = true; + this.next(); + node.argument = this.parseMaybeUnary(null, true); + this.checkExpressionErrors(refDestructuringErrors, true); + if (update) { this.checkLVal(node.argument); } + else if (this.strict && node.operator === "delete" && + node.argument.type === "Identifier") + { this.raiseRecoverable(node.start, "Deleting local variable in strict mode"); } + else { sawUnary = true; } + expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression"); + } else { + expr = this.parseExprSubscripts(refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + while (this.type.postfix && !this.canInsertSemicolon()) { + var node$1 = this.startNodeAt(startPos, startLoc); + node$1.operator = this.value; + node$1.prefix = false; + node$1.argument = expr; + this.checkLVal(expr); + this.next(); + expr = this.finishNode(node$1, "UpdateExpression"); + } + } + + if (!sawUnary && this.eat(types.starstar)) + { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false), "**", false) } + else + { return expr } + }; + + // Parse call, dot, and `[]`-subscript expressions. + + pp$3.parseExprSubscripts = function(refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprAtom(refDestructuringErrors); + var skipArrowSubscripts = expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")"; + if (this.checkExpressionErrors(refDestructuringErrors) || skipArrowSubscripts) { return expr } + var result = this.parseSubscripts(expr, startPos, startLoc); + if (refDestructuringErrors && result.type === "MemberExpression") { + if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; } + if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; } + } + return result + }; + + pp$3.parseSubscripts = function(base, startPos, startLoc, noCalls) { + var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === "Identifier" && base.name === "async" && + this.lastTokEnd === base.end && !this.canInsertSemicolon() && this.input.slice(base.start, base.end) === "async"; + while (true) { + var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow); + if (element === base || element.type === "ArrowFunctionExpression") { return element } + base = element; + } + }; + + pp$3.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow) { + var computed = this.eat(types.bracketL); + if (computed || this.eat(types.dot)) { + var node = this.startNodeAt(startPos, startLoc); + node.object = base; + node.property = computed ? this.parseExpression() : this.parseIdent(this.options.allowReserved !== "never"); + node.computed = !!computed; + if (computed) { this.expect(types.bracketR); } + base = this.finishNode(node, "MemberExpression"); + } else if (!noCalls && this.eat(types.parenL)) { + var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + var exprList = this.parseExprList(types.parenR, this.options.ecmaVersion >= 8 && base.type !== "Import", false, refDestructuringErrors); + if (maybeAsyncArrow && !this.canInsertSemicolon() && this.eat(types.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + if (this.awaitIdentPos > 0) + { this.raise(this.awaitIdentPos, "Cannot use 'await' as identifier inside an async function"); } + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true) + } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos; + var node$1 = this.startNodeAt(startPos, startLoc); + node$1.callee = base; + node$1.arguments = exprList; + if (node$1.callee.type === "Import") { + if (node$1.arguments.length !== 1) { + this.raise(node$1.start, "import() requires exactly one argument"); + } + + var importArg = node$1.arguments[0]; + if (importArg && importArg.type === "SpreadElement") { + this.raise(importArg.start, "... is not allowed in import()"); + } + } + base = this.finishNode(node$1, "CallExpression"); + } else if (this.type === types.backQuote) { + var node$2 = this.startNodeAt(startPos, startLoc); + node$2.tag = base; + node$2.quasi = this.parseTemplate({isTagged: true}); + base = this.finishNode(node$2, "TaggedTemplateExpression"); + } + return base + }; + + // Parse an atomic expression — either a single token that is an + // expression, an expression started by a keyword like `function` or + // `new`, or an expression wrapped in punctuation like `()`, `[]`, + // or `{}`. + + pp$3.parseExprAtom = function(refDestructuringErrors) { + // If a division operator appears in an expression position, the + // tokenizer got confused, and we force it to read a regexp instead. + if (this.type === types.slash) { this.readRegexp(); } + + var node, canBeArrow = this.potentialArrowAt === this.start; + switch (this.type) { + case types._super: + if (!this.allowSuper) + { this.raise(this.start, "'super' keyword outside a method"); } + node = this.startNode(); + this.next(); + if (this.type === types.parenL && !this.allowDirectSuper) + { this.raise(node.start, "super() call outside constructor of a subclass"); } + // The `super` keyword can appear at below: + // SuperProperty: + // super [ Expression ] + // super . IdentifierName + // SuperCall: + // super Arguments + if (this.type !== types.dot && this.type !== types.bracketL && this.type !== types.parenL) + { this.unexpected(); } + return this.finishNode(node, "Super") + + case types._this: + node = this.startNode(); + this.next(); + return this.finishNode(node, "ThisExpression") + + case types.name: + var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc; + var id = this.parseIdent(false); + if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === "async" && !this.canInsertSemicolon() && this.eat(types._function)) + { return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true) } + if (canBeArrow && !this.canInsertSemicolon()) { + if (this.eat(types.arrow)) + { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false) } + if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === types.name && !containsEsc) { + id = this.parseIdent(false); + if (this.canInsertSemicolon() || !this.eat(types.arrow)) + { this.unexpected(); } + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true) + } + } + return id + + case types.regexp: + var value = this.value; + node = this.parseLiteral(value.value); + node.regex = {pattern: value.pattern, flags: value.flags}; + return node + + case types.num: case types.string: + return this.parseLiteral(this.value) + + case types._null: case types._true: case types._false: + node = this.startNode(); + node.value = this.type === types._null ? null : this.type === types._true; + node.raw = this.type.keyword; + this.next(); + return this.finishNode(node, "Literal") + + case types.parenL: + var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow); + if (refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr)) + { refDestructuringErrors.parenthesizedAssign = start; } + if (refDestructuringErrors.parenthesizedBind < 0) + { refDestructuringErrors.parenthesizedBind = start; } + } + return expr + + case types.bracketL: + node = this.startNode(); + this.next(); + node.elements = this.parseExprList(types.bracketR, true, true, refDestructuringErrors); + return this.finishNode(node, "ArrayExpression") + + case types.braceL: + return this.parseObj(false, refDestructuringErrors) + + case types._function: + node = this.startNode(); + this.next(); + return this.parseFunction(node, 0) + + case types._class: + return this.parseClass(this.startNode(), false) + + case types._new: + return this.parseNew() + + case types.backQuote: + return this.parseTemplate() + + case types._import: + if (this.options.ecmaVersion > 10) { + return this.parseDynamicImport() + } else { + return this.unexpected() + } + + default: + this.unexpected(); + } + }; + + pp$3.parseDynamicImport = function() { + var node = this.startNode(); + this.next(); + if (this.type !== types.parenL) { + this.unexpected(); + } + return this.finishNode(node, "Import") + }; + + pp$3.parseLiteral = function(value) { + var node = this.startNode(); + node.value = value; + node.raw = this.input.slice(this.start, this.end); + if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1); } + this.next(); + return this.finishNode(node, "Literal") + }; + + pp$3.parseParenExpression = function() { + this.expect(types.parenL); + var val = this.parseExpression(); + this.expect(types.parenR); + return val + }; + + pp$3.parseParenAndDistinguishExpression = function(canBeArrow) { + var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8; + if (this.options.ecmaVersion >= 6) { + this.next(); + + var innerStartPos = this.start, innerStartLoc = this.startLoc; + var exprList = [], first = true, lastIsComma = false; + var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart; + this.yieldPos = 0; + this.awaitPos = 0; + // Do not save awaitIdentPos to allow checking awaits nested in parameters + while (this.type !== types.parenR) { + first ? first = false : this.expect(types.comma); + if (allowTrailingComma && this.afterTrailingComma(types.parenR, true)) { + lastIsComma = true; + break + } else if (this.type === types.ellipsis) { + spreadStart = this.start; + exprList.push(this.parseParenItem(this.parseRestBinding())); + if (this.type === types.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); } + break + } else { + exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem)); + } + } + var innerEndPos = this.start, innerEndLoc = this.startLoc; + this.expect(types.parenR); + + if (canBeArrow && !this.canInsertSemicolon() && this.eat(types.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + return this.parseParenArrowList(startPos, startLoc, exprList) + } + + if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); } + if (spreadStart) { this.unexpected(spreadStart); } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + + if (exprList.length > 1) { + val = this.startNodeAt(innerStartPos, innerStartLoc); + val.expressions = exprList; + this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc); + } else { + val = exprList[0]; + } + } else { + val = this.parseParenExpression(); + } + + if (this.options.preserveParens) { + var par = this.startNodeAt(startPos, startLoc); + par.expression = val; + return this.finishNode(par, "ParenthesizedExpression") + } else { + return val + } + }; + + pp$3.parseParenItem = function(item) { + return item + }; + + pp$3.parseParenArrowList = function(startPos, startLoc, exprList) { + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList) + }; + + // New's precedence is slightly tricky. It must allow its argument to + // be a `[]` or dot subscript expression, but not a call — at least, + // not without wrapping it in parentheses. Thus, it uses the noCalls + // argument to parseSubscripts to prevent it from consuming the + // argument list. + + var empty$1 = []; + + pp$3.parseNew = function() { + var node = this.startNode(); + var meta = this.parseIdent(true); + if (this.options.ecmaVersion >= 6 && this.eat(types.dot)) { + node.meta = meta; + var containsEsc = this.containsEsc; + node.property = this.parseIdent(true); + if (node.property.name !== "target" || containsEsc) + { this.raiseRecoverable(node.property.start, "The only valid meta property for new is new.target"); } + if (!this.inNonArrowFunction()) + { this.raiseRecoverable(node.start, "new.target can only be used in functions"); } + return this.finishNode(node, "MetaProperty") + } + var startPos = this.start, startLoc = this.startLoc; + node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true); + if (this.options.ecmaVersion > 10 && node.callee.type === "Import") { + this.raise(node.callee.start, "Cannot use new with import(...)"); + } + if (this.eat(types.parenL)) { node.arguments = this.parseExprList(types.parenR, this.options.ecmaVersion >= 8 && node.callee.type !== "Import", false); } + else { node.arguments = empty$1; } + return this.finishNode(node, "NewExpression") + }; + + // Parse template expression. + + pp$3.parseTemplateElement = function(ref) { + var isTagged = ref.isTagged; + + var elem = this.startNode(); + if (this.type === types.invalidTemplate) { + if (!isTagged) { + this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal"); + } + elem.value = { + raw: this.value, + cooked: null + }; + } else { + elem.value = { + raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"), + cooked: this.value + }; + } + this.next(); + elem.tail = this.type === types.backQuote; + return this.finishNode(elem, "TemplateElement") + }; + + pp$3.parseTemplate = function(ref) { + if ( ref === void 0 ) ref = {}; + var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false; + + var node = this.startNode(); + this.next(); + node.expressions = []; + var curElt = this.parseTemplateElement({isTagged: isTagged}); + node.quasis = [curElt]; + while (!curElt.tail) { + if (this.type === types.eof) { this.raise(this.pos, "Unterminated template literal"); } + this.expect(types.dollarBraceL); + node.expressions.push(this.parseExpression()); + this.expect(types.braceR); + node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged})); + } + this.next(); + return this.finishNode(node, "TemplateLiteral") + }; + + pp$3.isAsyncProp = function(prop) { + return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" && + (this.type === types.name || this.type === types.num || this.type === types.string || this.type === types.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types.star)) && + !lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) + }; + + // Parse an object literal or binding pattern. + + pp$3.parseObj = function(isPattern, refDestructuringErrors) { + var node = this.startNode(), first = true, propHash = {}; + node.properties = []; + this.next(); + while (!this.eat(types.braceR)) { + if (!first) { + this.expect(types.comma); + if (this.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var prop = this.parseProperty(isPattern, refDestructuringErrors); + if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); } + node.properties.push(prop); + } + return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression") + }; + + pp$3.parseProperty = function(isPattern, refDestructuringErrors) { + var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc; + if (this.options.ecmaVersion >= 9 && this.eat(types.ellipsis)) { + if (isPattern) { + prop.argument = this.parseIdent(false); + if (this.type === types.comma) { + this.raise(this.start, "Comma is not permitted after the rest element"); + } + return this.finishNode(prop, "RestElement") + } + // To disallow parenthesized identifier via `this.toAssignable()`. + if (this.type === types.parenL && refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0) { + refDestructuringErrors.parenthesizedAssign = this.start; + } + if (refDestructuringErrors.parenthesizedBind < 0) { + refDestructuringErrors.parenthesizedBind = this.start; + } + } + // Parse argument. + prop.argument = this.parseMaybeAssign(false, refDestructuringErrors); + // To disallow trailing comma via `this.toAssignable()`. + if (this.type === types.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) { + refDestructuringErrors.trailingComma = this.start; + } + // Finish + return this.finishNode(prop, "SpreadElement") + } + if (this.options.ecmaVersion >= 6) { + prop.method = false; + prop.shorthand = false; + if (isPattern || refDestructuringErrors) { + startPos = this.start; + startLoc = this.startLoc; + } + if (!isPattern) + { isGenerator = this.eat(types.star); } + } + var containsEsc = this.containsEsc; + this.parsePropertyName(prop); + if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(types.star); + this.parsePropertyName(prop, refDestructuringErrors); + } else { + isAsync = false; + } + this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc); + return this.finishNode(prop, "Property") + }; + + pp$3.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) { + if ((isGenerator || isAsync) && this.type === types.colon) + { this.unexpected(); } + + if (this.eat(types.colon)) { + prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors); + prop.kind = "init"; + } else if (this.options.ecmaVersion >= 6 && this.type === types.parenL) { + if (isPattern) { this.unexpected(); } + prop.kind = "init"; + prop.method = true; + prop.value = this.parseMethod(isGenerator, isAsync); + } else if (!isPattern && !containsEsc && + this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && + (prop.key.name === "get" || prop.key.name === "set") && + (this.type !== types.comma && this.type !== types.braceR)) { + if (isGenerator || isAsync) { this.unexpected(); } + prop.kind = prop.key.name; + this.parsePropertyName(prop); + prop.value = this.parseMethod(false); + var paramCount = prop.kind === "get" ? 0 : 1; + if (prop.value.params.length !== paramCount) { + var start = prop.value.start; + if (prop.kind === "get") + { this.raiseRecoverable(start, "getter should have no params"); } + else + { this.raiseRecoverable(start, "setter should have exactly one param"); } + } else { + if (prop.kind === "set" && prop.value.params[0].type === "RestElement") + { this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params"); } + } + } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") { + if (isGenerator || isAsync) { this.unexpected(); } + this.checkUnreserved(prop.key); + if (prop.key.name === "await" && !this.awaitIdentPos) + { this.awaitIdentPos = startPos; } + prop.kind = "init"; + if (isPattern) { + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key); + } else if (this.type === types.eq && refDestructuringErrors) { + if (refDestructuringErrors.shorthandAssign < 0) + { refDestructuringErrors.shorthandAssign = this.start; } + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key); + } else { + prop.value = prop.key; + } + prop.shorthand = true; + } else { this.unexpected(); } + }; + + pp$3.parsePropertyName = function(prop) { + if (this.options.ecmaVersion >= 6) { + if (this.eat(types.bracketL)) { + prop.computed = true; + prop.key = this.parseMaybeAssign(); + this.expect(types.bracketR); + return prop.key + } else { + prop.computed = false; + } + } + return prop.key = this.type === types.num || this.type === types.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never") + }; + + // Initialize empty function node. + + pp$3.initFunction = function(node) { + node.id = null; + if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; } + if (this.options.ecmaVersion >= 8) { node.async = false; } + }; + + // Parse object or class method. + + pp$3.parseMethod = function(isGenerator, isAsync, allowDirectSuper) { + var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + + this.initFunction(node); + if (this.options.ecmaVersion >= 6) + { node.generator = isGenerator; } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0)); + + this.expect(types.parenL); + node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + this.parseFunctionBody(node, false, true); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node, "FunctionExpression") + }; + + // Parse arrow function expression with given parameters. + + pp$3.parseArrowExpression = function(node, params, isAsync) { + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + + this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW); + this.initFunction(node); + if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; } + + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + + node.params = this.toAssignableList(params, true); + this.parseFunctionBody(node, true, false); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node, "ArrowFunctionExpression") + }; + + // Parse function body and check parameters. + + pp$3.parseFunctionBody = function(node, isArrowFunction, isMethod) { + var isExpression = isArrowFunction && this.type !== types.braceL; + var oldStrict = this.strict, useStrict = false; + + if (isExpression) { + node.body = this.parseMaybeAssign(); + node.expression = true; + this.checkParams(node, false); + } else { + var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params); + if (!oldStrict || nonSimple) { + useStrict = this.strictDirective(this.end); + // If this is a strict mode function, verify that argument names + // are not repeated, and it does not try to bind the words `eval` + // or `arguments`. + if (useStrict && nonSimple) + { this.raiseRecoverable(node.start, "Illegal 'use strict' directive in function with non-simple parameter list"); } + } + // Start a new scope with regard to labels and the `inFunction` + // flag (restore them to their old value afterwards). + var oldLabels = this.labels; + this.labels = []; + if (useStrict) { this.strict = true; } + + // Add the params to varDeclaredNames to ensure that an error is thrown + // if a let/const declaration in the function clashes with one of the params. + this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params)); + node.body = this.parseBlock(false); + node.expression = false; + this.adaptDirectivePrologue(node.body.body); + this.labels = oldLabels; + } + this.exitScope(); + + // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval' + if (this.strict && node.id) { this.checkLVal(node.id, BIND_OUTSIDE); } + this.strict = oldStrict; + }; + + pp$3.isSimpleParamList = function(params) { + for (var i = 0, list = params; i < list.length; i += 1) + { + var param = list[i]; + + if (param.type !== "Identifier") { return false + } } + return true + }; + + // Checks function params for various disallowed patterns such as using "eval" + // or "arguments" and duplicate parameters. + + pp$3.checkParams = function(node, allowDuplicates) { + var nameHash = {}; + for (var i = 0, list = node.params; i < list.length; i += 1) + { + var param = list[i]; + + this.checkLVal(param, BIND_VAR, allowDuplicates ? null : nameHash); + } + }; + + // Parses a comma-separated list of expressions, and returns them as + // an array. `close` is the token type that ends the list, and + // `allowEmpty` can be turned on to allow subsequent commas with + // nothing in between them to be parsed as `null` (which is needed + // for array literals). + + pp$3.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) { + var elts = [], first = true; + while (!this.eat(close)) { + if (!first) { + this.expect(types.comma); + if (allowTrailingComma && this.afterTrailingComma(close)) { break } + } else { first = false; } + + var elt = (void 0); + if (allowEmpty && this.type === types.comma) + { elt = null; } + else if (this.type === types.ellipsis) { + elt = this.parseSpread(refDestructuringErrors); + if (refDestructuringErrors && this.type === types.comma && refDestructuringErrors.trailingComma < 0) + { refDestructuringErrors.trailingComma = this.start; } + } else { + elt = this.parseMaybeAssign(false, refDestructuringErrors); + } + elts.push(elt); + } + return elts + }; + + pp$3.checkUnreserved = function(ref) { + var start = ref.start; + var end = ref.end; + var name = ref.name; + + if (this.inGenerator && name === "yield") + { this.raiseRecoverable(start, "Cannot use 'yield' as identifier inside a generator"); } + if (this.inAsync && name === "await") + { this.raiseRecoverable(start, "Cannot use 'await' as identifier inside an async function"); } + if (this.keywords.test(name)) + { this.raise(start, ("Unexpected keyword '" + name + "'")); } + if (this.options.ecmaVersion < 6 && + this.input.slice(start, end).indexOf("\\") !== -1) { return } + var re = this.strict ? this.reservedWordsStrict : this.reservedWords; + if (re.test(name)) { + if (!this.inAsync && name === "await") + { this.raiseRecoverable(start, "Cannot use keyword 'await' outside an async function"); } + this.raiseRecoverable(start, ("The keyword '" + name + "' is reserved")); + } + }; + + // Parse the next token as an identifier. If `liberal` is true (used + // when parsing properties), it will also convert keywords into + // identifiers. + + pp$3.parseIdent = function(liberal, isBinding) { + var node = this.startNode(); + if (this.type === types.name) { + node.name = this.value; + } else if (this.type.keyword) { + node.name = this.type.keyword; + + // To fix https://github.com/acornjs/acorn/issues/575 + // `class` and `function` keywords push new context into this.context. + // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name. + // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword + if ((node.name === "class" || node.name === "function") && + (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) { + this.context.pop(); + } + } else { + this.unexpected(); + } + this.next(); + this.finishNode(node, "Identifier"); + if (!liberal) { + this.checkUnreserved(node); + if (node.name === "await" && !this.awaitIdentPos) + { this.awaitIdentPos = node.start; } + } + return node + }; + + // Parses yield expression inside generator. + + pp$3.parseYield = function(noIn) { + if (!this.yieldPos) { this.yieldPos = this.start; } + + var node = this.startNode(); + this.next(); + if (this.type === types.semi || this.canInsertSemicolon() || (this.type !== types.star && !this.type.startsExpr)) { + node.delegate = false; + node.argument = null; + } else { + node.delegate = this.eat(types.star); + node.argument = this.parseMaybeAssign(noIn); + } + return this.finishNode(node, "YieldExpression") + }; + + pp$3.parseAwait = function() { + if (!this.awaitPos) { this.awaitPos = this.start; } + + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeUnary(null, true); + return this.finishNode(node, "AwaitExpression") + }; + + var pp$4 = Parser.prototype; + + // This function is used to raise exceptions on parse errors. It + // takes an offset integer (into the current `input`) to indicate + // the location of the error, attaches the position to the end + // of the error message, and then raises a `SyntaxError` with that + // message. + + pp$4.raise = function(pos, message) { + var loc = getLineInfo(this.input, pos); + message += " (" + loc.line + ":" + loc.column + ")"; + var err = new SyntaxError(message); + err.pos = pos; err.loc = loc; err.raisedAt = this.pos; + throw err + }; + + pp$4.raiseRecoverable = pp$4.raise; + + pp$4.curPosition = function() { + if (this.options.locations) { + return new Position(this.curLine, this.pos - this.lineStart) + } + }; + + var pp$5 = Parser.prototype; + + var Scope = function Scope(flags) { + this.flags = flags; + // A list of var-declared names in the current lexical scope + this.var = []; + // A list of lexically-declared names in the current lexical scope + this.lexical = []; + // A list of lexically-declared FunctionDeclaration names in the current lexical scope + this.functions = []; + }; + + // The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names. + + pp$5.enterScope = function(flags) { + this.scopeStack.push(new Scope(flags)); + }; + + pp$5.exitScope = function() { + this.scopeStack.pop(); + }; + + // The spec says: + // > At the top level of a function, or script, function declarations are + // > treated like var declarations rather than like lexical declarations. + pp$5.treatFunctionsAsVarInScope = function(scope) { + return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP) + }; + + pp$5.declareName = function(name, bindingType, pos) { + var redeclared = false; + if (bindingType === BIND_LEXICAL) { + var scope = this.currentScope(); + redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1; + scope.lexical.push(name); + if (this.inModule && (scope.flags & SCOPE_TOP)) + { delete this.undefinedExports[name]; } + } else if (bindingType === BIND_SIMPLE_CATCH) { + var scope$1 = this.currentScope(); + scope$1.lexical.push(name); + } else if (bindingType === BIND_FUNCTION) { + var scope$2 = this.currentScope(); + if (this.treatFunctionsAsVar) + { redeclared = scope$2.lexical.indexOf(name) > -1; } + else + { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; } + scope$2.functions.push(name); + } else { + for (var i = this.scopeStack.length - 1; i >= 0; --i) { + var scope$3 = this.scopeStack[i]; + if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) || + !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) { + redeclared = true; + break + } + scope$3.var.push(name); + if (this.inModule && (scope$3.flags & SCOPE_TOP)) + { delete this.undefinedExports[name]; } + if (scope$3.flags & SCOPE_VAR) { break } + } + } + if (redeclared) { this.raiseRecoverable(pos, ("Identifier '" + name + "' has already been declared")); } + }; + + pp$5.checkLocalExport = function(id) { + // scope.functions must be empty as Module code is always strict. + if (this.scopeStack[0].lexical.indexOf(id.name) === -1 && + this.scopeStack[0].var.indexOf(id.name) === -1) { + this.undefinedExports[id.name] = id; + } + }; + + pp$5.currentScope = function() { + return this.scopeStack[this.scopeStack.length - 1] + }; + + pp$5.currentVarScope = function() { + for (var i = this.scopeStack.length - 1;; i--) { + var scope = this.scopeStack[i]; + if (scope.flags & SCOPE_VAR) { return scope } + } + }; + + // Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`. + pp$5.currentThisScope = function() { + for (var i = this.scopeStack.length - 1;; i--) { + var scope = this.scopeStack[i]; + if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope } + } + }; + + var Node = function Node(parser, pos, loc) { + this.type = ""; + this.start = pos; + this.end = 0; + if (parser.options.locations) + { this.loc = new SourceLocation(parser, loc); } + if (parser.options.directSourceFile) + { this.sourceFile = parser.options.directSourceFile; } + if (parser.options.ranges) + { this.range = [pos, 0]; } + }; + + // Start an AST node, attaching a start offset. + + var pp$6 = Parser.prototype; + + pp$6.startNode = function() { + return new Node(this, this.start, this.startLoc) + }; + + pp$6.startNodeAt = function(pos, loc) { + return new Node(this, pos, loc) + }; + + // Finish an AST node, adding `type` and `end` properties. + + function finishNodeAt(node, type, pos, loc) { + node.type = type; + node.end = pos; + if (this.options.locations) + { node.loc.end = loc; } + if (this.options.ranges) + { node.range[1] = pos; } + return node + } + + pp$6.finishNode = function(node, type) { + return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc) + }; + + // Finish node at given position + + pp$6.finishNodeAt = function(node, type, pos, loc) { + return finishNodeAt.call(this, node, type, pos, loc) + }; + + // The algorithm used to determine whether a regexp can appear at a + + var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) { + this.token = token; + this.isExpr = !!isExpr; + this.preserveSpace = !!preserveSpace; + this.override = override; + this.generator = !!generator; + }; + + var types$1 = { + b_stat: new TokContext("{", false), + b_expr: new TokContext("{", true), + b_tmpl: new TokContext("${", false), + p_stat: new TokContext("(", false), + p_expr: new TokContext("(", true), + q_tmpl: new TokContext("`", true, true, function (p) { return p.tryReadTemplateToken(); }), + f_stat: new TokContext("function", false), + f_expr: new TokContext("function", true), + f_expr_gen: new TokContext("function", true, false, null, true), + f_gen: new TokContext("function", false, false, null, true) + }; + + var pp$7 = Parser.prototype; + + pp$7.initialContext = function() { + return [types$1.b_stat] + }; + + pp$7.braceIsBlock = function(prevType) { + var parent = this.curContext(); + if (parent === types$1.f_expr || parent === types$1.f_stat) + { return true } + if (prevType === types.colon && (parent === types$1.b_stat || parent === types$1.b_expr)) + { return !parent.isExpr } + + // The check for `tt.name && exprAllowed` detects whether we are + // after a `yield` or `of` construct. See the `updateContext` for + // `tt.name`. + if (prevType === types._return || prevType === types.name && this.exprAllowed) + { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) } + if (prevType === types._else || prevType === types.semi || prevType === types.eof || prevType === types.parenR || prevType === types.arrow) + { return true } + if (prevType === types.braceL) + { return parent === types$1.b_stat } + if (prevType === types._var || prevType === types._const || prevType === types.name) + { return false } + return !this.exprAllowed + }; + + pp$7.inGeneratorContext = function() { + for (var i = this.context.length - 1; i >= 1; i--) { + var context = this.context[i]; + if (context.token === "function") + { return context.generator } + } + return false + }; + + pp$7.updateContext = function(prevType) { + var update, type = this.type; + if (type.keyword && prevType === types.dot) + { this.exprAllowed = false; } + else if (update = type.updateContext) + { update.call(this, prevType); } + else + { this.exprAllowed = type.beforeExpr; } + }; + + // Token-specific context update code + + types.parenR.updateContext = types.braceR.updateContext = function() { + if (this.context.length === 1) { + this.exprAllowed = true; + return + } + var out = this.context.pop(); + if (out === types$1.b_stat && this.curContext().token === "function") { + out = this.context.pop(); + } + this.exprAllowed = !out.isExpr; + }; + + types.braceL.updateContext = function(prevType) { + this.context.push(this.braceIsBlock(prevType) ? types$1.b_stat : types$1.b_expr); + this.exprAllowed = true; + }; + + types.dollarBraceL.updateContext = function() { + this.context.push(types$1.b_tmpl); + this.exprAllowed = true; + }; + + types.parenL.updateContext = function(prevType) { + var statementParens = prevType === types._if || prevType === types._for || prevType === types._with || prevType === types._while; + this.context.push(statementParens ? types$1.p_stat : types$1.p_expr); + this.exprAllowed = true; + }; + + types.incDec.updateContext = function() { + // tokExprAllowed stays unchanged + }; + + types._function.updateContext = types._class.updateContext = function(prevType) { + if (prevType.beforeExpr && prevType !== types.semi && prevType !== types._else && + !(prevType === types._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) && + !((prevType === types.colon || prevType === types.braceL) && this.curContext() === types$1.b_stat)) + { this.context.push(types$1.f_expr); } + else + { this.context.push(types$1.f_stat); } + this.exprAllowed = false; + }; + + types.backQuote.updateContext = function() { + if (this.curContext() === types$1.q_tmpl) + { this.context.pop(); } + else + { this.context.push(types$1.q_tmpl); } + this.exprAllowed = false; + }; + + types.star.updateContext = function(prevType) { + if (prevType === types._function) { + var index = this.context.length - 1; + if (this.context[index] === types$1.f_expr) + { this.context[index] = types$1.f_expr_gen; } + else + { this.context[index] = types$1.f_gen; } + } + this.exprAllowed = true; + }; + + types.name.updateContext = function(prevType) { + var allowed = false; + if (this.options.ecmaVersion >= 6 && prevType !== types.dot) { + if (this.value === "of" && !this.exprAllowed || + this.value === "yield" && this.inGeneratorContext()) + { allowed = true; } + } + this.exprAllowed = allowed; + }; + + // This file contains Unicode properties extracted from the ECMAScript + // specification. The lists are extracted like so: + // $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText) + + // #table-binary-unicode-properties + var ecma9BinaryProperties = "ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS"; + var ecma10BinaryProperties = ecma9BinaryProperties + " Extended_Pictographic"; + var ecma11BinaryProperties = ecma10BinaryProperties; + var unicodeBinaryProperties = { + 9: ecma9BinaryProperties, + 10: ecma10BinaryProperties, + 11: ecma11BinaryProperties + }; + + // #table-unicode-general-category-values + var unicodeGeneralCategoryValues = "Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu"; + + // #table-unicode-script-values + var ecma9ScriptValues = "Adlam Adlm Ahom Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb"; + var ecma10ScriptValues = ecma9ScriptValues + " Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd"; + var ecma11ScriptValues = ecma10ScriptValues + " Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"; + var unicodeScriptValues = { + 9: ecma9ScriptValues, + 10: ecma10ScriptValues, + 11: ecma11ScriptValues + }; + + var data = {}; + function buildUnicodeData(ecmaVersion) { + var d = data[ecmaVersion] = { + binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + " " + unicodeGeneralCategoryValues), + nonBinary: { + General_Category: wordsRegexp(unicodeGeneralCategoryValues), + Script: wordsRegexp(unicodeScriptValues[ecmaVersion]) + } + }; + d.nonBinary.Script_Extensions = d.nonBinary.Script; + + d.nonBinary.gc = d.nonBinary.General_Category; + d.nonBinary.sc = d.nonBinary.Script; + d.nonBinary.scx = d.nonBinary.Script_Extensions; + } + buildUnicodeData(9); + buildUnicodeData(10); + buildUnicodeData(11); + + var pp$8 = Parser.prototype; + + var RegExpValidationState = function RegExpValidationState(parser) { + this.parser = parser; + this.validFlags = "gim" + (parser.options.ecmaVersion >= 6 ? "uy" : "") + (parser.options.ecmaVersion >= 9 ? "s" : ""); + this.unicodeProperties = data[parser.options.ecmaVersion >= 11 ? 11 : parser.options.ecmaVersion]; + this.source = ""; + this.flags = ""; + this.start = 0; + this.switchU = false; + this.switchN = false; + this.pos = 0; + this.lastIntValue = 0; + this.lastStringValue = ""; + this.lastAssertionIsQuantifiable = false; + this.numCapturingParens = 0; + this.maxBackReference = 0; + this.groupNames = []; + this.backReferenceNames = []; + }; + + RegExpValidationState.prototype.reset = function reset (start, pattern, flags) { + var unicode = flags.indexOf("u") !== -1; + this.start = start | 0; + this.source = pattern + ""; + this.flags = flags; + this.switchU = unicode && this.parser.options.ecmaVersion >= 6; + this.switchN = unicode && this.parser.options.ecmaVersion >= 9; + }; + + RegExpValidationState.prototype.raise = function raise (message) { + this.parser.raiseRecoverable(this.start, ("Invalid regular expression: /" + (this.source) + "/: " + message)); + }; + + // If u flag is given, this returns the code point at the index (it combines a surrogate pair). + // Otherwise, this returns the code unit of the index (can be a part of a surrogate pair). + RegExpValidationState.prototype.at = function at (i) { + var s = this.source; + var l = s.length; + if (i >= l) { + return -1 + } + var c = s.charCodeAt(i); + if (!this.switchU || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) { + return c + } + var next = s.charCodeAt(i + 1); + return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c + }; + + RegExpValidationState.prototype.nextIndex = function nextIndex (i) { + var s = this.source; + var l = s.length; + if (i >= l) { + return l + } + var c = s.charCodeAt(i), next; + if (!this.switchU || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l || + (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) { + return i + 1 + } + return i + 2 + }; + + RegExpValidationState.prototype.current = function current () { + return this.at(this.pos) + }; + + RegExpValidationState.prototype.lookahead = function lookahead () { + return this.at(this.nextIndex(this.pos)) + }; + + RegExpValidationState.prototype.advance = function advance () { + this.pos = this.nextIndex(this.pos); + }; + + RegExpValidationState.prototype.eat = function eat (ch) { + if (this.current() === ch) { + this.advance(); + return true + } + return false + }; + + function codePointToString(ch) { + if (ch <= 0xFFFF) { return String.fromCharCode(ch) } + ch -= 0x10000; + return String.fromCharCode((ch >> 10) + 0xD800, (ch & 0x03FF) + 0xDC00) + } + + /** + * Validate the flags part of a given RegExpLiteral. + * + * @param {RegExpValidationState} state The state to validate RegExp. + * @returns {void} + */ + pp$8.validateRegExpFlags = function(state) { + var validFlags = state.validFlags; + var flags = state.flags; + + for (var i = 0; i < flags.length; i++) { + var flag = flags.charAt(i); + if (validFlags.indexOf(flag) === -1) { + this.raise(state.start, "Invalid regular expression flag"); + } + if (flags.indexOf(flag, i + 1) > -1) { + this.raise(state.start, "Duplicate regular expression flag"); + } + } + }; + + /** + * Validate the pattern part of a given RegExpLiteral. + * + * @param {RegExpValidationState} state The state to validate RegExp. + * @returns {void} + */ + pp$8.validateRegExpPattern = function(state) { + this.regexp_pattern(state); + + // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of + // parsing contains a |GroupName|, reparse with the goal symbol + // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError* + // exception if _P_ did not conform to the grammar, if any elements of _P_ + // were not matched by the parse, or if any Early Error conditions exist. + if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) { + state.switchN = true; + this.regexp_pattern(state); + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern + pp$8.regexp_pattern = function(state) { + state.pos = 0; + state.lastIntValue = 0; + state.lastStringValue = ""; + state.lastAssertionIsQuantifiable = false; + state.numCapturingParens = 0; + state.maxBackReference = 0; + state.groupNames.length = 0; + state.backReferenceNames.length = 0; + + this.regexp_disjunction(state); + + if (state.pos !== state.source.length) { + // Make the same messages as V8. + if (state.eat(0x29 /* ) */)) { + state.raise("Unmatched ')'"); + } + if (state.eat(0x5D /* [ */) || state.eat(0x7D /* } */)) { + state.raise("Lone quantifier brackets"); + } + } + if (state.maxBackReference > state.numCapturingParens) { + state.raise("Invalid escape"); + } + for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) { + var name = list[i]; + + if (state.groupNames.indexOf(name) === -1) { + state.raise("Invalid named capture referenced"); + } + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction + pp$8.regexp_disjunction = function(state) { + this.regexp_alternative(state); + while (state.eat(0x7C /* | */)) { + this.regexp_alternative(state); + } + + // Make the same message as V8. + if (this.regexp_eatQuantifier(state, true)) { + state.raise("Nothing to repeat"); + } + if (state.eat(0x7B /* { */)) { + state.raise("Lone quantifier brackets"); + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative + pp$8.regexp_alternative = function(state) { + while (state.pos < state.source.length && this.regexp_eatTerm(state)) + { } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term + pp$8.regexp_eatTerm = function(state) { + if (this.regexp_eatAssertion(state)) { + // Handle `QuantifiableAssertion Quantifier` alternative. + // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion + // is a QuantifiableAssertion. + if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) { + // Make the same message as V8. + if (state.switchU) { + state.raise("Invalid quantifier"); + } + } + return true + } + + if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) { + this.regexp_eatQuantifier(state); + return true + } + + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion + pp$8.regexp_eatAssertion = function(state) { + var start = state.pos; + state.lastAssertionIsQuantifiable = false; + + // ^, $ + if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) { + return true + } + + // \b \B + if (state.eat(0x5C /* \ */)) { + if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) { + return true + } + state.pos = start; + } + + // Lookahead / Lookbehind + if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) { + var lookbehind = false; + if (this.options.ecmaVersion >= 9) { + lookbehind = state.eat(0x3C /* < */); + } + if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) { + this.regexp_disjunction(state); + if (!state.eat(0x29 /* ) */)) { + state.raise("Unterminated group"); + } + state.lastAssertionIsQuantifiable = !lookbehind; + return true + } + } + + state.pos = start; + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier + pp$8.regexp_eatQuantifier = function(state, noError) { + if ( noError === void 0 ) noError = false; + + if (this.regexp_eatQuantifierPrefix(state, noError)) { + state.eat(0x3F /* ? */); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix + pp$8.regexp_eatQuantifierPrefix = function(state, noError) { + return ( + state.eat(0x2A /* * */) || + state.eat(0x2B /* + */) || + state.eat(0x3F /* ? */) || + this.regexp_eatBracedQuantifier(state, noError) + ) + }; + pp$8.regexp_eatBracedQuantifier = function(state, noError) { + var start = state.pos; + if (state.eat(0x7B /* { */)) { + var min = 0, max = -1; + if (this.regexp_eatDecimalDigits(state)) { + min = state.lastIntValue; + if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) { + max = state.lastIntValue; + } + if (state.eat(0x7D /* } */)) { + // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term + if (max !== -1 && max < min && !noError) { + state.raise("numbers out of order in {} quantifier"); + } + return true + } + } + if (state.switchU && !noError) { + state.raise("Incomplete quantifier"); + } + state.pos = start; + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Atom + pp$8.regexp_eatAtom = function(state) { + return ( + this.regexp_eatPatternCharacters(state) || + state.eat(0x2E /* . */) || + this.regexp_eatReverseSolidusAtomEscape(state) || + this.regexp_eatCharacterClass(state) || + this.regexp_eatUncapturingGroup(state) || + this.regexp_eatCapturingGroup(state) + ) + }; + pp$8.regexp_eatReverseSolidusAtomEscape = function(state) { + var start = state.pos; + if (state.eat(0x5C /* \ */)) { + if (this.regexp_eatAtomEscape(state)) { + return true + } + state.pos = start; + } + return false + }; + pp$8.regexp_eatUncapturingGroup = function(state) { + var start = state.pos; + if (state.eat(0x28 /* ( */)) { + if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) { + this.regexp_disjunction(state); + if (state.eat(0x29 /* ) */)) { + return true + } + state.raise("Unterminated group"); + } + state.pos = start; + } + return false + }; + pp$8.regexp_eatCapturingGroup = function(state) { + if (state.eat(0x28 /* ( */)) { + if (this.options.ecmaVersion >= 9) { + this.regexp_groupSpecifier(state); + } else if (state.current() === 0x3F /* ? */) { + state.raise("Invalid group"); + } + this.regexp_disjunction(state); + if (state.eat(0x29 /* ) */)) { + state.numCapturingParens += 1; + return true + } + state.raise("Unterminated group"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom + pp$8.regexp_eatExtendedAtom = function(state) { + return ( + state.eat(0x2E /* . */) || + this.regexp_eatReverseSolidusAtomEscape(state) || + this.regexp_eatCharacterClass(state) || + this.regexp_eatUncapturingGroup(state) || + this.regexp_eatCapturingGroup(state) || + this.regexp_eatInvalidBracedQuantifier(state) || + this.regexp_eatExtendedPatternCharacter(state) + ) + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier + pp$8.regexp_eatInvalidBracedQuantifier = function(state) { + if (this.regexp_eatBracedQuantifier(state, true)) { + state.raise("Nothing to repeat"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter + pp$8.regexp_eatSyntaxCharacter = function(state) { + var ch = state.current(); + if (isSyntaxCharacter(ch)) { + state.lastIntValue = ch; + state.advance(); + return true + } + return false + }; + function isSyntaxCharacter(ch) { + return ( + ch === 0x24 /* $ */ || + ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ || + ch === 0x2E /* . */ || + ch === 0x3F /* ? */ || + ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ || + ch >= 0x7B /* { */ && ch <= 0x7D /* } */ + ) + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter + // But eat eager. + pp$8.regexp_eatPatternCharacters = function(state) { + var start = state.pos; + var ch = 0; + while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) { + state.advance(); + } + return state.pos !== start + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter + pp$8.regexp_eatExtendedPatternCharacter = function(state) { + var ch = state.current(); + if ( + ch !== -1 && + ch !== 0x24 /* $ */ && + !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) && + ch !== 0x2E /* . */ && + ch !== 0x3F /* ? */ && + ch !== 0x5B /* [ */ && + ch !== 0x5E /* ^ */ && + ch !== 0x7C /* | */ + ) { + state.advance(); + return true + } + return false + }; + + // GroupSpecifier[U] :: + // [empty] + // `?` GroupName[?U] + pp$8.regexp_groupSpecifier = function(state) { + if (state.eat(0x3F /* ? */)) { + if (this.regexp_eatGroupName(state)) { + if (state.groupNames.indexOf(state.lastStringValue) !== -1) { + state.raise("Duplicate capture group name"); + } + state.groupNames.push(state.lastStringValue); + return + } + state.raise("Invalid group"); + } + }; + + // GroupName[U] :: + // `<` RegExpIdentifierName[?U] `>` + // Note: this updates `state.lastStringValue` property with the eaten name. + pp$8.regexp_eatGroupName = function(state) { + state.lastStringValue = ""; + if (state.eat(0x3C /* < */)) { + if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) { + return true + } + state.raise("Invalid capture group name"); + } + return false + }; + + // RegExpIdentifierName[U] :: + // RegExpIdentifierStart[?U] + // RegExpIdentifierName[?U] RegExpIdentifierPart[?U] + // Note: this updates `state.lastStringValue` property with the eaten name. + pp$8.regexp_eatRegExpIdentifierName = function(state) { + state.lastStringValue = ""; + if (this.regexp_eatRegExpIdentifierStart(state)) { + state.lastStringValue += codePointToString(state.lastIntValue); + while (this.regexp_eatRegExpIdentifierPart(state)) { + state.lastStringValue += codePointToString(state.lastIntValue); + } + return true + } + return false + }; + + // RegExpIdentifierStart[U] :: + // UnicodeIDStart + // `$` + // `_` + // `\` RegExpUnicodeEscapeSequence[?U] + pp$8.regexp_eatRegExpIdentifierStart = function(state) { + var start = state.pos; + var ch = state.current(); + state.advance(); + + if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state)) { + ch = state.lastIntValue; + } + if (isRegExpIdentifierStart(ch)) { + state.lastIntValue = ch; + return true + } + + state.pos = start; + return false + }; + function isRegExpIdentifierStart(ch) { + return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ + } + + // RegExpIdentifierPart[U] :: + // UnicodeIDContinue + // `$` + // `_` + // `\` RegExpUnicodeEscapeSequence[?U] + // + // + pp$8.regexp_eatRegExpIdentifierPart = function(state) { + var start = state.pos; + var ch = state.current(); + state.advance(); + + if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state)) { + ch = state.lastIntValue; + } + if (isRegExpIdentifierPart(ch)) { + state.lastIntValue = ch; + return true + } + + state.pos = start; + return false + }; + function isRegExpIdentifierPart(ch) { + return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* */ || ch === 0x200D /* */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape + pp$8.regexp_eatAtomEscape = function(state) { + if ( + this.regexp_eatBackReference(state) || + this.regexp_eatCharacterClassEscape(state) || + this.regexp_eatCharacterEscape(state) || + (state.switchN && this.regexp_eatKGroupName(state)) + ) { + return true + } + if (state.switchU) { + // Make the same message as V8. + if (state.current() === 0x63 /* c */) { + state.raise("Invalid unicode escape"); + } + state.raise("Invalid escape"); + } + return false + }; + pp$8.regexp_eatBackReference = function(state) { + var start = state.pos; + if (this.regexp_eatDecimalEscape(state)) { + var n = state.lastIntValue; + if (state.switchU) { + // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape + if (n > state.maxBackReference) { + state.maxBackReference = n; + } + return true + } + if (n <= state.numCapturingParens) { + return true + } + state.pos = start; + } + return false + }; + pp$8.regexp_eatKGroupName = function(state) { + if (state.eat(0x6B /* k */)) { + if (this.regexp_eatGroupName(state)) { + state.backReferenceNames.push(state.lastStringValue); + return true + } + state.raise("Invalid named reference"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape + pp$8.regexp_eatCharacterEscape = function(state) { + return ( + this.regexp_eatControlEscape(state) || + this.regexp_eatCControlLetter(state) || + this.regexp_eatZero(state) || + this.regexp_eatHexEscapeSequence(state) || + this.regexp_eatRegExpUnicodeEscapeSequence(state) || + (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) || + this.regexp_eatIdentityEscape(state) + ) + }; + pp$8.regexp_eatCControlLetter = function(state) { + var start = state.pos; + if (state.eat(0x63 /* c */)) { + if (this.regexp_eatControlLetter(state)) { + return true + } + state.pos = start; + } + return false + }; + pp$8.regexp_eatZero = function(state) { + if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) { + state.lastIntValue = 0; + state.advance(); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape + pp$8.regexp_eatControlEscape = function(state) { + var ch = state.current(); + if (ch === 0x74 /* t */) { + state.lastIntValue = 0x09; /* \t */ + state.advance(); + return true + } + if (ch === 0x6E /* n */) { + state.lastIntValue = 0x0A; /* \n */ + state.advance(); + return true + } + if (ch === 0x76 /* v */) { + state.lastIntValue = 0x0B; /* \v */ + state.advance(); + return true + } + if (ch === 0x66 /* f */) { + state.lastIntValue = 0x0C; /* \f */ + state.advance(); + return true + } + if (ch === 0x72 /* r */) { + state.lastIntValue = 0x0D; /* \r */ + state.advance(); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter + pp$8.regexp_eatControlLetter = function(state) { + var ch = state.current(); + if (isControlLetter(ch)) { + state.lastIntValue = ch % 0x20; + state.advance(); + return true + } + return false + }; + function isControlLetter(ch) { + return ( + (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) || + (ch >= 0x61 /* a */ && ch <= 0x7A /* z */) + ) + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence + pp$8.regexp_eatRegExpUnicodeEscapeSequence = function(state) { + var start = state.pos; + + if (state.eat(0x75 /* u */)) { + if (this.regexp_eatFixedHexDigits(state, 4)) { + var lead = state.lastIntValue; + if (state.switchU && lead >= 0xD800 && lead <= 0xDBFF) { + var leadSurrogateEnd = state.pos; + if (state.eat(0x5C /* \ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) { + var trail = state.lastIntValue; + if (trail >= 0xDC00 && trail <= 0xDFFF) { + state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; + return true + } + } + state.pos = leadSurrogateEnd; + state.lastIntValue = lead; + } + return true + } + if ( + state.switchU && + state.eat(0x7B /* { */) && + this.regexp_eatHexDigits(state) && + state.eat(0x7D /* } */) && + isValidUnicode(state.lastIntValue) + ) { + return true + } + if (state.switchU) { + state.raise("Invalid unicode escape"); + } + state.pos = start; + } + + return false + }; + function isValidUnicode(ch) { + return ch >= 0 && ch <= 0x10FFFF + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape + pp$8.regexp_eatIdentityEscape = function(state) { + if (state.switchU) { + if (this.regexp_eatSyntaxCharacter(state)) { + return true + } + if (state.eat(0x2F /* / */)) { + state.lastIntValue = 0x2F; /* / */ + return true + } + return false + } + + var ch = state.current(); + if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) { + state.lastIntValue = ch; + state.advance(); + return true + } + + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape + pp$8.regexp_eatDecimalEscape = function(state) { + state.lastIntValue = 0; + var ch = state.current(); + if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) { + do { + state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */); + state.advance(); + } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape + pp$8.regexp_eatCharacterClassEscape = function(state) { + var ch = state.current(); + + if (isCharacterClassEscape(ch)) { + state.lastIntValue = -1; + state.advance(); + return true + } + + if ( + state.switchU && + this.options.ecmaVersion >= 9 && + (ch === 0x50 /* P */ || ch === 0x70 /* p */) + ) { + state.lastIntValue = -1; + state.advance(); + if ( + state.eat(0x7B /* { */) && + this.regexp_eatUnicodePropertyValueExpression(state) && + state.eat(0x7D /* } */) + ) { + return true + } + state.raise("Invalid property name"); + } + + return false + }; + function isCharacterClassEscape(ch) { + return ( + ch === 0x64 /* d */ || + ch === 0x44 /* D */ || + ch === 0x73 /* s */ || + ch === 0x53 /* S */ || + ch === 0x77 /* w */ || + ch === 0x57 /* W */ + ) + } + + // UnicodePropertyValueExpression :: + // UnicodePropertyName `=` UnicodePropertyValue + // LoneUnicodePropertyNameOrValue + pp$8.regexp_eatUnicodePropertyValueExpression = function(state) { + var start = state.pos; + + // UnicodePropertyName `=` UnicodePropertyValue + if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) { + var name = state.lastStringValue; + if (this.regexp_eatUnicodePropertyValue(state)) { + var value = state.lastStringValue; + this.regexp_validateUnicodePropertyNameAndValue(state, name, value); + return true + } + } + state.pos = start; + + // LoneUnicodePropertyNameOrValue + if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) { + var nameOrValue = state.lastStringValue; + this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue); + return true + } + return false + }; + pp$8.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) { + if (!has(state.unicodeProperties.nonBinary, name)) + { state.raise("Invalid property name"); } + if (!state.unicodeProperties.nonBinary[name].test(value)) + { state.raise("Invalid property value"); } + }; + pp$8.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) { + if (!state.unicodeProperties.binary.test(nameOrValue)) + { state.raise("Invalid property name"); } + }; + + // UnicodePropertyName :: + // UnicodePropertyNameCharacters + pp$8.regexp_eatUnicodePropertyName = function(state) { + var ch = 0; + state.lastStringValue = ""; + while (isUnicodePropertyNameCharacter(ch = state.current())) { + state.lastStringValue += codePointToString(ch); + state.advance(); + } + return state.lastStringValue !== "" + }; + function isUnicodePropertyNameCharacter(ch) { + return isControlLetter(ch) || ch === 0x5F /* _ */ + } + + // UnicodePropertyValue :: + // UnicodePropertyValueCharacters + pp$8.regexp_eatUnicodePropertyValue = function(state) { + var ch = 0; + state.lastStringValue = ""; + while (isUnicodePropertyValueCharacter(ch = state.current())) { + state.lastStringValue += codePointToString(ch); + state.advance(); + } + return state.lastStringValue !== "" + }; + function isUnicodePropertyValueCharacter(ch) { + return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch) + } + + // LoneUnicodePropertyNameOrValue :: + // UnicodePropertyValueCharacters + pp$8.regexp_eatLoneUnicodePropertyNameOrValue = function(state) { + return this.regexp_eatUnicodePropertyValue(state) + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass + pp$8.regexp_eatCharacterClass = function(state) { + if (state.eat(0x5B /* [ */)) { + state.eat(0x5E /* ^ */); + this.regexp_classRanges(state); + if (state.eat(0x5D /* [ */)) { + return true + } + // Unreachable since it threw "unterminated regular expression" error before. + state.raise("Unterminated character class"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges + // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges + // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash + pp$8.regexp_classRanges = function(state) { + while (this.regexp_eatClassAtom(state)) { + var left = state.lastIntValue; + if (state.eat(0x2D /* - */) && this.regexp_eatClassAtom(state)) { + var right = state.lastIntValue; + if (state.switchU && (left === -1 || right === -1)) { + state.raise("Invalid character class"); + } + if (left !== -1 && right !== -1 && left > right) { + state.raise("Range out of order in character class"); + } + } + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom + // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash + pp$8.regexp_eatClassAtom = function(state) { + var start = state.pos; + + if (state.eat(0x5C /* \ */)) { + if (this.regexp_eatClassEscape(state)) { + return true + } + if (state.switchU) { + // Make the same message as V8. + var ch$1 = state.current(); + if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) { + state.raise("Invalid class escape"); + } + state.raise("Invalid escape"); + } + state.pos = start; + } + + var ch = state.current(); + if (ch !== 0x5D /* [ */) { + state.lastIntValue = ch; + state.advance(); + return true + } + + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape + pp$8.regexp_eatClassEscape = function(state) { + var start = state.pos; + + if (state.eat(0x62 /* b */)) { + state.lastIntValue = 0x08; /* */ + return true + } + + if (state.switchU && state.eat(0x2D /* - */)) { + state.lastIntValue = 0x2D; /* - */ + return true + } + + if (!state.switchU && state.eat(0x63 /* c */)) { + if (this.regexp_eatClassControlLetter(state)) { + return true + } + state.pos = start; + } + + return ( + this.regexp_eatCharacterClassEscape(state) || + this.regexp_eatCharacterEscape(state) + ) + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter + pp$8.regexp_eatClassControlLetter = function(state) { + var ch = state.current(); + if (isDecimalDigit(ch) || ch === 0x5F /* _ */) { + state.lastIntValue = ch % 0x20; + state.advance(); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence + pp$8.regexp_eatHexEscapeSequence = function(state) { + var start = state.pos; + if (state.eat(0x78 /* x */)) { + if (this.regexp_eatFixedHexDigits(state, 2)) { + return true + } + if (state.switchU) { + state.raise("Invalid escape"); + } + state.pos = start; + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits + pp$8.regexp_eatDecimalDigits = function(state) { + var start = state.pos; + var ch = 0; + state.lastIntValue = 0; + while (isDecimalDigit(ch = state.current())) { + state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */); + state.advance(); + } + return state.pos !== start + }; + function isDecimalDigit(ch) { + return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits + pp$8.regexp_eatHexDigits = function(state) { + var start = state.pos; + var ch = 0; + state.lastIntValue = 0; + while (isHexDigit(ch = state.current())) { + state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); + state.advance(); + } + return state.pos !== start + }; + function isHexDigit(ch) { + return ( + (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) || + (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) || + (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) + ) + } + function hexToInt(ch) { + if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) { + return 10 + (ch - 0x41 /* A */) + } + if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) { + return 10 + (ch - 0x61 /* a */) + } + return ch - 0x30 /* 0 */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence + // Allows only 0-377(octal) i.e. 0-255(decimal). + pp$8.regexp_eatLegacyOctalEscapeSequence = function(state) { + if (this.regexp_eatOctalDigit(state)) { + var n1 = state.lastIntValue; + if (this.regexp_eatOctalDigit(state)) { + var n2 = state.lastIntValue; + if (n1 <= 3 && this.regexp_eatOctalDigit(state)) { + state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue; + } else { + state.lastIntValue = n1 * 8 + n2; + } + } else { + state.lastIntValue = n1; + } + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit + pp$8.regexp_eatOctalDigit = function(state) { + var ch = state.current(); + if (isOctalDigit(ch)) { + state.lastIntValue = ch - 0x30; /* 0 */ + state.advance(); + return true + } + state.lastIntValue = 0; + return false + }; + function isOctalDigit(ch) { + return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits + // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit + // And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence + pp$8.regexp_eatFixedHexDigits = function(state, length) { + var start = state.pos; + state.lastIntValue = 0; + for (var i = 0; i < length; ++i) { + var ch = state.current(); + if (!isHexDigit(ch)) { + state.pos = start; + return false + } + state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); + state.advance(); + } + return true + }; + + // Object type used to represent tokens. Note that normally, tokens + // simply exist as properties on the parser object. This is only + // used for the onToken callback and the external tokenizer. + + var Token = function Token(p) { + this.type = p.type; + this.value = p.value; + this.start = p.start; + this.end = p.end; + if (p.options.locations) + { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); } + if (p.options.ranges) + { this.range = [p.start, p.end]; } + }; + + // ## Tokenizer + + var pp$9 = Parser.prototype; + + // Move to the next token + + pp$9.next = function() { + if (this.options.onToken) + { this.options.onToken(new Token(this)); } + + this.lastTokEnd = this.end; + this.lastTokStart = this.start; + this.lastTokEndLoc = this.endLoc; + this.lastTokStartLoc = this.startLoc; + this.nextToken(); + }; + + pp$9.getToken = function() { + this.next(); + return new Token(this) + }; + + // If we're in an ES6 environment, make parsers iterable + if (typeof Symbol !== "undefined") + { pp$9[Symbol.iterator] = function() { + var this$1 = this; + + return { + next: function () { + var token = this$1.getToken(); + return { + done: token.type === types.eof, + value: token + } + } + } + }; } + + // Toggle strict mode. Re-reads the next number or string to please + // pedantic tests (`"use strict"; 010;` should fail). + + pp$9.curContext = function() { + return this.context[this.context.length - 1] + }; + + // Read a single token, updating the parser object's token-related + // properties. + + pp$9.nextToken = function() { + var curContext = this.curContext(); + if (!curContext || !curContext.preserveSpace) { this.skipSpace(); } + + this.start = this.pos; + if (this.options.locations) { this.startLoc = this.curPosition(); } + if (this.pos >= this.input.length) { return this.finishToken(types.eof) } + + if (curContext.override) { return curContext.override(this) } + else { this.readToken(this.fullCharCodeAtPos()); } + }; + + pp$9.readToken = function(code) { + // Identifier or keyword. '\uXXXX' sequences are allowed in + // identifiers, so '\' also dispatches to that. + if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\' */) + { return this.readWord() } + + return this.getTokenFromCode(code) + }; + + pp$9.fullCharCodeAtPos = function() { + var code = this.input.charCodeAt(this.pos); + if (code <= 0xd7ff || code >= 0xe000) { return code } + var next = this.input.charCodeAt(this.pos + 1); + return (code << 10) + next - 0x35fdc00 + }; + + pp$9.skipBlockComment = function() { + var startLoc = this.options.onComment && this.curPosition(); + var start = this.pos, end = this.input.indexOf("*/", this.pos += 2); + if (end === -1) { this.raise(this.pos - 2, "Unterminated comment"); } + this.pos = end + 2; + if (this.options.locations) { + lineBreakG.lastIndex = start; + var match; + while ((match = lineBreakG.exec(this.input)) && match.index < this.pos) { + ++this.curLine; + this.lineStart = match.index + match[0].length; + } + } + if (this.options.onComment) + { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos, + startLoc, this.curPosition()); } + }; + + pp$9.skipLineComment = function(startSkip) { + var start = this.pos; + var startLoc = this.options.onComment && this.curPosition(); + var ch = this.input.charCodeAt(this.pos += startSkip); + while (this.pos < this.input.length && !isNewLine(ch)) { + ch = this.input.charCodeAt(++this.pos); + } + if (this.options.onComment) + { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos, + startLoc, this.curPosition()); } + }; + + // Called at the start of the parse and after every token. Skips + // whitespace and comments, and. + + pp$9.skipSpace = function() { + loop: while (this.pos < this.input.length) { + var ch = this.input.charCodeAt(this.pos); + switch (ch) { + case 32: case 160: // ' ' + ++this.pos; + break + case 13: + if (this.input.charCodeAt(this.pos + 1) === 10) { + ++this.pos; + } + case 10: case 8232: case 8233: + ++this.pos; + if (this.options.locations) { + ++this.curLine; + this.lineStart = this.pos; + } + break + case 47: // '/' + switch (this.input.charCodeAt(this.pos + 1)) { + case 42: // '*' + this.skipBlockComment(); + break + case 47: + this.skipLineComment(2); + break + default: + break loop + } + break + default: + if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++this.pos; + } else { + break loop + } + } + } + }; + + // Called at the end of every token. Sets `end`, `val`, and + // maintains `context` and `exprAllowed`, and skips the space after + // the token, so that the next one's `start` will point at the + // right position. + + pp$9.finishToken = function(type, val) { + this.end = this.pos; + if (this.options.locations) { this.endLoc = this.curPosition(); } + var prevType = this.type; + this.type = type; + this.value = val; + + this.updateContext(prevType); + }; + + // ### Token reading + + // This is the function that is called to fetch the next token. It + // is somewhat obscure, because it works in character codes rather + // than characters, and because operator parsing has been inlined + // into it. + // + // All in the name of speed. + // + pp$9.readToken_dot = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (next >= 48 && next <= 57) { return this.readNumber(true) } + var next2 = this.input.charCodeAt(this.pos + 2); + if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.' + this.pos += 3; + return this.finishToken(types.ellipsis) + } else { + ++this.pos; + return this.finishToken(types.dot) + } + }; + + pp$9.readToken_slash = function() { // '/' + var next = this.input.charCodeAt(this.pos + 1); + if (this.exprAllowed) { ++this.pos; return this.readRegexp() } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.slash, 1) + }; + + pp$9.readToken_mult_modulo_exp = function(code) { // '%*' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + var tokentype = code === 42 ? types.star : types.modulo; + + // exponentiation operator ** and **= + if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) { + ++size; + tokentype = types.starstar; + next = this.input.charCodeAt(this.pos + 2); + } + + if (next === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(tokentype, size) + }; + + pp$9.readToken_pipe_amp = function(code) { // '|&' + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { return this.finishOp(code === 124 ? types.logicalOR : types.logicalAND, 2) } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(code === 124 ? types.bitwiseOR : types.bitwiseAND, 1) + }; + + pp$9.readToken_caret = function() { // '^' + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.bitwiseXOR, 1) + }; + + pp$9.readToken_plus_min = function(code) { // '+-' + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { + if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 && + (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) { + // A `-->` line comment + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken() + } + return this.finishOp(types.incDec, 2) + } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.plusMin, 1) + }; + + pp$9.readToken_lt_gt = function(code) { // '<>' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(types.bitShift, size) + } + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && + this.input.charCodeAt(this.pos + 3) === 45) { + // `` line comment\n this.skipLineComment(3)\n this.skipSpace()\n return this.nextToken()\n }\n return this.finishOp(tt.incDec, 2)\n }\n if (next === 61) return this.finishOp(tt.assign, 2)\n return this.finishOp(tt.plusMin, 1)\n}\n\npp.readToken_lt_gt = function(code) { // '<>'\n let next = this.input.charCodeAt(this.pos + 1)\n let size = 1\n if (next === code) {\n size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2\n if (this.input.charCodeAt(this.pos + size) === 61) return this.finishOp(tt.assign, size + 1)\n return this.finishOp(tt.bitShift, size)\n }\n if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&\n this.input.charCodeAt(this.pos + 3) === 45) {\n // `` line comment + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken() + } + return this.finishOp(types.incDec, 2) + } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.plusMin, 1) +}; + +pp$9.readToken_lt_gt = function(code) { // '<>' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(types.bitShift, size) + } + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && + this.input.charCodeAt(this.pos + 3) === 45) { + // `` line comment\n this.skipLineComment(3)\n this.skipSpace()\n return this.nextToken()\n }\n return this.finishOp(tt.incDec, 2)\n }\n if (next === 61) return this.finishOp(tt.assign, 2)\n return this.finishOp(tt.plusMin, 1)\n}\n\npp.readToken_lt_gt = function(code) { // '<>'\n let next = this.input.charCodeAt(this.pos + 1)\n let size = 1\n if (next === code) {\n size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2\n if (this.input.charCodeAt(this.pos + size) === 61) return this.finishOp(tt.assign, size + 1)\n return this.finishOp(tt.bitShift, size)\n }\n if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&\n this.input.charCodeAt(this.pos + 3) === 45) {\n // `` line comment + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken() + } + return this.finishOp(types.incDec, 2) + } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.plusMin, 1) +}; + +pp$8.readToken_lt_gt = function(code) { // '<>' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(types.bitShift, size) + } + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && + this.input.charCodeAt(this.pos + 3) === 45) { + // `` line comment + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken() + } + return this.finishOp(types.incDec, 2) + } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.plusMin, 1) +}; + +pp$8.readToken_lt_gt = function(code) { // '<>' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(types.bitShift, size) + } + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && + this.input.charCodeAt(this.pos + 3) === 45) { + // ` + +AsyncKit provides harness for `parallel` and `serial` iterators over list of items represented by arrays or objects. +Optionally it accepts abort function (should be synchronously return by iterator for each item), and terminates left over jobs upon an error event. For specific iteration order built-in (`ascending` and `descending`) and custom sort helpers also supported, via `asynckit.serialOrdered` method. + +It ensures async operations to keep behavior more stable and prevent `Maximum call stack size exceeded` errors, from sync iterators. + +| compression | size | +| :----------------- | -------: | +| asynckit.js | 12.34 kB | +| asynckit.min.js | 4.11 kB | +| asynckit.min.js.gz | 1.47 kB | + + +## Install + +```sh +$ npm install --save asynckit +``` + +## Examples + +### Parallel Jobs + +Runs iterator over provided array in parallel. Stores output in the `result` array, +on the matching positions. In unlikely event of an error from one of the jobs, +will terminate rest of the active jobs (if abort function is provided) +and return error along with salvaged data to the main callback function. + +#### Input Array + +```javascript +var parallel = require('asynckit').parallel + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ] + , target = [] + ; + +parallel(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// async job accepts one element from the array +// and a callback function +function asyncJob(item, cb) +{ + // different delays (in ms) per item + var delay = item * 25; + + // pretend different jobs take different time to finish + // and not in consequential order + var timeoutId = setTimeout(function() { + target.push(item); + cb(null, item * 2); + }, delay); + + // allow to cancel "leftover" jobs upon error + // return function, invoking of which will abort this job + return clearTimeout.bind(null, timeoutId); +} +``` + +More examples could be found in [test/test-parallel-array.js](test/test-parallel-array.js). + +#### Input Object + +Also it supports named jobs, listed via object. + +```javascript +var parallel = require('asynckit/parallel') + , assert = require('assert') + ; + +var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 } + , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 } + , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ] + , expectedKeys = [ 'first', 'one', 'two', 'four', 'eight', 'sixteen', 'thirtyTwo', 'sixtyFour' ] + , target = [] + , keys = [] + ; + +parallel(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); + assert.deepEqual(keys, expectedKeys); +}); + +// supports full value, key, callback (shortcut) interface +function asyncJob(item, key, cb) +{ + // different delays (in ms) per item + var delay = item * 25; + + // pretend different jobs take different time to finish + // and not in consequential order + var timeoutId = setTimeout(function() { + keys.push(key); + target.push(item); + cb(null, item * 2); + }, delay); + + // allow to cancel "leftover" jobs upon error + // return function, invoking of which will abort this job + return clearTimeout.bind(null, timeoutId); +} +``` + +More examples could be found in [test/test-parallel-object.js](test/test-parallel-object.js). + +### Serial Jobs + +Runs iterator over provided array sequentially. Stores output in the `result` array, +on the matching positions. In unlikely event of an error from one of the jobs, +will not proceed to the rest of the items in the list +and return error along with salvaged data to the main callback function. + +#### Input Array + +```javascript +var serial = require('asynckit/serial') + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ] + , target = [] + ; + +serial(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// extended interface (item, key, callback) +// also supported for arrays +function asyncJob(item, key, cb) +{ + target.push(key); + + // it will be automatically made async + // even it iterator "returns" in the same event loop + cb(null, item * 2); +} +``` + +More examples could be found in [test/test-serial-array.js](test/test-serial-array.js). + +#### Input Object + +Also it supports named jobs, listed via object. + +```javascript +var serial = require('asynckit').serial + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ] + , target = [] + ; + +var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 } + , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 } + , expectedTarget = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , target = [] + ; + + +serial(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// shortcut interface (item, callback) +// works for object as well as for the arrays +function asyncJob(item, cb) +{ + target.push(item); + + // it will be automatically made async + // even it iterator "returns" in the same event loop + cb(null, item * 2); +} +``` + +More examples could be found in [test/test-serial-object.js](test/test-serial-object.js). + +_Note: Since _object_ is an _unordered_ collection of properties, +it may produce unexpected results with sequential iterations. +Whenever order of the jobs' execution is important please use `serialOrdered` method._ + +### Ordered Serial Iterations + +TBD + +For example [compare-property](compare-property) package. + +### Streaming interface + +TBD + +## Want to Know More? + +More examples can be found in [test folder](test/). + +Or open an [issue](https://github.com/alexindigo/asynckit/issues) with questions and/or suggestions. + +## License + +AsyncKit is licensed under the MIT license. diff --git a/node_modules/asynckit/bench.js b/node_modules/asynckit/bench.js new file mode 100644 index 00000000..c612f1a5 --- /dev/null +++ b/node_modules/asynckit/bench.js @@ -0,0 +1,76 @@ +/* eslint no-console: "off" */ + +var asynckit = require('./') + , async = require('async') + , assert = require('assert') + , expected = 0 + ; + +var Benchmark = require('benchmark'); +var suite = new Benchmark.Suite; + +var source = []; +for (var z = 1; z < 100; z++) +{ + source.push(z); + expected += z; +} + +suite +// add tests + +.add('async.map', function(deferred) +{ + var total = 0; + + async.map(source, + function(i, cb) + { + setImmediate(function() + { + total += i; + cb(null, total); + }); + }, + function(err, result) + { + assert.ifError(err); + assert.equal(result[result.length - 1], expected); + deferred.resolve(); + }); +}, {'defer': true}) + + +.add('asynckit.parallel', function(deferred) +{ + var total = 0; + + asynckit.parallel(source, + function(i, cb) + { + setImmediate(function() + { + total += i; + cb(null, total); + }); + }, + function(err, result) + { + assert.ifError(err); + assert.equal(result[result.length - 1], expected); + deferred.resolve(); + }); +}, {'defer': true}) + + +// add listeners +.on('cycle', function(ev) +{ + console.log(String(ev.target)); +}) +.on('complete', function() +{ + console.log('Fastest is ' + this.filter('fastest').map('name')); +}) +// run async +.run({ 'async': true }); diff --git a/node_modules/asynckit/index.js b/node_modules/asynckit/index.js new file mode 100644 index 00000000..455f9454 --- /dev/null +++ b/node_modules/asynckit/index.js @@ -0,0 +1,6 @@ +module.exports = +{ + parallel : require('./parallel.js'), + serial : require('./serial.js'), + serialOrdered : require('./serialOrdered.js') +}; diff --git a/node_modules/asynckit/package.json b/node_modules/asynckit/package.json new file mode 100644 index 00000000..51147d65 --- /dev/null +++ b/node_modules/asynckit/package.json @@ -0,0 +1,63 @@ +{ + "name": "asynckit", + "version": "0.4.0", + "description": "Minimal async jobs utility library, with streams support", + "main": "index.js", + "scripts": { + "clean": "rimraf coverage", + "lint": "eslint *.js lib/*.js test/*.js", + "test": "istanbul cover --reporter=json tape -- 'test/test-*.js' | tap-spec", + "win-test": "tape test/test-*.js", + "browser": "browserify -t browserify-istanbul test/lib/browserify_adjustment.js test/test-*.js | obake --coverage | tap-spec", + "report": "istanbul report", + "size": "browserify index.js | size-table asynckit", + "debug": "tape test/test-*.js" + }, + "pre-commit": [ + "clean", + "lint", + "test", + "browser", + "report", + "size" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/alexindigo/asynckit.git" + }, + "keywords": [ + "async", + "jobs", + "parallel", + "serial", + "iterator", + "array", + "object", + "stream", + "destroy", + "terminate", + "abort" + ], + "author": "Alex Indigo ", + "license": "MIT", + "bugs": { + "url": "https://github.com/alexindigo/asynckit/issues" + }, + "homepage": "https://github.com/alexindigo/asynckit#readme", + "devDependencies": { + "browserify": "^13.0.0", + "browserify-istanbul": "^2.0.0", + "coveralls": "^2.11.9", + "eslint": "^2.9.0", + "istanbul": "^0.4.3", + "obake": "^0.1.2", + "phantomjs-prebuilt": "^2.1.7", + "pre-commit": "^1.1.3", + "reamde": "^1.1.0", + "rimraf": "^2.5.2", + "size-table": "^0.2.0", + "tap-spec": "^4.1.1", + "tape": "^4.5.1" + }, + "dependencies": {} +} diff --git a/node_modules/asynckit/parallel.js b/node_modules/asynckit/parallel.js new file mode 100644 index 00000000..3c50344d --- /dev/null +++ b/node_modules/asynckit/parallel.js @@ -0,0 +1,43 @@ +var iterate = require('./lib/iterate.js') + , initState = require('./lib/state.js') + , terminator = require('./lib/terminator.js') + ; + +// Public API +module.exports = parallel; + +/** + * Runs iterator over provided array elements in parallel + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function parallel(list, iterator, callback) +{ + var state = initState(list); + + while (state.index < (state['keyedList'] || list).length) + { + iterate(list, iterator, state, function(error, result) + { + if (error) + { + callback(error, result); + return; + } + + // looks like it's the last one + if (Object.keys(state.jobs).length === 0) + { + callback(null, state.results); + return; + } + }); + + state.index++; + } + + return terminator.bind(state, callback); +} diff --git a/node_modules/asynckit/serial.js b/node_modules/asynckit/serial.js new file mode 100644 index 00000000..6cd949a6 --- /dev/null +++ b/node_modules/asynckit/serial.js @@ -0,0 +1,17 @@ +var serialOrdered = require('./serialOrdered.js'); + +// Public API +module.exports = serial; + +/** + * Runs iterator over provided array elements in series + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function serial(list, iterator, callback) +{ + return serialOrdered(list, iterator, null, callback); +} diff --git a/node_modules/asynckit/serialOrdered.js b/node_modules/asynckit/serialOrdered.js new file mode 100644 index 00000000..607eafea --- /dev/null +++ b/node_modules/asynckit/serialOrdered.js @@ -0,0 +1,75 @@ +var iterate = require('./lib/iterate.js') + , initState = require('./lib/state.js') + , terminator = require('./lib/terminator.js') + ; + +// Public API +module.exports = serialOrdered; +// sorting helpers +module.exports.ascending = ascending; +module.exports.descending = descending; + +/** + * Runs iterator over provided sorted array elements in series + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} sortMethod - custom sort function + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function serialOrdered(list, iterator, sortMethod, callback) +{ + var state = initState(list, sortMethod); + + iterate(list, iterator, state, function iteratorHandler(error, result) + { + if (error) + { + callback(error, result); + return; + } + + state.index++; + + // are we there yet? + if (state.index < (state['keyedList'] || list).length) + { + iterate(list, iterator, state, iteratorHandler); + return; + } + + // done here + callback(null, state.results); + }); + + return terminator.bind(state, callback); +} + +/* + * -- Sort methods + */ + +/** + * sort helper to sort array elements in ascending order + * + * @param {mixed} a - an item to compare + * @param {mixed} b - an item to compare + * @returns {number} - comparison result + */ +function ascending(a, b) +{ + return a < b ? -1 : a > b ? 1 : 0; +} + +/** + * sort helper to sort array elements in descending order + * + * @param {mixed} a - an item to compare + * @param {mixed} b - an item to compare + * @returns {number} - comparison result + */ +function descending(a, b) +{ + return -1 * ascending(a, b); +} diff --git a/node_modules/asynckit/stream.js b/node_modules/asynckit/stream.js new file mode 100644 index 00000000..d43465f9 --- /dev/null +++ b/node_modules/asynckit/stream.js @@ -0,0 +1,21 @@ +var inherits = require('util').inherits + , Readable = require('stream').Readable + , ReadableAsyncKit = require('./lib/readable_asynckit.js') + , ReadableParallel = require('./lib/readable_parallel.js') + , ReadableSerial = require('./lib/readable_serial.js') + , ReadableSerialOrdered = require('./lib/readable_serial_ordered.js') + ; + +// API +module.exports = +{ + parallel : ReadableParallel, + serial : ReadableSerial, + serialOrdered : ReadableSerialOrdered, +}; + +inherits(ReadableAsyncKit, Readable); + +inherits(ReadableParallel, ReadableAsyncKit); +inherits(ReadableSerial, ReadableAsyncKit); +inherits(ReadableSerialOrdered, ReadableAsyncKit); diff --git a/node_modules/atob/LICENSE b/node_modules/atob/LICENSE new file mode 100644 index 00000000..2d9338bd --- /dev/null +++ b/node_modules/atob/LICENSE @@ -0,0 +1,230 @@ +At your option you may choose either of the following licenses: + + * The MIT License (MIT) + * The Apache License 2.0 (Apache-2.0) + + +The MIT License (MIT) + +Copyright (c) 2015 AJ ONeal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 AJ ONeal + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/node_modules/atob/LICENSE.DOCS b/node_modules/atob/LICENSE.DOCS new file mode 100644 index 00000000..1d658d6d --- /dev/null +++ b/node_modules/atob/LICENSE.DOCS @@ -0,0 +1,319 @@ +Creative Commons Legal Code + +Attribution 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined above) for the purposes of this + License. + c. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + d. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + e. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + f. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + g. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + h. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + i. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(b), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(b), as requested. + b. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Section 3(b), in the case of an Adaptation, + a credit identifying the use of the Work in the Adaptation (e.g., + "French translation of the Work by Original Author," or "Screenplay + based on original Work by Original Author"). The credit required by + this Section 4 (b) may be implemented in any reasonable manner; + provided, however, that in the case of a Adaptation or Collection, at + a minimum such credit will appear, if a credit for all contributing + authors of the Adaptation or Collection appears, then as part of these + credits and in a manner at least as prominent as the credits for the + other contributing authors. For the avoidance of doubt, You may only + use the credit required by this Section for the purpose of attribution + in the manner set out above and, by exercising Your rights under this + License, You may not implicitly or explicitly assert or imply any + connection with, sponsorship or endorsement by the Original Author, + Licensor and/or Attribution Parties, as appropriate, of You or Your + use of the Work, without the separate, express prior written + permission of the Original Author, Licensor and/or Attribution + Parties. + c. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of this License. + + Creative Commons may be contacted at http://creativecommons.org/. diff --git a/node_modules/atob/README.md b/node_modules/atob/README.md new file mode 100644 index 00000000..e15ef86b --- /dev/null +++ b/node_modules/atob/README.md @@ -0,0 +1,49 @@ +atob +=== + +| **atob** +| [btoa](https://git.coolaj86.com/coolaj86/btoa.js) +| [unibabel.js](https://git.coolaj86.com/coolaj86/unibabel.js) +| Sponsored by [ppl](https://ppl.family) + +Uses `Buffer` to emulate the exact functionality of the browser's atob. + +Note: Unicode may be handled incorrectly (like the browser). + +It turns base64-encoded ascii data back **to** binary. + +```javascript +(function () { + "use strict"; + + var atob = require('atob'); + var b64 = "SGVsbG8sIFdvcmxkIQ=="; + var bin = atob(b64); + + console.log(bin); // "Hello, World!" +}()); +``` + +### Need Unicode and Binary Support in the Browser? + +Check out [unibabel.js](https://git.coolaj86.com/coolaj86/unibabel.js) + +Changelog +======= + + * v2.1.0 address a few issues and PRs, update URLs + * v2.0.0 provide browser version for ios web workers + * v1.2.0 provide (empty) browser version + * v1.1.3 add MIT license + * v1.1.2 node only + +LICENSE +======= + +Code copyright 2012-2018 AJ ONeal + +Dual-licensed MIT and Apache-2.0 + +Docs copyright 2012-2018 AJ ONeal + +Docs released under [Creative Commons](https://git.coolaj86.com/coolaj86/atob.js/blob/master/LICENSE.DOCS). diff --git a/node_modules/atob/bower.json b/node_modules/atob/bower.json new file mode 100644 index 00000000..e3ef66e2 --- /dev/null +++ b/node_modules/atob/bower.json @@ -0,0 +1,24 @@ +{ + "name": "atob", + "description": "atob for isomorphic environments", + "main": "browser-atob.js", + "authors": [ + "AJ ONeal (https://coolaj86.com)" + ], + "license": "(MIT OR Apache-2.0)", + "keywords": [ + "atob", + "browser" + ], + "homepage": "https://github.com/node-browser-compat/atob", + "moduleType": [ + "globals" + ], + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ] +} diff --git a/node_modules/atob/browser-atob.js b/node_modules/atob/browser-atob.js new file mode 100644 index 00000000..af4f357b --- /dev/null +++ b/node_modules/atob/browser-atob.js @@ -0,0 +1,44 @@ +(function (w) { + "use strict"; + + function findBest(atobNative) { + // normal window + if ('function' === typeof atobNative) { return atobNative; } + + + // browserify (web worker) + if ('function' === typeof Buffer) { + return function atobBrowserify(a) { + //!! Deliberately using an API that's deprecated in node.js because + //!! this file is for browsers and we expect them to cope with it. + //!! Discussion: github.com/node-browser-compat/atob/pull/9 + return new Buffer(a, 'base64').toString('binary'); + }; + } + + // ios web worker with base64js + if ('object' === typeof w.base64js) { + // bufferToBinaryString + // https://git.coolaj86.com/coolaj86/unibabel.js/blob/master/index.js#L50 + return function atobWebWorker_iOS(a) { + var buf = w.base64js.b64ToByteArray(a); + return Array.prototype.map.call(buf, function (ch) { + return String.fromCharCode(ch); + }).join(''); + }; + } + + return function () { + // ios web worker without base64js + throw new Error("You're probably in an old browser or an iOS webworker." + + " It might help to include beatgammit's base64-js."); + }; + } + + var atobBest = findBest(w.atob); + w.atob = atobBest; + + if ((typeof module === 'object') && module && module.exports) { + module.exports = atobBest; + } +}(window)); diff --git a/node_modules/atob/node-atob.js b/node_modules/atob/node-atob.js new file mode 100644 index 00000000..d7305a32 --- /dev/null +++ b/node_modules/atob/node-atob.js @@ -0,0 +1,7 @@ +"use strict"; + +function atob(str) { + return Buffer.from(str, 'base64').toString('binary'); +} + +module.exports = atob.atob = atob; diff --git a/node_modules/atob/package.json b/node_modules/atob/package.json new file mode 100644 index 00000000..79bfd9ba --- /dev/null +++ b/node_modules/atob/package.json @@ -0,0 +1,24 @@ +{ + "name": "atob", + "homepage": "https://git.coolaj86.com/coolaj86/atob.js.git", + "description": "atob for Node.JS and Linux / Mac / Windows CLI (it's a one-liner)", + "repository": { + "type": "git", + "url": "git://git.coolaj86.com/coolaj86/atob.js.git" + }, + "keywords": [ + "atob", + "browser" + ], + "author": "AJ ONeal (https://coolaj86.com)", + "engines": { + "node": ">= 4.5.0" + }, + "main": "node-atob.js", + "browser": "browser-atob.js", + "bin": { + "atob": "bin/atob.js" + }, + "license": "(MIT OR Apache-2.0)", + "version": "2.1.2" +} diff --git a/node_modules/atob/test.js b/node_modules/atob/test.js new file mode 100644 index 00000000..bd80a4ea --- /dev/null +++ b/node_modules/atob/test.js @@ -0,0 +1,18 @@ +(function () { + "use strict"; + + var atob = require('.'); + var encoded = "SGVsbG8sIFdvcmxkIQ==" + var unencoded = "Hello, World!"; + /* + , encoded = "SGVsbG8sIBZM" + , unencoded = "Hello, 世界" + */ + + if (unencoded !== atob(encoded)) { + console.log('[FAIL]', unencoded, atob(encoded)); + return; + } + + console.log('[PASS] all tests pass'); +}()); diff --git a/node_modules/aws-sign2/LICENSE b/node_modules/aws-sign2/LICENSE new file mode 100644 index 00000000..a4a9aee0 --- /dev/null +++ b/node_modules/aws-sign2/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/aws-sign2/README.md b/node_modules/aws-sign2/README.md new file mode 100644 index 00000000..763564e0 --- /dev/null +++ b/node_modules/aws-sign2/README.md @@ -0,0 +1,4 @@ +aws-sign +======== + +AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module. diff --git a/node_modules/aws-sign2/index.js b/node_modules/aws-sign2/index.js new file mode 100644 index 00000000..fb35f6db --- /dev/null +++ b/node_modules/aws-sign2/index.js @@ -0,0 +1,212 @@ + +/*! + * Copyright 2010 LearnBoost + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Module dependencies. + */ + +var crypto = require('crypto') + , parse = require('url').parse + ; + +/** + * Valid keys. + */ + +var keys = + [ 'acl' + , 'location' + , 'logging' + , 'notification' + , 'partNumber' + , 'policy' + , 'requestPayment' + , 'torrent' + , 'uploadId' + , 'uploads' + , 'versionId' + , 'versioning' + , 'versions' + , 'website' + ] + +/** + * Return an "Authorization" header value with the given `options` + * in the form of "AWS :" + * + * @param {Object} options + * @return {String} + * @api private + */ + +function authorization (options) { + return 'AWS ' + options.key + ':' + sign(options) +} + +module.exports = authorization +module.exports.authorization = authorization + +/** + * Simple HMAC-SHA1 Wrapper + * + * @param {Object} options + * @return {String} + * @api private + */ + +function hmacSha1 (options) { + return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64') +} + +module.exports.hmacSha1 = hmacSha1 + +/** + * Create a base64 sha1 HMAC for `options`. + * + * @param {Object} options + * @return {String} + * @api private + */ + +function sign (options) { + options.message = stringToSign(options) + return hmacSha1(options) +} +module.exports.sign = sign + +/** + * Create a base64 sha1 HMAC for `options`. + * + * Specifically to be used with S3 presigned URLs + * + * @param {Object} options + * @return {String} + * @api private + */ + +function signQuery (options) { + options.message = queryStringToSign(options) + return hmacSha1(options) +} +module.exports.signQuery= signQuery + +/** + * Return a string for sign() with the given `options`. + * + * Spec: + * + * \n + * \n + * \n + * \n + * [headers\n] + * + * + * @param {Object} options + * @return {String} + * @api private + */ + +function stringToSign (options) { + var headers = options.amazonHeaders || '' + if (headers) headers += '\n' + var r = + [ options.verb + , options.md5 + , options.contentType + , options.date ? options.date.toUTCString() : '' + , headers + options.resource + ] + return r.join('\n') +} +module.exports.stringToSign = stringToSign + +/** + * Return a string for sign() with the given `options`, but is meant exclusively + * for S3 presigned URLs + * + * Spec: + * + * \n + * + * + * @param {Object} options + * @return {String} + * @api private + */ + +function queryStringToSign (options){ + return 'GET\n\n\n' + options.date + '\n' + options.resource +} +module.exports.queryStringToSign = queryStringToSign + +/** + * Perform the following: + * + * - ignore non-amazon headers + * - lowercase fields + * - sort lexicographically + * - trim whitespace between ":" + * - join with newline + * + * @param {Object} headers + * @return {String} + * @api private + */ + +function canonicalizeHeaders (headers) { + var buf = [] + , fields = Object.keys(headers) + ; + for (var i = 0, len = fields.length; i < len; ++i) { + var field = fields[i] + , val = headers[field] + , field = field.toLowerCase() + ; + if (0 !== field.indexOf('x-amz')) continue + buf.push(field + ':' + val) + } + return buf.sort().join('\n') +} +module.exports.canonicalizeHeaders = canonicalizeHeaders + +/** + * Perform the following: + * + * - ignore non sub-resources + * - sort lexicographically + * + * @param {String} resource + * @return {String} + * @api private + */ + +function canonicalizeResource (resource) { + var url = parse(resource, true) + , path = url.pathname + , buf = [] + ; + + Object.keys(url.query).forEach(function(key){ + if (!~keys.indexOf(key)) return + var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]) + buf.push(key + val) + }) + + return path + (buf.length ? '?' + buf.sort().join('&') : '') +} +module.exports.canonicalizeResource = canonicalizeResource diff --git a/node_modules/aws-sign2/package.json b/node_modules/aws-sign2/package.json new file mode 100644 index 00000000..4c3d57e5 --- /dev/null +++ b/node_modules/aws-sign2/package.json @@ -0,0 +1,17 @@ +{ + "author": "Mikeal Rogers (http://www.futurealoof.com)", + "name": "aws-sign2", + "description": "AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.", + "version": "0.7.0", + "repository": { + "url": "https://github.com/mikeal/aws-sign" + }, + "license": "Apache-2.0", + "main": "index.js", + "dependencies": {}, + "devDependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + } +} diff --git a/node_modules/aws4/.github/FUNDING.yml b/node_modules/aws4/.github/FUNDING.yml new file mode 100644 index 00000000..b7fdd974 --- /dev/null +++ b/node_modules/aws4/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: mhart diff --git a/node_modules/aws4/.travis.yml b/node_modules/aws4/.travis.yml new file mode 100644 index 00000000..178bf31e --- /dev/null +++ b/node_modules/aws4/.travis.yml @@ -0,0 +1,9 @@ +language: node_js +node_js: + - "0.10" + - "0.12" + - "4" + - "6" + - "8" + - "10" + - "12" diff --git a/node_modules/aws4/LICENSE b/node_modules/aws4/LICENSE new file mode 100644 index 00000000..4f321e59 --- /dev/null +++ b/node_modules/aws4/LICENSE @@ -0,0 +1,19 @@ +Copyright 2013 Michael Hart (michael.hart.au@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/aws4/README.md b/node_modules/aws4/README.md new file mode 100644 index 00000000..7202e452 --- /dev/null +++ b/node_modules/aws4/README.md @@ -0,0 +1,183 @@ +aws4 +---- + +[![Build Status](https://api.travis-ci.org/mhart/aws4.png?branch=master)](https://travis-ci.org/github/mhart/aws4) + +A small utility to sign vanilla Node.js http(s) request options using Amazon's +[AWS Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html). + +If you want to sign and send AWS requests in a modern browser, or an environment like [Cloudflare Workers](https://developers.cloudflare.com/workers/), then check out [aws4fetch](https://github.com/mhart/aws4fetch) – otherwise you can also bundle this library for use [in older browsers](./browser). + +The only AWS service that *doesn't* support v4 as of 2020-05-22 is +[SimpleDB](https://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/SDB_API.html) +(it only supports [AWS Signature Version 2](https://github.com/mhart/aws2)). + +It also provides defaults for a number of core AWS headers and +request parameters, making it very easy to query AWS services, or +build out a fully-featured AWS library. + +Example +------- + +```javascript +var https = require('https') +var aws4 = require('aws4') + +// to illustrate usage, we'll create a utility function to request and pipe to stdout +function request(opts) { https.request(opts, function(res) { res.pipe(process.stdout) }).end(opts.body || '') } + +// aws4 will sign an options object as you'd pass to http.request, with an AWS service and region +var opts = { host: 'my-bucket.s3.us-west-1.amazonaws.com', path: '/my-object', service: 's3', region: 'us-west-1' } + +// aws4.sign() will sign and modify these options, ready to pass to http.request +aws4.sign(opts, { accessKeyId: '', secretAccessKey: '' }) + +// or it can get credentials from process.env.AWS_ACCESS_KEY_ID, etc +aws4.sign(opts) + +// for most AWS services, aws4 can figure out the service and region if you pass a host +opts = { host: 'my-bucket.s3.us-west-1.amazonaws.com', path: '/my-object' } + +// usually it will add/modify request headers, but you can also sign the query: +opts = { host: 'my-bucket.s3.amazonaws.com', path: '/?X-Amz-Expires=12345', signQuery: true } + +// and for services with simple hosts, aws4 can infer the host from service and region: +opts = { service: 'sqs', region: 'us-east-1', path: '/?Action=ListQueues' } + +// and if you're using us-east-1, it's the default: +opts = { service: 'sqs', path: '/?Action=ListQueues' } + +aws4.sign(opts) +console.log(opts) +/* +{ + host: 'sqs.us-east-1.amazonaws.com', + path: '/?Action=ListQueues', + headers: { + Host: 'sqs.us-east-1.amazonaws.com', + 'X-Amz-Date': '20121226T061030Z', + Authorization: 'AWS4-HMAC-SHA256 Credential=ABCDEF/20121226/us-east-1/sqs/aws4_request, ...' + } +} +*/ + +// we can now use this to query AWS +request(opts) +/* + + +... +*/ + +// aws4 can infer the HTTP method if a body is passed in +// method will be POST and Content-Type: 'application/x-www-form-urlencoded; charset=utf-8' +request(aws4.sign({ service: 'iam', body: 'Action=ListGroups&Version=2010-05-08' })) +/* + +... +*/ + +// you can specify any custom option or header as per usual +request(aws4.sign({ + service: 'dynamodb', + region: 'ap-southeast-2', + method: 'POST', + path: '/', + headers: { + 'Content-Type': 'application/x-amz-json-1.0', + 'X-Amz-Target': 'DynamoDB_20120810.ListTables' + }, + body: '{}' +})) +/* +{"TableNames":[]} +... +*/ + +// The raw RequestSigner can be used to generate CodeCommit Git passwords +var signer = new aws4.RequestSigner({ + service: 'codecommit', + host: 'git-codecommit.us-east-1.amazonaws.com', + method: 'GIT', + path: '/v1/repos/MyAwesomeRepo', +}) +var password = signer.getDateTime() + 'Z' + signer.signature() + +// see example.js for examples with other services +``` + +API +--- + +### aws4.sign(requestOptions, [credentials]) + +Calculates and populates any necessary AWS headers and/or request +options on `requestOptions`. Returns `requestOptions` as a convenience for chaining. + +`requestOptions` is an object holding the same options that the Node.js +[http.request](https://nodejs.org/docs/latest/api/http.html#http_http_request_options_callback) +function takes. + +The following properties of `requestOptions` are used in the signing or +populated if they don't already exist: + +- `hostname` or `host` (will try to be determined from `service` and `region` if not given) +- `method` (will use `'GET'` if not given or `'POST'` if there is a `body`) +- `path` (will use `'/'` if not given) +- `body` (will use `''` if not given) +- `service` (will try to be calculated from `hostname` or `host` if not given) +- `region` (will try to be calculated from `hostname` or `host` or use `'us-east-1'` if not given) +- `signQuery` (to sign the query instead of adding an `Authorization` header, defaults to false) +- `headers['Host']` (will use `hostname` or `host` or be calculated if not given) +- `headers['Content-Type']` (will use `'application/x-www-form-urlencoded; charset=utf-8'` + if not given and there is a `body`) +- `headers['Date']` (used to calculate the signature date if given, otherwise `new Date` is used) + +Your AWS credentials (which can be found in your +[AWS console](https://portal.aws.amazon.com/gp/aws/securityCredentials)) +can be specified in one of two ways: + +- As the second argument, like this: + +```javascript +aws4.sign(requestOptions, { + secretAccessKey: "", + accessKeyId: "", + sessionToken: "" +}) +``` + +- From `process.env`, such as this: + +``` +export AWS_ACCESS_KEY_ID="" +export AWS_SECRET_ACCESS_KEY="" +export AWS_SESSION_TOKEN="" +``` + +(will also use `AWS_ACCESS_KEY` and `AWS_SECRET_KEY` if available) + +The `sessionToken` property and `AWS_SESSION_TOKEN` environment variable are optional for signing +with [IAM STS temporary credentials](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html). + +Installation +------------ + +With [npm](https://www.npmjs.com/) do: + +``` +npm install aws4 +``` + +Can also be used [in the browser](./browser). + +Thanks +------ + +Thanks to [@jed](https://github.com/jed) for his +[dynamo-client](https://github.com/jed/dynamo-client) lib where I first +committed and subsequently extracted this code. + +Also thanks to the +[official Node.js AWS SDK](https://github.com/aws/aws-sdk-js) for giving +me a start on implementing the v4 signature. diff --git a/node_modules/aws4/aws4.js b/node_modules/aws4/aws4.js new file mode 100644 index 00000000..b99b319f --- /dev/null +++ b/node_modules/aws4/aws4.js @@ -0,0 +1,373 @@ +var aws4 = exports, + url = require('url'), + querystring = require('querystring'), + crypto = require('crypto'), + lru = require('./lru'), + credentialsCache = lru(1000) + +// http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html + +function hmac(key, string, encoding) { + return crypto.createHmac('sha256', key).update(string, 'utf8').digest(encoding) +} + +function hash(string, encoding) { + return crypto.createHash('sha256').update(string, 'utf8').digest(encoding) +} + +// This function assumes the string has already been percent encoded +function encodeRfc3986(urlEncodedString) { + return urlEncodedString.replace(/[!'()*]/g, function(c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) +} + +function encodeRfc3986Full(str) { + return encodeRfc3986(encodeURIComponent(str)) +} + +// A bit of a combination of: +// https://github.com/aws/aws-sdk-java-v2/blob/dc695de6ab49ad03934e1b02e7263abbd2354be0/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/AbstractAws4Signer.java#L59 +// https://github.com/aws/aws-sdk-js/blob/18cb7e5b463b46239f9fdd4a65e2ff8c81831e8f/lib/signers/v4.js#L191-L199 +// https://github.com/mhart/aws4fetch/blob/b3aed16b6f17384cf36ea33bcba3c1e9f3bdfefd/src/main.js#L25-L34 +var HEADERS_TO_IGNORE = { + 'authorization': true, + 'connection': true, + 'x-amzn-trace-id': true, + 'user-agent': true, + 'expect': true, + 'presigned-expires': true, + 'range': true, +} + +// request: { path | body, [host], [method], [headers], [service], [region] } +// credentials: { accessKeyId, secretAccessKey, [sessionToken] } +function RequestSigner(request, credentials) { + + if (typeof request === 'string') request = url.parse(request) + + var headers = request.headers = (request.headers || {}), + hostParts = (!this.service || !this.region) && this.matchHost(request.hostname || request.host || headers.Host || headers.host) + + this.request = request + this.credentials = credentials || this.defaultCredentials() + + this.service = request.service || hostParts[0] || '' + this.region = request.region || hostParts[1] || 'us-east-1' + + // SES uses a different domain from the service name + if (this.service === 'email') this.service = 'ses' + + if (!request.method && request.body) + request.method = 'POST' + + if (!headers.Host && !headers.host) { + headers.Host = request.hostname || request.host || this.createHost() + + // If a port is specified explicitly, use it as is + if (request.port) + headers.Host += ':' + request.port + } + if (!request.hostname && !request.host) + request.hostname = headers.Host || headers.host + + this.isCodeCommitGit = this.service === 'codecommit' && request.method === 'GIT' +} + +RequestSigner.prototype.matchHost = function(host) { + var match = (host || '').match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com(\.cn)?$/) + var hostParts = (match || []).slice(1, 3) + + // ES's hostParts are sometimes the other way round, if the value that is expected + // to be region equals ‘es’ switch them back + // e.g. search-cluster-name-aaaa00aaaa0aaa0aaaaaaa0aaa.us-east-1.es.amazonaws.com + if (hostParts[1] === 'es') + hostParts = hostParts.reverse() + + if (hostParts[1] == 's3') { + hostParts[0] = 's3' + hostParts[1] = 'us-east-1' + } else { + for (var i = 0; i < 2; i++) { + if (/^s3-/.test(hostParts[i])) { + hostParts[1] = hostParts[i].slice(3) + hostParts[0] = 's3' + break + } + } + } + + return hostParts +} + +// http://docs.aws.amazon.com/general/latest/gr/rande.html +RequestSigner.prototype.isSingleRegion = function() { + // Special case for S3 and SimpleDB in us-east-1 + if (['s3', 'sdb'].indexOf(this.service) >= 0 && this.region === 'us-east-1') return true + + return ['cloudfront', 'ls', 'route53', 'iam', 'importexport', 'sts'] + .indexOf(this.service) >= 0 +} + +RequestSigner.prototype.createHost = function() { + var region = this.isSingleRegion() ? '' : '.' + this.region, + subdomain = this.service === 'ses' ? 'email' : this.service + return subdomain + region + '.amazonaws.com' +} + +RequestSigner.prototype.prepareRequest = function() { + this.parsePath() + + var request = this.request, headers = request.headers, query + + if (request.signQuery) { + + this.parsedPath.query = query = this.parsedPath.query || {} + + if (this.credentials.sessionToken) + query['X-Amz-Security-Token'] = this.credentials.sessionToken + + if (this.service === 's3' && !query['X-Amz-Expires']) + query['X-Amz-Expires'] = 86400 + + if (query['X-Amz-Date']) + this.datetime = query['X-Amz-Date'] + else + query['X-Amz-Date'] = this.getDateTime() + + query['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256' + query['X-Amz-Credential'] = this.credentials.accessKeyId + '/' + this.credentialString() + query['X-Amz-SignedHeaders'] = this.signedHeaders() + + } else { + + if (!request.doNotModifyHeaders && !this.isCodeCommitGit) { + if (request.body && !headers['Content-Type'] && !headers['content-type']) + headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' + + if (request.body && !headers['Content-Length'] && !headers['content-length']) + headers['Content-Length'] = Buffer.byteLength(request.body) + + if (this.credentials.sessionToken && !headers['X-Amz-Security-Token'] && !headers['x-amz-security-token']) + headers['X-Amz-Security-Token'] = this.credentials.sessionToken + + if (this.service === 's3' && !headers['X-Amz-Content-Sha256'] && !headers['x-amz-content-sha256']) + headers['X-Amz-Content-Sha256'] = hash(this.request.body || '', 'hex') + + if (headers['X-Amz-Date'] || headers['x-amz-date']) + this.datetime = headers['X-Amz-Date'] || headers['x-amz-date'] + else + headers['X-Amz-Date'] = this.getDateTime() + } + + delete headers.Authorization + delete headers.authorization + } +} + +RequestSigner.prototype.sign = function() { + if (!this.parsedPath) this.prepareRequest() + + if (this.request.signQuery) { + this.parsedPath.query['X-Amz-Signature'] = this.signature() + } else { + this.request.headers.Authorization = this.authHeader() + } + + this.request.path = this.formatPath() + + return this.request +} + +RequestSigner.prototype.getDateTime = function() { + if (!this.datetime) { + var headers = this.request.headers, + date = new Date(headers.Date || headers.date || new Date) + + this.datetime = date.toISOString().replace(/[:\-]|\.\d{3}/g, '') + + // Remove the trailing 'Z' on the timestamp string for CodeCommit git access + if (this.isCodeCommitGit) this.datetime = this.datetime.slice(0, -1) + } + return this.datetime +} + +RequestSigner.prototype.getDate = function() { + return this.getDateTime().substr(0, 8) +} + +RequestSigner.prototype.authHeader = function() { + return [ + 'AWS4-HMAC-SHA256 Credential=' + this.credentials.accessKeyId + '/' + this.credentialString(), + 'SignedHeaders=' + this.signedHeaders(), + 'Signature=' + this.signature(), + ].join(', ') +} + +RequestSigner.prototype.signature = function() { + var date = this.getDate(), + cacheKey = [this.credentials.secretAccessKey, date, this.region, this.service].join(), + kDate, kRegion, kService, kCredentials = credentialsCache.get(cacheKey) + if (!kCredentials) { + kDate = hmac('AWS4' + this.credentials.secretAccessKey, date) + kRegion = hmac(kDate, this.region) + kService = hmac(kRegion, this.service) + kCredentials = hmac(kService, 'aws4_request') + credentialsCache.set(cacheKey, kCredentials) + } + return hmac(kCredentials, this.stringToSign(), 'hex') +} + +RequestSigner.prototype.stringToSign = function() { + return [ + 'AWS4-HMAC-SHA256', + this.getDateTime(), + this.credentialString(), + hash(this.canonicalString(), 'hex'), + ].join('\n') +} + +RequestSigner.prototype.canonicalString = function() { + if (!this.parsedPath) this.prepareRequest() + + var pathStr = this.parsedPath.path, + query = this.parsedPath.query, + headers = this.request.headers, + queryStr = '', + normalizePath = this.service !== 's3', + decodePath = this.service === 's3' || this.request.doNotEncodePath, + decodeSlashesInPath = this.service === 's3', + firstValOnly = this.service === 's3', + bodyHash + + if (this.service === 's3' && this.request.signQuery) { + bodyHash = 'UNSIGNED-PAYLOAD' + } else if (this.isCodeCommitGit) { + bodyHash = '' + } else { + bodyHash = headers['X-Amz-Content-Sha256'] || headers['x-amz-content-sha256'] || + hash(this.request.body || '', 'hex') + } + + if (query) { + var reducedQuery = Object.keys(query).reduce(function(obj, key) { + if (!key) return obj + obj[encodeRfc3986Full(key)] = !Array.isArray(query[key]) ? query[key] : + (firstValOnly ? query[key][0] : query[key]) + return obj + }, {}) + var encodedQueryPieces = [] + Object.keys(reducedQuery).sort().forEach(function(key) { + if (!Array.isArray(reducedQuery[key])) { + encodedQueryPieces.push(key + '=' + encodeRfc3986Full(reducedQuery[key])) + } else { + reducedQuery[key].map(encodeRfc3986Full).sort() + .forEach(function(val) { encodedQueryPieces.push(key + '=' + val) }) + } + }) + queryStr = encodedQueryPieces.join('&') + } + if (pathStr !== '/') { + if (normalizePath) pathStr = pathStr.replace(/\/{2,}/g, '/') + pathStr = pathStr.split('/').reduce(function(path, piece) { + if (normalizePath && piece === '..') { + path.pop() + } else if (!normalizePath || piece !== '.') { + if (decodePath) piece = decodeURIComponent(piece.replace(/\+/g, ' ')) + path.push(encodeRfc3986Full(piece)) + } + return path + }, []).join('/') + if (pathStr[0] !== '/') pathStr = '/' + pathStr + if (decodeSlashesInPath) pathStr = pathStr.replace(/%2F/g, '/') + } + + return [ + this.request.method || 'GET', + pathStr, + queryStr, + this.canonicalHeaders() + '\n', + this.signedHeaders(), + bodyHash, + ].join('\n') +} + +RequestSigner.prototype.canonicalHeaders = function() { + var headers = this.request.headers + function trimAll(header) { + return header.toString().trim().replace(/\s+/g, ' ') + } + return Object.keys(headers) + .filter(function(key) { return HEADERS_TO_IGNORE[key.toLowerCase()] == null }) + .sort(function(a, b) { return a.toLowerCase() < b.toLowerCase() ? -1 : 1 }) + .map(function(key) { return key.toLowerCase() + ':' + trimAll(headers[key]) }) + .join('\n') +} + +RequestSigner.prototype.signedHeaders = function() { + return Object.keys(this.request.headers) + .map(function(key) { return key.toLowerCase() }) + .filter(function(key) { return HEADERS_TO_IGNORE[key] == null }) + .sort() + .join(';') +} + +RequestSigner.prototype.credentialString = function() { + return [ + this.getDate(), + this.region, + this.service, + 'aws4_request', + ].join('/') +} + +RequestSigner.prototype.defaultCredentials = function() { + var env = process.env + return { + accessKeyId: env.AWS_ACCESS_KEY_ID || env.AWS_ACCESS_KEY, + secretAccessKey: env.AWS_SECRET_ACCESS_KEY || env.AWS_SECRET_KEY, + sessionToken: env.AWS_SESSION_TOKEN, + } +} + +RequestSigner.prototype.parsePath = function() { + var path = this.request.path || '/' + + // S3 doesn't always encode characters > 127 correctly and + // all services don't encode characters > 255 correctly + // So if there are non-reserved chars (and it's not already all % encoded), just encode them all + if (/[^0-9A-Za-z;,/?:@&=+$\-_.!~*'()#%]/.test(path)) { + path = encodeURI(decodeURI(path)) + } + + var queryIx = path.indexOf('?'), + query = null + + if (queryIx >= 0) { + query = querystring.parse(path.slice(queryIx + 1)) + path = path.slice(0, queryIx) + } + + this.parsedPath = { + path: path, + query: query, + } +} + +RequestSigner.prototype.formatPath = function() { + var path = this.parsedPath.path, + query = this.parsedPath.query + + if (!query) return path + + // Services don't support empty query string keys + if (query[''] != null) delete query[''] + + return path + '?' + encodeRfc3986(querystring.stringify(query)) +} + +aws4.RequestSigner = RequestSigner + +aws4.sign = function(request, credentials) { + return new RequestSigner(request, credentials).sign() +} diff --git a/node_modules/aws4/lru.js b/node_modules/aws4/lru.js new file mode 100644 index 00000000..333f66a4 --- /dev/null +++ b/node_modules/aws4/lru.js @@ -0,0 +1,96 @@ +module.exports = function(size) { + return new LruCache(size) +} + +function LruCache(size) { + this.capacity = size | 0 + this.map = Object.create(null) + this.list = new DoublyLinkedList() +} + +LruCache.prototype.get = function(key) { + var node = this.map[key] + if (node == null) return undefined + this.used(node) + return node.val +} + +LruCache.prototype.set = function(key, val) { + var node = this.map[key] + if (node != null) { + node.val = val + } else { + if (!this.capacity) this.prune() + if (!this.capacity) return false + node = new DoublyLinkedNode(key, val) + this.map[key] = node + this.capacity-- + } + this.used(node) + return true +} + +LruCache.prototype.used = function(node) { + this.list.moveToFront(node) +} + +LruCache.prototype.prune = function() { + var node = this.list.pop() + if (node != null) { + delete this.map[node.key] + this.capacity++ + } +} + + +function DoublyLinkedList() { + this.firstNode = null + this.lastNode = null +} + +DoublyLinkedList.prototype.moveToFront = function(node) { + if (this.firstNode == node) return + + this.remove(node) + + if (this.firstNode == null) { + this.firstNode = node + this.lastNode = node + node.prev = null + node.next = null + } else { + node.prev = null + node.next = this.firstNode + node.next.prev = node + this.firstNode = node + } +} + +DoublyLinkedList.prototype.pop = function() { + var lastNode = this.lastNode + if (lastNode != null) { + this.remove(lastNode) + } + return lastNode +} + +DoublyLinkedList.prototype.remove = function(node) { + if (this.firstNode == node) { + this.firstNode = node.next + } else if (node.prev != null) { + node.prev.next = node.next + } + if (this.lastNode == node) { + this.lastNode = node.prev + } else if (node.next != null) { + node.next.prev = node.prev + } +} + + +function DoublyLinkedNode(key, val) { + this.key = key + this.val = val + this.prev = null + this.next = null +} diff --git a/node_modules/aws4/package.json b/node_modules/aws4/package.json new file mode 100644 index 00000000..424598d4 --- /dev/null +++ b/node_modules/aws4/package.json @@ -0,0 +1,17 @@ +{ + "name": "aws4", + "version": "1.11.0", + "description": "Signs and prepares requests using AWS Signature Version 4", + "author": "Michael Hart (https://github.com/mhart)", + "license": "MIT", + "repository": "github:mhart/aws4", + "main": "aws4.js", + "scripts": { + "test": "mocha ./test/fast.js -R list", + "integration": "node ./test/slow.js" + }, + "devDependencies": { + "mocha": "^2.5.3", + "should": "^8.4.0" + } +} diff --git a/node_modules/bach/LICENSE b/node_modules/bach/LICENSE new file mode 100644 index 00000000..0b2955ae --- /dev/null +++ b/node_modules/bach/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blaine Bublitz, Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/bach/README.md b/node_modules/bach/README.md new file mode 100644 index 00000000..4a9a8ebd --- /dev/null +++ b/node_modules/bach/README.md @@ -0,0 +1,252 @@ +

      + + + +

      + +# bach + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Compose your async functions with elegance. + +## Usage + +With `bach`, it is very easy to compose async functions to run in series or parallel. + +```js +var bach = require('bach'); + +function fn1(cb) { + cb(null, 1); +} + +function fn2(cb) { + cb(null, 2); +} + +function fn3(cb) { + cb(null, 3); +} + +var seriesFn = bach.series(fn1, fn2, fn3); +// fn1, fn2, and fn3 will be run in series +seriesFn(function(err, res) { + if (err) { // in this example, err is undefined + // handle error + } + // handle results + // in this example, res is [1, 2, 3] +}); + +var parallelFn = bach.parallel(fn1, fn2, fn3); +// fn1, fn2, and fn3 will be run in parallel +parallelFn(function(err, res) { + if (err) { // in this example, err is undefined + // handle error + } + // handle results + // in this example, res is [1, 2, 3] +}); +``` + +Since the composer functions return a function, you can combine them. + +```js +var combinedFn = bach.series(fn1, bach.parallel(fn2, fn3)); +// fn1 will be executed before fn2 and fn3 are run in parallel +combinedFn(function(err, res) { + if (err) { // in this example, err is undefined + // handle error + } + // handle results + // in this example, res is [1, [2, 3]] +}); +``` + +Functions are called with [async-done], so you can return a stream, promise, observable or child process. See [`async-done` completion and error resolution][completions] for more detail. + +```js +// streams +var fs = require('fs'); + +function streamFn1() { + return fs.createReadStream('./example') + .pipe(fs.createWriteStream('./example')); +} + +function streamFn2() { + return fs.createReadStream('./example') + .pipe(fs.createWriteStream('./example')); +} + +var parallelStreams = bach.parallel(streamFn1, streamFn2); +parallelStreams(function(err) { + if (err) { // in this example, err is undefined + // handle error + } + // all streams have emitted an 'end' or 'close' event +}); +``` + +```js +// promises +var when = require('when'); + +function promiseFn1() { + return when.resolve(1); +} + +function promiseFn2() { + return when.resolve(2); +} + +var parallelPromises = bach.parallel(promiseFn1, promiseFn2); +parallelPromises(function(err, res) { + if (err) { // in this example, err is undefined + // handle error + } + // handle results + // in this example, res is [1, 2] +}); +``` + +All errors are caught in a [domain] and passed to the final callback as the first argument. + +```js +function success(cb) { + setTimeout(function() { + cb(null, 1); + }, 500); +} + +function error() { + throw new Error('Thrown Error'); +} + +var errorThrownFn = bach.parallel(error, success); +errorThrownFn(function(err, res) { + if (err) { + // handle error + // in this example, err is an error caught by the domain + } + // handle results + // in this example, res is [undefined] +}); +``` + +When an error happens in a parallel composition, the callback will be called as soon as the error happens. +If you want to continue on error and wait until all functions have finished before calling the callback, use `settleSeries` or `settleParallel`. + +```js +function success(cb) { + setTimeout(function() { + cb(null, 1); + }, 500); +} + +function error(cb) { + cb(new Error('Async Error')); +} + +var parallelSettlingFn = bach.settleParallel(success, error); +parallelSettlingFn(function(err, res) { + // all functions have finished executing + if (err) { + // handle error + // in this example, err is an error passed to the callback + } + // handle results + // in this example, res is [1] +}); +``` + +## API + +### `series(fns..., [extensions])` + +Takes a variable amount of functions (`fns`) to be called in series when the returned function is +called. Optionally, takes an [extensions](#extensions) object as the last argument. + +Returns an `invoker(cb)` function to be called to start the serial execution. The invoker function takes a callback (`cb`) with the `function(error, results)` signature. + +If all functions complete successfully, the callback function will be called with all `results` as the second argument. + +If an error occurs, execution will stop and the error will be passed to the callback function as the first parameter. The error parameter will always be a single error. + +### `parallel(fns..., [extensions])` + +Takes a variable amount of functions (`fns`) to be called in parallel when the returned function is +called. Optionally, takes an [extensions](#extensions) object as the last argument. + +Returns an `invoker(cb)` function to be called to start the parallel execution. The invoker function takes a callback (`cb`) with the `function(error, results)` signature. + +If all functions complete successfully, the callback function will be called with all `results` as the second argument. + +If an error occurs, the callback function will be called with the error as the first parameter. Any async functions that have not completed, will still complete, but their results will __not__ be available. The error parameter will always be a single error. + +### `settleSeries(fns..., [extensions])` + +Takes a variable amount of functions (`fns`) to be called in series when the returned function is +called. Optionally, takes an [extensions](#extensions) object as the last argument. + +Returns an `invoker(cb)` function to be called to start the serial execution. The invoker function takes a callback (`cb`) with the `function(error, results)` signature. + +All functions will always be called and the callback will receive all settled errors and results. If any errors occur, the error parameter will be an array of errors. + +### `settleParallel(fns..., [extensions])` + +Takes a variable amount of functions (`fns`) to be called in parallel when the returned function is +called. Optionally, takes an [extensions](#extensions) object as the last argument. + +Returns an `invoker(cb)` function to be called to start the parallel execution. The invoker function takes a callback (`cb`) with the `function(error, results)` signature. + +All functions will always be called and the callback will receive all settled errors and results. If any errors occur, the error parameter will be an array of errors. + +### `extensions` + +The `extensions` object is used for specifying functions that give insight into the lifecycle of each function call. The possible extension points are `create`, `before`, `after` and `error`. If an extension point is not specified, it defaults to a no-op function. + +##### `extensions.create(fn, index)` + +Called at the very beginning of each function call with the function (`fn`) being executed and the `index` from the array/arguments. If `create` returns a value (`storage`), it is passed to the `before`, `after` and `error` extension points. + +If a value is not returned, an empty object is used as `storage` for each other extension point. + +This is useful for tracking information across an iteration. + +##### `extensions.before(storage)` + +Called immediately before each function call with the `storage` value returned from the `create` extension point. + +##### `extensions.after(result, storage)` + +Called immediately after each function call with the `result` of the function and the `storage` value returned from the `create` extension point. + +##### `extensions.error(error, storage)` + +Called immediately after a failed function call with the `error` of the function and the `storage` value returned from the `create` extension point. + +## License + +MIT + +[domain]: http://nodejs.org/api/domain.html +[async-done]: https://github.com/gulpjs/async-done +[completions]: https://github.com/gulpjs/async-done#completion-and-error-resolution + +[downloads-image]: http://img.shields.io/npm/dm/bach.svg +[npm-url]: https://www.npmjs.com/package/bach +[npm-image]: http://img.shields.io/npm/v/bach.svg + +[travis-url]: https://travis-ci.org/gulpjs/bach +[travis-image]: http://img.shields.io/travis/gulpjs/bach.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/bach +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/bach.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/bach +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/bach.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/bach/index.js b/node_modules/bach/index.js new file mode 100644 index 00000000..1a4848e0 --- /dev/null +++ b/node_modules/bach/index.js @@ -0,0 +1,8 @@ +'use strict'; + +module.exports = { + series: require('./lib/series'), + parallel: require('./lib/parallel'), + settleSeries: require('./lib/settleSeries'), + settleParallel: require('./lib/settleParallel'), +}; diff --git a/node_modules/bach/package.json b/node_modules/bach/package.json new file mode 100644 index 00000000..35df585e --- /dev/null +++ b/node_modules/bach/package.json @@ -0,0 +1,78 @@ +{ + "name": "bach", + "version": "1.2.0", + "description": "Compose your async functions with elegance.", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Blaine Bublitz ", + "Pawel Kozlowski ", + "Benjamin Tan " + ], + "repository": "gulpjs/bach", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "index.js", + "lib", + "LICENSE" + ], + "scripts": { + "lint": "eslint . && jscs index.js lib/ test/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "devDependencies": { + "eslint": "^1.7.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.19.0", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "mocha": "^2.4.5" + }, + "keywords": [ + "compose", + "fluent", + "composing", + "continuation", + "function composition", + "functional", + "async", + "map", + "series", + "parallel", + "extension", + "tracing", + "debug", + "timing", + "aop", + "settle", + "promises", + "callbacks", + "observables", + "streams", + "end", + "completion", + "complete", + "finish", + "done", + "error handling" + ] +} diff --git a/node_modules/balanced-match/.npmignore b/node_modules/balanced-match/.npmignore new file mode 100644 index 00000000..ae5d8c36 --- /dev/null +++ b/node_modules/balanced-match/.npmignore @@ -0,0 +1,5 @@ +test +.gitignore +.travis.yml +Makefile +example.js diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md new file mode 100644 index 00000000..2cdc8e41 --- /dev/null +++ b/node_modules/balanced-match/LICENSE.md @@ -0,0 +1,21 @@ +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/balanced-match/README.md b/node_modules/balanced-match/README.md new file mode 100644 index 00000000..08e918c0 --- /dev/null +++ b/node_modules/balanced-match/README.md @@ -0,0 +1,91 @@ +# balanced-match + +Match balanced string pairs, like `{` and `}` or `` and ``. Supports regular expressions as well! + +[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) +[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) + +[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) + +## Example + +Get the first matching pair of braces: + +```js +var balanced = require('balanced-match'); + +console.log(balanced('{', '}', 'pre{in{nested}}post')); +console.log(balanced('{', '}', 'pre{first}between{second}post')); +console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); +``` + +The matches are: + +```bash +$ node example.js +{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } +{ start: 3, + end: 9, + pre: 'pre', + body: 'first', + post: 'between{second}post' } +{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } +``` + +## API + +### var m = balanced(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +object with those keys: + +* **start** the index of the first match of `a` +* **end** the index of the matching `b` +* **pre** the preamble, `a` and `b` not included +* **body** the match, `a` and `b` not included +* **post** the postscript, `a` and `b` not included + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. + +### var r = balanced.range(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +array with indexes: `[ , ]`. + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install balanced-match +``` + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/balanced-match/index.js b/node_modules/balanced-match/index.js new file mode 100644 index 00000000..1685a762 --- /dev/null +++ b/node_modules/balanced-match/index.js @@ -0,0 +1,59 @@ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} diff --git a/node_modules/balanced-match/package.json b/node_modules/balanced-match/package.json new file mode 100644 index 00000000..61349c6e --- /dev/null +++ b/node_modules/balanced-match/package.json @@ -0,0 +1,49 @@ +{ + "name": "balanced-match", + "description": "Match balanced character pairs, like \"{\" and \"}\"", + "version": "1.0.0", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/balanced-match.git" + }, + "homepage": "https://github.com/juliangruber/balanced-match", + "main": "index.js", + "scripts": { + "test": "make test", + "bench": "make bench" + }, + "dependencies": {}, + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "keywords": [ + "match", + "regexp", + "test", + "balanced", + "parse" + ], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/node_modules/base/LICENSE b/node_modules/base/LICENSE new file mode 100644 index 00000000..e33d14b7 --- /dev/null +++ b/node_modules/base/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/base/README.md b/node_modules/base/README.md new file mode 100644 index 00000000..c77cdaf9 --- /dev/null +++ b/node_modules/base/README.md @@ -0,0 +1,491 @@ +

      + + + +

      + +# base [![NPM version](https://img.shields.io/npm/v/base.svg?style=flat)](https://www.npmjs.com/package/base) [![NPM monthly downloads](https://img.shields.io/npm/dm/base.svg?style=flat)](https://npmjs.org/package/base) [![NPM total downloads](https://img.shields.io/npm/dt/base.svg?style=flat)](https://npmjs.org/package/base) [![Linux Build Status](https://img.shields.io/travis/node-base/base.svg?style=flat&label=Travis)](https://travis-ci.org/node-base/base) + +> base is the foundation for creating modular, unit testable and highly pluggable node.js applications, starting with a handful of common methods, like `set`, `get`, `del` and `use`. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save base +``` + +## What is Base? + +Base is a framework for rapidly creating high quality node.js applications, using plugins like building blocks. + +### Guiding principles + +The core team follows these principles to help guide API decisions: + +* **Compact API surface**: The smaller the API surface, the easier the library will be to learn and use. +* **Easy to extend**: Implementors can use any npm package, and write plugins in pure JavaScript. If you're building complex apps, Base simplifies inheritance. +* **Easy to test**: No special setup should be required to unit test `Base` or base plugins + +### Minimal API surface + +[The API](#api) was designed to provide only the minimum necessary functionality for creating a useful application, with or without [plugins](#plugins). + +**Base core** + +Base itself ships with only a handful of [useful methods](#api), such as: + +* `.set`: for setting values on the instance +* `.get`: for getting values from the instance +* `.has`: to check if a property exists on the instance +* `.define`: for setting non-enumerable values on the instance +* `.use`: for adding plugins + +**Be generic** + +When deciding on method to add or remove, we try to answer these questions: + +1. Will all or most Base applications need this method? +2. Will this method encourage practices or enforce conventions that are beneficial to implementors? +3. Can or should this be done in a plugin instead? + +### Composability + +**Plugin system** + +It couldn't be easier to extend Base with any features or custom functionality you can think of. + +Base plugins are just functions that take an instance of `Base`: + +```js +var base = new Base(); + +function plugin(base) { + // do plugin stuff, in pure JavaScript +} +// use the plugin +base.use(plugin); +``` + +**Inheritance** + +Easily inherit Base using `.extend`: + +```js +var Base = require('base'); + +function MyApp() { + Base.call(this); +} +Base.extend(MyApp); + +var app = new MyApp(); +app.set('a', 'b'); +app.get('a'); +//=> 'b'; +``` + +**Inherit or instantiate with a namespace** + +By default, the `.get`, `.set` and `.has` methods set and get values from the root of the `base` instance. You can customize this using the `.namespace` method exposed on the exported function. For example: + +```js +var Base = require('base'); +// get and set values on the `base.cache` object +var base = Base.namespace('cache'); + +var app = base(); +app.set('foo', 'bar'); +console.log(app.cache.foo); +//=> 'bar' +``` + +## API + +**Usage** + +```js +var Base = require('base'); +var app = new Base(); +app.set('foo', 'bar'); +console.log(app.foo); +//=> 'bar' +``` + +### [Base](index.js#L44) + +Create an instance of `Base` with the given `config` and `options`. + +**Params** + +* `config` **{Object}**: If supplied, this object is passed to [cache-base](https://github.com/jonschlinkert/cache-base) to merge onto the the instance upon instantiation. +* `options` **{Object}**: If supplied, this object is used to initialize the `base.options` object. + +**Example** + +```js +// initialize with `config` and `options` +var app = new Base({isApp: true}, {abc: true}); +app.set('foo', 'bar'); + +// values defined with the given `config` object will be on the root of the instance +console.log(app.baz); //=> undefined +console.log(app.foo); //=> 'bar' +// or use `.get` +console.log(app.get('isApp')); //=> true +console.log(app.get('foo')); //=> 'bar' + +// values defined with the given `options` object will be on `app.options +console.log(app.options.abc); //=> true +``` + +### [.is](index.js#L107) + +Set the given `name` on `app._name` and `app.is*` properties. Used for doing lookups in plugins. + +**Params** + +* `name` **{String}** +* `returns` **{Boolean}** + +**Example** + +```js +app.is('foo'); +console.log(app._name); +//=> 'foo' +console.log(app.isFoo); +//=> true +app.is('bar'); +console.log(app.isFoo); +//=> true +console.log(app.isBar); +//=> true +console.log(app._name); +//=> 'bar' +``` + +### [.isRegistered](index.js#L145) + +Returns true if a plugin has already been registered on an instance. + +Plugin implementors are encouraged to use this first thing in a plugin +to prevent the plugin from being called more than once on the same +instance. + +**Params** + +* `name` **{String}**: The plugin name. +* `register` **{Boolean}**: If the plugin if not already registered, to record it as being registered pass `true` as the second argument. +* `returns` **{Boolean}**: Returns true if a plugin is already registered. + +**Events** + +* `emits`: `plugin` Emits the name of the plugin being registered. Useful for unit tests, to ensure plugins are only registered once. + +**Example** + +```js +var base = new Base(); +base.use(function(app) { + if (app.isRegistered('myPlugin')) return; + // do stuff to `app` +}); + +// to also record the plugin as being registered +base.use(function(app) { + if (app.isRegistered('myPlugin', true)) return; + // do stuff to `app` +}); +``` + +### [.use](index.js#L175) + +Define a plugin function to be called immediately upon init. Plugins are chainable and expose the following arguments to the plugin function: + +* `app`: the current instance of `Base` +* `base`: the [first ancestor instance](#base) of `Base` + +**Params** + +* `fn` **{Function}**: plugin function to call +* `returns` **{Object}**: Returns the item instance for chaining. + +**Example** + +```js +var app = new Base() + .use(foo) + .use(bar) + .use(baz) +``` + +### [.define](index.js#L197) + +The `.define` method is used for adding non-enumerable property on the instance. Dot-notation is **not supported** with `define`. + +**Params** + +* `key` **{String}**: The name of the property to define. +* `value` **{any}** +* `returns` **{Object}**: Returns the instance for chaining. + +**Example** + +```js +// arbitrary `render` function using lodash `template` +app.define('render', function(str, locals) { + return _.template(str)(locals); +}); +``` + +### [.mixin](index.js#L222) + +Mix property `key` onto the Base prototype. If base is inherited using `Base.extend` this method will be overridden by a new `mixin` method that will only add properties to the prototype of the inheriting application. + +**Params** + +* `key` **{String}** +* `val` **{Object|Array}** +* `returns` **{Object}**: Returns the `base` instance for chaining. + +**Example** + +```js +app.mixin('foo', function() { + // do stuff +}); +``` + +### [.base](index.js#L268) + +Getter/setter used when creating nested instances of `Base`, for storing a reference to the first ancestor instance. This works by setting an instance of `Base` on the `parent` property of a "child" instance. The `base` property defaults to the current instance if no `parent` property is defined. + +**Example** + +```js +// create an instance of `Base`, this is our first ("base") instance +var first = new Base(); +first.foo = 'bar'; // arbitrary property, to make it easier to see what's happening later + +// create another instance +var second = new Base(); +// create a reference to the first instance (`first`) +second.parent = first; + +// create another instance +var third = new Base(); +// create a reference to the previous instance (`second`) +// repeat this pattern every time a "child" instance is created +third.parent = second; + +// we can always access the first instance using the `base` property +console.log(first.base.foo); +//=> 'bar' +console.log(second.base.foo); +//=> 'bar' +console.log(third.base.foo); +//=> 'bar' +// and now you know how to get to third base ;) +``` + +### [#use](index.js#L293) + +Static method for adding global plugin functions that will be added to an instance when created. + +**Params** + +* `fn` **{Function}**: Plugin function to use on each instance. +* `returns` **{Object}**: Returns the `Base` constructor for chaining + +**Example** + +```js +Base.use(function(app) { + app.foo = 'bar'; +}); +var app = new Base(); +console.log(app.foo); +//=> 'bar' +``` + +### [#extend](index.js#L337) + +Static method for inheriting the prototype and static methods of the `Base` class. This method greatly simplifies the process of creating inheritance-based applications. See [static-extend](https://github.com/jonschlinkert/static-extend) for more details. + +**Params** + +* `Ctor` **{Function}**: constructor to extend +* `methods` **{Object}**: Optional prototype properties to mix in. +* `returns` **{Object}**: Returns the `Base` constructor for chaining + +**Example** + +```js +var extend = cu.extend(Parent); +Parent.extend(Child); + +// optional methods +Parent.extend(Child, { + foo: function() {}, + bar: function() {} +}); +``` + +### [#mixin](index.js#L379) + +Used for adding methods to the `Base` prototype, and/or to the prototype of child instances. When a mixin function returns a function, the returned function is pushed onto the `.mixins` array, making it available to be used on inheriting classes whenever `Base.mixins()` is called (e.g. `Base.mixins(Child)`). + +**Params** + +* `fn` **{Function}**: Function to call +* `returns` **{Object}**: Returns the `Base` constructor for chaining + +**Example** + +```js +Base.mixin(function(proto) { + proto.foo = function(msg) { + return 'foo ' + msg; + }; +}); +``` + +### [#mixins](index.js#L401) + +Static method for running global mixin functions against a child constructor. Mixins must be registered before calling this method. + +**Params** + +* `Child` **{Function}**: Constructor function of a child class +* `returns` **{Object}**: Returns the `Base` constructor for chaining + +**Example** + +```js +Base.extend(Child); +Base.mixins(Child); +``` + +### [#inherit](index.js#L420) + +Similar to `util.inherit`, but copies all static properties, prototype properties, and getters/setters from `Provider` to `Receiver`. See [class-utils](https://github.com/jonschlinkert/class-utils#inherit) for more details. + +**Params** + +* `Receiver` **{Function}**: Receiving (child) constructor +* `Provider` **{Function}**: Providing (parent) constructor +* `returns` **{Object}**: Returns the `Base` constructor for chaining + +**Example** + +```js +Base.inherit(Foo, Bar); +``` + +## In the wild + +The following node.js applications were built with `Base`: + +* [assemble](https://github.com/assemble/assemble) +* [verb](https://github.com/verbose/verb) +* [generate](https://github.com/generate/generate) +* [scaffold](https://github.com/jonschlinkert/scaffold) +* [boilerplate](https://github.com/jonschlinkert/boilerplate) + +## Test coverage + +``` +Statements : 98.91% ( 91/92 ) +Branches : 92.86% ( 26/28 ) +Functions : 100% ( 17/17 ) +Lines : 98.9% ( 90/91 ) +``` + +## History + +### v0.11.2 + +* fixes https://github.com/micromatch/micromatch/issues/99 + +### v0.11.0 + +**Breaking changes** + +* Static `.use` and `.run` methods are now non-enumerable + +### v0.9.0 + +**Breaking changes** + +* `.is` no longer takes a function, a string must be passed +* all remaining `.debug` code has been removed +* `app._namespace` was removed (related to `debug`) +* `.plugin`, `.use`, and `.define` no longer emit events +* `.assertPlugin` was removed +* `.lazy` was removed + +## About + +### Related projects + +* [base-cwd](https://www.npmjs.com/package/base-cwd): Base plugin that adds a getter/setter for the current working directory. | [homepage](https://github.com/node-base/base-cwd "Base plugin that adds a getter/setter for the current working directory.") +* [base-data](https://www.npmjs.com/package/base-data): adds a `data` method to base-methods. | [homepage](https://github.com/node-base/base-data "adds a `data` method to base-methods.") +* [base-fs](https://www.npmjs.com/package/base-fs): base-methods plugin that adds vinyl-fs methods to your 'base' application for working with the file… [more](https://github.com/node-base/base-fs) | [homepage](https://github.com/node-base/base-fs "base-methods plugin that adds vinyl-fs methods to your 'base' application for working with the file system, like src, dest, copy and symlink.") +* [base-generators](https://www.npmjs.com/package/base-generators): Adds project-generator support to your `base` application. | [homepage](https://github.com/node-base/base-generators "Adds project-generator support to your `base` application.") +* [base-option](https://www.npmjs.com/package/base-option): Adds a few options methods to base, like `option`, `enable` and `disable`. See the readme… [more](https://github.com/node-base/base-option) | [homepage](https://github.com/node-base/base-option "Adds a few options methods to base, like `option`, `enable` and `disable`. See the readme for the full API.") +* [base-pipeline](https://www.npmjs.com/package/base-pipeline): base-methods plugin that adds pipeline and plugin methods for dynamically composing streaming plugin pipelines. | [homepage](https://github.com/node-base/base-pipeline "base-methods plugin that adds pipeline and plugin methods for dynamically composing streaming plugin pipelines.") +* [base-pkg](https://www.npmjs.com/package/base-pkg): Plugin for adding a `pkg` method that exposes pkg-store to your base application. | [homepage](https://github.com/node-base/base-pkg "Plugin for adding a `pkg` method that exposes pkg-store to your base application.") +* [base-plugins](https://www.npmjs.com/package/base-plugins): Adds 'smart plugin' support to your base application. | [homepage](https://github.com/node-base/base-plugins "Adds 'smart plugin' support to your base application.") +* [base-questions](https://www.npmjs.com/package/base-questions): Plugin for base-methods that adds methods for prompting the user and storing the answers on… [more](https://github.com/node-base/base-questions) | [homepage](https://github.com/node-base/base-questions "Plugin for base-methods that adds methods for prompting the user and storing the answers on a project-by-project basis.") +* [base-store](https://www.npmjs.com/package/base-store): Plugin for getting and persisting config values with your base-methods application. Adds a 'store' object… [more](https://github.com/node-base/base-store) | [homepage](https://github.com/node-base/base-store "Plugin for getting and persisting config values with your base-methods application. Adds a 'store' object that exposes all of the methods from the data-store library. Also now supports sub-stores!") +* [base-task](https://www.npmjs.com/package/base-task): base plugin that provides a very thin wrapper around [https://github.com/doowb/composer](https://github.com/doowb/composer) for adding task methods to… [more](https://github.com/node-base/base-task) | [homepage](https://github.com/node-base/base-task "base plugin that provides a very thin wrapper around for adding task methods to your application.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 141 | [jonschlinkert](https://github.com/jonschlinkert) | +| 30 | [doowb](https://github.com/doowb) | +| 3 | [charlike](https://github.com/charlike) | +| 1 | [criticalmash](https://github.com/criticalmash) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on September 07, 2017._ \ No newline at end of file diff --git a/node_modules/base/index.js b/node_modules/base/index.js new file mode 100644 index 00000000..fb680481 --- /dev/null +++ b/node_modules/base/index.js @@ -0,0 +1,435 @@ +'use strict'; + +var util = require('util'); +var define = require('define-property'); +var CacheBase = require('cache-base'); +var Emitter = require('component-emitter'); +var isObject = require('isobject'); +var merge = require('mixin-deep'); +var pascal = require('pascalcase'); +var cu = require('class-utils'); + +/** + * Optionally define a custom `cache` namespace to use. + */ + +function namespace(name) { + var Cache = name ? CacheBase.namespace(name) : CacheBase; + var fns = []; + + /** + * Create an instance of `Base` with the given `config` and `options`. + * + * ```js + * // initialize with `config` and `options` + * var app = new Base({isApp: true}, {abc: true}); + * app.set('foo', 'bar'); + * + * // values defined with the given `config` object will be on the root of the instance + * console.log(app.baz); //=> undefined + * console.log(app.foo); //=> 'bar' + * // or use `.get` + * console.log(app.get('isApp')); //=> true + * console.log(app.get('foo')); //=> 'bar' + * + * // values defined with the given `options` object will be on `app.options + * console.log(app.options.abc); //=> true + * ``` + * + * @param {Object} `config` If supplied, this object is passed to [cache-base][] to merge onto the the instance upon instantiation. + * @param {Object} `options` If supplied, this object is used to initialize the `base.options` object. + * @api public + */ + + function Base(config, options) { + if (!(this instanceof Base)) { + return new Base(config, options); + } + Cache.call(this, config); + this.is('base'); + this.initBase(config, options); + } + + /** + * Inherit cache-base + */ + + util.inherits(Base, Cache); + + /** + * Add static emitter methods + */ + + Emitter(Base); + + /** + * Initialize `Base` defaults with the given `config` object + */ + + Base.prototype.initBase = function(config, options) { + this.options = merge({}, this.options, options); + this.cache = this.cache || {}; + this.define('registered', {}); + if (name) this[name] = {}; + + // make `app._callbacks` non-enumerable + this.define('_callbacks', this._callbacks); + if (isObject(config)) { + this.visit('set', config); + } + Base.run(this, 'use', fns); + }; + + /** + * Set the given `name` on `app._name` and `app.is*` properties. Used for doing + * lookups in plugins. + * + * ```js + * app.is('foo'); + * console.log(app._name); + * //=> 'foo' + * console.log(app.isFoo); + * //=> true + * app.is('bar'); + * console.log(app.isFoo); + * //=> true + * console.log(app.isBar); + * //=> true + * console.log(app._name); + * //=> 'bar' + * ``` + * @name .is + * @param {String} `name` + * @return {Boolean} + * @api public + */ + + Base.prototype.is = function(name) { + if (typeof name !== 'string') { + throw new TypeError('expected name to be a string'); + } + this.define('is' + pascal(name), true); + this.define('_name', name); + this.define('_appname', name); + return this; + }; + + /** + * Returns true if a plugin has already been registered on an instance. + * + * Plugin implementors are encouraged to use this first thing in a plugin + * to prevent the plugin from being called more than once on the same + * instance. + * + * ```js + * var base = new Base(); + * base.use(function(app) { + * if (app.isRegistered('myPlugin')) return; + * // do stuff to `app` + * }); + * + * // to also record the plugin as being registered + * base.use(function(app) { + * if (app.isRegistered('myPlugin', true)) return; + * // do stuff to `app` + * }); + * ``` + * @name .isRegistered + * @emits `plugin` Emits the name of the plugin being registered. Useful for unit tests, to ensure plugins are only registered once. + * @param {String} `name` The plugin name. + * @param {Boolean} `register` If the plugin if not already registered, to record it as being registered pass `true` as the second argument. + * @return {Boolean} Returns true if a plugin is already registered. + * @api public + */ + + Base.prototype.isRegistered = function(name, register) { + if (this.registered.hasOwnProperty(name)) { + return true; + } + if (register !== false) { + this.registered[name] = true; + this.emit('plugin', name); + } + return false; + }; + + /** + * Define a plugin function to be called immediately upon init. Plugins are chainable + * and expose the following arguments to the plugin function: + * + * - `app`: the current instance of `Base` + * - `base`: the [first ancestor instance](#base) of `Base` + * + * ```js + * var app = new Base() + * .use(foo) + * .use(bar) + * .use(baz) + * ``` + * @name .use + * @param {Function} `fn` plugin function to call + * @return {Object} Returns the item instance for chaining. + * @api public + */ + + Base.prototype.use = function(fn) { + fn.call(this, this); + return this; + }; + + /** + * The `.define` method is used for adding non-enumerable property on the instance. + * Dot-notation is **not supported** with `define`. + * + * ```js + * // arbitrary `render` function using lodash `template` + * app.define('render', function(str, locals) { + * return _.template(str)(locals); + * }); + * ``` + * @name .define + * @param {String} `key` The name of the property to define. + * @param {any} `value` + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Base.prototype.define = function(key, val) { + if (isObject(key)) { + return this.visit('define', key); + } + define(this, key, val); + return this; + }; + + /** + * Mix property `key` onto the Base prototype. If base is inherited using + * `Base.extend` this method will be overridden by a new `mixin` method that will + * only add properties to the prototype of the inheriting application. + * + * ```js + * app.mixin('foo', function() { + * // do stuff + * }); + * ``` + * @name .mixin + * @param {String} `key` + * @param {Object|Array} `val` + * @return {Object} Returns the `base` instance for chaining. + * @api public + */ + + Base.prototype.mixin = function(key, val) { + Base.prototype[key] = val; + return this; + }; + + /** + * Non-enumberable mixin array, used by the static [Base.mixin]() method. + */ + + Base.prototype.mixins = Base.prototype.mixins || []; + + /** + * Getter/setter used when creating nested instances of `Base`, for storing a reference + * to the first ancestor instance. This works by setting an instance of `Base` on the `parent` + * property of a "child" instance. The `base` property defaults to the current instance if + * no `parent` property is defined. + * + * ```js + * // create an instance of `Base`, this is our first ("base") instance + * var first = new Base(); + * first.foo = 'bar'; // arbitrary property, to make it easier to see what's happening later + * + * // create another instance + * var second = new Base(); + * // create a reference to the first instance (`first`) + * second.parent = first; + * + * // create another instance + * var third = new Base(); + * // create a reference to the previous instance (`second`) + * // repeat this pattern every time a "child" instance is created + * third.parent = second; + * + * // we can always access the first instance using the `base` property + * console.log(first.base.foo); + * //=> 'bar' + * console.log(second.base.foo); + * //=> 'bar' + * console.log(third.base.foo); + * //=> 'bar' + * // and now you know how to get to third base ;) + * ``` + * @name .base + * @api public + */ + + Object.defineProperty(Base.prototype, 'base', { + configurable: true, + get: function() { + return this.parent ? this.parent.base : this; + } + }); + + /** + * Static method for adding global plugin functions that will + * be added to an instance when created. + * + * ```js + * Base.use(function(app) { + * app.foo = 'bar'; + * }); + * var app = new Base(); + * console.log(app.foo); + * //=> 'bar' + * ``` + * @name #use + * @param {Function} `fn` Plugin function to use on each instance. + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'use', function(fn) { + fns.push(fn); + return Base; + }); + + /** + * Run an array of functions by passing each function + * to a method on the given object specified by the given property. + * + * @param {Object} `obj` Object containing method to use. + * @param {String} `prop` Name of the method on the object to use. + * @param {Array} `arr` Array of functions to pass to the method. + */ + + define(Base, 'run', function(obj, prop, arr) { + var len = arr.length, i = 0; + while (len--) { + obj[prop](arr[i++]); + } + return Base; + }); + + /** + * Static method for inheriting the prototype and static methods of the `Base` class. + * This method greatly simplifies the process of creating inheritance-based applications. + * See [static-extend][] for more details. + * + * ```js + * var extend = cu.extend(Parent); + * Parent.extend(Child); + * + * // optional methods + * Parent.extend(Child, { + * foo: function() {}, + * bar: function() {} + * }); + * ``` + * @name #extend + * @param {Function} `Ctor` constructor to extend + * @param {Object} `methods` Optional prototype properties to mix in. + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'extend', cu.extend(Base, function(Ctor, Parent) { + Ctor.prototype.mixins = Ctor.prototype.mixins || []; + + define(Ctor, 'mixin', function(fn) { + var mixin = fn(Ctor.prototype, Ctor); + if (typeof mixin === 'function') { + Ctor.prototype.mixins.push(mixin); + } + return Ctor; + }); + + define(Ctor, 'mixins', function(Child) { + Base.run(Child, 'mixin', Ctor.prototype.mixins); + return Ctor; + }); + + Ctor.prototype.mixin = function(key, value) { + Ctor.prototype[key] = value; + return this; + }; + return Base; + })); + + /** + * Used for adding methods to the `Base` prototype, and/or to the prototype of child instances. + * When a mixin function returns a function, the returned function is pushed onto the `.mixins` + * array, making it available to be used on inheriting classes whenever `Base.mixins()` is + * called (e.g. `Base.mixins(Child)`). + * + * ```js + * Base.mixin(function(proto) { + * proto.foo = function(msg) { + * return 'foo ' + msg; + * }; + * }); + * ``` + * @name #mixin + * @param {Function} `fn` Function to call + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'mixin', function(fn) { + var mixin = fn(Base.prototype, Base); + if (typeof mixin === 'function') { + Base.prototype.mixins.push(mixin); + } + return Base; + }); + + /** + * Static method for running global mixin functions against a child constructor. + * Mixins must be registered before calling this method. + * + * ```js + * Base.extend(Child); + * Base.mixins(Child); + * ``` + * @name #mixins + * @param {Function} `Child` Constructor function of a child class + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'mixins', function(Child) { + Base.run(Child, 'mixin', Base.prototype.mixins); + return Base; + }); + + /** + * Similar to `util.inherit`, but copies all static properties, prototype properties, and + * getters/setters from `Provider` to `Receiver`. See [class-utils][]{#inherit} for more details. + * + * ```js + * Base.inherit(Foo, Bar); + * ``` + * @name #inherit + * @param {Function} `Receiver` Receiving (child) constructor + * @param {Function} `Provider` Providing (parent) constructor + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'inherit', cu.inherit); + define(Base, 'bubble', cu.bubble); + return Base; +} + +/** + * Expose `Base` with default settings + */ + +module.exports = namespace(); + +/** + * Allow users to define a namespace + */ + +module.exports.namespace = namespace; diff --git a/node_modules/base/node_modules/define-property/LICENSE b/node_modules/base/node_modules/define-property/LICENSE new file mode 100644 index 00000000..ec85897e --- /dev/null +++ b/node_modules/base/node_modules/define-property/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, 2017, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/base/node_modules/define-property/README.md b/node_modules/base/node_modules/define-property/README.md new file mode 100644 index 00000000..2f1af05f --- /dev/null +++ b/node_modules/base/node_modules/define-property/README.md @@ -0,0 +1,95 @@ +# define-property [![NPM version](https://img.shields.io/npm/v/define-property.svg?style=flat)](https://www.npmjs.com/package/define-property) [![NPM monthly downloads](https://img.shields.io/npm/dm/define-property.svg?style=flat)](https://npmjs.org/package/define-property) [![NPM total downloads](https://img.shields.io/npm/dt/define-property.svg?style=flat)](https://npmjs.org/package/define-property) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/define-property.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/define-property) + +> Define a non-enumerable property on an object. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save define-property +``` + +Install with [yarn](https://yarnpkg.com): + +```sh +$ yarn add define-property +``` + +## Usage + +**Params** + +* `obj`: The object on which to define the property. +* `prop`: The name of the property to be defined or modified. +* `descriptor`: The descriptor for the property being defined or modified. + +```js +var define = require('define-property'); +var obj = {}; +define(obj, 'foo', function(val) { + return val.toUpperCase(); +}); + +console.log(obj); +//=> {} + +console.log(obj.foo('bar')); +//=> 'BAR' +``` + +**get/set** + +```js +define(obj, 'foo', { + get: function() {}, + set: function() {} +}); +``` + +## About + +### Related projects + +* [assign-deep](https://www.npmjs.com/package/assign-deep): Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target… [more](https://github.com/jonschlinkert/assign-deep) | [homepage](https://github.com/jonschlinkert/assign-deep "Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target (first) object.") +* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow "Extend an object with the properties of additional objects. node.js/javascript util.") +* [merge-deep](https://www.npmjs.com/package/merge-deep): Recursively merge values in a javascript object. | [homepage](https://github.com/jonschlinkert/merge-deep "Recursively merge values in a javascript object.") +* [mixin-deep](https://www.npmjs.com/package/mixin-deep): Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone. | [homepage](https://github.com/jonschlinkert/mixin-deep "Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.5.0, on April 20, 2017._ \ No newline at end of file diff --git a/node_modules/base/node_modules/define-property/index.js b/node_modules/base/node_modules/define-property/index.js new file mode 100644 index 00000000..27c19ebf --- /dev/null +++ b/node_modules/base/node_modules/define-property/index.js @@ -0,0 +1,31 @@ +/*! + * define-property + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isDescriptor = require('is-descriptor'); + +module.exports = function defineProperty(obj, prop, val) { + if (typeof obj !== 'object' && typeof obj !== 'function') { + throw new TypeError('expected an object or function.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('expected `prop` to be a string.'); + } + + if (isDescriptor(val) && ('set' in val || 'get' in val)) { + return Object.defineProperty(obj, prop, val); + } + + return Object.defineProperty(obj, prop, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); +}; diff --git a/node_modules/base/node_modules/define-property/package.json b/node_modules/base/node_modules/define-property/package.json new file mode 100644 index 00000000..e0ab1ca0 --- /dev/null +++ b/node_modules/base/node_modules/define-property/package.json @@ -0,0 +1,62 @@ +{ + "name": "define-property", + "description": "Define a non-enumerable property on an object.", + "version": "1.0.0", + "homepage": "https://github.com/jonschlinkert/define-property", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/define-property", + "bugs": { + "url": "https://github.com/jonschlinkert/define-property/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "devDependencies": { + "gulp-format-md": "^0.1.12", + "mocha": "^3.2.0" + }, + "keywords": [ + "define", + "define-property", + "enumerable", + "key", + "non", + "non-enumerable", + "object", + "prop", + "property", + "value" + ], + "verb": { + "related": { + "list": [ + "extend-shallow", + "merge-deep", + "assign-deep", + "mixin-deep" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/base/package.json b/node_modules/base/package.json new file mode 100644 index 00000000..d2cc5708 --- /dev/null +++ b/node_modules/base/package.json @@ -0,0 +1,111 @@ +{ + "name": "base", + "description": "base is the foundation for creating modular, unit testable and highly pluggable node.js applications, starting with a handful of common methods, like `set`, `get`, `del` and `use`.", + "version": "0.11.2", + "homepage": "https://github.com/node-base/base", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "maintainers": [ + "Brian Woodward (https://github.com/doowb)", + "Jon Schlinkert (https://github.com/jonschlinkert)" + ], + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "John O'Donnell (https://github.com/criticalmash)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "tunnckoCore (https://i.am.charlike.online)", + "(https://github.com/wtgtybhertgeghgtwtg)" + ], + "repository": "node-base/base", + "bugs": { + "url": "https://github.com/node-base/base/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "devDependencies": { + "gulp": "^3.9.1", + "gulp-eslint": "^4.0.0", + "gulp-format-md": "^1.0.0", + "gulp-istanbul": "^1.1.2", + "gulp-mocha": "^3.0.1", + "helper-coverage": "^0.1.3", + "mocha": "^3.5.0", + "should": "^13.0.1", + "through2": "^2.0.3", + "verb-generate-readme": "^0.6.0" + }, + "keywords": [ + "base", + "boilerplate", + "cache", + "del", + "get", + "inherit", + "methods", + "set", + "starter", + "unset", + "visit" + ], + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "helpers": [ + "helper-coverage" + ], + "related": { + "description": "There are a number of different plugins available for extending base. Let us know if you create your own!", + "hightlight": "generate", + "list": [ + "base-cwd", + "base-data", + "base-fs", + "base-generators", + "base-option", + "base-pipeline", + "base-pkg", + "base-plugins", + "base-questions", + "base-store", + "base-task" + ] + }, + "reflinks": [ + "assemble", + "boilerplate", + "cache-base", + "class-utils", + "generate", + "scaffold", + "static-extend", + "verb" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/bcrypt-pbkdf/CONTRIBUTING.md b/node_modules/bcrypt-pbkdf/CONTRIBUTING.md new file mode 100644 index 00000000..401d34ed --- /dev/null +++ b/node_modules/bcrypt-pbkdf/CONTRIBUTING.md @@ -0,0 +1,13 @@ +# Contributing + +This repository uses [cr.joyent.us](https://cr.joyent.us) (Gerrit) for new +changes. Anyone can submit changes. To get started, see the [cr.joyent.us user +guide](https://github.com/joyent/joyent-gerrit/blob/master/docs/user/README.md). +This repo does not use GitHub pull requests. + +See the [Joyent Engineering +Guidelines](https://github.com/joyent/eng/blob/master/docs/index.md) for general +best practices expected in this repository. + +If you're changing something non-trivial or user-facing, you may want to submit +an issue first. diff --git a/node_modules/bcrypt-pbkdf/LICENSE b/node_modules/bcrypt-pbkdf/LICENSE new file mode 100644 index 00000000..fc58d2ab --- /dev/null +++ b/node_modules/bcrypt-pbkdf/LICENSE @@ -0,0 +1,66 @@ +The Blowfish portions are under the following license: + +Blowfish block cipher for OpenBSD +Copyright 1997 Niels Provos +All rights reserved. + +Implementation advice by David Mazieres . + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +The bcrypt_pbkdf portions are under the following license: + +Copyright (c) 2013 Ted Unangst + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + + +Performance improvements (Javascript-specific): + +Copyright 2016, Joyent Inc +Author: Alex Wilson + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/bcrypt-pbkdf/README.md b/node_modules/bcrypt-pbkdf/README.md new file mode 100644 index 00000000..7551f335 --- /dev/null +++ b/node_modules/bcrypt-pbkdf/README.md @@ -0,0 +1,45 @@ +Port of the OpenBSD `bcrypt_pbkdf` function to pure Javascript. `npm`-ified +version of [Devi Mandiri's port](https://github.com/devi/tmp/blob/master/js/bcrypt_pbkdf.js), +with some minor performance improvements. The code is copied verbatim (and +un-styled) from Devi's work. + +This product includes software developed by Niels Provos. + +## API + +### `bcrypt_pbkdf.pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds)` + +Derive a cryptographic key of arbitrary length from a given password and salt, +using the OpenBSD `bcrypt_pbkdf` function. This is a combination of Blowfish and +SHA-512. + +See [this article](http://www.tedunangst.com/flak/post/bcrypt-pbkdf) for +further information. + +Parameters: + + * `pass`, a Uint8Array of length `passlen` + * `passlen`, an integer Number + * `salt`, a Uint8Array of length `saltlen` + * `saltlen`, an integer Number + * `key`, a Uint8Array of length `keylen`, will be filled with output + * `keylen`, an integer Number + * `rounds`, an integer Number, number of rounds of the PBKDF to run + +### `bcrypt_pbkdf.hash(sha2pass, sha2salt, out)` + +Calculate a Blowfish hash, given SHA2-512 output of a password and salt. Used as +part of the inner round function in the PBKDF. + +Parameters: + + * `sha2pass`, a Uint8Array of length 64 + * `sha2salt`, a Uint8Array of length 64 + * `out`, a Uint8Array of length 32, will be filled with output + +## License + +This source form is a 1:1 port from the OpenBSD `blowfish.c` and `bcrypt_pbkdf.c`. +As a result, it retains the original copyright and license. The two files are +under slightly different (but compatible) licenses, and are here combined in +one file. For each of the full license texts see `LICENSE`. diff --git a/node_modules/bcrypt-pbkdf/index.js b/node_modules/bcrypt-pbkdf/index.js new file mode 100644 index 00000000..b1b5ad4b --- /dev/null +++ b/node_modules/bcrypt-pbkdf/index.js @@ -0,0 +1,556 @@ +'use strict'; + +var crypto_hash_sha512 = require('tweetnacl').lowlevel.crypto_hash; + +/* + * This file is a 1:1 port from the OpenBSD blowfish.c and bcrypt_pbkdf.c. As a + * result, it retains the original copyright and license. The two files are + * under slightly different (but compatible) licenses, and are here combined in + * one file. + * + * Credit for the actual porting work goes to: + * Devi Mandiri + */ + +/* + * The Blowfish portions are under the following license: + * + * Blowfish block cipher for OpenBSD + * Copyright 1997 Niels Provos + * All rights reserved. + * + * Implementation advice by David Mazieres . + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * The bcrypt_pbkdf portions are under the following license: + * + * Copyright (c) 2013 Ted Unangst + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Performance improvements (Javascript-specific): + * + * Copyright 2016, Joyent Inc + * Author: Alex Wilson + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +// Ported from OpenBSD bcrypt_pbkdf.c v1.9 + +var BLF_J = 0; + +var Blowfish = function() { + this.S = [ + new Uint32Array([ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a]), + new Uint32Array([ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]), + new Uint32Array([ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]), + new Uint32Array([ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]) + ]; + this.P = new Uint32Array([ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b]); +}; + +function F(S, x8, i) { + return (((S[0][x8[i+3]] + + S[1][x8[i+2]]) ^ + S[2][x8[i+1]]) + + S[3][x8[i]]); +}; + +Blowfish.prototype.encipher = function(x, x8) { + if (x8 === undefined) { + x8 = new Uint8Array(x.buffer); + if (x.byteOffset !== 0) + x8 = x8.subarray(x.byteOffset); + } + x[0] ^= this.P[0]; + for (var i = 1; i < 16; i += 2) { + x[1] ^= F(this.S, x8, 0) ^ this.P[i]; + x[0] ^= F(this.S, x8, 4) ^ this.P[i+1]; + } + var t = x[0]; + x[0] = x[1] ^ this.P[17]; + x[1] = t; +}; + +Blowfish.prototype.decipher = function(x) { + var x8 = new Uint8Array(x.buffer); + if (x.byteOffset !== 0) + x8 = x8.subarray(x.byteOffset); + x[0] ^= this.P[17]; + for (var i = 16; i > 0; i -= 2) { + x[1] ^= F(this.S, x8, 0) ^ this.P[i]; + x[0] ^= F(this.S, x8, 4) ^ this.P[i-1]; + } + var t = x[0]; + x[0] = x[1] ^ this.P[0]; + x[1] = t; +}; + +function stream2word(data, databytes){ + var i, temp = 0; + for (i = 0; i < 4; i++, BLF_J++) { + if (BLF_J >= databytes) BLF_J = 0; + temp = (temp << 8) | data[BLF_J]; + } + return temp; +}; + +Blowfish.prototype.expand0state = function(key, keybytes) { + var d = new Uint32Array(2), i, k; + var d8 = new Uint8Array(d.buffer); + + for (i = 0, BLF_J = 0; i < 18; i++) { + this.P[i] ^= stream2word(key, keybytes); + } + BLF_J = 0; + + for (i = 0; i < 18; i += 2) { + this.encipher(d, d8); + this.P[i] = d[0]; + this.P[i+1] = d[1]; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + this.encipher(d, d8); + this.S[i][k] = d[0]; + this.S[i][k+1] = d[1]; + } + } +}; + +Blowfish.prototype.expandstate = function(data, databytes, key, keybytes) { + var d = new Uint32Array(2), i, k; + + for (i = 0, BLF_J = 0; i < 18; i++) { + this.P[i] ^= stream2word(key, keybytes); + } + + for (i = 0, BLF_J = 0; i < 18; i += 2) { + d[0] ^= stream2word(data, databytes); + d[1] ^= stream2word(data, databytes); + this.encipher(d); + this.P[i] = d[0]; + this.P[i+1] = d[1]; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + d[0] ^= stream2word(data, databytes); + d[1] ^= stream2word(data, databytes); + this.encipher(d); + this.S[i][k] = d[0]; + this.S[i][k+1] = d[1]; + } + } + BLF_J = 0; +}; + +Blowfish.prototype.enc = function(data, blocks) { + for (var i = 0; i < blocks; i++) { + this.encipher(data.subarray(i*2)); + } +}; + +Blowfish.prototype.dec = function(data, blocks) { + for (var i = 0; i < blocks; i++) { + this.decipher(data.subarray(i*2)); + } +}; + +var BCRYPT_BLOCKS = 8, + BCRYPT_HASHSIZE = 32; + +function bcrypt_hash(sha2pass, sha2salt, out) { + var state = new Blowfish(), + cdata = new Uint32Array(BCRYPT_BLOCKS), i, + ciphertext = new Uint8Array([79,120,121,99,104,114,111,109,97,116,105, + 99,66,108,111,119,102,105,115,104,83,119,97,116,68,121,110,97,109, + 105,116,101]); //"OxychromaticBlowfishSwatDynamite" + + state.expandstate(sha2salt, 64, sha2pass, 64); + for (i = 0; i < 64; i++) { + state.expand0state(sha2salt, 64); + state.expand0state(sha2pass, 64); + } + + for (i = 0; i < BCRYPT_BLOCKS; i++) + cdata[i] = stream2word(ciphertext, ciphertext.byteLength); + for (i = 0; i < 64; i++) + state.enc(cdata, cdata.byteLength / 8); + + for (i = 0; i < BCRYPT_BLOCKS; i++) { + out[4*i+3] = cdata[i] >>> 24; + out[4*i+2] = cdata[i] >>> 16; + out[4*i+1] = cdata[i] >>> 8; + out[4*i+0] = cdata[i]; + } +}; + +function bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) { + var sha2pass = new Uint8Array(64), + sha2salt = new Uint8Array(64), + out = new Uint8Array(BCRYPT_HASHSIZE), + tmpout = new Uint8Array(BCRYPT_HASHSIZE), + countsalt = new Uint8Array(saltlen+4), + i, j, amt, stride, dest, count, + origkeylen = keylen; + + if (rounds < 1) + return -1; + if (passlen === 0 || saltlen === 0 || keylen === 0 || + keylen > (out.byteLength * out.byteLength) || saltlen > (1<<20)) + return -1; + + stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength); + amt = Math.floor((keylen + stride - 1) / stride); + + for (i = 0; i < saltlen; i++) + countsalt[i] = salt[i]; + + crypto_hash_sha512(sha2pass, pass, passlen); + + for (count = 1; keylen > 0; count++) { + countsalt[saltlen+0] = count >>> 24; + countsalt[saltlen+1] = count >>> 16; + countsalt[saltlen+2] = count >>> 8; + countsalt[saltlen+3] = count; + + crypto_hash_sha512(sha2salt, countsalt, saltlen + 4); + bcrypt_hash(sha2pass, sha2salt, tmpout); + for (i = out.byteLength; i--;) + out[i] = tmpout[i]; + + for (i = 1; i < rounds; i++) { + crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength); + bcrypt_hash(sha2pass, sha2salt, tmpout); + for (j = 0; j < out.byteLength; j++) + out[j] ^= tmpout[j]; + } + + amt = Math.min(amt, keylen); + for (i = 0; i < amt; i++) { + dest = i * stride + (count - 1); + if (dest >= origkeylen) + break; + key[dest] = out[i]; + } + keylen -= i; + } + + return 0; +}; + +module.exports = { + BLOCKS: BCRYPT_BLOCKS, + HASHSIZE: BCRYPT_HASHSIZE, + hash: bcrypt_hash, + pbkdf: bcrypt_pbkdf +}; diff --git a/node_modules/bcrypt-pbkdf/package.json b/node_modules/bcrypt-pbkdf/package.json new file mode 100644 index 00000000..e93a969b --- /dev/null +++ b/node_modules/bcrypt-pbkdf/package.json @@ -0,0 +1,15 @@ +{ + "name": "bcrypt-pbkdf", + "version": "1.0.2", + "description": "Port of the OpenBSD bcrypt_pbkdf function to pure JS", + "repository": { + "type": "git", + "url": "git://github.com/joyent/node-bcrypt-pbkdf.git" + }, + "main": "index.js", + "dependencies": { + "tweetnacl": "^0.14.3" + }, + "devDependencies": {}, + "license": "BSD-3-Clause" +} diff --git a/node_modules/binary-extensions/binary-extensions.json b/node_modules/binary-extensions/binary-extensions.json new file mode 100644 index 00000000..725e5320 --- /dev/null +++ b/node_modules/binary-extensions/binary-extensions.json @@ -0,0 +1,252 @@ +[ + "3dm", + "3ds", + "3g2", + "3gp", + "7z", + "a", + "aac", + "adp", + "ai", + "aif", + "aiff", + "alz", + "ape", + "apk", + "ar", + "arj", + "asf", + "au", + "avi", + "bak", + "baml", + "bh", + "bin", + "bk", + "bmp", + "btif", + "bz2", + "bzip2", + "cab", + "caf", + "cgm", + "class", + "cmx", + "cpio", + "cr2", + "cur", + "dat", + "dcm", + "deb", + "dex", + "djvu", + "dll", + "dmg", + "dng", + "doc", + "docm", + "docx", + "dot", + "dotm", + "dra", + "DS_Store", + "dsk", + "dts", + "dtshd", + "dvb", + "dwg", + "dxf", + "ecelp4800", + "ecelp7470", + "ecelp9600", + "egg", + "eol", + "eot", + "epub", + "exe", + "f4v", + "fbs", + "fh", + "fla", + "flac", + "fli", + "flv", + "fpx", + "fst", + "fvt", + "g3", + "gh", + "gif", + "graffle", + "gz", + "gzip", + "h261", + "h263", + "h264", + "icns", + "ico", + "ief", + "img", + "ipa", + "iso", + "jar", + "jpeg", + "jpg", + "jpgv", + "jpm", + "jxr", + "key", + "ktx", + "lha", + "lib", + "lvp", + "lz", + "lzh", + "lzma", + "lzo", + "m3u", + "m4a", + "m4v", + "mar", + "mdi", + "mht", + "mid", + "midi", + "mj2", + "mka", + "mkv", + "mmr", + "mng", + "mobi", + "mov", + "movie", + "mp3", + "mp4", + "mp4a", + "mpeg", + "mpg", + "mpga", + "mxu", + "nef", + "npx", + "numbers", + "nupkg", + "o", + "oga", + "ogg", + "ogv", + "otf", + "pages", + "pbm", + "pcx", + "pdb", + "pdf", + "pea", + "pgm", + "pic", + "png", + "pnm", + "pot", + "potm", + "potx", + "ppa", + "ppam", + "ppm", + "pps", + "ppsm", + "ppsx", + "ppt", + "pptm", + "pptx", + "psd", + "pya", + "pyc", + "pyo", + "pyv", + "qt", + "rar", + "ras", + "raw", + "resources", + "rgb", + "rip", + "rlc", + "rmf", + "rmvb", + "rtf", + "rz", + "s3m", + "s7z", + "scpt", + "sgi", + "shar", + "sil", + "sketch", + "slk", + "smv", + "snk", + "so", + "stl", + "suo", + "sub", + "swf", + "tar", + "tbz", + "tbz2", + "tga", + "tgz", + "thmx", + "tif", + "tiff", + "tlz", + "ttc", + "ttf", + "txz", + "udf", + "uvh", + "uvi", + "uvm", + "uvp", + "uvs", + "uvu", + "viv", + "vob", + "war", + "wav", + "wax", + "wbmp", + "wdp", + "weba", + "webm", + "webp", + "whl", + "wim", + "wm", + "wma", + "wmv", + "wmx", + "woff", + "woff2", + "wrm", + "wvx", + "xbm", + "xif", + "xla", + "xlam", + "xls", + "xlsb", + "xlsm", + "xlsx", + "xlt", + "xltm", + "xltx", + "xm", + "xmind", + "xpi", + "xpm", + "xwd", + "xz", + "z", + "zip", + "zipx" +] diff --git a/node_modules/binary-extensions/license b/node_modules/binary-extensions/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/binary-extensions/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/binary-extensions/package.json b/node_modules/binary-extensions/package.json new file mode 100644 index 00000000..e5007c82 --- /dev/null +++ b/node_modules/binary-extensions/package.json @@ -0,0 +1,36 @@ +{ + "name": "binary-extensions", + "version": "1.13.1", + "description": "List of binary file extensions", + "license": "MIT", + "repository": "sindresorhus/binary-extensions", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "ava" + }, + "main": "binary-extensions.json", + "files": [ + "binary-extensions.json" + ], + "keywords": [ + "bin", + "binary", + "ext", + "extensions", + "extension", + "file", + "json", + "list", + "array" + ], + "devDependencies": { + "ava": "0.16.0" + } +} diff --git a/node_modules/binary-extensions/readme.md b/node_modules/binary-extensions/readme.md new file mode 100644 index 00000000..4c9eca24 --- /dev/null +++ b/node_modules/binary-extensions/readme.md @@ -0,0 +1,33 @@ +# binary-extensions [![Build Status](https://travis-ci.org/sindresorhus/binary-extensions.svg?branch=master)](https://travis-ci.org/sindresorhus/binary-extensions) + +> List of binary file extensions + +The list is just a [JSON file](binary-extensions.json) and can be used anywhere. + + +## Install + +``` +$ npm install binary-extensions +``` + + +## Usage + +```js +const binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` + + +## Related + +- [is-binary-path](https://github.com/sindresorhus/is-binary-path) - Check if a filepath is a binary file +- [text-extensions](https://github.com/sindresorhus/text-extensions) - List of text file extensions + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com), Paul Miller (https://paulmillr.com) diff --git a/node_modules/block-stream/LICENCE b/node_modules/block-stream/LICENCE new file mode 100644 index 00000000..74489e2e --- /dev/null +++ b/node_modules/block-stream/LICENCE @@ -0,0 +1,25 @@ +Copyright (c) Isaac Z. Schlueter +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/block-stream/LICENSE b/node_modules/block-stream/LICENSE new file mode 100644 index 00000000..19129e31 --- /dev/null +++ b/node_modules/block-stream/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/block-stream/README.md b/node_modules/block-stream/README.md new file mode 100644 index 00000000..c16e9c46 --- /dev/null +++ b/node_modules/block-stream/README.md @@ -0,0 +1,14 @@ +# block-stream + +A stream of blocks. + +Write data into it, and it'll output data in buffer blocks the size you +specify, padding with zeroes if necessary. + +```javascript +var block = new BlockStream(512) +fs.createReadStream("some-file").pipe(block) +block.pipe(fs.createWriteStream("block-file")) +``` + +When `.end()` or `.flush()` is called, it'll pad the block with zeroes. diff --git a/node_modules/block-stream/block-stream.js b/node_modules/block-stream/block-stream.js new file mode 100644 index 00000000..008de035 --- /dev/null +++ b/node_modules/block-stream/block-stream.js @@ -0,0 +1,209 @@ +// write data to it, and it'll emit data in 512 byte blocks. +// if you .end() or .flush(), it'll emit whatever it's got, +// padded with nulls to 512 bytes. + +module.exports = BlockStream + +var Stream = require("stream").Stream + , inherits = require("inherits") + , assert = require("assert").ok + , debug = process.env.DEBUG ? console.error : function () {} + +function BlockStream (size, opt) { + this.writable = this.readable = true + this._opt = opt || {} + this._chunkSize = size || 512 + this._offset = 0 + this._buffer = [] + this._bufferLength = 0 + if (this._opt.nopad) this._zeroes = false + else { + this._zeroes = new Buffer(this._chunkSize) + for (var i = 0; i < this._chunkSize; i ++) { + this._zeroes[i] = 0 + } + } +} + +inherits(BlockStream, Stream) + +BlockStream.prototype.write = function (c) { + // debug(" BS write", c) + if (this._ended) throw new Error("BlockStream: write after end") + if (c && !Buffer.isBuffer(c)) c = new Buffer(c + "") + if (c.length) { + this._buffer.push(c) + this._bufferLength += c.length + } + // debug("pushed onto buffer", this._bufferLength) + if (this._bufferLength >= this._chunkSize) { + if (this._paused) { + // debug(" BS paused, return false, need drain") + this._needDrain = true + return false + } + this._emitChunk() + } + return true +} + +BlockStream.prototype.pause = function () { + // debug(" BS pausing") + this._paused = true +} + +BlockStream.prototype.resume = function () { + // debug(" BS resume") + this._paused = false + return this._emitChunk() +} + +BlockStream.prototype.end = function (chunk) { + // debug("end", chunk) + if (typeof chunk === "function") cb = chunk, chunk = null + if (chunk) this.write(chunk) + this._ended = true + this.flush() +} + +BlockStream.prototype.flush = function () { + this._emitChunk(true) +} + +BlockStream.prototype._emitChunk = function (flush) { + // debug("emitChunk flush=%j emitting=%j paused=%j", flush, this._emitting, this._paused) + + // emit a chunk + if (flush && this._zeroes) { + // debug(" BS push zeroes", this._bufferLength) + // push a chunk of zeroes + var padBytes = (this._bufferLength % this._chunkSize) + if (padBytes !== 0) padBytes = this._chunkSize - padBytes + if (padBytes > 0) { + // debug("padBytes", padBytes, this._zeroes.slice(0, padBytes)) + this._buffer.push(this._zeroes.slice(0, padBytes)) + this._bufferLength += padBytes + // debug(this._buffer[this._buffer.length - 1].length, this._bufferLength) + } + } + + if (this._emitting || this._paused) return + this._emitting = true + + // debug(" BS entering loops") + var bufferIndex = 0 + while (this._bufferLength >= this._chunkSize && + (flush || !this._paused)) { + // debug(" BS data emission loop", this._bufferLength) + + var out + , outOffset = 0 + , outHas = this._chunkSize + + while (outHas > 0 && (flush || !this._paused) ) { + // debug(" BS data inner emit loop", this._bufferLength) + var cur = this._buffer[bufferIndex] + , curHas = cur.length - this._offset + // debug("cur=", cur) + // debug("curHas=%j", curHas) + // If it's not big enough to fill the whole thing, then we'll need + // to copy multiple buffers into one. However, if it is big enough, + // then just slice out the part we want, to save unnecessary copying. + // Also, need to copy if we've already done some copying, since buffers + // can't be joined like cons strings. + if (out || curHas < outHas) { + out = out || new Buffer(this._chunkSize) + cur.copy(out, outOffset, + this._offset, this._offset + Math.min(curHas, outHas)) + } else if (cur.length === outHas && this._offset === 0) { + // shortcut -- cur is exactly long enough, and no offset. + out = cur + } else { + // slice out the piece of cur that we need. + out = cur.slice(this._offset, this._offset + outHas) + } + + if (curHas > outHas) { + // means that the current buffer couldn't be completely output + // update this._offset to reflect how much WAS written + this._offset += outHas + outHas = 0 + } else { + // output the entire current chunk. + // toss it away + outHas -= curHas + outOffset += curHas + bufferIndex ++ + this._offset = 0 + } + } + + this._bufferLength -= this._chunkSize + assert(out.length === this._chunkSize) + // debug("emitting data", out) + // debug(" BS emitting, paused=%j", this._paused, this._bufferLength) + this.emit("data", out) + out = null + } + // debug(" BS out of loops", this._bufferLength) + + // whatever is left, it's not enough to fill up a block, or we're paused + this._buffer = this._buffer.slice(bufferIndex) + if (this._paused) { + // debug(" BS paused, leaving", this._bufferLength) + this._needsDrain = true + this._emitting = false + return + } + + // if flushing, and not using null-padding, then need to emit the last + // chunk(s) sitting in the queue. We know that it's not enough to + // fill up a whole block, because otherwise it would have been emitted + // above, but there may be some offset. + var l = this._buffer.length + if (flush && !this._zeroes && l) { + if (l === 1) { + if (this._offset) { + this.emit("data", this._buffer[0].slice(this._offset)) + } else { + this.emit("data", this._buffer[0]) + } + } else { + var outHas = this._bufferLength + , out = new Buffer(outHas) + , outOffset = 0 + for (var i = 0; i < l; i ++) { + var cur = this._buffer[i] + , curHas = cur.length - this._offset + cur.copy(out, outOffset, this._offset) + this._offset = 0 + outOffset += curHas + this._bufferLength -= curHas + } + this.emit("data", out) + } + // truncate + this._buffer.length = 0 + this._bufferLength = 0 + this._offset = 0 + } + + // now either drained or ended + // debug("either draining, or ended", this._bufferLength, this._ended) + // means that we've flushed out all that we can so far. + if (this._needDrain) { + // debug("emitting drain", this._bufferLength) + this._needDrain = false + this.emit("drain") + } + + if ((this._bufferLength === 0) && this._ended && !this._endEmitted) { + // debug("emitting end", this._bufferLength) + this._endEmitted = true + this.emit("end") + } + + this._emitting = false + + // debug(" BS no longer emitting", flush, this._paused, this._emitting, this._bufferLength, this._chunkSize) +} diff --git a/node_modules/block-stream/package.json b/node_modules/block-stream/package.json new file mode 100644 index 00000000..1971213d --- /dev/null +++ b/node_modules/block-stream/package.json @@ -0,0 +1,27 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "name": "block-stream", + "description": "a stream of blocks", + "version": "0.0.9", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/block-stream.git" + }, + "engines": { + "node": "0.4 || >=0.5.8" + }, + "main": "block-stream.js", + "dependencies": { + "inherits": "~2.0.0" + }, + "devDependencies": { + "tap": "^5.7.1" + }, + "scripts": { + "test": "tap test/*.js --cov" + }, + "license": "ISC", + "files": [ + "block-stream.js" + ] +} diff --git a/node_modules/brace-expansion/LICENSE b/node_modules/brace-expansion/LICENSE new file mode 100644 index 00000000..de322667 --- /dev/null +++ b/node_modules/brace-expansion/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/brace-expansion/README.md b/node_modules/brace-expansion/README.md new file mode 100644 index 00000000..6b4e0e16 --- /dev/null +++ b/node_modules/brace-expansion/README.md @@ -0,0 +1,129 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) +[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) + +[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) + +## Example + +```js +var expand = require('brace-expansion'); + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +var expand = require('brace-expansion'); +``` + +### var expanded = expand(str) + +Return an array of all possible and valid expansions of `str`. If none are +found, `[str]` is returned. + +Valid expansions are: + +```js +/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install brace-expansion +``` + +## Contributors + +- [Julian Gruber](https://github.com/juliangruber) +- [Isaac Z. Schlueter](https://github.com/isaacs) + +## Sponsors + +This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! + +Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/brace-expansion/index.js b/node_modules/brace-expansion/index.js new file mode 100644 index 00000000..0478be81 --- /dev/null +++ b/node_modules/brace-expansion/index.js @@ -0,0 +1,201 @@ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + diff --git a/node_modules/brace-expansion/package.json b/node_modules/brace-expansion/package.json new file mode 100644 index 00000000..a18faa8f --- /dev/null +++ b/node_modules/brace-expansion/package.json @@ -0,0 +1,47 @@ +{ + "name": "brace-expansion", + "description": "Brace expansion as known from sh/bash", + "version": "1.1.11", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/brace-expansion.git" + }, + "homepage": "https://github.com/juliangruber/brace-expansion", + "main": "index.js", + "scripts": { + "test": "tape test/*.js", + "gentest": "bash test/generate.sh", + "bench": "matcha test/perf/bench.js" + }, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "keywords": [], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/node_modules/braces/LICENSE b/node_modules/braces/LICENSE new file mode 100644 index 00000000..d32ab442 --- /dev/null +++ b/node_modules/braces/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/braces/README.md b/node_modules/braces/README.md new file mode 100644 index 00000000..f909bfba --- /dev/null +++ b/node_modules/braces/README.md @@ -0,0 +1,640 @@ +# braces [![NPM version](https://img.shields.io/npm/v/braces.svg?style=flat)](https://www.npmjs.com/package/braces) [![NPM monthly downloads](https://img.shields.io/npm/dm/braces.svg?style=flat)](https://npmjs.org/package/braces) [![NPM total downloads](https://img.shields.io/npm/dt/braces.svg?style=flat)](https://npmjs.org/package/braces) [![Linux Build Status](https://img.shields.io/travis/micromatch/braces.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/braces) [![Windows Build Status](https://img.shields.io/appveyor/ci/micromatch/braces.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/micromatch/braces) + +> Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save braces +``` + +## Why use braces? + +Brace patterns are great for matching ranges. Users (and implementors) shouldn't have to think about whether or not they will break their application (or yours) from accidentally defining an aggressive brace pattern. _Braces is the only library that offers a [solution to this problem](#performance)_. + +* **Safe(r)**: Braces isn't vulnerable to DoS attacks like [brace-expansion](https://github.com/juliangruber/brace-expansion), [minimatch](https://github.com/isaacs/minimatch) and [multimatch](https://github.com/sindresorhus/multimatch) (a different bug than the [other regex DoS bug](https://medium.com/node-security/minimatch-redos-vulnerability-590da24e6d3c#.jew0b6mpc)). +* **Accurate**: complete support for the [Bash 4.3 Brace Expansion](www.gnu.org/software/bash/) specification (passes all of the Bash braces tests) +* **[fast and performant](#benchmarks)**: Starts fast, runs fast and [scales well](#performance) as patterns increase in complexity. +* **Organized code base**: with parser and compiler that are eas(y|ier) to maintain and update when edge cases crop up. +* **Well-tested**: thousands of test assertions. Passes 100% of the [minimatch](https://github.com/isaacs/minimatch) and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests as well (as of the writing of this). + +## Usage + +The main export is a function that takes one or more brace `patterns` and `options`. + +```js +var braces = require('braces'); +braces(pattern[, options]); +``` + +By default, braces returns an optimized regex-source string. To get an array of brace patterns, use `brace.expand()`. + +The following section explains the difference in more detail. _(If you're curious about "why" braces does this by default, see [brace matching pitfalls](#brace-matching-pitfalls)_. + +### Optimized vs. expanded braces + +**Optimized** + +By default, patterns are optimized for regex and matching: + +```js +console.log(braces('a/{x,y,z}/b')); +//=> ['a/(x|y|z)/b'] +``` + +**Expanded** + +To expand patterns the same way as Bash or [minimatch](https://github.com/isaacs/minimatch), use the [.expand](#expand) method: + +```js +console.log(braces.expand('a/{x,y,z}/b')); +//=> ['a/x/b', 'a/y/b', 'a/z/b'] +``` + +Or use [options.expand](#optionsexpand): + +```js +console.log(braces('a/{x,y,z}/b', {expand: true})); +//=> ['a/x/b', 'a/y/b', 'a/z/b'] +``` + +## Features + +* [lists](#lists): Supports "lists": `a/{b,c}/d` => `['a/b/d', 'a/c/d']` +* [sequences](#sequences): Supports alphabetical or numerical "sequences" (ranges): `{1..3}` => `['1', '2', '3']` +* [steps](#steps): Supports "steps" or increments: `{2..10..2}` => `['2', '4', '6', '8', '10']` +* [escaping](#escaping) +* [options](#options) + +### Lists + +Uses [fill-range](https://github.com/jonschlinkert/fill-range) for expanding alphabetical or numeric lists: + +```js +console.log(braces('a/{foo,bar,baz}/*.js')); +//=> ['a/(foo|bar|baz)/*.js'] + +console.log(braces.expand('a/{foo,bar,baz}/*.js')); +//=> ['a/foo/*.js', 'a/bar/*.js', 'a/baz/*.js'] +``` + +### Sequences + +Uses [fill-range](https://github.com/jonschlinkert/fill-range) for expanding alphabetical or numeric ranges (bash "sequences"): + +```js +console.log(braces.expand('{1..3}')); // ['1', '2', '3'] +console.log(braces.expand('a{01..03}b')); // ['a01b', 'a02b', 'a03b'] +console.log(braces.expand('a{1..3}b')); // ['a1b', 'a2b', 'a3b'] +console.log(braces.expand('{a..c}')); // ['a', 'b', 'c'] +console.log(braces.expand('foo/{a..c}')); // ['foo/a', 'foo/b', 'foo/c'] + +// supports padded ranges +console.log(braces('a{01..03}b')); //=> [ 'a(0[1-3])b' ] +console.log(braces('a{001..300}b')); //=> [ 'a(0{2}[1-9]|0[1-9][0-9]|[12][0-9]{2}|300)b' ] +``` + +### Steps + +Steps, or increments, may be used with ranges: + +```js +console.log(braces.expand('{2..10..2}')); +//=> ['2', '4', '6', '8', '10'] + +console.log(braces('{2..10..2}')); +//=> ['(2|4|6|8|10)'] +``` + +When the [.optimize](#optimize) method is used, or [options.optimize](#optionsoptimize) is set to true, sequences are passed to [to-regex-range](https://github.com/jonschlinkert/to-regex-range) for expansion. + +### Nesting + +Brace patterns may be nested. The results of each expanded string are not sorted, and left to right order is preserved. + +**"Expanded" braces** + +```js +console.log(braces.expand('a{b,c,/{x,y}}/e')); +//=> ['ab/e', 'ac/e', 'a/x/e', 'a/y/e'] + +console.log(braces.expand('a/{x,{1..5},y}/c')); +//=> ['a/x/c', 'a/1/c', 'a/2/c', 'a/3/c', 'a/4/c', 'a/5/c', 'a/y/c'] +``` + +**"Optimized" braces** + +```js +console.log(braces('a{b,c,/{x,y}}/e')); +//=> ['a(b|c|/(x|y))/e'] + +console.log(braces('a/{x,{1..5},y}/c')); +//=> ['a/(x|([1-5])|y)/c'] +``` + +### Escaping + +**Escaping braces** + +A brace pattern will not be expanded or evaluted if _either the opening or closing brace is escaped_: + +```js +console.log(braces.expand('a\\{d,c,b}e')); +//=> ['a{d,c,b}e'] + +console.log(braces.expand('a{d,c,b\\}e')); +//=> ['a{d,c,b}e'] +``` + +**Escaping commas** + +Commas inside braces may also be escaped: + +```js +console.log(braces.expand('a{b\\,c}d')); +//=> ['a{b,c}d'] + +console.log(braces.expand('a{d\\,c,b}e')); +//=> ['ad,ce', 'abe'] +``` + +**Single items** + +Following bash conventions, a brace pattern is also not expanded when it contains a single character: + +```js +console.log(braces.expand('a{b}c')); +//=> ['a{b}c'] +``` + +## Options + +### options.maxLength + +**Type**: `Number` + +**Default**: `65,536` + +**Description**: Limit the length of the input string. Useful when the input string is generated or your application allows users to pass a string, et cetera. + +```js +console.log(braces('a/{b,c}/d', { maxLength: 3 })); //=> throws an error +``` + +### options.expand + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Generate an "expanded" brace pattern (this option is unncessary with the `.expand` method, which does the same thing). + +```js +console.log(braces('a/{b,c}/d', {expand: true})); +//=> [ 'a/b/d', 'a/c/d' ] +``` + +### options.optimize + +**Type**: `Boolean` + +**Default**: `true` + +**Description**: Enabled by default. + +```js +console.log(braces('a/{b,c}/d')); +//=> [ 'a/(b|c)/d' ] +``` + +### options.nodupes + +**Type**: `Boolean` + +**Default**: `true` + +**Description**: Duplicates are removed by default. To keep duplicates, pass `{nodupes: false}` on the options + +### options.rangeLimit + +**Type**: `Number` + +**Default**: `250` + +**Description**: When `braces.expand()` is used, or `options.expand` is true, brace patterns will automatically be [optimized](#optionsoptimize) when the difference between the range minimum and range maximum exceeds the `rangeLimit`. This is to prevent huge ranges from freezing your application. + +You can set this to any number, or change `options.rangeLimit` to `Inifinity` to disable this altogether. + +**Examples** + +```js +// pattern exceeds the "rangeLimit", so it's optimized automatically +console.log(braces.expand('{1..1000}')); +//=> ['([1-9]|[1-9][0-9]{1,2}|1000)'] + +// pattern does not exceed "rangeLimit", so it's NOT optimized +console.log(braces.expand('{1..100}')); +//=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100'] +``` + +### options.transform + +**Type**: `Function` + +**Default**: `undefined` + +**Description**: Customize range expansion. + +```js +var range = braces.expand('x{a..e}y', { + transform: function(str) { + return 'foo' + str; + } +}); + +console.log(range); +//=> [ 'xfooay', 'xfooby', 'xfoocy', 'xfoody', 'xfooey' ] +``` + +### options.quantifiers + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: In regular expressions, quanitifiers can be used to specify how many times a token can be repeated. For example, `a{1,3}` will match the letter `a` one to three times. + +Unfortunately, regex quantifiers happen to share the same syntax as [Bash lists](#lists) + +The `quantifiers` option tells braces to detect when [regex quantifiers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#quantifiers) are defined in the given pattern, and not to try to expand them as lists. + +**Examples** + +```js +var braces = require('braces'); +console.log(braces('a/b{1,3}/{x,y,z}')); +//=> [ 'a/b(1|3)/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', {quantifiers: true})); +//=> [ 'a/b{1,3}/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', {quantifiers: true, expand: true})); +//=> [ 'a/b{1,3}/x', 'a/b{1,3}/y', 'a/b{1,3}/z' ] +``` + +### options.unescape + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Strip backslashes that were used for escaping from the result. + +## What is "brace expansion"? + +Brace expansion is a type of parameter expansion that was made popular by unix shells for generating lists of strings, as well as regex-like matching when used alongside wildcards (globs). + +In addition to "expansion", braces are also used for matching. In other words: + +* [brace expansion](#brace-expansion) is for generating new lists +* [brace matching](#brace-matching) is for filtering existing lists + +
      +More about brace expansion (click to expand) + +There are two main types of brace expansion: + +1. **lists**: which are defined using comma-separated values inside curly braces: `{a,b,c}` +2. **sequences**: which are defined using a starting value and an ending value, separated by two dots: `a{1..3}b`. Optionally, a third argument may be passed to define a "step" or increment to use: `a{1..100..10}b`. These are also sometimes referred to as "ranges". + +Here are some example brace patterns to illustrate how they work: + +**Sets** + +``` +{a,b,c} => a b c +{a,b,c}{1,2} => a1 a2 b1 b2 c1 c2 +``` + +**Sequences** + +``` +{1..9} => 1 2 3 4 5 6 7 8 9 +{4..-4} => 4 3 2 1 0 -1 -2 -3 -4 +{1..20..3} => 1 4 7 10 13 16 19 +{a..j} => a b c d e f g h i j +{j..a} => j i h g f e d c b a +{a..z..3} => a d g j m p s v y +``` + +**Combination** + +Sets and sequences can be mixed together or used along with any other strings. + +``` +{a,b,c}{1..3} => a1 a2 a3 b1 b2 b3 c1 c2 c3 +foo/{a,b,c}/bar => foo/a/bar foo/b/bar foo/c/bar +``` + +The fact that braces can be "expanded" from relatively simple patterns makes them ideal for quickly generating test fixtures, file paths, and similar use cases. + +## Brace matching + +In addition to _expansion_, brace patterns are also useful for performing regular-expression-like matching. + +For example, the pattern `foo/{1..3}/bar` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +``` + +But not: + +``` +baz/1/qux +baz/2/qux +baz/3/qux +``` + +Braces can also be combined with [glob patterns](https://github.com/jonschlinkert/micromatch) to perform more advanced wildcard matching. For example, the pattern `*/{1..3}/*` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +baz/1/qux +baz/2/qux +baz/3/qux +``` + +## Brace matching pitfalls + +Although brace patterns offer a user-friendly way of matching ranges or sets of strings, there are also some major disadvantages and potential risks you should be aware of. + +### tldr + +**"brace bombs"** + +* brace expansion can eat up a huge amount of processing resources +* as brace patterns increase _linearly in size_, the system resources required to expand the pattern increase exponentially +* users can accidentally (or intentially) exhaust your system's resources resulting in the equivalent of a DoS attack (bonus: no programming knowledge is required!) + +For a more detailed explanation with examples, see the [geometric complexity](#geometric-complexity) section. + +### The solution + +Jump to the [performance section](#performance) to see how Braces solves this problem in comparison to other libraries. + +### Geometric complexity + +At minimum, brace patterns with sets limited to two elements have quadradic or `O(n^2)` complexity. But the complexity of the algorithm increases exponentially as the number of sets, _and elements per set_, increases, which is `O(n^c)`. + +For example, the following sets demonstrate quadratic (`O(n^2)`) complexity: + +``` +{1,2}{3,4} => (2X2) => 13 14 23 24 +{1,2}{3,4}{5,6} => (2X2X2) => 135 136 145 146 235 236 245 246 +``` + +But add an element to a set, and we get a n-fold Cartesian product with `O(n^c)` complexity: + +``` +{1,2,3}{4,5,6}{7,8,9} => (3X3X3) => 147 148 149 157 158 159 167 168 169 247 248 + 249 257 258 259 267 268 269 347 348 349 357 + 358 359 367 368 369 +``` + +Now, imagine how this complexity grows given that each element is a n-tuple: + +``` +{1..100}{1..100} => (100X100) => 10,000 elements (38.4 kB) +{1..100}{1..100}{1..100} => (100X100X100) => 1,000,000 elements (5.76 MB) +``` + +Although these examples are clearly contrived, they demonstrate how brace patterns can quickly grow out of control. + +**More information** + +Interested in learning more about brace expansion? + +* [linuxjournal/bash-brace-expansion](http://www.linuxjournal.com/content/bash-brace-expansion) +* [rosettacode/Brace_expansion](https://rosettacode.org/wiki/Brace_expansion) +* [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) + +
      + +## Performance + +Braces is not only screaming fast, it's also more accurate the other brace expansion libraries. + +### Better algorithms + +Fortunately there is a solution to the ["brace bomb" problem](#brace-matching-pitfalls): _don't expand brace patterns into an array when they're used for matching_. + +Instead, convert the pattern into an optimized regular expression. This is easier said than done, and braces is the only library that does this currently. + +**The proof is in the numbers** + +Minimatch gets exponentially slower as patterns increase in complexity, braces does not. The following results were generated using `braces()` and `minimatch.braceExpand()`, respectively. + +| **Pattern** | **braces** | **[minimatch](https://github.com/isaacs/minimatch)** | +| --- | --- | --- | +| `{1..9007199254740991}`[1] | `298 B` (5ms 459μs) | N/A (freezes) | +| `{1..1000000000000000}` | `41 B` (1ms 15μs) | N/A (freezes) | +| `{1..100000000000000}` | `40 B` (890μs) | N/A (freezes) | +| `{1..10000000000000}` | `39 B` (2ms 49μs) | N/A (freezes) | +| `{1..1000000000000}` | `38 B` (608μs) | N/A (freezes) | +| `{1..100000000000}` | `37 B` (397μs) | N/A (freezes) | +| `{1..10000000000}` | `35 B` (983μs) | N/A (freezes) | +| `{1..1000000000}` | `34 B` (798μs) | N/A (freezes) | +| `{1..100000000}` | `33 B` (733μs) | N/A (freezes) | +| `{1..10000000}` | `32 B` (5ms 632μs) | `78.89 MB` (16s 388ms 569μs) | +| `{1..1000000}` | `31 B` (1ms 381μs) | `6.89 MB` (1s 496ms 887μs) | +| `{1..100000}` | `30 B` (950μs) | `588.89 kB` (146ms 921μs) | +| `{1..10000}` | `29 B` (1ms 114μs) | `48.89 kB` (14ms 187μs) | +| `{1..1000}` | `28 B` (760μs) | `3.89 kB` (1ms 453μs) | +| `{1..100}` | `22 B` (345μs) | `291 B` (196μs) | +| `{1..10}` | `10 B` (533μs) | `20 B` (37μs) | +| `{1..3}` | `7 B` (190μs) | `5 B` (27μs) | + +### Faster algorithms + +When you need expansion, braces is still much faster. + +_(the following results were generated using `braces.expand()` and `minimatch.braceExpand()`, respectively)_ + +| **Pattern** | **braces** | **[minimatch](https://github.com/isaacs/minimatch)** | +| --- | --- | --- | +| `{1..10000000}` | `78.89 MB` (2s 698ms 642μs) | `78.89 MB` (18s 601ms 974μs) | +| `{1..1000000}` | `6.89 MB` (458ms 576μs) | `6.89 MB` (1s 491ms 621μs) | +| `{1..100000}` | `588.89 kB` (20ms 728μs) | `588.89 kB` (156ms 919μs) | +| `{1..10000}` | `48.89 kB` (2ms 202μs) | `48.89 kB` (13ms 641μs) | +| `{1..1000}` | `3.89 kB` (1ms 796μs) | `3.89 kB` (1ms 958μs) | +| `{1..100}` | `291 B` (424μs) | `291 B` (211μs) | +| `{1..10}` | `20 B` (487μs) | `20 B` (72μs) | +| `{1..3}` | `5 B` (166μs) | `5 B` (27μs) | + +If you'd like to run these comparisons yourself, see [test/support/generate.js](test/support/generate.js). + +## Benchmarks + +### Running benchmarks + +Install dev dependencies: + +```bash +npm i -d && npm benchmark +``` + +### Latest results + +```bash +Benchmarking: (8 of 8) + · combination-nested + · combination + · escaped + · list-basic + · list-multiple + · no-braces + · sequence-basic + · sequence-multiple + +# benchmark/fixtures/combination-nested.js (52 bytes) + brace-expansion x 4,756 ops/sec ±1.09% (86 runs sampled) + braces x 11,202,303 ops/sec ±1.06% (88 runs sampled) + minimatch x 4,816 ops/sec ±0.99% (87 runs sampled) + + fastest is braces + +# benchmark/fixtures/combination.js (51 bytes) + brace-expansion x 625 ops/sec ±0.87% (87 runs sampled) + braces x 11,031,884 ops/sec ±0.72% (90 runs sampled) + minimatch x 637 ops/sec ±0.84% (88 runs sampled) + + fastest is braces + +# benchmark/fixtures/escaped.js (44 bytes) + brace-expansion x 163,325 ops/sec ±1.05% (87 runs sampled) + braces x 10,655,071 ops/sec ±1.22% (88 runs sampled) + minimatch x 147,495 ops/sec ±0.96% (88 runs sampled) + + fastest is braces + +# benchmark/fixtures/list-basic.js (40 bytes) + brace-expansion x 99,726 ops/sec ±1.07% (83 runs sampled) + braces x 10,596,584 ops/sec ±0.98% (88 runs sampled) + minimatch x 100,069 ops/sec ±1.17% (86 runs sampled) + + fastest is braces + +# benchmark/fixtures/list-multiple.js (52 bytes) + brace-expansion x 34,348 ops/sec ±1.08% (88 runs sampled) + braces x 9,264,131 ops/sec ±1.12% (88 runs sampled) + minimatch x 34,893 ops/sec ±0.87% (87 runs sampled) + + fastest is braces + +# benchmark/fixtures/no-braces.js (48 bytes) + brace-expansion x 275,368 ops/sec ±1.18% (89 runs sampled) + braces x 9,134,677 ops/sec ±0.95% (88 runs sampled) + minimatch x 3,755,954 ops/sec ±1.13% (89 runs sampled) + + fastest is braces + +# benchmark/fixtures/sequence-basic.js (41 bytes) + brace-expansion x 5,492 ops/sec ±1.35% (87 runs sampled) + braces x 8,485,034 ops/sec ±1.28% (89 runs sampled) + minimatch x 5,341 ops/sec ±1.17% (87 runs sampled) + + fastest is braces + +# benchmark/fixtures/sequence-multiple.js (51 bytes) + brace-expansion x 116 ops/sec ±0.77% (77 runs sampled) + braces x 9,445,118 ops/sec ±1.32% (84 runs sampled) + minimatch x 109 ops/sec ±1.16% (76 runs sampled) + + fastest is braces +``` + +## About + +
      +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
      + +
      +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
      + +
      +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
      + +### Related projects + +You might also be interested in these projects: + +* [expand-brackets](https://www.npmjs.com/package/expand-brackets): Expand POSIX bracket expressions (character classes) in glob patterns. | [homepage](https://github.com/jonschlinkert/expand-brackets "Expand POSIX bracket expressions (character classes) in glob patterns.") +* [extglob](https://www.npmjs.com/package/extglob): Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob… [more](https://github.com/micromatch/extglob) | [homepage](https://github.com/micromatch/extglob "Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob patterns.") +* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or `step` to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`") +* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/micromatch/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.") +* [nanomatch](https://www.npmjs.com/package/nanomatch): Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash… [more](https://github.com/micromatch/nanomatch) | [homepage](https://github.com/micromatch/nanomatch "Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash 4.3 wildcard support only (no support for exglobs, posix brackets or braces)") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 188 | [jonschlinkert](https://github.com/jonschlinkert) | +| 4 | [doowb](https://github.com/doowb) | +| 1 | [es128](https://github.com/es128) | +| 1 | [eush77](https://github.com/eush77) | +| 1 | [hemanth](https://github.com/hemanth) | + +### Author + +**Jon Schlinkert** + +* [linkedin/in/jonschlinkert](https://linkedin.com/in/jonschlinkert) +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on February 17, 2018._ + +
      +
      +
        +
      1. this is the largest safe integer allowed in JavaScript. + +
      2. +
      +
      \ No newline at end of file diff --git a/node_modules/braces/index.js b/node_modules/braces/index.js new file mode 100644 index 00000000..048e1c23 --- /dev/null +++ b/node_modules/braces/index.js @@ -0,0 +1,318 @@ +'use strict'; + +/** + * Module dependencies + */ + +var toRegex = require('to-regex'); +var unique = require('array-unique'); +var extend = require('extend-shallow'); + +/** + * Local dependencies + */ + +var compilers = require('./lib/compilers'); +var parsers = require('./lib/parsers'); +var Braces = require('./lib/braces'); +var utils = require('./lib/utils'); +var MAX_LENGTH = 1024 * 64; +var cache = {}; + +/** + * Convert the given `braces` pattern into a regex-compatible string. By default, only one string is generated for every input string. Set `options.expand` to true to return an array of patterns (similar to Bash or minimatch. Before using `options.expand`, it's recommended that you read the [performance notes](#performance)). + * + * ```js + * var braces = require('braces'); + * console.log(braces('{a,b,c}')); + * //=> ['(a|b|c)'] + * + * console.log(braces('{a,b,c}', {expand: true})); + * //=> ['a', 'b', 'c'] + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ + +function braces(pattern, options) { + var key = utils.createKey(String(pattern), options); + var arr = []; + + var disabled = options && options.cache === false; + if (!disabled && cache.hasOwnProperty(key)) { + return cache[key]; + } + + if (Array.isArray(pattern)) { + for (var i = 0; i < pattern.length; i++) { + arr.push.apply(arr, braces.create(pattern[i], options)); + } + } else { + arr = braces.create(pattern, options); + } + + if (options && options.nodupes === true) { + arr = unique(arr); + } + + if (!disabled) { + cache[key] = arr; + } + return arr; +} + +/** + * Expands a brace pattern into an array. This method is called by the main [braces](#braces) function when `options.expand` is true. Before using this method it's recommended that you read the [performance notes](#performance)) and advantages of using [.optimize](#optimize) instead. + * + * ```js + * var braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/b/d', 'a/c/d']; + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.expand = function(pattern, options) { + return braces.create(pattern, extend({}, options, {expand: true})); +}; + +/** + * Expands a brace pattern into a regex-compatible, optimized string. This method is called by the main [braces](#braces) function by default. + * + * ```js + * var braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/(b|c)/d'] + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.optimize = function(pattern, options) { + return braces.create(pattern, options); +}; + +/** + * Processes a brace pattern and returns either an expanded array (if `options.expand` is true), a highly optimized regex-compatible string. This method is called by the main [braces](#braces) function. + * + * ```js + * var braces = require('braces'); + * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) + * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.create = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + var maxLength = (options && options.maxLength) || MAX_LENGTH; + if (pattern.length >= maxLength) { + throw new Error('expected pattern to be less than ' + maxLength + ' characters'); + } + + function create() { + if (pattern === '' || pattern.length < 3) { + return [pattern]; + } + + if (utils.isEmptySets(pattern)) { + return []; + } + + if (utils.isQuotedString(pattern)) { + return [pattern.slice(1, -1)]; + } + + var proto = new Braces(options); + var result = !options || options.expand !== true + ? proto.optimize(pattern, options) + : proto.expand(pattern, options); + + // get the generated pattern(s) + var arr = result.output; + + // filter out empty strings if specified + if (options && options.noempty === true) { + arr = arr.filter(Boolean); + } + + // filter out duplicates if specified + if (options && options.nodupes === true) { + arr = unique(arr); + } + + Object.defineProperty(arr, 'result', { + enumerable: false, + value: result + }); + + return arr; + } + + return memoize('create', pattern, options, create); +}; + +/** + * Create a regular expression from the given string `pattern`. + * + * ```js + * var braces = require('braces'); + * + * console.log(braces.makeRe('id-{200..300}')); + * //=> /^(?:id-(20[0-9]|2[1-9][0-9]|300))$/ + * ``` + * @param {String} `pattern` The pattern to convert to regex. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +braces.makeRe = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + var maxLength = (options && options.maxLength) || MAX_LENGTH; + if (pattern.length >= maxLength) { + throw new Error('expected pattern to be less than ' + maxLength + ' characters'); + } + + function makeRe() { + var arr = braces(pattern, options); + var opts = extend({strictErrors: false}, options); + return toRegex(arr, opts); + } + + return memoize('makeRe', pattern, options, makeRe); +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * var braces = require('braces'); + * var ast = braces.parse('a/{b,c}/d'); + * console.log(ast); + * // { type: 'root', + * // errors: [], + * // input: 'a/{b,c}/d', + * // nodes: + * // [ { type: 'bos', val: '' }, + * // { type: 'text', val: 'a/' }, + * // { type: 'brace', + * // nodes: + * // [ { type: 'brace.open', val: '{' }, + * // { type: 'text', val: 'b,c' }, + * // { type: 'brace.close', val: '}' } ] }, + * // { type: 'text', val: '/d' }, + * // { type: 'eos', val: '' } ] } + * ``` + * @param {String} `pattern` Brace pattern to parse + * @param {Object} `options` + * @return {Object} Returns an AST + * @api public + */ + +braces.parse = function(pattern, options) { + var proto = new Braces(options); + return proto.parse(pattern, options); +}; + +/** + * Compile the given `ast` or string with the given `options`. + * + * ```js + * var braces = require('braces'); + * var ast = braces.parse('a/{b,c}/d'); + * console.log(braces.compile(ast)); + * // { options: { source: 'string' }, + * // state: {}, + * // compilers: + * // { eos: [Function], + * // noop: [Function], + * // bos: [Function], + * // brace: [Function], + * // 'brace.open': [Function], + * // text: [Function], + * // 'brace.close': [Function] }, + * // output: [ 'a/(b|c)/d' ], + * // ast: + * // { ... }, + * // parsingErrors: [] } + * ``` + * @param {Object|String} `ast` AST from [.parse](#parse). If a string is passed it will be parsed first. + * @param {Object} `options` + * @return {Object} Returns an object that has an `output` property with the compiled string. + * @api public + */ + +braces.compile = function(ast, options) { + var proto = new Braces(options); + return proto.compile(ast, options); +}; + +/** + * Clear the regex cache. + * + * ```js + * braces.clearCache(); + * ``` + * @api public + */ + +braces.clearCache = function() { + cache = braces.cache = {}; +}; + +/** + * Memoize a generated regex or function. A unique key is generated + * from the method name, pattern, and user-defined options. Set + * options.memoize to false to disable. + */ + +function memoize(type, pattern, options, fn) { + var key = utils.createKey(type + ':' + pattern, options); + var disabled = options && options.cache === false; + if (disabled) { + braces.clearCache(); + return fn(pattern, options); + } + + if (cache.hasOwnProperty(key)) { + return cache[key]; + } + + var res = fn(pattern, options); + cache[key] = res; + return res; +} + +/** + * Expose `Braces` constructor and methods + * @type {Function} + */ + +braces.Braces = Braces; +braces.compilers = compilers; +braces.parsers = parsers; +braces.cache = cache; + +/** + * Expose `braces` + * @type {Function} + */ + +module.exports = braces; diff --git a/node_modules/braces/package.json b/node_modules/braces/package.json new file mode 100644 index 00000000..96cbb2b7 --- /dev/null +++ b/node_modules/braces/package.json @@ -0,0 +1,108 @@ +{ + "name": "braces", + "description": "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.", + "version": "2.3.2", + "homepage": "https://github.com/micromatch/braces", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Elan Shanker (https://github.com/es128)", + "Eugene Sharygin (https://github.com/eush77)", + "hemanth.hm (http://h3manth.com)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "micromatch/braces", + "bugs": { + "url": "https://github.com/micromatch/braces/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "lib" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha", + "benchmark": "node benchmark" + }, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "devDependencies": { + "ansi-cyan": "^0.1.1", + "benchmarked": "^2.0.0", + "brace-expansion": "^1.1.8", + "cross-spawn": "^5.1.0", + "gulp": "^3.9.1", + "gulp-eslint": "^4.0.0", + "gulp-format-md": "^1.0.0", + "gulp-istanbul": "^1.1.2", + "gulp-mocha": "^3.0.1", + "gulp-unused": "^0.2.1", + "is-windows": "^1.0.1", + "minimatch": "^3.0.4", + "mocha": "^3.2.0", + "noncharacters": "^1.1.0", + "text-table": "^0.2.0", + "time-diff": "^0.3.1", + "yargs-parser": "^8.0.0" + }, + "keywords": [ + "alpha", + "alphabetical", + "bash", + "brace", + "braces", + "expand", + "expansion", + "filepath", + "fill", + "fs", + "glob", + "globbing", + "letter", + "match", + "matches", + "matching", + "number", + "numerical", + "path", + "range", + "ranges", + "sh" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "lint": { + "reflinks": true + }, + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "expand-brackets", + "extglob", + "fill-range", + "micromatch", + "nanomatch" + ] + } + } +} diff --git a/node_modules/buffer-equal/.travis.yml b/node_modules/buffer-equal/.travis.yml new file mode 100644 index 00000000..dad2273c --- /dev/null +++ b/node_modules/buffer-equal/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.8 + - "0.10" diff --git a/node_modules/buffer-equal/LICENSE b/node_modules/buffer-equal/LICENSE new file mode 100644 index 00000000..ee27ba4b --- /dev/null +++ b/node_modules/buffer-equal/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/buffer-equal/README.markdown b/node_modules/buffer-equal/README.markdown new file mode 100644 index 00000000..8c062fd0 --- /dev/null +++ b/node_modules/buffer-equal/README.markdown @@ -0,0 +1,62 @@ +buffer-equal +============ + +Return whether two buffers are equal. + +[![build status](https://secure.travis-ci.org/substack/node-buffer-equal.png)](http://travis-ci.org/substack/node-buffer-equal) + +example +======= + +``` js +var bufferEqual = require('buffer-equal'); + +console.dir(bufferEqual( + new Buffer([253,254,255]), + new Buffer([253,254,255]) +)); +console.dir(bufferEqual( + new Buffer('abc'), + new Buffer('abcd') +)); +console.dir(bufferEqual( + new Buffer('abc'), + 'abc' +)); +``` + +output: + +``` +true +false +undefined +``` + +methods +======= + +``` js +var bufferEqual = require('buffer-equal') +``` + +bufferEqual(a, b) +----------------- + +Return whether the two buffers `a` and `b` are equal. + +If `a` or `b` is not a buffer, return `undefined`. + +install +======= + +With [npm](http://npmjs.org) do: + +``` +npm install buffer-equal +``` + +license +======= + +MIT diff --git a/node_modules/buffer-equal/example/eq.js b/node_modules/buffer-equal/example/eq.js new file mode 100644 index 00000000..1eb05095 --- /dev/null +++ b/node_modules/buffer-equal/example/eq.js @@ -0,0 +1,14 @@ +var bufferEqual = require('../'); + +console.dir(bufferEqual( + new Buffer([253,254,255]), + new Buffer([253,254,255]) +)); +console.dir(bufferEqual( + new Buffer('abc'), + new Buffer('abcd') +)); +console.dir(bufferEqual( + new Buffer('abc'), + 'abc' +)); diff --git a/node_modules/buffer-equal/index.js b/node_modules/buffer-equal/index.js new file mode 100644 index 00000000..e640d4e2 --- /dev/null +++ b/node_modules/buffer-equal/index.js @@ -0,0 +1,14 @@ +var Buffer = require('buffer').Buffer; // for use with browserify + +module.exports = function (a, b) { + if (!Buffer.isBuffer(a)) return undefined; + if (!Buffer.isBuffer(b)) return undefined; + if (typeof a.equals === 'function') return a.equals(b); + if (a.length !== b.length) return false; + + for (var i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false; + } + + return true; +}; diff --git a/node_modules/buffer-equal/package.json b/node_modules/buffer-equal/package.json new file mode 100644 index 00000000..ec5850b2 --- /dev/null +++ b/node_modules/buffer-equal/package.json @@ -0,0 +1,33 @@ +{ + "name" : "buffer-equal", + "description" : "return whether two buffers are equal", + "version" : "1.0.0", + "repository" : { + "type" : "git", + "url" : "git://github.com/substack/node-buffer-equal.git" + }, + "main" : "index.js", + "keywords" : [ + "buffer", + "equal" + ], + "directories" : { + "example" : "example", + "test" : "test" + }, + "scripts" : { + "test" : "tap test/*.js" + }, + "devDependencies" : { + "tap" : "0.2.4" + }, + "engines" : { + "node" : ">=0.4.0" + }, + "license" : "MIT", + "author" : { + "name" : "James Halliday", + "email" : "mail@substack.net", + "url" : "http://substack.net" + } +} diff --git a/node_modules/buffer-equal/test/eq.js b/node_modules/buffer-equal/test/eq.js new file mode 100644 index 00000000..3d340062 --- /dev/null +++ b/node_modules/buffer-equal/test/eq.js @@ -0,0 +1,35 @@ +var bufferEqual = require('../'); +var test = require('tap').test; + +test('equal', function (t) { + var eq = bufferEqual( + new Buffer([253,254,255]), + new Buffer([253,254,255]) + ); + t.strictEqual(eq, true); + t.end(); +}); + +test('not equal', function (t) { + var eq = bufferEqual( + new Buffer('abc'), + new Buffer('abcd') + ); + t.strictEqual(eq, false); + t.end(); +}); + +test('not equal not buffer', function (t) { + var eq = bufferEqual( + new Buffer('abc'), + 'abc' + ); + t.strictEqual(eq, undefined); + t.end(); +}); + +test('equal not buffer', function (t) { + var eq = bufferEqual('abc', 'abc'); + t.strictEqual(eq, undefined); + t.end(); +}); diff --git a/node_modules/buffer-from/LICENSE b/node_modules/buffer-from/LICENSE new file mode 100644 index 00000000..e4bf1d69 --- /dev/null +++ b/node_modules/buffer-from/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016, 2018 Linus Unnebäck + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/buffer-from/index.js b/node_modules/buffer-from/index.js new file mode 100644 index 00000000..d92a83d0 --- /dev/null +++ b/node_modules/buffer-from/index.js @@ -0,0 +1,69 @@ +var toString = Object.prototype.toString + +var isModern = ( + typeof Buffer.alloc === 'function' && + typeof Buffer.allocUnsafe === 'function' && + typeof Buffer.from === 'function' +) + +function isArrayBuffer (input) { + return toString.call(input).slice(8, -1) === 'ArrayBuffer' +} + +function fromArrayBuffer (obj, byteOffset, length) { + byteOffset >>>= 0 + + var maxLength = obj.byteLength - byteOffset + + if (maxLength < 0) { + throw new RangeError("'offset' is out of bounds") + } + + if (length === undefined) { + length = maxLength + } else { + length >>>= 0 + + if (length > maxLength) { + throw new RangeError("'length' is out of bounds") + } + } + + return isModern + ? Buffer.from(obj.slice(byteOffset, byteOffset + length)) + : new Buffer(new Uint8Array(obj.slice(byteOffset, byteOffset + length))) +} + +function fromString (string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + return isModern + ? Buffer.from(string, encoding) + : new Buffer(string, encoding) +} + +function bufferFrom (value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') + } + + if (isArrayBuffer(value)) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + return isModern + ? Buffer.from(value) + : new Buffer(value) +} + +module.exports = bufferFrom diff --git a/node_modules/buffer-from/package.json b/node_modules/buffer-from/package.json new file mode 100644 index 00000000..b0024501 --- /dev/null +++ b/node_modules/buffer-from/package.json @@ -0,0 +1,19 @@ +{ + "name": "buffer-from", + "version": "1.1.1", + "license": "MIT", + "repository": "LinusU/buffer-from", + "files": [ + "index.js" + ], + "scripts": { + "test": "standard && node test" + }, + "devDependencies": { + "standard": "^7.1.2" + }, + "keywords": [ + "buffer", + "buffer from" + ] +} diff --git a/node_modules/buffer-from/readme.md b/node_modules/buffer-from/readme.md new file mode 100644 index 00000000..9880a558 --- /dev/null +++ b/node_modules/buffer-from/readme.md @@ -0,0 +1,69 @@ +# Buffer From + +A [ponyfill](https://ponyfill.com) for `Buffer.from`, uses native implementation if available. + +## Installation + +```sh +npm install --save buffer-from +``` + +## Usage + +```js +const bufferFrom = require('buffer-from') + +console.log(bufferFrom([1, 2, 3, 4])) +//=> + +const arr = new Uint8Array([1, 2, 3, 4]) +console.log(bufferFrom(arr.buffer, 1, 2)) +//=> + +console.log(bufferFrom('test', 'utf8')) +//=> + +const buf = bufferFrom('test') +console.log(bufferFrom(buf)) +//=> +``` + +## API + +### bufferFrom(array) + +- `array` <Array> + +Allocates a new `Buffer` using an `array` of octets. + +### bufferFrom(arrayBuffer[, byteOffset[, length]]) + +- `arrayBuffer` <ArrayBuffer> The `.buffer` property of a TypedArray or ArrayBuffer +- `byteOffset` <Integer> Where to start copying from `arrayBuffer`. **Default:** `0` +- `length` <Integer> How many bytes to copy from `arrayBuffer`. **Default:** `arrayBuffer.length - byteOffset` + +When passed a reference to the `.buffer` property of a TypedArray instance, the +newly created `Buffer` will share the same allocated memory as the TypedArray. + +The optional `byteOffset` and `length` arguments specify a memory range within +the `arrayBuffer` that will be shared by the `Buffer`. + +### bufferFrom(buffer) + +- `buffer` <Buffer> An existing `Buffer` to copy data from + +Copies the passed `buffer` data onto a new `Buffer` instance. + +### bufferFrom(string[, encoding]) + +- `string` <String> A string to encode. +- `encoding` <String> The encoding of `string`. **Default:** `'utf8'` + +Creates a new `Buffer` containing the given JavaScript string `string`. If +provided, the `encoding` parameter identifies the character encoding of +`string`. + +## See also + +- [buffer-alloc](https://github.com/LinusU/buffer-alloc) A ponyfill for `Buffer.alloc` +- [buffer-alloc-unsafe](https://github.com/LinusU/buffer-alloc-unsafe) A ponyfill for `Buffer.allocUnsafe` diff --git a/node_modules/cache-base/LICENSE b/node_modules/cache-base/LICENSE new file mode 100644 index 00000000..943e71d0 --- /dev/null +++ b/node_modules/cache-base/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/cache-base/README.md b/node_modules/cache-base/README.md new file mode 100644 index 00000000..62c6ffeb --- /dev/null +++ b/node_modules/cache-base/README.md @@ -0,0 +1,291 @@ +# cache-base [![NPM version](https://img.shields.io/npm/v/cache-base.svg?style=flat)](https://www.npmjs.com/package/cache-base) [![NPM monthly downloads](https://img.shields.io/npm/dm/cache-base.svg?style=flat)](https://npmjs.org/package/cache-base) [![NPM total downloads](https://img.shields.io/npm/dt/cache-base.svg?style=flat)](https://npmjs.org/package/cache-base) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/cache-base.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/cache-base) + +> Basic object cache with `get`, `set`, `del`, and `has` methods for node.js/javascript projects. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save cache-base +``` + +## Usage + +```js +var Cache = require('cache-base'); + +// instantiate +var app = new Cache(); + +// set values +app.set('a', 'b'); +app.set('c.d', 'e'); + +// get values +app.get('a'); +//=> 'b' +app.get('c'); +//=> {d: 'e'} + +console.log(app.cache); +//=> {a: 'b'} +``` + +**Inherit** + +```js +var util = require('util'); +var Cache = require('cache-base'); + +function MyApp() { + Cache.call(this); +} +util.inherits(MyApp, Cache); + +var app = new MyApp(); +app.set('a', 'b'); +app.get('a'); +//=> 'b' +``` + +**Namespace** + +Define a custom property for storing values. + +```js +var Cache = require('cache-base').namespace('data'); +var app = new Cache(); +app.set('a', 'b'); +console.log(app.data); +//=> {a: 'b'} +``` + +## API + +### [namespace](index.js#L29) + +Create a `Cache` constructor that when instantiated will store values on the given `prop`. + +**Params** + +* `prop` **{String}**: The property name to use for storing values. +* `returns` **{Function}**: Returns a custom `Cache` constructor + +**Example** + +```js +var Cache = require('cache-base').namespace('data'); +var cache = new Cache(); + +cache.set('foo', 'bar'); +//=> {data: {foo: 'bar'}} +``` + +### [Cache](index.js#L43) + +Create a new `Cache`. Internally the `Cache` constructor is created using the `namespace` function, with `cache` defined as the storage object. + +**Params** + +* `cache` **{Object}**: Optionally pass an object to initialize with. + +**Example** + +```js +var app = new Cache(); +``` + +### [.set](index.js#L84) + +Assign `value` to `key`. Also emits `set` with the key and value. + +**Params** + +* `key` **{String}** +* `value` **{any}** +* `returns` **{Object}**: Returns the instance for chaining. + +**Events** + +* `emits`: `set` with `key` and `value` as arguments. + +**Example** + +```js +app.on('set', function(key, val) { + // do something when `set` is emitted +}); + +app.set(key, value); + +// also takes an object or array +app.set({name: 'Halle'}); +app.set([{foo: 'bar'}, {baz: 'quux'}]); +console.log(app); +//=> {name: 'Halle', foo: 'bar', baz: 'quux'} +``` + +### [.union](index.js#L114) + +Union `array` to `key`. Also emits `set` with the key and value. + +**Params** + +* `key` **{String}** +* `value` **{any}** +* `returns` **{Object}**: Returns the instance for chaining. + +**Example** + +```js +app.union('a.b', ['foo']); +app.union('a.b', ['bar']); +console.log(app.get('a')); +//=> {b: ['foo', 'bar']} +``` + +### [.get](index.js#L144) + +Return the value of `key`. Dot notation may be used to get [nested property values](https://github.com/jonschlinkert/get-value). + +**Params** + +* `key` **{String}**: The name of the property to get. Dot-notation may be used. +* `returns` **{any}**: Returns the value of `key` + +**Events** + +* `emits`: `get` with `key` and `value` as arguments. + +**Example** + +```js +app.set('a.b.c', 'd'); +app.get('a.b'); +//=> {c: 'd'} + +app.get(['a', 'b']); +//=> {c: 'd'} +``` + +### [.has](index.js#L171) + +Return true if app has a stored value for `key`, false only if value is `undefined`. + +**Params** + +* `key` **{String}** +* `returns` **{Boolean}** + +**Events** + +* `emits`: `has` with `key` and true or false as arguments. + +**Example** + +```js +app.set('foo', 'bar'); +app.has('foo'); +//=> true +``` + +### [.del](index.js#L199) + +Delete one or more properties from the instance. + +**Params** + +* `key` **{String|Array}**: Property name or array of property names. +* `returns` **{Object}**: Returns the instance for chaining. + +**Events** + +* `emits`: `del` with the `key` as the only argument. + +**Example** + +```js +app.del(); // delete all +// or +app.del('foo'); +// or +app.del(['foo', 'bar']); +``` + +### [.clear](index.js#L218) + +Reset the entire cache to an empty object. + +**Example** + +```js +app.clear(); +``` + +### [.visit](index.js#L235) + +Visit `method` over the properties in the given object, or map +visit over the object-elements in an array. + +**Params** + +* `method` **{String}**: The name of the `base` method to call. +* `val` **{Object|Array}**: The object or array to iterate over. +* `returns` **{Object}**: Returns the instance for chaining. + +## About + +### Related projects + +* [base-methods](https://www.npmjs.com/package/base-methods): base-methods is the foundation for creating modular, unit testable and highly pluggable node.js applications, starting… [more](https://github.com/jonschlinkert/base-methods) | [homepage](https://github.com/jonschlinkert/base-methods "base-methods is the foundation for creating modular, unit testable and highly pluggable node.js applications, starting with a handful of common methods, like `set`, `get`, `del` and `use`.") +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (`a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value "Use property paths (`a.b.c`) to get a nested value from an object.") +* [has-value](https://www.npmjs.com/package/has-value): Returns true if a value exists, false if empty. Works with deeply nested values using… [more](https://github.com/jonschlinkert/has-value) | [homepage](https://github.com/jonschlinkert/has-value "Returns true if a value exists, false if empty. Works with deeply nested values using object paths.") +* [option-cache](https://www.npmjs.com/package/option-cache): Simple API for managing options in JavaScript applications. | [homepage](https://github.com/jonschlinkert/option-cache "Simple API for managing options in JavaScript applications.") +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value "Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths.") +* [unset-value](https://www.npmjs.com/package/unset-value): Delete nested properties from an object using dot notation. | [homepage](https://github.com/jonschlinkert/unset-value "Delete nested properties from an object using dot notation.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 54 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 22, 2017._ \ No newline at end of file diff --git a/node_modules/cache-base/index.js b/node_modules/cache-base/index.js new file mode 100644 index 00000000..41280245 --- /dev/null +++ b/node_modules/cache-base/index.js @@ -0,0 +1,261 @@ +'use strict'; + +var isObject = require('isobject'); +var Emitter = require('component-emitter'); +var visit = require('collection-visit'); +var toPath = require('to-object-path'); +var union = require('union-value'); +var del = require('unset-value'); +var get = require('get-value'); +var has = require('has-value'); +var set = require('set-value'); + +/** + * Create a `Cache` constructor that when instantiated will + * store values on the given `prop`. + * + * ```js + * var Cache = require('cache-base').namespace('data'); + * var cache = new Cache(); + * + * cache.set('foo', 'bar'); + * //=> {data: {foo: 'bar'}} + * ``` + * @param {String} `prop` The property name to use for storing values. + * @return {Function} Returns a custom `Cache` constructor + * @api public + */ + +function namespace(prop) { + + /** + * Create a new `Cache`. Internally the `Cache` constructor is created using + * the `namespace` function, with `cache` defined as the storage object. + * + * ```js + * var app = new Cache(); + * ``` + * @param {Object} `cache` Optionally pass an object to initialize with. + * @constructor + * @api public + */ + + function Cache(cache) { + if (prop) { + this[prop] = {}; + } + if (cache) { + this.set(cache); + } + } + + /** + * Inherit Emitter + */ + + Emitter(Cache.prototype); + + /** + * Assign `value` to `key`. Also emits `set` with + * the key and value. + * + * ```js + * app.on('set', function(key, val) { + * // do something when `set` is emitted + * }); + * + * app.set(key, value); + * + * // also takes an object or array + * app.set({name: 'Halle'}); + * app.set([{foo: 'bar'}, {baz: 'quux'}]); + * console.log(app); + * //=> {name: 'Halle', foo: 'bar', baz: 'quux'} + * ``` + * + * @name .set + * @emits `set` with `key` and `value` as arguments. + * @param {String} `key` + * @param {any} `value` + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.set = function(key, val) { + if (Array.isArray(key) && arguments.length === 2) { + key = toPath(key); + } + if (isObject(key) || Array.isArray(key)) { + this.visit('set', key); + } else { + set(prop ? this[prop] : this, key, val); + this.emit('set', key, val); + } + return this; + }; + + /** + * Union `array` to `key`. Also emits `set` with + * the key and value. + * + * ```js + * app.union('a.b', ['foo']); + * app.union('a.b', ['bar']); + * console.log(app.get('a')); + * //=> {b: ['foo', 'bar']} + * ``` + * @name .union + * @param {String} `key` + * @param {any} `value` + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.union = function(key, val) { + if (Array.isArray(key) && arguments.length === 2) { + key = toPath(key); + } + var ctx = prop ? this[prop] : this; + union(ctx, key, arrayify(val)); + this.emit('union', val); + return this; + }; + + /** + * Return the value of `key`. Dot notation may be used + * to get [nested property values][get-value]. + * + * ```js + * app.set('a.b.c', 'd'); + * app.get('a.b'); + * //=> {c: 'd'} + * + * app.get(['a', 'b']); + * //=> {c: 'd'} + * ``` + * + * @name .get + * @emits `get` with `key` and `value` as arguments. + * @param {String} `key` The name of the property to get. Dot-notation may be used. + * @return {any} Returns the value of `key` + * @api public + */ + + Cache.prototype.get = function(key) { + key = toPath(arguments); + + var ctx = prop ? this[prop] : this; + var val = get(ctx, key); + + this.emit('get', key, val); + return val; + }; + + /** + * Return true if app has a stored value for `key`, + * false only if value is `undefined`. + * + * ```js + * app.set('foo', 'bar'); + * app.has('foo'); + * //=> true + * ``` + * + * @name .has + * @emits `has` with `key` and true or false as arguments. + * @param {String} `key` + * @return {Boolean} + * @api public + */ + + Cache.prototype.has = function(key) { + key = toPath(arguments); + + var ctx = prop ? this[prop] : this; + var val = get(ctx, key); + + var has = typeof val !== 'undefined'; + this.emit('has', key, has); + return has; + }; + + /** + * Delete one or more properties from the instance. + * + * ```js + * app.del(); // delete all + * // or + * app.del('foo'); + * // or + * app.del(['foo', 'bar']); + * ``` + * @name .del + * @emits `del` with the `key` as the only argument. + * @param {String|Array} `key` Property name or array of property names. + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.del = function(key) { + if (Array.isArray(key)) { + this.visit('del', key); + } else { + del(prop ? this[prop] : this, key); + this.emit('del', key); + } + return this; + }; + + /** + * Reset the entire cache to an empty object. + * + * ```js + * app.clear(); + * ``` + * @api public + */ + + Cache.prototype.clear = function() { + if (prop) { + this[prop] = {}; + } + }; + + /** + * Visit `method` over the properties in the given object, or map + * visit over the object-elements in an array. + * + * @name .visit + * @param {String} `method` The name of the `base` method to call. + * @param {Object|Array} `val` The object or array to iterate over. + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.visit = function(method, val) { + visit(this, method, val); + return this; + }; + + return Cache; +} + +/** + * Cast val to an array + */ + +function arrayify(val) { + return val ? (Array.isArray(val) ? val : [val]) : []; +} + +/** + * Expose `Cache` + */ + +module.exports = namespace(); + +/** + * Expose `Cache.namespace` + */ + +module.exports.namespace = namespace; diff --git a/node_modules/cache-base/package.json b/node_modules/cache-base/package.json new file mode 100644 index 00000000..fd88a110 --- /dev/null +++ b/node_modules/cache-base/package.json @@ -0,0 +1,82 @@ +{ + "name": "cache-base", + "description": "Basic object cache with `get`, `set`, `del`, and `has` methods for node.js/javascript projects.", + "version": "1.0.1", + "homepage": "https://github.com/jonschlinkert/cache-base", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "(https://github.com/wtgtybhertgeghgtwtg)" + ], + "repository": "jonschlinkert/cache-base", + "bugs": { + "url": "https://github.com/jonschlinkert/cache-base/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.4.2" + }, + "keywords": [ + "base", + "cache", + "config", + "data", + "get", + "has", + "hash", + "hasown", + "object", + "set", + "store" + ], + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "highligh": "base", + "list": [ + "base-methods", + "get-value", + "has-value", + "option-cache", + "set-value", + "unset-value" + ] + }, + "reflinks": [ + "verb" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/call-bind/.eslintignore b/node_modules/call-bind/.eslintignore new file mode 100644 index 00000000..404abb22 --- /dev/null +++ b/node_modules/call-bind/.eslintignore @@ -0,0 +1 @@ +coverage/ diff --git a/node_modules/call-bind/.eslintrc b/node_modules/call-bind/.eslintrc new file mode 100644 index 00000000..e5d3c9a9 --- /dev/null +++ b/node_modules/call-bind/.eslintrc @@ -0,0 +1,17 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "func-name-matching": 0, + "id-length": 0, + "new-cap": [2, { + "capIsNewExceptions": [ + "GetIntrinsic", + ], + }], + "no-magic-numbers": 0, + "operator-linebreak": [2, "before"], + }, +} diff --git a/node_modules/call-bind/.github/FUNDING.yml b/node_modules/call-bind/.github/FUNDING.yml new file mode 100644 index 00000000..c70c2ecd --- /dev/null +++ b/node_modules/call-bind/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [ljharb] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: npm/call-bind +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/node_modules/call-bind/.nycrc b/node_modules/call-bind/.nycrc new file mode 100644 index 00000000..1826526e --- /dev/null +++ b/node_modules/call-bind/.nycrc @@ -0,0 +1,13 @@ +{ + "all": true, + "check-coverage": false, + "reporter": ["text-summary", "text", "html", "json"], + "lines": 86, + "statements": 85.93, + "functions": 82.43, + "branches": 76.06, + "exclude": [ + "coverage", + "test" + ] +} diff --git a/node_modules/call-bind/CHANGELOG.md b/node_modules/call-bind/CHANGELOG.md new file mode 100644 index 00000000..dee2dc06 --- /dev/null +++ b/node_modules/call-bind/CHANGELOG.md @@ -0,0 +1,36 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [v1.0.1](https://github.com/ljharb/call-bind/compare/v1.0.0...v1.0.1) - 2021-01-08 + +### Commits + +- [Tests] migrate tests to Github Actions [`b6db284`](https://github.com/ljharb/call-bind/commit/b6db284c36f8ccd195b88a6764fe84b7223a0da1) +- [meta] do not publish github action workflow files [`ec7fe46`](https://github.com/ljharb/call-bind/commit/ec7fe46e60cfa4764ee943d2755f5e5a366e578e) +- [Fix] preserve original function’s length when possible [`adbceaa`](https://github.com/ljharb/call-bind/commit/adbceaa3cac4b41ea78bb19d7ccdbaaf7e0bdadb) +- [Tests] gather coverage data on every job [`d69e23c`](https://github.com/ljharb/call-bind/commit/d69e23cc65f101ba1d4c19bb07fa8eb0ec624be8) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`2fd3586`](https://github.com/ljharb/call-bind/commit/2fd3586c5d47b335364c14293114c6b625ae1f71) +- [Deps] update `get-intrinsic` [`f23e931`](https://github.com/ljharb/call-bind/commit/f23e9318cc271c2add8bb38cfded85ee7baf8eee) +- [Deps] update `get-intrinsic` [`72d9f44`](https://github.com/ljharb/call-bind/commit/72d9f44e184465ba8dd3fb48260bbcff234985f2) +- [meta] fix FUNDING.yml [`e723573`](https://github.com/ljharb/call-bind/commit/e723573438c5a68dcec31fb5d96ea6b7e4a93be8) +- [eslint] ignore coverage output [`15e76d2`](https://github.com/ljharb/call-bind/commit/15e76d28a5f43e504696401e5b31ebb78ee1b532) +- [meta] add Automatic Rebase and Require Allow Edits workflows [`8fa4dab`](https://github.com/ljharb/call-bind/commit/8fa4dabb23ba3dd7bb92c9571c1241c08b56e4b6) + +## v1.0.0 - 2020-10-30 + +### Commits + +- Initial commit [`306cf98`](https://github.com/ljharb/call-bind/commit/306cf98c7ec9e7ef66b653ec152277ac1381eb50) +- Tests [`e10d0bb`](https://github.com/ljharb/call-bind/commit/e10d0bbdadc7a10ecedc9a1c035112d3e368b8df) +- Implementation [`43852ed`](https://github.com/ljharb/call-bind/commit/43852eda0f187327b7fad2423ca972149a52bd65) +- npm init [`408f860`](https://github.com/ljharb/call-bind/commit/408f860b773a2f610805fd3613d0d71bac1b6249) +- [meta] add Automatic Rebase and Require Allow Edits workflows [`fb349b2`](https://github.com/ljharb/call-bind/commit/fb349b2e48defbec8b5ec8a8395cc8f69f220b13) +- [meta] add `auto-changelog` [`c4001fc`](https://github.com/ljharb/call-bind/commit/c4001fc43031799ef908211c98d3b0fb2b60fde4) +- [meta] add "funding"; create `FUNDING.yml` [`d4d6d29`](https://github.com/ljharb/call-bind/commit/d4d6d2974a14bc2e98830468eda7fe6d6a776717) +- [Tests] add `npm run lint` [`dedfb98`](https://github.com/ljharb/call-bind/commit/dedfb98bd0ecefb08ddb9a94061bd10cde4332af) +- Only apps should have lockfiles [`54ac776`](https://github.com/ljharb/call-bind/commit/54ac77653db45a7361dc153d2f478e743f110650) +- [meta] add `safe-publish-latest` [`9ea8e43`](https://github.com/ljharb/call-bind/commit/9ea8e435b950ce9b705559cd651039f9bf40140f) diff --git a/node_modules/call-bind/LICENSE b/node_modules/call-bind/LICENSE new file mode 100644 index 00000000..48f05d01 --- /dev/null +++ b/node_modules/call-bind/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/call-bind/README.md b/node_modules/call-bind/README.md new file mode 100644 index 00000000..53649eb4 --- /dev/null +++ b/node_modules/call-bind/README.md @@ -0,0 +1,2 @@ +# call-bind +Robustly `.call.bind()` a function. diff --git a/node_modules/call-bind/callBound.js b/node_modules/call-bind/callBound.js new file mode 100644 index 00000000..8374adfd --- /dev/null +++ b/node_modules/call-bind/callBound.js @@ -0,0 +1,15 @@ +'use strict'; + +var GetIntrinsic = require('get-intrinsic'); + +var callBind = require('./'); + +var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf')); + +module.exports = function callBoundIntrinsic(name, allowMissing) { + var intrinsic = GetIntrinsic(name, !!allowMissing); + if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) { + return callBind(intrinsic); + } + return intrinsic; +}; diff --git a/node_modules/call-bind/index.js b/node_modules/call-bind/index.js new file mode 100644 index 00000000..8f4f46bb --- /dev/null +++ b/node_modules/call-bind/index.js @@ -0,0 +1,46 @@ +'use strict'; + +var bind = require('function-bind'); +var GetIntrinsic = require('get-intrinsic'); + +var $apply = GetIntrinsic('%Function.prototype.apply%'); +var $call = GetIntrinsic('%Function.prototype.call%'); +var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply); + +var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true); +var $defineProperty = GetIntrinsic('%Object.defineProperty%', true); +var $max = GetIntrinsic('%Math.max%'); + +if ($defineProperty) { + try { + $defineProperty({}, 'a', { value: 1 }); + } catch (e) { + // IE 8 has a broken defineProperty + $defineProperty = null; + } +} + +module.exports = function callBind(originalFunction) { + var func = $reflectApply(bind, $call, arguments); + if ($gOPD && $defineProperty) { + var desc = $gOPD(func, 'length'); + if (desc.configurable) { + $defineProperty( + func, + 'length', + { value: $max(0, originalFunction.length - (arguments.length - 1)) } + ); + } + } + return func; +}; + +var applyBind = function applyBind() { + return $reflectApply(bind, $apply, arguments); +}; + +if ($defineProperty) { + $defineProperty(module.exports, 'apply', { value: applyBind }); +} else { + module.exports.apply = applyBind; +} diff --git a/node_modules/call-bind/package.json b/node_modules/call-bind/package.json new file mode 100644 index 00000000..afd241b8 --- /dev/null +++ b/node_modules/call-bind/package.json @@ -0,0 +1,80 @@ +{ + "name": "call-bind", + "version": "1.0.1", + "description": "Robustly `.call.bind()` a function", + "main": "index.js", + "exports": { + ".": [ + { + "default": "./index.js" + }, + "./index.js" + ], + "./callBound": [ + { + "default": "./callBound.js" + }, + "./callBound.js" + ], + "./package.json": "./package.json" + }, + "scripts": { + "prepublish": "safe-publish-latest", + "lint": "eslint --ext=.js,.mjs .", + "pretest": "npm run lint", + "tests-only": "nyc tape 'test/*'", + "test": "npm run tests-only", + "posttest": "aud --production", + "version": "auto-changelog && git add CHANGELOG.md", + "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ljharb/call-bind.git" + }, + "keywords": [ + "javascript", + "ecmascript", + "es", + "js", + "callbind", + "callbound", + "call", + "bind", + "bound", + "call-bind", + "call-bound", + "function", + "es-abstract" + ], + "author": "Jordan Harband ", + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/ljharb/call-bind/issues" + }, + "homepage": "https://github.com/ljharb/call-bind#readme", + "devDependencies": { + "@ljharb/eslint-config": "^17.3.0", + "aud": "^1.1.3", + "auto-changelog": "^2.2.1", + "eslint": "^7.17.0", + "nyc": "^10.3.2", + "safe-publish-latest": "^1.1.4", + "tape": "^5.1.1" + }, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "auto-changelog": { + "output": "CHANGELOG.md", + "template": "keepachangelog", + "unreleased": false, + "commitLimit": false, + "backfillLimit": false, + "hideCredit": true + } +} diff --git a/node_modules/call-bind/test/callBound.js b/node_modules/call-bind/test/callBound.js new file mode 100644 index 00000000..209ce3cc --- /dev/null +++ b/node_modules/call-bind/test/callBound.js @@ -0,0 +1,55 @@ +'use strict'; + +var test = require('tape'); + +var callBound = require('../callBound'); + +test('callBound', function (t) { + // static primitive + t.equal(callBound('Array.length'), Array.length, 'Array.length yields itself'); + t.equal(callBound('%Array.length%'), Array.length, '%Array.length% yields itself'); + + // static non-function object + t.equal(callBound('Array.prototype'), Array.prototype, 'Array.prototype yields itself'); + t.equal(callBound('%Array.prototype%'), Array.prototype, '%Array.prototype% yields itself'); + t.equal(callBound('Array.constructor'), Array.constructor, 'Array.constructor yields itself'); + t.equal(callBound('%Array.constructor%'), Array.constructor, '%Array.constructor% yields itself'); + + // static function + t.equal(callBound('Date.parse'), Date.parse, 'Date.parse yields itself'); + t.equal(callBound('%Date.parse%'), Date.parse, '%Date.parse% yields itself'); + + // prototype primitive + t.equal(callBound('Error.prototype.message'), Error.prototype.message, 'Error.prototype.message yields itself'); + t.equal(callBound('%Error.prototype.message%'), Error.prototype.message, '%Error.prototype.message% yields itself'); + + // prototype function + t.notEqual(callBound('Object.prototype.toString'), Object.prototype.toString, 'Object.prototype.toString does not yield itself'); + t.notEqual(callBound('%Object.prototype.toString%'), Object.prototype.toString, '%Object.prototype.toString% does not yield itself'); + t.equal(callBound('Object.prototype.toString')(true), Object.prototype.toString.call(true), 'call-bound Object.prototype.toString calls into the original'); + t.equal(callBound('%Object.prototype.toString%')(true), Object.prototype.toString.call(true), 'call-bound %Object.prototype.toString% calls into the original'); + + t['throws']( + function () { callBound('does not exist'); }, + SyntaxError, + 'nonexistent intrinsic throws' + ); + t['throws']( + function () { callBound('does not exist', true); }, + SyntaxError, + 'allowMissing arg still throws for unknown intrinsic' + ); + + /* globals WeakRef: false */ + t.test('real but absent intrinsic', { skip: typeof WeakRef !== 'undefined' }, function (st) { + st['throws']( + function () { callBound('WeakRef'); }, + TypeError, + 'real but absent intrinsic throws' + ); + st.equal(callBound('WeakRef', true), undefined, 'allowMissing arg avoids exception'); + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/call-bind/test/index.js b/node_modules/call-bind/test/index.js new file mode 100644 index 00000000..b5b530dc --- /dev/null +++ b/node_modules/call-bind/test/index.js @@ -0,0 +1,66 @@ +'use strict'; + +var callBind = require('../'); +var bind = require('function-bind'); + +var test = require('tape'); + +/* + * older engines have length nonconfigurable + * in io.js v3, it is configurable except on bound functions, hence the .bind() + */ +var functionsHaveConfigurableLengths = !!( + Object.getOwnPropertyDescriptor + && Object.getOwnPropertyDescriptor(bind.call(function () {}), 'length').configurable +); + +test('callBind', function (t) { + var sentinel = { sentinel: true }; + var func = function (a, b) { + // eslint-disable-next-line no-invalid-this + return [this, a, b]; + }; + t.equal(func.length, 2, 'original function length is 2'); + t.deepEqual(func(), [undefined, undefined, undefined], 'unbound func with too few args'); + t.deepEqual(func(1, 2), [undefined, 1, 2], 'unbound func with right args'); + t.deepEqual(func(1, 2, 3), [undefined, 1, 2], 'unbound func with too many args'); + + var bound = callBind(func); + t.equal(bound.length, func.length, 'function length is preserved', { skip: !functionsHaveConfigurableLengths }); + t.deepEqual(bound(), [undefined, undefined, undefined], 'bound func with too few args'); + t.deepEqual(bound(1, 2), [1, 2, undefined], 'bound func with right args'); + t.deepEqual(bound(1, 2, 3), [1, 2, 3], 'bound func with too many args'); + + var boundR = callBind(func, sentinel); + t.equal(boundR.length, func.length - 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths }); + t.deepEqual(boundR(), [sentinel, undefined, undefined], 'bound func with receiver, with too few args'); + t.deepEqual(boundR(1, 2), [sentinel, 1, 2], 'bound func with receiver, with right args'); + t.deepEqual(boundR(1, 2, 3), [sentinel, 1, 2], 'bound func with receiver, with too many args'); + + var boundArg = callBind(func, sentinel, 1); + t.equal(boundArg.length, func.length - 2, 'function length is preserved', { skip: !functionsHaveConfigurableLengths }); + t.deepEqual(boundArg(), [sentinel, 1, undefined], 'bound func with receiver and arg, with too few args'); + t.deepEqual(boundArg(2), [sentinel, 1, 2], 'bound func with receiver and arg, with right arg'); + t.deepEqual(boundArg(2, 3), [sentinel, 1, 2], 'bound func with receiver and arg, with too many args'); + + t.test('callBind.apply', function (st) { + var aBound = callBind.apply(func); + st.deepEqual(aBound(sentinel), [sentinel, undefined, undefined], 'apply-bound func with no args'); + st.deepEqual(aBound(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args'); + st.deepEqual(aBound(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args'); + + var aBoundArg = callBind.apply(func); + st.deepEqual(aBoundArg(sentinel, [1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with too many args'); + st.deepEqual(aBoundArg(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args'); + st.deepEqual(aBoundArg(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args'); + + var aBoundR = callBind.apply(func, sentinel); + st.deepEqual(aBoundR([1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with receiver and too many args'); + st.deepEqual(aBoundR([1, 2], 4), [sentinel, 1, 2], 'apply-bound func with receiver and right args'); + st.deepEqual(aBoundR([1], 4), [sentinel, 1, undefined], 'apply-bound func with receiver and too few args'); + + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/camelcase-keys/index.js b/node_modules/camelcase-keys/index.js new file mode 100644 index 00000000..0eca08c8 --- /dev/null +++ b/node_modules/camelcase-keys/index.js @@ -0,0 +1,12 @@ +'use strict'; +var mapObj = require('map-obj'); +var camelCase = require('camelcase'); + +module.exports = function (input, options) { + options = options || {}; + var exclude = options.exclude || []; + return mapObj(input, function (key, val) { + key = exclude.indexOf(key) === -1 ? camelCase(key) : key; + return [key, val]; + }); +}; diff --git a/node_modules/camelcase-keys/license b/node_modules/camelcase-keys/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/camelcase-keys/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/camelcase-keys/node_modules/camelcase/index.js b/node_modules/camelcase-keys/node_modules/camelcase/index.js new file mode 100644 index 00000000..929facb6 --- /dev/null +++ b/node_modules/camelcase-keys/node_modules/camelcase/index.js @@ -0,0 +1,56 @@ +'use strict'; + +function preserveCamelCase(str) { + var isLastCharLower = false; + + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i); + + if (isLastCharLower && (/[a-zA-Z]/).test(c) && c.toUpperCase() === c) { + str = str.substr(0, i) + '-' + str.substr(i); + isLastCharLower = false; + i++; + } else { + isLastCharLower = (c.toLowerCase() === c); + } + } + + return str; +} + +module.exports = function () { + var str = [].map.call(arguments, function (str) { + return str.trim(); + }).filter(function (str) { + return str.length; + }).join('-'); + + if (!str.length) { + return ''; + } + + if (str.length === 1) { + return str; + } + + if (!(/[_.\- ]+/).test(str)) { + if (str === str.toUpperCase()) { + return str.toLowerCase(); + } + + if (str[0] !== str[0].toLowerCase()) { + return str[0].toLowerCase() + str.slice(1); + } + + return str; + } + + str = preserveCamelCase(str); + + return str + .replace(/^[_.\- ]+/, '') + .toLowerCase() + .replace(/[_.\- ]+(\w|$)/g, function (m, p1) { + return p1.toUpperCase(); + }); +}; diff --git a/node_modules/camelcase-keys/node_modules/camelcase/license b/node_modules/camelcase-keys/node_modules/camelcase/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/camelcase-keys/node_modules/camelcase/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/camelcase-keys/node_modules/camelcase/package.json b/node_modules/camelcase-keys/node_modules/camelcase/package.json new file mode 100644 index 00000000..6cee2b52 --- /dev/null +++ b/node_modules/camelcase-keys/node_modules/camelcase/package.json @@ -0,0 +1,39 @@ +{ + "name": "camelcase", + "version": "2.1.1", + "description": "Convert a dash/dot/underscore/space separated string to camelCase: foo-bar → fooBar", + "license": "MIT", + "repository": "sindresorhus/camelcase", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "camelcase", + "camel-case", + "camel", + "case", + "dash", + "hyphen", + "dot", + "underscore", + "separator", + "string", + "text", + "convert" + ], + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/camelcase-keys/node_modules/camelcase/readme.md b/node_modules/camelcase-keys/node_modules/camelcase/readme.md new file mode 100644 index 00000000..080b2a10 --- /dev/null +++ b/node_modules/camelcase-keys/node_modules/camelcase/readme.md @@ -0,0 +1,57 @@ +# camelcase [![Build Status](https://travis-ci.org/sindresorhus/camelcase.svg?branch=master)](https://travis-ci.org/sindresorhus/camelcase) + +> Convert a dash/dot/underscore/space separated string to camelCase: `foo-bar` → `fooBar` + + +## Install + +``` +$ npm install --save camelcase +``` + + +## Usage + +```js +const camelCase = require('camelcase'); + +camelCase('foo-bar'); +//=> 'fooBar' + +camelCase('foo_bar'); +//=> 'fooBar' + +camelCase('Foo-Bar'); +//=> 'fooBar' + +camelCase('--foo.bar'); +//=> 'fooBar' + +camelCase('__foo__bar__'); +//=> 'fooBar' + +camelCase('foo bar'); +//=> 'fooBar' + +console.log(process.argv[3]); +//=> '--foo-bar' +camelCase(process.argv[3]); +//=> 'fooBar' + +camelCase('foo', 'bar'); +//=> 'fooBar' + +camelCase('__foo__', '--bar'); +//=> 'fooBar' +``` + + +## Related + +- [decamelize](https://github.com/sindresorhus/decamelize) - The inverse of this module +- [uppercamelcase](https://github.com/SamVerschueren/uppercamelcase) - Like this module, but to PascalCase instead of camelCase + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/camelcase-keys/package.json b/node_modules/camelcase-keys/package.json new file mode 100644 index 00000000..44a34de2 --- /dev/null +++ b/node_modules/camelcase-keys/package.json @@ -0,0 +1,52 @@ +{ + "name": "camelcase-keys", + "version": "2.1.0", + "description": "Convert object keys to camelCase", + "license": "MIT", + "repository": "sindresorhus/camelcase-keys", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "map", + "obj", + "object", + "key", + "keys", + "value", + "values", + "val", + "iterate", + "camelcase", + "camel-case", + "camel", + "case", + "dash", + "hyphen", + "dot", + "underscore", + "separator", + "string", + "text", + "convert" + ], + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } +} diff --git a/node_modules/camelcase-keys/readme.md b/node_modules/camelcase-keys/readme.md new file mode 100644 index 00000000..ca373287 --- /dev/null +++ b/node_modules/camelcase-keys/readme.md @@ -0,0 +1,54 @@ +# camelcase-keys [![Build Status](https://travis-ci.org/sindresorhus/camelcase-keys.svg?branch=master)](https://travis-ci.org/sindresorhus/camelcase-keys) + +> Convert object keys to camelCase using [`camelcase`](https://github.com/sindresorhus/camelcase) + + +## Install + +``` +$ npm install --save camelcase-keys +``` + + +## Usage + +```js +const camelcaseKeys = require('camelcase-keys'); + +camelcaseKeys({'foo-bar': true}); +//=> {fooBar: true} + + +const argv = require('minimist')(process.argv.slice(2)); +//=> {_: [], 'foo-bar': true} + +camelcaseKeys(argv); +//=> {_: [], fooBar: true} +``` + + +## API + +### camelcaseKeys(input, [options]) + +#### input + +Type: `object` + +Object to camelCase. + +#### options + +Type: `object` + +##### exclude + +Type: `array` +Default: `[]` + +Exclude keys from being camelCased. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/camelcase/index.js b/node_modules/camelcase/index.js new file mode 100644 index 00000000..5670f73f --- /dev/null +++ b/node_modules/camelcase/index.js @@ -0,0 +1,56 @@ +'use strict'; + +function preserveCamelCase(str) { + var isLastCharLower = false; + + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i); + + if (isLastCharLower && (/[a-zA-Z]/).test(c) && c.toUpperCase() === c) { + str = str.substr(0, i) + '-' + str.substr(i); + isLastCharLower = false; + i++; + } else { + isLastCharLower = (c.toLowerCase() === c); + } + } + + return str; +} + +module.exports = function () { + var str = [].map.call(arguments, function (str) { + return str.trim(); + }).filter(function (str) { + return str.length; + }).join('-'); + + if (!str.length) { + return ''; + } + + if (str.length === 1) { + return str.toLowerCase(); + } + + if (!(/[_.\- ]+/).test(str)) { + if (str === str.toUpperCase()) { + return str.toLowerCase(); + } + + if (str[0] !== str[0].toLowerCase()) { + return str[0].toLowerCase() + str.slice(1); + } + + return str; + } + + str = preserveCamelCase(str); + + return str + .replace(/^[_.\- ]+/, '') + .toLowerCase() + .replace(/[_.\- ]+(\w|$)/g, function (m, p1) { + return p1.toUpperCase(); + }); +}; diff --git a/node_modules/camelcase/license b/node_modules/camelcase/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/camelcase/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/camelcase/package.json b/node_modules/camelcase/package.json new file mode 100644 index 00000000..a404754e --- /dev/null +++ b/node_modules/camelcase/package.json @@ -0,0 +1,39 @@ +{ + "name": "camelcase", + "version": "3.0.0", + "description": "Convert a dash/dot/underscore/space separated string to camelCase: foo-bar → fooBar", + "license": "MIT", + "repository": "sindresorhus/camelcase", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "camelcase", + "camel-case", + "camel", + "case", + "dash", + "hyphen", + "dot", + "underscore", + "separator", + "string", + "text", + "convert" + ], + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/camelcase/readme.md b/node_modules/camelcase/readme.md new file mode 100644 index 00000000..080b2a10 --- /dev/null +++ b/node_modules/camelcase/readme.md @@ -0,0 +1,57 @@ +# camelcase [![Build Status](https://travis-ci.org/sindresorhus/camelcase.svg?branch=master)](https://travis-ci.org/sindresorhus/camelcase) + +> Convert a dash/dot/underscore/space separated string to camelCase: `foo-bar` → `fooBar` + + +## Install + +``` +$ npm install --save camelcase +``` + + +## Usage + +```js +const camelCase = require('camelcase'); + +camelCase('foo-bar'); +//=> 'fooBar' + +camelCase('foo_bar'); +//=> 'fooBar' + +camelCase('Foo-Bar'); +//=> 'fooBar' + +camelCase('--foo.bar'); +//=> 'fooBar' + +camelCase('__foo__bar__'); +//=> 'fooBar' + +camelCase('foo bar'); +//=> 'fooBar' + +console.log(process.argv[3]); +//=> '--foo-bar' +camelCase(process.argv[3]); +//=> 'fooBar' + +camelCase('foo', 'bar'); +//=> 'fooBar' + +camelCase('__foo__', '--bar'); +//=> 'fooBar' +``` + + +## Related + +- [decamelize](https://github.com/sindresorhus/decamelize) - The inverse of this module +- [uppercamelcase](https://github.com/SamVerschueren/uppercamelcase) - Like this module, but to PascalCase instead of camelCase + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/caseless/LICENSE b/node_modules/caseless/LICENSE new file mode 100644 index 00000000..61789f4a --- /dev/null +++ b/node_modules/caseless/LICENSE @@ -0,0 +1,28 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/caseless/README.md b/node_modules/caseless/README.md new file mode 100644 index 00000000..e5077a21 --- /dev/null +++ b/node_modules/caseless/README.md @@ -0,0 +1,45 @@ +## Caseless -- wrap an object to set and get property with caseless semantics but also preserve caseing. + +This library is incredibly useful when working with HTTP headers. It allows you to get/set/check for headers in a caseless manner while also preserving the caseing of headers the first time they are set. + +## Usage + +```javascript +var headers = {} + , c = caseless(headers) + ; +c.set('a-Header', 'asdf') +c.get('a-header') === 'asdf' +``` + +## has(key) + +Has takes a name and if it finds a matching header will return that header name with the preserved caseing it was set with. + +```javascript +c.has('a-header') === 'a-Header' +``` + +## set(key, value[, clobber=true]) + +Set is fairly straight forward except that if the header exists and clobber is disabled it will add `','+value` to the existing header. + +```javascript +c.set('a-Header', 'fdas') +c.set('a-HEADER', 'more', false) +c.get('a-header') === 'fdsa,more' +``` + +## swap(key) + +Swaps the casing of a header with the new one that is passed in. + +```javascript +var headers = {} + , c = caseless(headers) + ; +c.set('a-Header', 'fdas') +c.swap('a-HEADER') +c.has('a-header') === 'a-HEADER' +headers === {'a-HEADER': 'fdas'} +``` diff --git a/node_modules/caseless/index.js b/node_modules/caseless/index.js new file mode 100644 index 00000000..b194734e --- /dev/null +++ b/node_modules/caseless/index.js @@ -0,0 +1,67 @@ +function Caseless (dict) { + this.dict = dict || {} +} +Caseless.prototype.set = function (name, value, clobber) { + if (typeof name === 'object') { + for (var i in name) { + this.set(i, name[i], value) + } + } else { + if (typeof clobber === 'undefined') clobber = true + var has = this.has(name) + + if (!clobber && has) this.dict[has] = this.dict[has] + ',' + value + else this.dict[has || name] = value + return has + } +} +Caseless.prototype.has = function (name) { + var keys = Object.keys(this.dict) + , name = name.toLowerCase() + ; + for (var i=0;i", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/mikeal/caseless/issues" + }, + "devDependencies": { + "tape": "^2.10.2" + } +} diff --git a/node_modules/caseless/test.js b/node_modules/caseless/test.js new file mode 100644 index 00000000..f55196cc --- /dev/null +++ b/node_modules/caseless/test.js @@ -0,0 +1,67 @@ +var tape = require('tape') + , caseless = require('./') + ; + +tape('set get has', function (t) { + var headers = {} + , c = caseless(headers) + ; + t.plan(17) + c.set('a-Header', 'asdf') + t.equal(c.get('a-header'), 'asdf') + t.equal(c.has('a-header'), 'a-Header') + t.ok(!c.has('nothing')) + // old bug where we used the wrong regex + t.ok(!c.has('a-hea')) + c.set('a-header', 'fdsa') + t.equal(c.get('a-header'), 'fdsa') + t.equal(c.get('a-Header'), 'fdsa') + c.set('a-HEADER', 'more', false) + t.equal(c.get('a-header'), 'fdsa,more') + + t.deepEqual(headers, {'a-Header': 'fdsa,more'}) + c.swap('a-HEADER') + t.deepEqual(headers, {'a-HEADER': 'fdsa,more'}) + + c.set('deleteme', 'foobar') + t.ok(c.has('deleteme')) + t.ok(c.del('deleteme')) + t.notOk(c.has('deleteme')) + t.notOk(c.has('idonotexist')) + t.ok(c.del('idonotexist')) + + c.set('tva', 'test1') + c.set('tva-header', 'test2') + t.equal(c.has('tva'), 'tva') + t.notOk(c.has('header')) + + t.equal(c.get('tva'), 'test1') + +}) + +tape('swap', function (t) { + var headers = {} + , c = caseless(headers) + ; + t.plan(4) + // No Header to Swap. + t.throws(function () { + c.swap('content-type') + }) + // Set Header. + c.set('content-type', 'application/json') + // Swap Header With Itself. + c.swap('content-type') + // Does Not Delete Itself. + t.ok(c.has('content-type')) + // Swap Header With a Different Header. + c.swap('Content-Type') + // Still Has Header. + t.ok(c.has('Content-Type')) + // Delete Header. + c.del('Content-Type') + // No Header to Swap. + t.throws(function () { + c.swap('content-type') + }) +}) diff --git a/node_modules/chalk/index.js b/node_modules/chalk/index.js new file mode 100644 index 00000000..1cc5fa89 --- /dev/null +++ b/node_modules/chalk/index.js @@ -0,0 +1,228 @@ +'use strict'; +const escapeStringRegexp = require('escape-string-regexp'); +const ansiStyles = require('ansi-styles'); +const stdoutColor = require('supports-color').stdout; + +const template = require('./templates.js'); + +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); + +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; + +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); + +const styles = Object.create(null); + +function applyOptions(obj, options) { + options = options || {}; + + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; +} + +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); + + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; + + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); + + chalk.template.constructor = Chalk; + + return chalk.template; + } + + applyOptions(this, options); +} + +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} + +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} + +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; + +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } + + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} + +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } + + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} + +const proto = Object.defineProperties(() => {}, styles); + +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; + + builder._styles = _styles; + builder._empty = _empty; + + const self = this; + + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); + + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto + + return builder; +} + +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); + + if (argsLen === 0) { + return ''; + } + + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } + + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } + + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; + + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } + + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; + + return str; +} + +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } + + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; + + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } + + return template(chalk, parts.join('')); +} + +Object.defineProperties(Chalk.prototype, styles); + +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript diff --git a/node_modules/chalk/index.js.flow b/node_modules/chalk/index.js.flow new file mode 100644 index 00000000..622caaa2 --- /dev/null +++ b/node_modules/chalk/index.js.flow @@ -0,0 +1,93 @@ +// @flow strict + +type TemplateStringsArray = $ReadOnlyArray; + +export type Level = $Values<{ + None: 0, + Basic: 1, + Ansi256: 2, + TrueColor: 3 +}>; + +export type ChalkOptions = {| + enabled?: boolean, + level?: Level +|}; + +export type ColorSupport = {| + level: Level, + hasBasic: boolean, + has256: boolean, + has16m: boolean +|}; + +export interface Chalk { + (...text: string[]): string, + (text: TemplateStringsArray, ...placeholders: string[]): string, + constructor(options?: ChalkOptions): Chalk, + enabled: boolean, + level: Level, + rgb(r: number, g: number, b: number): Chalk, + hsl(h: number, s: number, l: number): Chalk, + hsv(h: number, s: number, v: number): Chalk, + hwb(h: number, w: number, b: number): Chalk, + bgHex(color: string): Chalk, + bgKeyword(color: string): Chalk, + bgRgb(r: number, g: number, b: number): Chalk, + bgHsl(h: number, s: number, l: number): Chalk, + bgHsv(h: number, s: number, v: number): Chalk, + bgHwb(h: number, w: number, b: number): Chalk, + hex(color: string): Chalk, + keyword(color: string): Chalk, + + +reset: Chalk, + +bold: Chalk, + +dim: Chalk, + +italic: Chalk, + +underline: Chalk, + +inverse: Chalk, + +hidden: Chalk, + +strikethrough: Chalk, + + +visible: Chalk, + + +black: Chalk, + +red: Chalk, + +green: Chalk, + +yellow: Chalk, + +blue: Chalk, + +magenta: Chalk, + +cyan: Chalk, + +white: Chalk, + +gray: Chalk, + +grey: Chalk, + +blackBright: Chalk, + +redBright: Chalk, + +greenBright: Chalk, + +yellowBright: Chalk, + +blueBright: Chalk, + +magentaBright: Chalk, + +cyanBright: Chalk, + +whiteBright: Chalk, + + +bgBlack: Chalk, + +bgRed: Chalk, + +bgGreen: Chalk, + +bgYellow: Chalk, + +bgBlue: Chalk, + +bgMagenta: Chalk, + +bgCyan: Chalk, + +bgWhite: Chalk, + +bgBlackBright: Chalk, + +bgRedBright: Chalk, + +bgGreenBright: Chalk, + +bgYellowBright: Chalk, + +bgBlueBright: Chalk, + +bgMagentaBright: Chalk, + +bgCyanBright: Chalk, + +bgWhiteBrigh: Chalk, + + supportsColor: ColorSupport +}; + +declare module.exports: Chalk; diff --git a/node_modules/chalk/license b/node_modules/chalk/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/chalk/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/chalk/package.json b/node_modules/chalk/package.json new file mode 100644 index 00000000..bc324685 --- /dev/null +++ b/node_modules/chalk/package.json @@ -0,0 +1,71 @@ +{ + "name": "chalk", + "version": "2.4.2", + "description": "Terminal string styling done right", + "license": "MIT", + "repository": "chalk/chalk", + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && tsc --project types && flow --max-warnings=0 && nyc ava", + "bench": "matcha benchmark.js", + "coveralls": "nyc report --reporter=text-lcov | coveralls" + }, + "files": [ + "index.js", + "templates.js", + "types/index.d.ts", + "index.js.flow" + ], + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "str", + "ansi", + "style", + "styles", + "tty", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "devDependencies": { + "ava": "*", + "coveralls": "^3.0.0", + "execa": "^0.9.0", + "flow-bin": "^0.68.0", + "import-fresh": "^2.0.0", + "matcha": "^0.7.0", + "nyc": "^11.0.2", + "resolve-from": "^4.0.0", + "typescript": "^2.5.3", + "xo": "*" + }, + "types": "types/index.d.ts", + "xo": { + "envs": [ + "node", + "mocha" + ], + "ignores": [ + "test/_flow.js" + ] + } +} diff --git a/node_modules/chalk/readme.md b/node_modules/chalk/readme.md new file mode 100644 index 00000000..d298e2c4 --- /dev/null +++ b/node_modules/chalk/readme.md @@ -0,0 +1,314 @@ +

      +
      +
      + Chalk +
      +
      +
      +

      + +> Terminal string styling done right + +[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) [![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) [![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) [![Mentioned in Awesome Node.js](https://awesome.re/mentioned-badge.svg)](https://github.com/sindresorhus/awesome-nodejs) + +### [See what's new in Chalk 2](https://github.com/chalk/chalk/releases/tag/v2.0.0) + + + + +## Highlights + +- Expressive API +- Highly performant +- Ability to nest styles +- [256/Truecolor color support](#256-and-truecolor-color-support) +- Auto-detects color support +- Doesn't extend `String.prototype` +- Clean and focused +- Actively maintained +- [Used by ~23,000 packages](https://www.npmjs.com/browse/depended/chalk) as of December 31, 2017 + + +## Install + +```console +$ npm install chalk +``` + + + + + + +## Usage + +```js +const chalk = require('chalk'); + +console.log(chalk.blue('Hello world!')); +``` + +Chalk comes with an easy to use composable API where you just chain and nest the styles you want. + +```js +const chalk = require('chalk'); +const log = console.log; + +// Combine styled and normal strings +log(chalk.blue('Hello') + ' World' + chalk.red('!')); + +// Compose multiple styles using the chainable API +log(chalk.blue.bgRed.bold('Hello world!')); + +// Pass in multiple arguments +log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz')); + +// Nest styles +log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!')); + +// Nest styles of the same type even (color, underline, background) +log(chalk.green( + 'I am a green line ' + + chalk.blue.underline.bold('with a blue substring') + + ' that becomes green again!' +)); + +// ES2015 template literal +log(` +CPU: ${chalk.red('90%')} +RAM: ${chalk.green('40%')} +DISK: ${chalk.yellow('70%')} +`); + +// ES2015 tagged template literal +log(chalk` +CPU: {red ${cpu.totalPercent}%} +RAM: {green ${ram.used / ram.total * 100}%} +DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} +`); + +// Use RGB colors in terminal emulators that support it. +log(chalk.keyword('orange')('Yay for orange colored text!')); +log(chalk.rgb(123, 45, 67).underline('Underlined reddish color')); +log(chalk.hex('#DEADED').bold('Bold gray!')); +``` + +Easily define your own themes: + +```js +const chalk = require('chalk'); + +const error = chalk.bold.red; +const warning = chalk.keyword('orange'); + +console.log(error('Error!')); +console.log(warning('Warning!')); +``` + +Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args): + +```js +const name = 'Sindre'; +console.log(chalk.green('Hello %s'), name); +//=> 'Hello Sindre' +``` + + +## API + +### chalk.` +Browserstack-logo-white + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/psl/data/rules.json b/node_modules/psl/data/rules.json new file mode 100644 index 00000000..e19abdc8 --- /dev/null +++ b/node_modules/psl/data/rules.json @@ -0,0 +1,8834 @@ +[ +"ac", +"com.ac", +"edu.ac", +"gov.ac", +"net.ac", +"mil.ac", +"org.ac", +"ad", +"nom.ad", +"ae", +"co.ae", +"net.ae", +"org.ae", +"sch.ae", +"ac.ae", +"gov.ae", +"mil.ae", +"aero", +"accident-investigation.aero", +"accident-prevention.aero", +"aerobatic.aero", +"aeroclub.aero", +"aerodrome.aero", +"agents.aero", +"aircraft.aero", +"airline.aero", +"airport.aero", +"air-surveillance.aero", +"airtraffic.aero", +"air-traffic-control.aero", +"ambulance.aero", +"amusement.aero", +"association.aero", +"author.aero", +"ballooning.aero", +"broker.aero", +"caa.aero", +"cargo.aero", +"catering.aero", +"certification.aero", +"championship.aero", +"charter.aero", +"civilaviation.aero", +"club.aero", +"conference.aero", +"consultant.aero", +"consulting.aero", +"control.aero", +"council.aero", +"crew.aero", +"design.aero", +"dgca.aero", +"educator.aero", +"emergency.aero", +"engine.aero", +"engineer.aero", +"entertainment.aero", +"equipment.aero", +"exchange.aero", +"express.aero", +"federation.aero", +"flight.aero", +"freight.aero", +"fuel.aero", +"gliding.aero", +"government.aero", +"groundhandling.aero", +"group.aero", +"hanggliding.aero", +"homebuilt.aero", +"insurance.aero", +"journal.aero", +"journalist.aero", +"leasing.aero", +"logistics.aero", +"magazine.aero", +"maintenance.aero", +"media.aero", +"microlight.aero", +"modelling.aero", +"navigation.aero", +"parachuting.aero", +"paragliding.aero", +"passenger-association.aero", +"pilot.aero", +"press.aero", +"production.aero", +"recreation.aero", +"repbody.aero", +"res.aero", +"research.aero", +"rotorcraft.aero", +"safety.aero", +"scientist.aero", +"services.aero", +"show.aero", +"skydiving.aero", +"software.aero", +"student.aero", +"trader.aero", +"trading.aero", +"trainer.aero", +"union.aero", +"workinggroup.aero", +"works.aero", +"af", +"gov.af", +"com.af", +"org.af", +"net.af", +"edu.af", +"ag", +"com.ag", +"org.ag", +"net.ag", +"co.ag", +"nom.ag", +"ai", +"off.ai", +"com.ai", +"net.ai", +"org.ai", +"al", +"com.al", +"edu.al", +"gov.al", +"mil.al", +"net.al", +"org.al", +"am", +"co.am", +"com.am", +"commune.am", +"net.am", +"org.am", +"ao", +"ed.ao", +"gv.ao", +"og.ao", +"co.ao", +"pb.ao", +"it.ao", +"aq", +"ar", +"com.ar", +"edu.ar", +"gob.ar", +"gov.ar", +"int.ar", +"mil.ar", +"musica.ar", +"net.ar", +"org.ar", +"tur.ar", +"arpa", +"e164.arpa", +"in-addr.arpa", +"ip6.arpa", +"iris.arpa", +"uri.arpa", +"urn.arpa", +"as", +"gov.as", +"asia", +"at", +"ac.at", +"co.at", +"gv.at", +"or.at", +"au", +"com.au", +"net.au", +"org.au", +"edu.au", +"gov.au", +"asn.au", +"id.au", +"info.au", +"conf.au", +"oz.au", +"act.au", +"nsw.au", +"nt.au", +"qld.au", +"sa.au", +"tas.au", +"vic.au", +"wa.au", +"act.edu.au", +"catholic.edu.au", +"nsw.edu.au", +"nt.edu.au", +"qld.edu.au", +"sa.edu.au", +"tas.edu.au", +"vic.edu.au", +"wa.edu.au", +"qld.gov.au", +"sa.gov.au", +"tas.gov.au", +"vic.gov.au", +"wa.gov.au", +"education.tas.edu.au", +"schools.nsw.edu.au", +"aw", +"com.aw", +"ax", +"az", +"com.az", +"net.az", +"int.az", +"gov.az", +"org.az", +"edu.az", +"info.az", +"pp.az", +"mil.az", +"name.az", +"pro.az", +"biz.az", +"ba", +"com.ba", +"edu.ba", +"gov.ba", +"mil.ba", +"net.ba", +"org.ba", +"bb", +"biz.bb", +"co.bb", +"com.bb", +"edu.bb", +"gov.bb", +"info.bb", +"net.bb", +"org.bb", +"store.bb", +"tv.bb", +"*.bd", +"be", +"ac.be", +"bf", +"gov.bf", +"bg", +"a.bg", +"b.bg", +"c.bg", +"d.bg", +"e.bg", +"f.bg", +"g.bg", +"h.bg", +"i.bg", +"j.bg", +"k.bg", +"l.bg", +"m.bg", +"n.bg", +"o.bg", +"p.bg", +"q.bg", +"r.bg", +"s.bg", +"t.bg", +"u.bg", +"v.bg", +"w.bg", +"x.bg", +"y.bg", +"z.bg", +"0.bg", +"1.bg", +"2.bg", +"3.bg", +"4.bg", +"5.bg", +"6.bg", +"7.bg", +"8.bg", +"9.bg", +"bh", +"com.bh", +"edu.bh", +"net.bh", +"org.bh", +"gov.bh", +"bi", +"co.bi", +"com.bi", +"edu.bi", +"or.bi", +"org.bi", +"biz", +"bj", +"asso.bj", +"barreau.bj", +"gouv.bj", +"bm", +"com.bm", +"edu.bm", +"gov.bm", +"net.bm", +"org.bm", +"bn", +"com.bn", +"edu.bn", +"gov.bn", +"net.bn", +"org.bn", +"bo", +"com.bo", +"edu.bo", +"gob.bo", +"int.bo", +"org.bo", +"net.bo", +"mil.bo", +"tv.bo", +"web.bo", +"academia.bo", +"agro.bo", +"arte.bo", +"blog.bo", +"bolivia.bo", +"ciencia.bo", +"cooperativa.bo", +"democracia.bo", +"deporte.bo", +"ecologia.bo", +"economia.bo", +"empresa.bo", +"indigena.bo", +"industria.bo", +"info.bo", +"medicina.bo", +"movimiento.bo", +"musica.bo", +"natural.bo", +"nombre.bo", +"noticias.bo", +"patria.bo", +"politica.bo", +"profesional.bo", +"plurinacional.bo", +"pueblo.bo", +"revista.bo", +"salud.bo", +"tecnologia.bo", +"tksat.bo", +"transporte.bo", +"wiki.bo", +"br", +"9guacu.br", +"abc.br", +"adm.br", +"adv.br", +"agr.br", +"aju.br", +"am.br", +"anani.br", +"aparecida.br", +"arq.br", +"art.br", +"ato.br", +"b.br", +"barueri.br", +"belem.br", +"bhz.br", +"bio.br", +"blog.br", +"bmd.br", +"boavista.br", +"bsb.br", +"campinagrande.br", +"campinas.br", +"caxias.br", +"cim.br", +"cng.br", +"cnt.br", +"com.br", +"contagem.br", +"coop.br", +"cri.br", +"cuiaba.br", +"curitiba.br", +"def.br", +"ecn.br", +"eco.br", +"edu.br", +"emp.br", +"eng.br", +"esp.br", +"etc.br", +"eti.br", +"far.br", +"feira.br", +"flog.br", +"floripa.br", +"fm.br", +"fnd.br", +"fortal.br", +"fot.br", +"foz.br", +"fst.br", +"g12.br", +"ggf.br", +"goiania.br", +"gov.br", +"ac.gov.br", +"al.gov.br", +"am.gov.br", +"ap.gov.br", +"ba.gov.br", +"ce.gov.br", +"df.gov.br", +"es.gov.br", +"go.gov.br", +"ma.gov.br", +"mg.gov.br", +"ms.gov.br", +"mt.gov.br", +"pa.gov.br", +"pb.gov.br", +"pe.gov.br", +"pi.gov.br", +"pr.gov.br", +"rj.gov.br", +"rn.gov.br", +"ro.gov.br", +"rr.gov.br", +"rs.gov.br", +"sc.gov.br", +"se.gov.br", +"sp.gov.br", +"to.gov.br", +"gru.br", +"imb.br", +"ind.br", +"inf.br", +"jab.br", +"jampa.br", +"jdf.br", +"joinville.br", +"jor.br", +"jus.br", +"leg.br", +"lel.br", +"londrina.br", +"macapa.br", +"maceio.br", +"manaus.br", +"maringa.br", +"mat.br", +"med.br", +"mil.br", +"morena.br", +"mp.br", +"mus.br", +"natal.br", +"net.br", +"niteroi.br", +"*.nom.br", +"not.br", +"ntr.br", +"odo.br", +"ong.br", +"org.br", +"osasco.br", +"palmas.br", +"poa.br", +"ppg.br", +"pro.br", +"psc.br", +"psi.br", +"pvh.br", +"qsl.br", +"radio.br", +"rec.br", +"recife.br", +"ribeirao.br", +"rio.br", +"riobranco.br", +"riopreto.br", +"salvador.br", +"sampa.br", +"santamaria.br", +"santoandre.br", +"saobernardo.br", +"saogonca.br", +"sjc.br", +"slg.br", +"slz.br", +"sorocaba.br", +"srv.br", +"taxi.br", +"tc.br", +"teo.br", +"the.br", +"tmp.br", +"trd.br", +"tur.br", +"tv.br", +"udi.br", +"vet.br", +"vix.br", +"vlog.br", +"wiki.br", +"zlg.br", +"bs", +"com.bs", +"net.bs", +"org.bs", +"edu.bs", +"gov.bs", +"bt", +"com.bt", +"edu.bt", +"gov.bt", +"net.bt", +"org.bt", +"bv", +"bw", +"co.bw", +"org.bw", +"by", +"gov.by", +"mil.by", +"com.by", +"of.by", +"bz", +"com.bz", +"net.bz", +"org.bz", +"edu.bz", +"gov.bz", +"ca", +"ab.ca", +"bc.ca", +"mb.ca", +"nb.ca", +"nf.ca", +"nl.ca", +"ns.ca", +"nt.ca", +"nu.ca", +"on.ca", +"pe.ca", +"qc.ca", +"sk.ca", +"yk.ca", +"gc.ca", +"cat", +"cc", +"cd", +"gov.cd", +"cf", +"cg", +"ch", +"ci", +"org.ci", +"or.ci", +"com.ci", +"co.ci", +"edu.ci", +"ed.ci", +"ac.ci", +"net.ci", +"go.ci", +"asso.ci", +"aéroport.ci", +"int.ci", +"presse.ci", +"md.ci", +"gouv.ci", +"*.ck", +"!www.ck", +"cl", +"aprendemas.cl", +"co.cl", +"gob.cl", +"gov.cl", +"mil.cl", +"cm", +"co.cm", +"com.cm", +"gov.cm", +"net.cm", +"cn", +"ac.cn", +"com.cn", +"edu.cn", +"gov.cn", +"net.cn", +"org.cn", +"mil.cn", +"公司.cn", +"网络.cn", +"網絡.cn", +"ah.cn", +"bj.cn", +"cq.cn", +"fj.cn", +"gd.cn", +"gs.cn", +"gz.cn", +"gx.cn", +"ha.cn", +"hb.cn", +"he.cn", +"hi.cn", +"hl.cn", +"hn.cn", +"jl.cn", +"js.cn", +"jx.cn", +"ln.cn", +"nm.cn", +"nx.cn", +"qh.cn", +"sc.cn", +"sd.cn", +"sh.cn", +"sn.cn", +"sx.cn", +"tj.cn", +"xj.cn", +"xz.cn", +"yn.cn", +"zj.cn", +"hk.cn", +"mo.cn", +"tw.cn", +"co", +"arts.co", +"com.co", +"edu.co", +"firm.co", +"gov.co", +"info.co", +"int.co", +"mil.co", +"net.co", +"nom.co", +"org.co", +"rec.co", +"web.co", +"com", +"coop", +"cr", +"ac.cr", +"co.cr", +"ed.cr", +"fi.cr", +"go.cr", +"or.cr", +"sa.cr", +"cu", +"com.cu", +"edu.cu", +"org.cu", +"net.cu", +"gov.cu", +"inf.cu", +"cv", +"cw", +"com.cw", +"edu.cw", +"net.cw", +"org.cw", +"cx", +"gov.cx", +"cy", +"ac.cy", +"biz.cy", +"com.cy", +"ekloges.cy", +"gov.cy", +"ltd.cy", +"name.cy", +"net.cy", +"org.cy", +"parliament.cy", +"press.cy", +"pro.cy", +"tm.cy", +"cz", +"de", +"dj", +"dk", +"dm", +"com.dm", +"net.dm", +"org.dm", +"edu.dm", +"gov.dm", +"do", +"art.do", +"com.do", +"edu.do", +"gob.do", +"gov.do", +"mil.do", +"net.do", +"org.do", +"sld.do", +"web.do", +"dz", +"com.dz", +"org.dz", +"net.dz", +"gov.dz", +"edu.dz", +"asso.dz", +"pol.dz", +"art.dz", +"ec", +"com.ec", +"info.ec", +"net.ec", +"fin.ec", +"k12.ec", +"med.ec", +"pro.ec", +"org.ec", +"edu.ec", +"gov.ec", +"gob.ec", +"mil.ec", +"edu", +"ee", +"edu.ee", +"gov.ee", +"riik.ee", +"lib.ee", +"med.ee", +"com.ee", +"pri.ee", +"aip.ee", +"org.ee", +"fie.ee", +"eg", +"com.eg", +"edu.eg", +"eun.eg", +"gov.eg", +"mil.eg", +"name.eg", +"net.eg", +"org.eg", +"sci.eg", +"*.er", +"es", +"com.es", +"nom.es", +"org.es", +"gob.es", +"edu.es", +"et", +"com.et", +"gov.et", +"org.et", +"edu.et", +"biz.et", +"name.et", +"info.et", +"net.et", +"eu", +"fi", +"aland.fi", +"fj", +"ac.fj", +"biz.fj", +"com.fj", +"gov.fj", +"info.fj", +"mil.fj", +"name.fj", +"net.fj", +"org.fj", +"pro.fj", +"*.fk", +"fm", +"fo", +"fr", +"asso.fr", +"com.fr", +"gouv.fr", +"nom.fr", +"prd.fr", +"tm.fr", +"aeroport.fr", +"avocat.fr", +"avoues.fr", +"cci.fr", +"chambagri.fr", +"chirurgiens-dentistes.fr", +"experts-comptables.fr", +"geometre-expert.fr", +"greta.fr", +"huissier-justice.fr", +"medecin.fr", +"notaires.fr", +"pharmacien.fr", +"port.fr", +"veterinaire.fr", +"ga", +"gb", +"gd", +"ge", +"com.ge", +"edu.ge", +"gov.ge", +"org.ge", +"mil.ge", +"net.ge", +"pvt.ge", +"gf", +"gg", +"co.gg", +"net.gg", +"org.gg", +"gh", +"com.gh", +"edu.gh", +"gov.gh", +"org.gh", +"mil.gh", +"gi", +"com.gi", +"ltd.gi", +"gov.gi", +"mod.gi", +"edu.gi", +"org.gi", +"gl", +"co.gl", +"com.gl", +"edu.gl", +"net.gl", +"org.gl", +"gm", +"gn", +"ac.gn", +"com.gn", +"edu.gn", +"gov.gn", +"org.gn", +"net.gn", +"gov", +"gp", +"com.gp", +"net.gp", +"mobi.gp", +"edu.gp", +"org.gp", +"asso.gp", +"gq", +"gr", +"com.gr", +"edu.gr", +"net.gr", +"org.gr", +"gov.gr", +"gs", +"gt", +"com.gt", +"edu.gt", +"gob.gt", +"ind.gt", +"mil.gt", +"net.gt", +"org.gt", +"gu", +"com.gu", +"edu.gu", +"gov.gu", +"guam.gu", +"info.gu", +"net.gu", +"org.gu", +"web.gu", +"gw", +"gy", +"co.gy", +"com.gy", +"edu.gy", +"gov.gy", +"net.gy", +"org.gy", +"hk", +"com.hk", +"edu.hk", +"gov.hk", +"idv.hk", +"net.hk", +"org.hk", +"公司.hk", +"教育.hk", +"敎育.hk", +"政府.hk", +"個人.hk", +"个人.hk", +"箇人.hk", +"網络.hk", +"网络.hk", +"组織.hk", +"網絡.hk", +"网絡.hk", +"组织.hk", +"組織.hk", +"組织.hk", +"hm", +"hn", +"com.hn", +"edu.hn", +"org.hn", +"net.hn", +"mil.hn", +"gob.hn", +"hr", +"iz.hr", +"from.hr", +"name.hr", +"com.hr", +"ht", +"com.ht", +"shop.ht", +"firm.ht", +"info.ht", +"adult.ht", +"net.ht", +"pro.ht", +"org.ht", +"med.ht", +"art.ht", +"coop.ht", +"pol.ht", +"asso.ht", +"edu.ht", +"rel.ht", +"gouv.ht", +"perso.ht", +"hu", +"co.hu", +"info.hu", +"org.hu", +"priv.hu", +"sport.hu", +"tm.hu", +"2000.hu", +"agrar.hu", +"bolt.hu", +"casino.hu", +"city.hu", +"erotica.hu", +"erotika.hu", +"film.hu", +"forum.hu", +"games.hu", +"hotel.hu", +"ingatlan.hu", +"jogasz.hu", +"konyvelo.hu", +"lakas.hu", +"media.hu", +"news.hu", +"reklam.hu", +"sex.hu", +"shop.hu", +"suli.hu", +"szex.hu", +"tozsde.hu", +"utazas.hu", +"video.hu", +"id", +"ac.id", +"biz.id", +"co.id", +"desa.id", +"go.id", +"mil.id", +"my.id", +"net.id", +"or.id", +"ponpes.id", +"sch.id", +"web.id", +"ie", +"gov.ie", +"il", +"ac.il", +"co.il", +"gov.il", +"idf.il", +"k12.il", +"muni.il", +"net.il", +"org.il", +"im", +"ac.im", +"co.im", +"com.im", +"ltd.co.im", +"net.im", +"org.im", +"plc.co.im", +"tt.im", +"tv.im", +"in", +"co.in", +"firm.in", +"net.in", +"org.in", +"gen.in", +"ind.in", +"nic.in", +"ac.in", +"edu.in", +"res.in", +"gov.in", +"mil.in", +"info", +"int", +"eu.int", +"io", +"com.io", +"iq", +"gov.iq", +"edu.iq", +"mil.iq", +"com.iq", +"org.iq", +"net.iq", +"ir", +"ac.ir", +"co.ir", +"gov.ir", +"id.ir", +"net.ir", +"org.ir", +"sch.ir", +"ایران.ir", +"ايران.ir", +"is", +"net.is", +"com.is", +"edu.is", +"gov.is", +"org.is", +"int.is", +"it", +"gov.it", +"edu.it", +"abr.it", +"abruzzo.it", +"aosta-valley.it", +"aostavalley.it", +"bas.it", +"basilicata.it", +"cal.it", +"calabria.it", +"cam.it", +"campania.it", +"emilia-romagna.it", +"emiliaromagna.it", +"emr.it", +"friuli-v-giulia.it", +"friuli-ve-giulia.it", +"friuli-vegiulia.it", +"friuli-venezia-giulia.it", +"friuli-veneziagiulia.it", +"friuli-vgiulia.it", +"friuliv-giulia.it", +"friulive-giulia.it", +"friulivegiulia.it", +"friulivenezia-giulia.it", +"friuliveneziagiulia.it", +"friulivgiulia.it", +"fvg.it", +"laz.it", +"lazio.it", +"lig.it", +"liguria.it", +"lom.it", +"lombardia.it", +"lombardy.it", +"lucania.it", +"mar.it", +"marche.it", +"mol.it", +"molise.it", +"piedmont.it", +"piemonte.it", +"pmn.it", +"pug.it", +"puglia.it", +"sar.it", +"sardegna.it", +"sardinia.it", +"sic.it", +"sicilia.it", +"sicily.it", +"taa.it", +"tos.it", +"toscana.it", +"trentin-sud-tirol.it", +"trentin-süd-tirol.it", +"trentin-sudtirol.it", +"trentin-südtirol.it", +"trentin-sued-tirol.it", +"trentin-suedtirol.it", +"trentino-a-adige.it", +"trentino-aadige.it", +"trentino-alto-adige.it", +"trentino-altoadige.it", +"trentino-s-tirol.it", +"trentino-stirol.it", +"trentino-sud-tirol.it", +"trentino-süd-tirol.it", +"trentino-sudtirol.it", +"trentino-südtirol.it", +"trentino-sued-tirol.it", +"trentino-suedtirol.it", +"trentino.it", +"trentinoa-adige.it", +"trentinoaadige.it", +"trentinoalto-adige.it", +"trentinoaltoadige.it", +"trentinos-tirol.it", +"trentinostirol.it", +"trentinosud-tirol.it", +"trentinosüd-tirol.it", +"trentinosudtirol.it", +"trentinosüdtirol.it", +"trentinosued-tirol.it", +"trentinosuedtirol.it", +"trentinsud-tirol.it", +"trentinsüd-tirol.it", +"trentinsudtirol.it", +"trentinsüdtirol.it", +"trentinsued-tirol.it", +"trentinsuedtirol.it", +"tuscany.it", +"umb.it", +"umbria.it", +"val-d-aosta.it", +"val-daosta.it", +"vald-aosta.it", +"valdaosta.it", +"valle-aosta.it", +"valle-d-aosta.it", +"valle-daosta.it", +"valleaosta.it", +"valled-aosta.it", +"valledaosta.it", +"vallee-aoste.it", +"vallée-aoste.it", +"vallee-d-aoste.it", +"vallée-d-aoste.it", +"valleeaoste.it", +"valléeaoste.it", +"valleedaoste.it", +"valléedaoste.it", +"vao.it", +"vda.it", +"ven.it", +"veneto.it", +"ag.it", +"agrigento.it", +"al.it", +"alessandria.it", +"alto-adige.it", +"altoadige.it", +"an.it", +"ancona.it", +"andria-barletta-trani.it", +"andria-trani-barletta.it", +"andriabarlettatrani.it", +"andriatranibarletta.it", +"ao.it", +"aosta.it", +"aoste.it", +"ap.it", +"aq.it", +"aquila.it", +"ar.it", +"arezzo.it", +"ascoli-piceno.it", +"ascolipiceno.it", +"asti.it", +"at.it", +"av.it", +"avellino.it", +"ba.it", +"balsan-sudtirol.it", +"balsan-südtirol.it", +"balsan-suedtirol.it", +"balsan.it", +"bari.it", +"barletta-trani-andria.it", +"barlettatraniandria.it", +"belluno.it", +"benevento.it", +"bergamo.it", +"bg.it", +"bi.it", +"biella.it", +"bl.it", +"bn.it", +"bo.it", +"bologna.it", +"bolzano-altoadige.it", +"bolzano.it", +"bozen-sudtirol.it", +"bozen-südtirol.it", +"bozen-suedtirol.it", +"bozen.it", +"br.it", +"brescia.it", +"brindisi.it", +"bs.it", +"bt.it", +"bulsan-sudtirol.it", +"bulsan-südtirol.it", +"bulsan-suedtirol.it", +"bulsan.it", +"bz.it", +"ca.it", +"cagliari.it", +"caltanissetta.it", +"campidano-medio.it", +"campidanomedio.it", +"campobasso.it", +"carbonia-iglesias.it", +"carboniaiglesias.it", +"carrara-massa.it", +"carraramassa.it", +"caserta.it", +"catania.it", +"catanzaro.it", +"cb.it", +"ce.it", +"cesena-forli.it", +"cesena-forlì.it", +"cesenaforli.it", +"cesenaforlì.it", +"ch.it", +"chieti.it", +"ci.it", +"cl.it", +"cn.it", +"co.it", +"como.it", +"cosenza.it", +"cr.it", +"cremona.it", +"crotone.it", +"cs.it", +"ct.it", +"cuneo.it", +"cz.it", +"dell-ogliastra.it", +"dellogliastra.it", +"en.it", +"enna.it", +"fc.it", +"fe.it", +"fermo.it", +"ferrara.it", +"fg.it", +"fi.it", +"firenze.it", +"florence.it", +"fm.it", +"foggia.it", +"forli-cesena.it", +"forlì-cesena.it", +"forlicesena.it", +"forlìcesena.it", +"fr.it", +"frosinone.it", +"ge.it", +"genoa.it", +"genova.it", +"go.it", +"gorizia.it", +"gr.it", +"grosseto.it", +"iglesias-carbonia.it", +"iglesiascarbonia.it", +"im.it", +"imperia.it", +"is.it", +"isernia.it", +"kr.it", +"la-spezia.it", +"laquila.it", +"laspezia.it", +"latina.it", +"lc.it", +"le.it", +"lecce.it", +"lecco.it", +"li.it", +"livorno.it", +"lo.it", +"lodi.it", +"lt.it", +"lu.it", +"lucca.it", +"macerata.it", +"mantova.it", +"massa-carrara.it", +"massacarrara.it", +"matera.it", +"mb.it", +"mc.it", +"me.it", +"medio-campidano.it", +"mediocampidano.it", +"messina.it", +"mi.it", +"milan.it", +"milano.it", +"mn.it", +"mo.it", +"modena.it", +"monza-brianza.it", +"monza-e-della-brianza.it", +"monza.it", +"monzabrianza.it", +"monzaebrianza.it", +"monzaedellabrianza.it", +"ms.it", +"mt.it", +"na.it", +"naples.it", +"napoli.it", +"no.it", +"novara.it", +"nu.it", +"nuoro.it", +"og.it", +"ogliastra.it", +"olbia-tempio.it", +"olbiatempio.it", +"or.it", +"oristano.it", +"ot.it", +"pa.it", +"padova.it", +"padua.it", +"palermo.it", +"parma.it", +"pavia.it", +"pc.it", +"pd.it", +"pe.it", +"perugia.it", +"pesaro-urbino.it", +"pesarourbino.it", +"pescara.it", +"pg.it", +"pi.it", +"piacenza.it", +"pisa.it", +"pistoia.it", +"pn.it", +"po.it", +"pordenone.it", +"potenza.it", +"pr.it", +"prato.it", +"pt.it", +"pu.it", +"pv.it", +"pz.it", +"ra.it", +"ragusa.it", +"ravenna.it", +"rc.it", +"re.it", +"reggio-calabria.it", +"reggio-emilia.it", +"reggiocalabria.it", +"reggioemilia.it", +"rg.it", +"ri.it", +"rieti.it", +"rimini.it", +"rm.it", +"rn.it", +"ro.it", +"roma.it", +"rome.it", +"rovigo.it", +"sa.it", +"salerno.it", +"sassari.it", +"savona.it", +"si.it", +"siena.it", +"siracusa.it", +"so.it", +"sondrio.it", +"sp.it", +"sr.it", +"ss.it", +"suedtirol.it", +"südtirol.it", +"sv.it", +"ta.it", +"taranto.it", +"te.it", +"tempio-olbia.it", +"tempioolbia.it", +"teramo.it", +"terni.it", +"tn.it", +"to.it", +"torino.it", +"tp.it", +"tr.it", +"trani-andria-barletta.it", +"trani-barletta-andria.it", +"traniandriabarletta.it", +"tranibarlettaandria.it", +"trapani.it", +"trento.it", +"treviso.it", +"trieste.it", +"ts.it", +"turin.it", +"tv.it", +"ud.it", +"udine.it", +"urbino-pesaro.it", +"urbinopesaro.it", +"va.it", +"varese.it", +"vb.it", +"vc.it", +"ve.it", +"venezia.it", +"venice.it", +"verbania.it", +"vercelli.it", +"verona.it", +"vi.it", +"vibo-valentia.it", +"vibovalentia.it", +"vicenza.it", +"viterbo.it", +"vr.it", +"vs.it", +"vt.it", +"vv.it", +"je", +"co.je", +"net.je", +"org.je", +"*.jm", +"jo", +"com.jo", +"org.jo", +"net.jo", +"edu.jo", +"sch.jo", +"gov.jo", +"mil.jo", +"name.jo", +"jobs", +"jp", +"ac.jp", +"ad.jp", +"co.jp", +"ed.jp", +"go.jp", +"gr.jp", +"lg.jp", +"ne.jp", +"or.jp", +"aichi.jp", +"akita.jp", +"aomori.jp", +"chiba.jp", +"ehime.jp", +"fukui.jp", +"fukuoka.jp", +"fukushima.jp", +"gifu.jp", +"gunma.jp", +"hiroshima.jp", +"hokkaido.jp", +"hyogo.jp", +"ibaraki.jp", +"ishikawa.jp", +"iwate.jp", +"kagawa.jp", +"kagoshima.jp", +"kanagawa.jp", +"kochi.jp", +"kumamoto.jp", +"kyoto.jp", +"mie.jp", +"miyagi.jp", +"miyazaki.jp", +"nagano.jp", +"nagasaki.jp", +"nara.jp", +"niigata.jp", +"oita.jp", +"okayama.jp", +"okinawa.jp", +"osaka.jp", +"saga.jp", +"saitama.jp", +"shiga.jp", +"shimane.jp", +"shizuoka.jp", +"tochigi.jp", +"tokushima.jp", +"tokyo.jp", +"tottori.jp", +"toyama.jp", +"wakayama.jp", +"yamagata.jp", +"yamaguchi.jp", +"yamanashi.jp", +"栃木.jp", +"愛知.jp", +"愛媛.jp", +"兵庫.jp", +"熊本.jp", +"茨城.jp", +"北海道.jp", +"千葉.jp", +"和歌山.jp", +"長崎.jp", +"長野.jp", +"新潟.jp", +"青森.jp", +"静岡.jp", +"東京.jp", +"石川.jp", +"埼玉.jp", +"三重.jp", +"京都.jp", +"佐賀.jp", +"大分.jp", +"大阪.jp", +"奈良.jp", +"宮城.jp", +"宮崎.jp", +"富山.jp", +"山口.jp", +"山形.jp", +"山梨.jp", +"岩手.jp", +"岐阜.jp", +"岡山.jp", +"島根.jp", +"広島.jp", +"徳島.jp", +"沖縄.jp", +"滋賀.jp", +"神奈川.jp", +"福井.jp", +"福岡.jp", +"福島.jp", +"秋田.jp", +"群馬.jp", +"香川.jp", +"高知.jp", +"鳥取.jp", +"鹿児島.jp", +"*.kawasaki.jp", +"*.kitakyushu.jp", +"*.kobe.jp", +"*.nagoya.jp", +"*.sapporo.jp", +"*.sendai.jp", +"*.yokohama.jp", +"!city.kawasaki.jp", +"!city.kitakyushu.jp", +"!city.kobe.jp", +"!city.nagoya.jp", +"!city.sapporo.jp", +"!city.sendai.jp", +"!city.yokohama.jp", +"aisai.aichi.jp", +"ama.aichi.jp", +"anjo.aichi.jp", +"asuke.aichi.jp", +"chiryu.aichi.jp", +"chita.aichi.jp", +"fuso.aichi.jp", +"gamagori.aichi.jp", +"handa.aichi.jp", +"hazu.aichi.jp", +"hekinan.aichi.jp", +"higashiura.aichi.jp", +"ichinomiya.aichi.jp", +"inazawa.aichi.jp", +"inuyama.aichi.jp", +"isshiki.aichi.jp", +"iwakura.aichi.jp", +"kanie.aichi.jp", +"kariya.aichi.jp", +"kasugai.aichi.jp", +"kira.aichi.jp", +"kiyosu.aichi.jp", +"komaki.aichi.jp", +"konan.aichi.jp", +"kota.aichi.jp", +"mihama.aichi.jp", +"miyoshi.aichi.jp", +"nishio.aichi.jp", +"nisshin.aichi.jp", +"obu.aichi.jp", +"oguchi.aichi.jp", +"oharu.aichi.jp", +"okazaki.aichi.jp", +"owariasahi.aichi.jp", +"seto.aichi.jp", +"shikatsu.aichi.jp", +"shinshiro.aichi.jp", +"shitara.aichi.jp", +"tahara.aichi.jp", +"takahama.aichi.jp", +"tobishima.aichi.jp", +"toei.aichi.jp", +"togo.aichi.jp", +"tokai.aichi.jp", +"tokoname.aichi.jp", +"toyoake.aichi.jp", +"toyohashi.aichi.jp", +"toyokawa.aichi.jp", +"toyone.aichi.jp", +"toyota.aichi.jp", +"tsushima.aichi.jp", +"yatomi.aichi.jp", +"akita.akita.jp", +"daisen.akita.jp", +"fujisato.akita.jp", +"gojome.akita.jp", +"hachirogata.akita.jp", +"happou.akita.jp", +"higashinaruse.akita.jp", +"honjo.akita.jp", +"honjyo.akita.jp", +"ikawa.akita.jp", +"kamikoani.akita.jp", +"kamioka.akita.jp", +"katagami.akita.jp", +"kazuno.akita.jp", +"kitaakita.akita.jp", +"kosaka.akita.jp", +"kyowa.akita.jp", +"misato.akita.jp", +"mitane.akita.jp", +"moriyoshi.akita.jp", +"nikaho.akita.jp", +"noshiro.akita.jp", +"odate.akita.jp", +"oga.akita.jp", +"ogata.akita.jp", +"semboku.akita.jp", +"yokote.akita.jp", +"yurihonjo.akita.jp", +"aomori.aomori.jp", +"gonohe.aomori.jp", +"hachinohe.aomori.jp", +"hashikami.aomori.jp", +"hiranai.aomori.jp", +"hirosaki.aomori.jp", +"itayanagi.aomori.jp", +"kuroishi.aomori.jp", +"misawa.aomori.jp", +"mutsu.aomori.jp", +"nakadomari.aomori.jp", +"noheji.aomori.jp", +"oirase.aomori.jp", +"owani.aomori.jp", +"rokunohe.aomori.jp", +"sannohe.aomori.jp", +"shichinohe.aomori.jp", +"shingo.aomori.jp", +"takko.aomori.jp", +"towada.aomori.jp", +"tsugaru.aomori.jp", +"tsuruta.aomori.jp", +"abiko.chiba.jp", +"asahi.chiba.jp", +"chonan.chiba.jp", +"chosei.chiba.jp", +"choshi.chiba.jp", +"chuo.chiba.jp", +"funabashi.chiba.jp", +"futtsu.chiba.jp", +"hanamigawa.chiba.jp", +"ichihara.chiba.jp", +"ichikawa.chiba.jp", +"ichinomiya.chiba.jp", +"inzai.chiba.jp", +"isumi.chiba.jp", +"kamagaya.chiba.jp", +"kamogawa.chiba.jp", +"kashiwa.chiba.jp", +"katori.chiba.jp", +"katsuura.chiba.jp", +"kimitsu.chiba.jp", +"kisarazu.chiba.jp", +"kozaki.chiba.jp", +"kujukuri.chiba.jp", +"kyonan.chiba.jp", +"matsudo.chiba.jp", +"midori.chiba.jp", +"mihama.chiba.jp", +"minamiboso.chiba.jp", +"mobara.chiba.jp", +"mutsuzawa.chiba.jp", +"nagara.chiba.jp", +"nagareyama.chiba.jp", +"narashino.chiba.jp", +"narita.chiba.jp", +"noda.chiba.jp", +"oamishirasato.chiba.jp", +"omigawa.chiba.jp", +"onjuku.chiba.jp", +"otaki.chiba.jp", +"sakae.chiba.jp", +"sakura.chiba.jp", +"shimofusa.chiba.jp", +"shirako.chiba.jp", +"shiroi.chiba.jp", +"shisui.chiba.jp", +"sodegaura.chiba.jp", +"sosa.chiba.jp", +"tako.chiba.jp", +"tateyama.chiba.jp", +"togane.chiba.jp", +"tohnosho.chiba.jp", +"tomisato.chiba.jp", +"urayasu.chiba.jp", +"yachimata.chiba.jp", +"yachiyo.chiba.jp", +"yokaichiba.chiba.jp", +"yokoshibahikari.chiba.jp", +"yotsukaido.chiba.jp", +"ainan.ehime.jp", +"honai.ehime.jp", +"ikata.ehime.jp", +"imabari.ehime.jp", +"iyo.ehime.jp", +"kamijima.ehime.jp", +"kihoku.ehime.jp", +"kumakogen.ehime.jp", +"masaki.ehime.jp", +"matsuno.ehime.jp", +"matsuyama.ehime.jp", +"namikata.ehime.jp", +"niihama.ehime.jp", +"ozu.ehime.jp", +"saijo.ehime.jp", +"seiyo.ehime.jp", +"shikokuchuo.ehime.jp", +"tobe.ehime.jp", +"toon.ehime.jp", +"uchiko.ehime.jp", +"uwajima.ehime.jp", +"yawatahama.ehime.jp", +"echizen.fukui.jp", +"eiheiji.fukui.jp", +"fukui.fukui.jp", +"ikeda.fukui.jp", +"katsuyama.fukui.jp", +"mihama.fukui.jp", +"minamiechizen.fukui.jp", +"obama.fukui.jp", +"ohi.fukui.jp", +"ono.fukui.jp", +"sabae.fukui.jp", +"sakai.fukui.jp", +"takahama.fukui.jp", +"tsuruga.fukui.jp", +"wakasa.fukui.jp", +"ashiya.fukuoka.jp", +"buzen.fukuoka.jp", +"chikugo.fukuoka.jp", +"chikuho.fukuoka.jp", +"chikujo.fukuoka.jp", +"chikushino.fukuoka.jp", +"chikuzen.fukuoka.jp", +"chuo.fukuoka.jp", +"dazaifu.fukuoka.jp", +"fukuchi.fukuoka.jp", +"hakata.fukuoka.jp", +"higashi.fukuoka.jp", +"hirokawa.fukuoka.jp", +"hisayama.fukuoka.jp", +"iizuka.fukuoka.jp", +"inatsuki.fukuoka.jp", +"kaho.fukuoka.jp", +"kasuga.fukuoka.jp", +"kasuya.fukuoka.jp", +"kawara.fukuoka.jp", +"keisen.fukuoka.jp", +"koga.fukuoka.jp", +"kurate.fukuoka.jp", +"kurogi.fukuoka.jp", +"kurume.fukuoka.jp", +"minami.fukuoka.jp", +"miyako.fukuoka.jp", +"miyama.fukuoka.jp", +"miyawaka.fukuoka.jp", +"mizumaki.fukuoka.jp", +"munakata.fukuoka.jp", +"nakagawa.fukuoka.jp", +"nakama.fukuoka.jp", +"nishi.fukuoka.jp", +"nogata.fukuoka.jp", +"ogori.fukuoka.jp", +"okagaki.fukuoka.jp", +"okawa.fukuoka.jp", +"oki.fukuoka.jp", +"omuta.fukuoka.jp", +"onga.fukuoka.jp", +"onojo.fukuoka.jp", +"oto.fukuoka.jp", +"saigawa.fukuoka.jp", +"sasaguri.fukuoka.jp", +"shingu.fukuoka.jp", +"shinyoshitomi.fukuoka.jp", +"shonai.fukuoka.jp", +"soeda.fukuoka.jp", +"sue.fukuoka.jp", +"tachiarai.fukuoka.jp", +"tagawa.fukuoka.jp", +"takata.fukuoka.jp", +"toho.fukuoka.jp", +"toyotsu.fukuoka.jp", +"tsuiki.fukuoka.jp", +"ukiha.fukuoka.jp", +"umi.fukuoka.jp", +"usui.fukuoka.jp", +"yamada.fukuoka.jp", +"yame.fukuoka.jp", +"yanagawa.fukuoka.jp", +"yukuhashi.fukuoka.jp", +"aizubange.fukushima.jp", +"aizumisato.fukushima.jp", +"aizuwakamatsu.fukushima.jp", +"asakawa.fukushima.jp", +"bandai.fukushima.jp", +"date.fukushima.jp", +"fukushima.fukushima.jp", +"furudono.fukushima.jp", +"futaba.fukushima.jp", +"hanawa.fukushima.jp", +"higashi.fukushima.jp", +"hirata.fukushima.jp", +"hirono.fukushima.jp", +"iitate.fukushima.jp", +"inawashiro.fukushima.jp", +"ishikawa.fukushima.jp", +"iwaki.fukushima.jp", +"izumizaki.fukushima.jp", +"kagamiishi.fukushima.jp", +"kaneyama.fukushima.jp", +"kawamata.fukushima.jp", +"kitakata.fukushima.jp", +"kitashiobara.fukushima.jp", +"koori.fukushima.jp", +"koriyama.fukushima.jp", +"kunimi.fukushima.jp", +"miharu.fukushima.jp", +"mishima.fukushima.jp", +"namie.fukushima.jp", +"nango.fukushima.jp", +"nishiaizu.fukushima.jp", +"nishigo.fukushima.jp", +"okuma.fukushima.jp", +"omotego.fukushima.jp", +"ono.fukushima.jp", +"otama.fukushima.jp", +"samegawa.fukushima.jp", +"shimogo.fukushima.jp", +"shirakawa.fukushima.jp", +"showa.fukushima.jp", +"soma.fukushima.jp", +"sukagawa.fukushima.jp", +"taishin.fukushima.jp", +"tamakawa.fukushima.jp", +"tanagura.fukushima.jp", +"tenei.fukushima.jp", +"yabuki.fukushima.jp", +"yamato.fukushima.jp", +"yamatsuri.fukushima.jp", +"yanaizu.fukushima.jp", +"yugawa.fukushima.jp", +"anpachi.gifu.jp", +"ena.gifu.jp", +"gifu.gifu.jp", +"ginan.gifu.jp", +"godo.gifu.jp", +"gujo.gifu.jp", +"hashima.gifu.jp", +"hichiso.gifu.jp", +"hida.gifu.jp", +"higashishirakawa.gifu.jp", +"ibigawa.gifu.jp", +"ikeda.gifu.jp", +"kakamigahara.gifu.jp", +"kani.gifu.jp", +"kasahara.gifu.jp", +"kasamatsu.gifu.jp", +"kawaue.gifu.jp", +"kitagata.gifu.jp", +"mino.gifu.jp", +"minokamo.gifu.jp", +"mitake.gifu.jp", +"mizunami.gifu.jp", +"motosu.gifu.jp", +"nakatsugawa.gifu.jp", +"ogaki.gifu.jp", +"sakahogi.gifu.jp", +"seki.gifu.jp", +"sekigahara.gifu.jp", +"shirakawa.gifu.jp", +"tajimi.gifu.jp", +"takayama.gifu.jp", +"tarui.gifu.jp", +"toki.gifu.jp", +"tomika.gifu.jp", +"wanouchi.gifu.jp", +"yamagata.gifu.jp", +"yaotsu.gifu.jp", +"yoro.gifu.jp", +"annaka.gunma.jp", +"chiyoda.gunma.jp", +"fujioka.gunma.jp", +"higashiagatsuma.gunma.jp", +"isesaki.gunma.jp", +"itakura.gunma.jp", +"kanna.gunma.jp", +"kanra.gunma.jp", +"katashina.gunma.jp", +"kawaba.gunma.jp", +"kiryu.gunma.jp", +"kusatsu.gunma.jp", +"maebashi.gunma.jp", +"meiwa.gunma.jp", +"midori.gunma.jp", +"minakami.gunma.jp", +"naganohara.gunma.jp", +"nakanojo.gunma.jp", +"nanmoku.gunma.jp", +"numata.gunma.jp", +"oizumi.gunma.jp", +"ora.gunma.jp", +"ota.gunma.jp", +"shibukawa.gunma.jp", +"shimonita.gunma.jp", +"shinto.gunma.jp", +"showa.gunma.jp", +"takasaki.gunma.jp", +"takayama.gunma.jp", +"tamamura.gunma.jp", +"tatebayashi.gunma.jp", +"tomioka.gunma.jp", +"tsukiyono.gunma.jp", +"tsumagoi.gunma.jp", +"ueno.gunma.jp", +"yoshioka.gunma.jp", +"asaminami.hiroshima.jp", +"daiwa.hiroshima.jp", +"etajima.hiroshima.jp", +"fuchu.hiroshima.jp", +"fukuyama.hiroshima.jp", +"hatsukaichi.hiroshima.jp", +"higashihiroshima.hiroshima.jp", +"hongo.hiroshima.jp", +"jinsekikogen.hiroshima.jp", +"kaita.hiroshima.jp", +"kui.hiroshima.jp", +"kumano.hiroshima.jp", +"kure.hiroshima.jp", +"mihara.hiroshima.jp", +"miyoshi.hiroshima.jp", +"naka.hiroshima.jp", +"onomichi.hiroshima.jp", +"osakikamijima.hiroshima.jp", +"otake.hiroshima.jp", +"saka.hiroshima.jp", +"sera.hiroshima.jp", +"seranishi.hiroshima.jp", +"shinichi.hiroshima.jp", +"shobara.hiroshima.jp", +"takehara.hiroshima.jp", +"abashiri.hokkaido.jp", +"abira.hokkaido.jp", +"aibetsu.hokkaido.jp", +"akabira.hokkaido.jp", +"akkeshi.hokkaido.jp", +"asahikawa.hokkaido.jp", +"ashibetsu.hokkaido.jp", +"ashoro.hokkaido.jp", +"assabu.hokkaido.jp", +"atsuma.hokkaido.jp", +"bibai.hokkaido.jp", +"biei.hokkaido.jp", +"bifuka.hokkaido.jp", +"bihoro.hokkaido.jp", +"biratori.hokkaido.jp", +"chippubetsu.hokkaido.jp", +"chitose.hokkaido.jp", +"date.hokkaido.jp", +"ebetsu.hokkaido.jp", +"embetsu.hokkaido.jp", +"eniwa.hokkaido.jp", +"erimo.hokkaido.jp", +"esan.hokkaido.jp", +"esashi.hokkaido.jp", +"fukagawa.hokkaido.jp", +"fukushima.hokkaido.jp", +"furano.hokkaido.jp", +"furubira.hokkaido.jp", +"haboro.hokkaido.jp", +"hakodate.hokkaido.jp", +"hamatonbetsu.hokkaido.jp", +"hidaka.hokkaido.jp", +"higashikagura.hokkaido.jp", +"higashikawa.hokkaido.jp", +"hiroo.hokkaido.jp", +"hokuryu.hokkaido.jp", +"hokuto.hokkaido.jp", +"honbetsu.hokkaido.jp", +"horokanai.hokkaido.jp", +"horonobe.hokkaido.jp", +"ikeda.hokkaido.jp", +"imakane.hokkaido.jp", +"ishikari.hokkaido.jp", +"iwamizawa.hokkaido.jp", +"iwanai.hokkaido.jp", +"kamifurano.hokkaido.jp", +"kamikawa.hokkaido.jp", +"kamishihoro.hokkaido.jp", +"kamisunagawa.hokkaido.jp", +"kamoenai.hokkaido.jp", +"kayabe.hokkaido.jp", +"kembuchi.hokkaido.jp", +"kikonai.hokkaido.jp", +"kimobetsu.hokkaido.jp", +"kitahiroshima.hokkaido.jp", +"kitami.hokkaido.jp", +"kiyosato.hokkaido.jp", +"koshimizu.hokkaido.jp", +"kunneppu.hokkaido.jp", +"kuriyama.hokkaido.jp", +"kuromatsunai.hokkaido.jp", +"kushiro.hokkaido.jp", +"kutchan.hokkaido.jp", +"kyowa.hokkaido.jp", +"mashike.hokkaido.jp", +"matsumae.hokkaido.jp", +"mikasa.hokkaido.jp", +"minamifurano.hokkaido.jp", +"mombetsu.hokkaido.jp", +"moseushi.hokkaido.jp", +"mukawa.hokkaido.jp", +"muroran.hokkaido.jp", +"naie.hokkaido.jp", +"nakagawa.hokkaido.jp", +"nakasatsunai.hokkaido.jp", +"nakatombetsu.hokkaido.jp", +"nanae.hokkaido.jp", +"nanporo.hokkaido.jp", +"nayoro.hokkaido.jp", +"nemuro.hokkaido.jp", +"niikappu.hokkaido.jp", +"niki.hokkaido.jp", +"nishiokoppe.hokkaido.jp", +"noboribetsu.hokkaido.jp", +"numata.hokkaido.jp", +"obihiro.hokkaido.jp", +"obira.hokkaido.jp", +"oketo.hokkaido.jp", +"okoppe.hokkaido.jp", +"otaru.hokkaido.jp", +"otobe.hokkaido.jp", +"otofuke.hokkaido.jp", +"otoineppu.hokkaido.jp", +"oumu.hokkaido.jp", +"ozora.hokkaido.jp", +"pippu.hokkaido.jp", +"rankoshi.hokkaido.jp", +"rebun.hokkaido.jp", +"rikubetsu.hokkaido.jp", +"rishiri.hokkaido.jp", +"rishirifuji.hokkaido.jp", +"saroma.hokkaido.jp", +"sarufutsu.hokkaido.jp", +"shakotan.hokkaido.jp", +"shari.hokkaido.jp", +"shibecha.hokkaido.jp", +"shibetsu.hokkaido.jp", +"shikabe.hokkaido.jp", +"shikaoi.hokkaido.jp", +"shimamaki.hokkaido.jp", +"shimizu.hokkaido.jp", +"shimokawa.hokkaido.jp", +"shinshinotsu.hokkaido.jp", +"shintoku.hokkaido.jp", +"shiranuka.hokkaido.jp", +"shiraoi.hokkaido.jp", +"shiriuchi.hokkaido.jp", +"sobetsu.hokkaido.jp", +"sunagawa.hokkaido.jp", +"taiki.hokkaido.jp", +"takasu.hokkaido.jp", +"takikawa.hokkaido.jp", +"takinoue.hokkaido.jp", +"teshikaga.hokkaido.jp", +"tobetsu.hokkaido.jp", +"tohma.hokkaido.jp", +"tomakomai.hokkaido.jp", +"tomari.hokkaido.jp", +"toya.hokkaido.jp", +"toyako.hokkaido.jp", +"toyotomi.hokkaido.jp", +"toyoura.hokkaido.jp", +"tsubetsu.hokkaido.jp", +"tsukigata.hokkaido.jp", +"urakawa.hokkaido.jp", +"urausu.hokkaido.jp", +"uryu.hokkaido.jp", +"utashinai.hokkaido.jp", +"wakkanai.hokkaido.jp", +"wassamu.hokkaido.jp", +"yakumo.hokkaido.jp", +"yoichi.hokkaido.jp", +"aioi.hyogo.jp", +"akashi.hyogo.jp", +"ako.hyogo.jp", +"amagasaki.hyogo.jp", +"aogaki.hyogo.jp", +"asago.hyogo.jp", +"ashiya.hyogo.jp", +"awaji.hyogo.jp", +"fukusaki.hyogo.jp", +"goshiki.hyogo.jp", +"harima.hyogo.jp", +"himeji.hyogo.jp", +"ichikawa.hyogo.jp", +"inagawa.hyogo.jp", +"itami.hyogo.jp", +"kakogawa.hyogo.jp", +"kamigori.hyogo.jp", +"kamikawa.hyogo.jp", +"kasai.hyogo.jp", +"kasuga.hyogo.jp", +"kawanishi.hyogo.jp", +"miki.hyogo.jp", +"minamiawaji.hyogo.jp", +"nishinomiya.hyogo.jp", +"nishiwaki.hyogo.jp", +"ono.hyogo.jp", +"sanda.hyogo.jp", +"sannan.hyogo.jp", +"sasayama.hyogo.jp", +"sayo.hyogo.jp", +"shingu.hyogo.jp", +"shinonsen.hyogo.jp", +"shiso.hyogo.jp", +"sumoto.hyogo.jp", +"taishi.hyogo.jp", +"taka.hyogo.jp", +"takarazuka.hyogo.jp", +"takasago.hyogo.jp", +"takino.hyogo.jp", +"tamba.hyogo.jp", +"tatsuno.hyogo.jp", +"toyooka.hyogo.jp", +"yabu.hyogo.jp", +"yashiro.hyogo.jp", +"yoka.hyogo.jp", +"yokawa.hyogo.jp", +"ami.ibaraki.jp", +"asahi.ibaraki.jp", +"bando.ibaraki.jp", +"chikusei.ibaraki.jp", +"daigo.ibaraki.jp", +"fujishiro.ibaraki.jp", +"hitachi.ibaraki.jp", +"hitachinaka.ibaraki.jp", +"hitachiomiya.ibaraki.jp", +"hitachiota.ibaraki.jp", +"ibaraki.ibaraki.jp", +"ina.ibaraki.jp", +"inashiki.ibaraki.jp", +"itako.ibaraki.jp", +"iwama.ibaraki.jp", +"joso.ibaraki.jp", +"kamisu.ibaraki.jp", +"kasama.ibaraki.jp", +"kashima.ibaraki.jp", +"kasumigaura.ibaraki.jp", +"koga.ibaraki.jp", +"miho.ibaraki.jp", +"mito.ibaraki.jp", +"moriya.ibaraki.jp", +"naka.ibaraki.jp", +"namegata.ibaraki.jp", +"oarai.ibaraki.jp", +"ogawa.ibaraki.jp", +"omitama.ibaraki.jp", +"ryugasaki.ibaraki.jp", +"sakai.ibaraki.jp", +"sakuragawa.ibaraki.jp", +"shimodate.ibaraki.jp", +"shimotsuma.ibaraki.jp", +"shirosato.ibaraki.jp", +"sowa.ibaraki.jp", +"suifu.ibaraki.jp", +"takahagi.ibaraki.jp", +"tamatsukuri.ibaraki.jp", +"tokai.ibaraki.jp", +"tomobe.ibaraki.jp", +"tone.ibaraki.jp", +"toride.ibaraki.jp", +"tsuchiura.ibaraki.jp", +"tsukuba.ibaraki.jp", +"uchihara.ibaraki.jp", +"ushiku.ibaraki.jp", +"yachiyo.ibaraki.jp", +"yamagata.ibaraki.jp", +"yawara.ibaraki.jp", +"yuki.ibaraki.jp", +"anamizu.ishikawa.jp", +"hakui.ishikawa.jp", +"hakusan.ishikawa.jp", +"kaga.ishikawa.jp", +"kahoku.ishikawa.jp", +"kanazawa.ishikawa.jp", +"kawakita.ishikawa.jp", +"komatsu.ishikawa.jp", +"nakanoto.ishikawa.jp", +"nanao.ishikawa.jp", +"nomi.ishikawa.jp", +"nonoichi.ishikawa.jp", +"noto.ishikawa.jp", +"shika.ishikawa.jp", +"suzu.ishikawa.jp", +"tsubata.ishikawa.jp", +"tsurugi.ishikawa.jp", +"uchinada.ishikawa.jp", +"wajima.ishikawa.jp", +"fudai.iwate.jp", +"fujisawa.iwate.jp", +"hanamaki.iwate.jp", +"hiraizumi.iwate.jp", +"hirono.iwate.jp", +"ichinohe.iwate.jp", +"ichinoseki.iwate.jp", +"iwaizumi.iwate.jp", +"iwate.iwate.jp", +"joboji.iwate.jp", +"kamaishi.iwate.jp", +"kanegasaki.iwate.jp", +"karumai.iwate.jp", +"kawai.iwate.jp", +"kitakami.iwate.jp", +"kuji.iwate.jp", +"kunohe.iwate.jp", +"kuzumaki.iwate.jp", +"miyako.iwate.jp", +"mizusawa.iwate.jp", +"morioka.iwate.jp", +"ninohe.iwate.jp", +"noda.iwate.jp", +"ofunato.iwate.jp", +"oshu.iwate.jp", +"otsuchi.iwate.jp", +"rikuzentakata.iwate.jp", +"shiwa.iwate.jp", +"shizukuishi.iwate.jp", +"sumita.iwate.jp", +"tanohata.iwate.jp", +"tono.iwate.jp", +"yahaba.iwate.jp", +"yamada.iwate.jp", +"ayagawa.kagawa.jp", +"higashikagawa.kagawa.jp", +"kanonji.kagawa.jp", +"kotohira.kagawa.jp", +"manno.kagawa.jp", +"marugame.kagawa.jp", +"mitoyo.kagawa.jp", +"naoshima.kagawa.jp", +"sanuki.kagawa.jp", +"tadotsu.kagawa.jp", +"takamatsu.kagawa.jp", +"tonosho.kagawa.jp", +"uchinomi.kagawa.jp", +"utazu.kagawa.jp", +"zentsuji.kagawa.jp", +"akune.kagoshima.jp", +"amami.kagoshima.jp", +"hioki.kagoshima.jp", +"isa.kagoshima.jp", +"isen.kagoshima.jp", +"izumi.kagoshima.jp", +"kagoshima.kagoshima.jp", +"kanoya.kagoshima.jp", +"kawanabe.kagoshima.jp", +"kinko.kagoshima.jp", +"kouyama.kagoshima.jp", +"makurazaki.kagoshima.jp", +"matsumoto.kagoshima.jp", +"minamitane.kagoshima.jp", +"nakatane.kagoshima.jp", +"nishinoomote.kagoshima.jp", +"satsumasendai.kagoshima.jp", +"soo.kagoshima.jp", +"tarumizu.kagoshima.jp", +"yusui.kagoshima.jp", +"aikawa.kanagawa.jp", +"atsugi.kanagawa.jp", +"ayase.kanagawa.jp", +"chigasaki.kanagawa.jp", +"ebina.kanagawa.jp", +"fujisawa.kanagawa.jp", +"hadano.kanagawa.jp", +"hakone.kanagawa.jp", +"hiratsuka.kanagawa.jp", +"isehara.kanagawa.jp", +"kaisei.kanagawa.jp", +"kamakura.kanagawa.jp", +"kiyokawa.kanagawa.jp", +"matsuda.kanagawa.jp", +"minamiashigara.kanagawa.jp", +"miura.kanagawa.jp", +"nakai.kanagawa.jp", +"ninomiya.kanagawa.jp", +"odawara.kanagawa.jp", +"oi.kanagawa.jp", +"oiso.kanagawa.jp", +"sagamihara.kanagawa.jp", +"samukawa.kanagawa.jp", +"tsukui.kanagawa.jp", +"yamakita.kanagawa.jp", +"yamato.kanagawa.jp", +"yokosuka.kanagawa.jp", +"yugawara.kanagawa.jp", +"zama.kanagawa.jp", +"zushi.kanagawa.jp", +"aki.kochi.jp", +"geisei.kochi.jp", +"hidaka.kochi.jp", +"higashitsuno.kochi.jp", +"ino.kochi.jp", +"kagami.kochi.jp", +"kami.kochi.jp", +"kitagawa.kochi.jp", +"kochi.kochi.jp", +"mihara.kochi.jp", +"motoyama.kochi.jp", +"muroto.kochi.jp", +"nahari.kochi.jp", +"nakamura.kochi.jp", +"nankoku.kochi.jp", +"nishitosa.kochi.jp", +"niyodogawa.kochi.jp", +"ochi.kochi.jp", +"okawa.kochi.jp", +"otoyo.kochi.jp", +"otsuki.kochi.jp", +"sakawa.kochi.jp", +"sukumo.kochi.jp", +"susaki.kochi.jp", +"tosa.kochi.jp", +"tosashimizu.kochi.jp", +"toyo.kochi.jp", +"tsuno.kochi.jp", +"umaji.kochi.jp", +"yasuda.kochi.jp", +"yusuhara.kochi.jp", +"amakusa.kumamoto.jp", +"arao.kumamoto.jp", +"aso.kumamoto.jp", +"choyo.kumamoto.jp", +"gyokuto.kumamoto.jp", +"kamiamakusa.kumamoto.jp", +"kikuchi.kumamoto.jp", +"kumamoto.kumamoto.jp", +"mashiki.kumamoto.jp", +"mifune.kumamoto.jp", +"minamata.kumamoto.jp", +"minamioguni.kumamoto.jp", +"nagasu.kumamoto.jp", +"nishihara.kumamoto.jp", +"oguni.kumamoto.jp", +"ozu.kumamoto.jp", +"sumoto.kumamoto.jp", +"takamori.kumamoto.jp", +"uki.kumamoto.jp", +"uto.kumamoto.jp", +"yamaga.kumamoto.jp", +"yamato.kumamoto.jp", +"yatsushiro.kumamoto.jp", +"ayabe.kyoto.jp", +"fukuchiyama.kyoto.jp", +"higashiyama.kyoto.jp", +"ide.kyoto.jp", +"ine.kyoto.jp", +"joyo.kyoto.jp", +"kameoka.kyoto.jp", +"kamo.kyoto.jp", +"kita.kyoto.jp", +"kizu.kyoto.jp", +"kumiyama.kyoto.jp", +"kyotamba.kyoto.jp", +"kyotanabe.kyoto.jp", +"kyotango.kyoto.jp", +"maizuru.kyoto.jp", +"minami.kyoto.jp", +"minamiyamashiro.kyoto.jp", +"miyazu.kyoto.jp", +"muko.kyoto.jp", +"nagaokakyo.kyoto.jp", +"nakagyo.kyoto.jp", +"nantan.kyoto.jp", +"oyamazaki.kyoto.jp", +"sakyo.kyoto.jp", +"seika.kyoto.jp", +"tanabe.kyoto.jp", +"uji.kyoto.jp", +"ujitawara.kyoto.jp", +"wazuka.kyoto.jp", +"yamashina.kyoto.jp", +"yawata.kyoto.jp", +"asahi.mie.jp", +"inabe.mie.jp", +"ise.mie.jp", +"kameyama.mie.jp", +"kawagoe.mie.jp", +"kiho.mie.jp", +"kisosaki.mie.jp", +"kiwa.mie.jp", +"komono.mie.jp", +"kumano.mie.jp", +"kuwana.mie.jp", +"matsusaka.mie.jp", +"meiwa.mie.jp", +"mihama.mie.jp", +"minamiise.mie.jp", +"misugi.mie.jp", +"miyama.mie.jp", +"nabari.mie.jp", +"shima.mie.jp", +"suzuka.mie.jp", +"tado.mie.jp", +"taiki.mie.jp", +"taki.mie.jp", +"tamaki.mie.jp", +"toba.mie.jp", +"tsu.mie.jp", +"udono.mie.jp", +"ureshino.mie.jp", +"watarai.mie.jp", +"yokkaichi.mie.jp", +"furukawa.miyagi.jp", +"higashimatsushima.miyagi.jp", +"ishinomaki.miyagi.jp", +"iwanuma.miyagi.jp", +"kakuda.miyagi.jp", +"kami.miyagi.jp", +"kawasaki.miyagi.jp", +"marumori.miyagi.jp", +"matsushima.miyagi.jp", +"minamisanriku.miyagi.jp", +"misato.miyagi.jp", +"murata.miyagi.jp", +"natori.miyagi.jp", +"ogawara.miyagi.jp", +"ohira.miyagi.jp", +"onagawa.miyagi.jp", +"osaki.miyagi.jp", +"rifu.miyagi.jp", +"semine.miyagi.jp", +"shibata.miyagi.jp", +"shichikashuku.miyagi.jp", +"shikama.miyagi.jp", +"shiogama.miyagi.jp", +"shiroishi.miyagi.jp", +"tagajo.miyagi.jp", +"taiwa.miyagi.jp", +"tome.miyagi.jp", +"tomiya.miyagi.jp", +"wakuya.miyagi.jp", +"watari.miyagi.jp", +"yamamoto.miyagi.jp", +"zao.miyagi.jp", +"aya.miyazaki.jp", +"ebino.miyazaki.jp", +"gokase.miyazaki.jp", +"hyuga.miyazaki.jp", +"kadogawa.miyazaki.jp", +"kawaminami.miyazaki.jp", +"kijo.miyazaki.jp", +"kitagawa.miyazaki.jp", +"kitakata.miyazaki.jp", +"kitaura.miyazaki.jp", +"kobayashi.miyazaki.jp", +"kunitomi.miyazaki.jp", +"kushima.miyazaki.jp", +"mimata.miyazaki.jp", +"miyakonojo.miyazaki.jp", +"miyazaki.miyazaki.jp", +"morotsuka.miyazaki.jp", +"nichinan.miyazaki.jp", +"nishimera.miyazaki.jp", +"nobeoka.miyazaki.jp", +"saito.miyazaki.jp", +"shiiba.miyazaki.jp", +"shintomi.miyazaki.jp", +"takaharu.miyazaki.jp", +"takanabe.miyazaki.jp", +"takazaki.miyazaki.jp", +"tsuno.miyazaki.jp", +"achi.nagano.jp", +"agematsu.nagano.jp", +"anan.nagano.jp", +"aoki.nagano.jp", +"asahi.nagano.jp", +"azumino.nagano.jp", +"chikuhoku.nagano.jp", +"chikuma.nagano.jp", +"chino.nagano.jp", +"fujimi.nagano.jp", +"hakuba.nagano.jp", +"hara.nagano.jp", +"hiraya.nagano.jp", +"iida.nagano.jp", +"iijima.nagano.jp", +"iiyama.nagano.jp", +"iizuna.nagano.jp", +"ikeda.nagano.jp", +"ikusaka.nagano.jp", +"ina.nagano.jp", +"karuizawa.nagano.jp", +"kawakami.nagano.jp", +"kiso.nagano.jp", +"kisofukushima.nagano.jp", +"kitaaiki.nagano.jp", +"komagane.nagano.jp", +"komoro.nagano.jp", +"matsukawa.nagano.jp", +"matsumoto.nagano.jp", +"miasa.nagano.jp", +"minamiaiki.nagano.jp", +"minamimaki.nagano.jp", +"minamiminowa.nagano.jp", +"minowa.nagano.jp", +"miyada.nagano.jp", +"miyota.nagano.jp", +"mochizuki.nagano.jp", +"nagano.nagano.jp", +"nagawa.nagano.jp", +"nagiso.nagano.jp", +"nakagawa.nagano.jp", +"nakano.nagano.jp", +"nozawaonsen.nagano.jp", +"obuse.nagano.jp", +"ogawa.nagano.jp", +"okaya.nagano.jp", +"omachi.nagano.jp", +"omi.nagano.jp", +"ookuwa.nagano.jp", +"ooshika.nagano.jp", +"otaki.nagano.jp", +"otari.nagano.jp", +"sakae.nagano.jp", +"sakaki.nagano.jp", +"saku.nagano.jp", +"sakuho.nagano.jp", +"shimosuwa.nagano.jp", +"shinanomachi.nagano.jp", +"shiojiri.nagano.jp", +"suwa.nagano.jp", +"suzaka.nagano.jp", +"takagi.nagano.jp", +"takamori.nagano.jp", +"takayama.nagano.jp", +"tateshina.nagano.jp", +"tatsuno.nagano.jp", +"togakushi.nagano.jp", +"togura.nagano.jp", +"tomi.nagano.jp", +"ueda.nagano.jp", +"wada.nagano.jp", +"yamagata.nagano.jp", +"yamanouchi.nagano.jp", +"yasaka.nagano.jp", +"yasuoka.nagano.jp", +"chijiwa.nagasaki.jp", +"futsu.nagasaki.jp", +"goto.nagasaki.jp", +"hasami.nagasaki.jp", +"hirado.nagasaki.jp", +"iki.nagasaki.jp", +"isahaya.nagasaki.jp", +"kawatana.nagasaki.jp", +"kuchinotsu.nagasaki.jp", +"matsuura.nagasaki.jp", +"nagasaki.nagasaki.jp", +"obama.nagasaki.jp", +"omura.nagasaki.jp", +"oseto.nagasaki.jp", +"saikai.nagasaki.jp", +"sasebo.nagasaki.jp", +"seihi.nagasaki.jp", +"shimabara.nagasaki.jp", +"shinkamigoto.nagasaki.jp", +"togitsu.nagasaki.jp", +"tsushima.nagasaki.jp", +"unzen.nagasaki.jp", +"ando.nara.jp", +"gose.nara.jp", +"heguri.nara.jp", +"higashiyoshino.nara.jp", +"ikaruga.nara.jp", +"ikoma.nara.jp", +"kamikitayama.nara.jp", +"kanmaki.nara.jp", +"kashiba.nara.jp", +"kashihara.nara.jp", +"katsuragi.nara.jp", +"kawai.nara.jp", +"kawakami.nara.jp", +"kawanishi.nara.jp", +"koryo.nara.jp", +"kurotaki.nara.jp", +"mitsue.nara.jp", +"miyake.nara.jp", +"nara.nara.jp", +"nosegawa.nara.jp", +"oji.nara.jp", +"ouda.nara.jp", +"oyodo.nara.jp", +"sakurai.nara.jp", +"sango.nara.jp", +"shimoichi.nara.jp", +"shimokitayama.nara.jp", +"shinjo.nara.jp", +"soni.nara.jp", +"takatori.nara.jp", +"tawaramoto.nara.jp", +"tenkawa.nara.jp", +"tenri.nara.jp", +"uda.nara.jp", +"yamatokoriyama.nara.jp", +"yamatotakada.nara.jp", +"yamazoe.nara.jp", +"yoshino.nara.jp", +"aga.niigata.jp", +"agano.niigata.jp", +"gosen.niigata.jp", +"itoigawa.niigata.jp", +"izumozaki.niigata.jp", +"joetsu.niigata.jp", +"kamo.niigata.jp", +"kariwa.niigata.jp", +"kashiwazaki.niigata.jp", +"minamiuonuma.niigata.jp", +"mitsuke.niigata.jp", +"muika.niigata.jp", +"murakami.niigata.jp", +"myoko.niigata.jp", +"nagaoka.niigata.jp", +"niigata.niigata.jp", +"ojiya.niigata.jp", +"omi.niigata.jp", +"sado.niigata.jp", +"sanjo.niigata.jp", +"seiro.niigata.jp", +"seirou.niigata.jp", +"sekikawa.niigata.jp", +"shibata.niigata.jp", +"tagami.niigata.jp", +"tainai.niigata.jp", +"tochio.niigata.jp", +"tokamachi.niigata.jp", +"tsubame.niigata.jp", +"tsunan.niigata.jp", +"uonuma.niigata.jp", +"yahiko.niigata.jp", +"yoita.niigata.jp", +"yuzawa.niigata.jp", +"beppu.oita.jp", +"bungoono.oita.jp", +"bungotakada.oita.jp", +"hasama.oita.jp", +"hiji.oita.jp", +"himeshima.oita.jp", +"hita.oita.jp", +"kamitsue.oita.jp", +"kokonoe.oita.jp", +"kuju.oita.jp", +"kunisaki.oita.jp", +"kusu.oita.jp", +"oita.oita.jp", +"saiki.oita.jp", +"taketa.oita.jp", +"tsukumi.oita.jp", +"usa.oita.jp", +"usuki.oita.jp", +"yufu.oita.jp", +"akaiwa.okayama.jp", +"asakuchi.okayama.jp", +"bizen.okayama.jp", +"hayashima.okayama.jp", +"ibara.okayama.jp", +"kagamino.okayama.jp", +"kasaoka.okayama.jp", +"kibichuo.okayama.jp", +"kumenan.okayama.jp", +"kurashiki.okayama.jp", +"maniwa.okayama.jp", +"misaki.okayama.jp", +"nagi.okayama.jp", +"niimi.okayama.jp", +"nishiawakura.okayama.jp", +"okayama.okayama.jp", +"satosho.okayama.jp", +"setouchi.okayama.jp", +"shinjo.okayama.jp", +"shoo.okayama.jp", +"soja.okayama.jp", +"takahashi.okayama.jp", +"tamano.okayama.jp", +"tsuyama.okayama.jp", +"wake.okayama.jp", +"yakage.okayama.jp", +"aguni.okinawa.jp", +"ginowan.okinawa.jp", +"ginoza.okinawa.jp", +"gushikami.okinawa.jp", +"haebaru.okinawa.jp", +"higashi.okinawa.jp", +"hirara.okinawa.jp", +"iheya.okinawa.jp", +"ishigaki.okinawa.jp", +"ishikawa.okinawa.jp", +"itoman.okinawa.jp", +"izena.okinawa.jp", +"kadena.okinawa.jp", +"kin.okinawa.jp", +"kitadaito.okinawa.jp", +"kitanakagusuku.okinawa.jp", +"kumejima.okinawa.jp", +"kunigami.okinawa.jp", +"minamidaito.okinawa.jp", +"motobu.okinawa.jp", +"nago.okinawa.jp", +"naha.okinawa.jp", +"nakagusuku.okinawa.jp", +"nakijin.okinawa.jp", +"nanjo.okinawa.jp", +"nishihara.okinawa.jp", +"ogimi.okinawa.jp", +"okinawa.okinawa.jp", +"onna.okinawa.jp", +"shimoji.okinawa.jp", +"taketomi.okinawa.jp", +"tarama.okinawa.jp", +"tokashiki.okinawa.jp", +"tomigusuku.okinawa.jp", +"tonaki.okinawa.jp", +"urasoe.okinawa.jp", +"uruma.okinawa.jp", +"yaese.okinawa.jp", +"yomitan.okinawa.jp", +"yonabaru.okinawa.jp", +"yonaguni.okinawa.jp", +"zamami.okinawa.jp", +"abeno.osaka.jp", +"chihayaakasaka.osaka.jp", +"chuo.osaka.jp", +"daito.osaka.jp", +"fujiidera.osaka.jp", +"habikino.osaka.jp", +"hannan.osaka.jp", +"higashiosaka.osaka.jp", +"higashisumiyoshi.osaka.jp", +"higashiyodogawa.osaka.jp", +"hirakata.osaka.jp", +"ibaraki.osaka.jp", +"ikeda.osaka.jp", +"izumi.osaka.jp", +"izumiotsu.osaka.jp", +"izumisano.osaka.jp", +"kadoma.osaka.jp", +"kaizuka.osaka.jp", +"kanan.osaka.jp", +"kashiwara.osaka.jp", +"katano.osaka.jp", +"kawachinagano.osaka.jp", +"kishiwada.osaka.jp", +"kita.osaka.jp", +"kumatori.osaka.jp", +"matsubara.osaka.jp", +"minato.osaka.jp", +"minoh.osaka.jp", +"misaki.osaka.jp", +"moriguchi.osaka.jp", +"neyagawa.osaka.jp", +"nishi.osaka.jp", +"nose.osaka.jp", +"osakasayama.osaka.jp", +"sakai.osaka.jp", +"sayama.osaka.jp", +"sennan.osaka.jp", +"settsu.osaka.jp", +"shijonawate.osaka.jp", +"shimamoto.osaka.jp", +"suita.osaka.jp", +"tadaoka.osaka.jp", +"taishi.osaka.jp", +"tajiri.osaka.jp", +"takaishi.osaka.jp", +"takatsuki.osaka.jp", +"tondabayashi.osaka.jp", +"toyonaka.osaka.jp", +"toyono.osaka.jp", +"yao.osaka.jp", +"ariake.saga.jp", +"arita.saga.jp", +"fukudomi.saga.jp", +"genkai.saga.jp", +"hamatama.saga.jp", +"hizen.saga.jp", +"imari.saga.jp", +"kamimine.saga.jp", +"kanzaki.saga.jp", +"karatsu.saga.jp", +"kashima.saga.jp", +"kitagata.saga.jp", +"kitahata.saga.jp", +"kiyama.saga.jp", +"kouhoku.saga.jp", +"kyuragi.saga.jp", +"nishiarita.saga.jp", +"ogi.saga.jp", +"omachi.saga.jp", +"ouchi.saga.jp", +"saga.saga.jp", +"shiroishi.saga.jp", +"taku.saga.jp", +"tara.saga.jp", +"tosu.saga.jp", +"yoshinogari.saga.jp", +"arakawa.saitama.jp", +"asaka.saitama.jp", +"chichibu.saitama.jp", +"fujimi.saitama.jp", +"fujimino.saitama.jp", +"fukaya.saitama.jp", +"hanno.saitama.jp", +"hanyu.saitama.jp", +"hasuda.saitama.jp", +"hatogaya.saitama.jp", +"hatoyama.saitama.jp", +"hidaka.saitama.jp", +"higashichichibu.saitama.jp", +"higashimatsuyama.saitama.jp", +"honjo.saitama.jp", +"ina.saitama.jp", +"iruma.saitama.jp", +"iwatsuki.saitama.jp", +"kamiizumi.saitama.jp", +"kamikawa.saitama.jp", +"kamisato.saitama.jp", +"kasukabe.saitama.jp", +"kawagoe.saitama.jp", +"kawaguchi.saitama.jp", +"kawajima.saitama.jp", +"kazo.saitama.jp", +"kitamoto.saitama.jp", +"koshigaya.saitama.jp", +"kounosu.saitama.jp", +"kuki.saitama.jp", +"kumagaya.saitama.jp", +"matsubushi.saitama.jp", +"minano.saitama.jp", +"misato.saitama.jp", +"miyashiro.saitama.jp", +"miyoshi.saitama.jp", +"moroyama.saitama.jp", +"nagatoro.saitama.jp", +"namegawa.saitama.jp", +"niiza.saitama.jp", +"ogano.saitama.jp", +"ogawa.saitama.jp", +"ogose.saitama.jp", +"okegawa.saitama.jp", +"omiya.saitama.jp", +"otaki.saitama.jp", +"ranzan.saitama.jp", +"ryokami.saitama.jp", +"saitama.saitama.jp", +"sakado.saitama.jp", +"satte.saitama.jp", +"sayama.saitama.jp", +"shiki.saitama.jp", +"shiraoka.saitama.jp", +"soka.saitama.jp", +"sugito.saitama.jp", +"toda.saitama.jp", +"tokigawa.saitama.jp", +"tokorozawa.saitama.jp", +"tsurugashima.saitama.jp", +"urawa.saitama.jp", +"warabi.saitama.jp", +"yashio.saitama.jp", +"yokoze.saitama.jp", +"yono.saitama.jp", +"yorii.saitama.jp", +"yoshida.saitama.jp", +"yoshikawa.saitama.jp", +"yoshimi.saitama.jp", +"aisho.shiga.jp", +"gamo.shiga.jp", +"higashiomi.shiga.jp", +"hikone.shiga.jp", +"koka.shiga.jp", +"konan.shiga.jp", +"kosei.shiga.jp", +"koto.shiga.jp", +"kusatsu.shiga.jp", +"maibara.shiga.jp", +"moriyama.shiga.jp", +"nagahama.shiga.jp", +"nishiazai.shiga.jp", +"notogawa.shiga.jp", +"omihachiman.shiga.jp", +"otsu.shiga.jp", +"ritto.shiga.jp", +"ryuoh.shiga.jp", +"takashima.shiga.jp", +"takatsuki.shiga.jp", +"torahime.shiga.jp", +"toyosato.shiga.jp", +"yasu.shiga.jp", +"akagi.shimane.jp", +"ama.shimane.jp", +"gotsu.shimane.jp", +"hamada.shimane.jp", +"higashiizumo.shimane.jp", +"hikawa.shimane.jp", +"hikimi.shimane.jp", +"izumo.shimane.jp", +"kakinoki.shimane.jp", +"masuda.shimane.jp", +"matsue.shimane.jp", +"misato.shimane.jp", +"nishinoshima.shimane.jp", +"ohda.shimane.jp", +"okinoshima.shimane.jp", +"okuizumo.shimane.jp", +"shimane.shimane.jp", +"tamayu.shimane.jp", +"tsuwano.shimane.jp", +"unnan.shimane.jp", +"yakumo.shimane.jp", +"yasugi.shimane.jp", +"yatsuka.shimane.jp", +"arai.shizuoka.jp", +"atami.shizuoka.jp", +"fuji.shizuoka.jp", +"fujieda.shizuoka.jp", +"fujikawa.shizuoka.jp", +"fujinomiya.shizuoka.jp", +"fukuroi.shizuoka.jp", +"gotemba.shizuoka.jp", +"haibara.shizuoka.jp", +"hamamatsu.shizuoka.jp", +"higashiizu.shizuoka.jp", +"ito.shizuoka.jp", +"iwata.shizuoka.jp", +"izu.shizuoka.jp", +"izunokuni.shizuoka.jp", +"kakegawa.shizuoka.jp", +"kannami.shizuoka.jp", +"kawanehon.shizuoka.jp", +"kawazu.shizuoka.jp", +"kikugawa.shizuoka.jp", +"kosai.shizuoka.jp", +"makinohara.shizuoka.jp", +"matsuzaki.shizuoka.jp", +"minamiizu.shizuoka.jp", +"mishima.shizuoka.jp", +"morimachi.shizuoka.jp", +"nishiizu.shizuoka.jp", +"numazu.shizuoka.jp", +"omaezaki.shizuoka.jp", +"shimada.shizuoka.jp", +"shimizu.shizuoka.jp", +"shimoda.shizuoka.jp", +"shizuoka.shizuoka.jp", +"susono.shizuoka.jp", +"yaizu.shizuoka.jp", +"yoshida.shizuoka.jp", +"ashikaga.tochigi.jp", +"bato.tochigi.jp", +"haga.tochigi.jp", +"ichikai.tochigi.jp", +"iwafune.tochigi.jp", +"kaminokawa.tochigi.jp", +"kanuma.tochigi.jp", +"karasuyama.tochigi.jp", +"kuroiso.tochigi.jp", +"mashiko.tochigi.jp", +"mibu.tochigi.jp", +"moka.tochigi.jp", +"motegi.tochigi.jp", +"nasu.tochigi.jp", +"nasushiobara.tochigi.jp", +"nikko.tochigi.jp", +"nishikata.tochigi.jp", +"nogi.tochigi.jp", +"ohira.tochigi.jp", +"ohtawara.tochigi.jp", +"oyama.tochigi.jp", +"sakura.tochigi.jp", +"sano.tochigi.jp", +"shimotsuke.tochigi.jp", +"shioya.tochigi.jp", +"takanezawa.tochigi.jp", +"tochigi.tochigi.jp", +"tsuga.tochigi.jp", +"ujiie.tochigi.jp", +"utsunomiya.tochigi.jp", +"yaita.tochigi.jp", +"aizumi.tokushima.jp", +"anan.tokushima.jp", +"ichiba.tokushima.jp", +"itano.tokushima.jp", +"kainan.tokushima.jp", +"komatsushima.tokushima.jp", +"matsushige.tokushima.jp", +"mima.tokushima.jp", +"minami.tokushima.jp", +"miyoshi.tokushima.jp", +"mugi.tokushima.jp", +"nakagawa.tokushima.jp", +"naruto.tokushima.jp", +"sanagochi.tokushima.jp", +"shishikui.tokushima.jp", +"tokushima.tokushima.jp", +"wajiki.tokushima.jp", +"adachi.tokyo.jp", +"akiruno.tokyo.jp", +"akishima.tokyo.jp", +"aogashima.tokyo.jp", +"arakawa.tokyo.jp", +"bunkyo.tokyo.jp", +"chiyoda.tokyo.jp", +"chofu.tokyo.jp", +"chuo.tokyo.jp", +"edogawa.tokyo.jp", +"fuchu.tokyo.jp", +"fussa.tokyo.jp", +"hachijo.tokyo.jp", +"hachioji.tokyo.jp", +"hamura.tokyo.jp", +"higashikurume.tokyo.jp", +"higashimurayama.tokyo.jp", +"higashiyamato.tokyo.jp", +"hino.tokyo.jp", +"hinode.tokyo.jp", +"hinohara.tokyo.jp", +"inagi.tokyo.jp", +"itabashi.tokyo.jp", +"katsushika.tokyo.jp", +"kita.tokyo.jp", +"kiyose.tokyo.jp", +"kodaira.tokyo.jp", +"koganei.tokyo.jp", +"kokubunji.tokyo.jp", +"komae.tokyo.jp", +"koto.tokyo.jp", +"kouzushima.tokyo.jp", +"kunitachi.tokyo.jp", +"machida.tokyo.jp", +"meguro.tokyo.jp", +"minato.tokyo.jp", +"mitaka.tokyo.jp", +"mizuho.tokyo.jp", +"musashimurayama.tokyo.jp", +"musashino.tokyo.jp", +"nakano.tokyo.jp", +"nerima.tokyo.jp", +"ogasawara.tokyo.jp", +"okutama.tokyo.jp", +"ome.tokyo.jp", +"oshima.tokyo.jp", +"ota.tokyo.jp", +"setagaya.tokyo.jp", +"shibuya.tokyo.jp", +"shinagawa.tokyo.jp", +"shinjuku.tokyo.jp", +"suginami.tokyo.jp", +"sumida.tokyo.jp", +"tachikawa.tokyo.jp", +"taito.tokyo.jp", +"tama.tokyo.jp", +"toshima.tokyo.jp", +"chizu.tottori.jp", +"hino.tottori.jp", +"kawahara.tottori.jp", +"koge.tottori.jp", +"kotoura.tottori.jp", +"misasa.tottori.jp", +"nanbu.tottori.jp", +"nichinan.tottori.jp", +"sakaiminato.tottori.jp", +"tottori.tottori.jp", +"wakasa.tottori.jp", +"yazu.tottori.jp", +"yonago.tottori.jp", +"asahi.toyama.jp", +"fuchu.toyama.jp", +"fukumitsu.toyama.jp", +"funahashi.toyama.jp", +"himi.toyama.jp", +"imizu.toyama.jp", +"inami.toyama.jp", +"johana.toyama.jp", +"kamiichi.toyama.jp", +"kurobe.toyama.jp", +"nakaniikawa.toyama.jp", +"namerikawa.toyama.jp", +"nanto.toyama.jp", +"nyuzen.toyama.jp", +"oyabe.toyama.jp", +"taira.toyama.jp", +"takaoka.toyama.jp", +"tateyama.toyama.jp", +"toga.toyama.jp", +"tonami.toyama.jp", +"toyama.toyama.jp", +"unazuki.toyama.jp", +"uozu.toyama.jp", +"yamada.toyama.jp", +"arida.wakayama.jp", +"aridagawa.wakayama.jp", +"gobo.wakayama.jp", +"hashimoto.wakayama.jp", +"hidaka.wakayama.jp", +"hirogawa.wakayama.jp", +"inami.wakayama.jp", +"iwade.wakayama.jp", +"kainan.wakayama.jp", +"kamitonda.wakayama.jp", +"katsuragi.wakayama.jp", +"kimino.wakayama.jp", +"kinokawa.wakayama.jp", +"kitayama.wakayama.jp", +"koya.wakayama.jp", +"koza.wakayama.jp", +"kozagawa.wakayama.jp", +"kudoyama.wakayama.jp", +"kushimoto.wakayama.jp", +"mihama.wakayama.jp", +"misato.wakayama.jp", +"nachikatsuura.wakayama.jp", +"shingu.wakayama.jp", +"shirahama.wakayama.jp", +"taiji.wakayama.jp", +"tanabe.wakayama.jp", +"wakayama.wakayama.jp", +"yuasa.wakayama.jp", +"yura.wakayama.jp", +"asahi.yamagata.jp", +"funagata.yamagata.jp", +"higashine.yamagata.jp", +"iide.yamagata.jp", +"kahoku.yamagata.jp", +"kaminoyama.yamagata.jp", +"kaneyama.yamagata.jp", +"kawanishi.yamagata.jp", +"mamurogawa.yamagata.jp", +"mikawa.yamagata.jp", +"murayama.yamagata.jp", +"nagai.yamagata.jp", +"nakayama.yamagata.jp", +"nanyo.yamagata.jp", +"nishikawa.yamagata.jp", +"obanazawa.yamagata.jp", +"oe.yamagata.jp", +"oguni.yamagata.jp", +"ohkura.yamagata.jp", +"oishida.yamagata.jp", +"sagae.yamagata.jp", +"sakata.yamagata.jp", +"sakegawa.yamagata.jp", +"shinjo.yamagata.jp", +"shirataka.yamagata.jp", +"shonai.yamagata.jp", +"takahata.yamagata.jp", +"tendo.yamagata.jp", +"tozawa.yamagata.jp", +"tsuruoka.yamagata.jp", +"yamagata.yamagata.jp", +"yamanobe.yamagata.jp", +"yonezawa.yamagata.jp", +"yuza.yamagata.jp", +"abu.yamaguchi.jp", +"hagi.yamaguchi.jp", +"hikari.yamaguchi.jp", +"hofu.yamaguchi.jp", +"iwakuni.yamaguchi.jp", +"kudamatsu.yamaguchi.jp", +"mitou.yamaguchi.jp", +"nagato.yamaguchi.jp", +"oshima.yamaguchi.jp", +"shimonoseki.yamaguchi.jp", +"shunan.yamaguchi.jp", +"tabuse.yamaguchi.jp", +"tokuyama.yamaguchi.jp", +"toyota.yamaguchi.jp", +"ube.yamaguchi.jp", +"yuu.yamaguchi.jp", +"chuo.yamanashi.jp", +"doshi.yamanashi.jp", +"fuefuki.yamanashi.jp", +"fujikawa.yamanashi.jp", +"fujikawaguchiko.yamanashi.jp", +"fujiyoshida.yamanashi.jp", +"hayakawa.yamanashi.jp", +"hokuto.yamanashi.jp", +"ichikawamisato.yamanashi.jp", +"kai.yamanashi.jp", +"kofu.yamanashi.jp", +"koshu.yamanashi.jp", +"kosuge.yamanashi.jp", +"minami-alps.yamanashi.jp", +"minobu.yamanashi.jp", +"nakamichi.yamanashi.jp", +"nanbu.yamanashi.jp", +"narusawa.yamanashi.jp", +"nirasaki.yamanashi.jp", +"nishikatsura.yamanashi.jp", +"oshino.yamanashi.jp", +"otsuki.yamanashi.jp", +"showa.yamanashi.jp", +"tabayama.yamanashi.jp", +"tsuru.yamanashi.jp", +"uenohara.yamanashi.jp", +"yamanakako.yamanashi.jp", +"yamanashi.yamanashi.jp", +"ke", +"ac.ke", +"co.ke", +"go.ke", +"info.ke", +"me.ke", +"mobi.ke", +"ne.ke", +"or.ke", +"sc.ke", +"kg", +"org.kg", +"net.kg", +"com.kg", +"edu.kg", +"gov.kg", +"mil.kg", +"*.kh", +"ki", +"edu.ki", +"biz.ki", +"net.ki", +"org.ki", +"gov.ki", +"info.ki", +"com.ki", +"km", +"org.km", +"nom.km", +"gov.km", +"prd.km", +"tm.km", +"edu.km", +"mil.km", +"ass.km", +"com.km", +"coop.km", +"asso.km", +"presse.km", +"medecin.km", +"notaires.km", +"pharmaciens.km", +"veterinaire.km", +"gouv.km", +"kn", +"net.kn", +"org.kn", +"edu.kn", +"gov.kn", +"kp", +"com.kp", +"edu.kp", +"gov.kp", +"org.kp", +"rep.kp", +"tra.kp", +"kr", +"ac.kr", +"co.kr", +"es.kr", +"go.kr", +"hs.kr", +"kg.kr", +"mil.kr", +"ms.kr", +"ne.kr", +"or.kr", +"pe.kr", +"re.kr", +"sc.kr", +"busan.kr", +"chungbuk.kr", +"chungnam.kr", +"daegu.kr", +"daejeon.kr", +"gangwon.kr", +"gwangju.kr", +"gyeongbuk.kr", +"gyeonggi.kr", +"gyeongnam.kr", +"incheon.kr", +"jeju.kr", +"jeonbuk.kr", +"jeonnam.kr", +"seoul.kr", +"ulsan.kr", +"kw", +"com.kw", +"edu.kw", +"emb.kw", +"gov.kw", +"ind.kw", +"net.kw", +"org.kw", +"ky", +"edu.ky", +"gov.ky", +"com.ky", +"org.ky", +"net.ky", +"kz", +"org.kz", +"edu.kz", +"net.kz", +"gov.kz", +"mil.kz", +"com.kz", +"la", +"int.la", +"net.la", +"info.la", +"edu.la", +"gov.la", +"per.la", +"com.la", +"org.la", +"lb", +"com.lb", +"edu.lb", +"gov.lb", +"net.lb", +"org.lb", +"lc", +"com.lc", +"net.lc", +"co.lc", +"org.lc", +"edu.lc", +"gov.lc", +"li", +"lk", +"gov.lk", +"sch.lk", +"net.lk", +"int.lk", +"com.lk", +"org.lk", +"edu.lk", +"ngo.lk", +"soc.lk", +"web.lk", +"ltd.lk", +"assn.lk", +"grp.lk", +"hotel.lk", +"ac.lk", +"lr", +"com.lr", +"edu.lr", +"gov.lr", +"org.lr", +"net.lr", +"ls", +"ac.ls", +"biz.ls", +"co.ls", +"edu.ls", +"gov.ls", +"info.ls", +"net.ls", +"org.ls", +"sc.ls", +"lt", +"gov.lt", +"lu", +"lv", +"com.lv", +"edu.lv", +"gov.lv", +"org.lv", +"mil.lv", +"id.lv", +"net.lv", +"asn.lv", +"conf.lv", +"ly", +"com.ly", +"net.ly", +"gov.ly", +"plc.ly", +"edu.ly", +"sch.ly", +"med.ly", +"org.ly", +"id.ly", +"ma", +"co.ma", +"net.ma", +"gov.ma", +"org.ma", +"ac.ma", +"press.ma", +"mc", +"tm.mc", +"asso.mc", +"md", +"me", +"co.me", +"net.me", +"org.me", +"edu.me", +"ac.me", +"gov.me", +"its.me", +"priv.me", +"mg", +"org.mg", +"nom.mg", +"gov.mg", +"prd.mg", +"tm.mg", +"edu.mg", +"mil.mg", +"com.mg", +"co.mg", +"mh", +"mil", +"mk", +"com.mk", +"org.mk", +"net.mk", +"edu.mk", +"gov.mk", +"inf.mk", +"name.mk", +"ml", +"com.ml", +"edu.ml", +"gouv.ml", +"gov.ml", +"net.ml", +"org.ml", +"presse.ml", +"*.mm", +"mn", +"gov.mn", +"edu.mn", +"org.mn", +"mo", +"com.mo", +"net.mo", +"org.mo", +"edu.mo", +"gov.mo", +"mobi", +"mp", +"mq", +"mr", +"gov.mr", +"ms", +"com.ms", +"edu.ms", +"gov.ms", +"net.ms", +"org.ms", +"mt", +"com.mt", +"edu.mt", +"net.mt", +"org.mt", +"mu", +"com.mu", +"net.mu", +"org.mu", +"gov.mu", +"ac.mu", +"co.mu", +"or.mu", +"museum", +"academy.museum", +"agriculture.museum", +"air.museum", +"airguard.museum", +"alabama.museum", +"alaska.museum", +"amber.museum", +"ambulance.museum", +"american.museum", +"americana.museum", +"americanantiques.museum", +"americanart.museum", +"amsterdam.museum", +"and.museum", +"annefrank.museum", +"anthro.museum", +"anthropology.museum", +"antiques.museum", +"aquarium.museum", +"arboretum.museum", +"archaeological.museum", +"archaeology.museum", +"architecture.museum", +"art.museum", +"artanddesign.museum", +"artcenter.museum", +"artdeco.museum", +"arteducation.museum", +"artgallery.museum", +"arts.museum", +"artsandcrafts.museum", +"asmatart.museum", +"assassination.museum", +"assisi.museum", +"association.museum", +"astronomy.museum", +"atlanta.museum", +"austin.museum", +"australia.museum", +"automotive.museum", +"aviation.museum", +"axis.museum", +"badajoz.museum", +"baghdad.museum", +"bahn.museum", +"bale.museum", +"baltimore.museum", +"barcelona.museum", +"baseball.museum", +"basel.museum", +"baths.museum", +"bauern.museum", +"beauxarts.museum", +"beeldengeluid.museum", +"bellevue.museum", +"bergbau.museum", +"berkeley.museum", +"berlin.museum", +"bern.museum", +"bible.museum", +"bilbao.museum", +"bill.museum", +"birdart.museum", +"birthplace.museum", +"bonn.museum", +"boston.museum", +"botanical.museum", +"botanicalgarden.museum", +"botanicgarden.museum", +"botany.museum", +"brandywinevalley.museum", +"brasil.museum", +"bristol.museum", +"british.museum", +"britishcolumbia.museum", +"broadcast.museum", +"brunel.museum", +"brussel.museum", +"brussels.museum", +"bruxelles.museum", +"building.museum", +"burghof.museum", +"bus.museum", +"bushey.museum", +"cadaques.museum", +"california.museum", +"cambridge.museum", +"can.museum", +"canada.museum", +"capebreton.museum", +"carrier.museum", +"cartoonart.museum", +"casadelamoneda.museum", +"castle.museum", +"castres.museum", +"celtic.museum", +"center.museum", +"chattanooga.museum", +"cheltenham.museum", +"chesapeakebay.museum", +"chicago.museum", +"children.museum", +"childrens.museum", +"childrensgarden.museum", +"chiropractic.museum", +"chocolate.museum", +"christiansburg.museum", +"cincinnati.museum", +"cinema.museum", +"circus.museum", +"civilisation.museum", +"civilization.museum", +"civilwar.museum", +"clinton.museum", +"clock.museum", +"coal.museum", +"coastaldefence.museum", +"cody.museum", +"coldwar.museum", +"collection.museum", +"colonialwilliamsburg.museum", +"coloradoplateau.museum", +"columbia.museum", +"columbus.museum", +"communication.museum", +"communications.museum", +"community.museum", +"computer.museum", +"computerhistory.museum", +"comunicações.museum", +"contemporary.museum", +"contemporaryart.museum", +"convent.museum", +"copenhagen.museum", +"corporation.museum", +"correios-e-telecomunicações.museum", +"corvette.museum", +"costume.museum", +"countryestate.museum", +"county.museum", +"crafts.museum", +"cranbrook.museum", +"creation.museum", +"cultural.museum", +"culturalcenter.museum", +"culture.museum", +"cyber.museum", +"cymru.museum", +"dali.museum", +"dallas.museum", +"database.museum", +"ddr.museum", +"decorativearts.museum", +"delaware.museum", +"delmenhorst.museum", +"denmark.museum", +"depot.museum", +"design.museum", +"detroit.museum", +"dinosaur.museum", +"discovery.museum", +"dolls.museum", +"donostia.museum", +"durham.museum", +"eastafrica.museum", +"eastcoast.museum", +"education.museum", +"educational.museum", +"egyptian.museum", +"eisenbahn.museum", +"elburg.museum", +"elvendrell.museum", +"embroidery.museum", +"encyclopedic.museum", +"england.museum", +"entomology.museum", +"environment.museum", +"environmentalconservation.museum", +"epilepsy.museum", +"essex.museum", +"estate.museum", +"ethnology.museum", +"exeter.museum", +"exhibition.museum", +"family.museum", +"farm.museum", +"farmequipment.museum", +"farmers.museum", +"farmstead.museum", +"field.museum", +"figueres.museum", +"filatelia.museum", +"film.museum", +"fineart.museum", +"finearts.museum", +"finland.museum", +"flanders.museum", +"florida.museum", +"force.museum", +"fortmissoula.museum", +"fortworth.museum", +"foundation.museum", +"francaise.museum", +"frankfurt.museum", +"franziskaner.museum", +"freemasonry.museum", +"freiburg.museum", +"fribourg.museum", +"frog.museum", +"fundacio.museum", +"furniture.museum", +"gallery.museum", +"garden.museum", +"gateway.museum", +"geelvinck.museum", +"gemological.museum", +"geology.museum", +"georgia.museum", +"giessen.museum", +"glas.museum", +"glass.museum", +"gorge.museum", +"grandrapids.museum", +"graz.museum", +"guernsey.museum", +"halloffame.museum", +"hamburg.museum", +"handson.museum", +"harvestcelebration.museum", +"hawaii.museum", +"health.museum", +"heimatunduhren.museum", +"hellas.museum", +"helsinki.museum", +"hembygdsforbund.museum", +"heritage.museum", +"histoire.museum", +"historical.museum", +"historicalsociety.museum", +"historichouses.museum", +"historisch.museum", +"historisches.museum", +"history.museum", +"historyofscience.museum", +"horology.museum", +"house.museum", +"humanities.museum", +"illustration.museum", +"imageandsound.museum", +"indian.museum", +"indiana.museum", +"indianapolis.museum", +"indianmarket.museum", +"intelligence.museum", +"interactive.museum", +"iraq.museum", +"iron.museum", +"isleofman.museum", +"jamison.museum", +"jefferson.museum", +"jerusalem.museum", +"jewelry.museum", +"jewish.museum", +"jewishart.museum", +"jfk.museum", +"journalism.museum", +"judaica.museum", +"judygarland.museum", +"juedisches.museum", +"juif.museum", +"karate.museum", +"karikatur.museum", +"kids.museum", +"koebenhavn.museum", +"koeln.museum", +"kunst.museum", +"kunstsammlung.museum", +"kunstunddesign.museum", +"labor.museum", +"labour.museum", +"lajolla.museum", +"lancashire.museum", +"landes.museum", +"lans.museum", +"läns.museum", +"larsson.museum", +"lewismiller.museum", +"lincoln.museum", +"linz.museum", +"living.museum", +"livinghistory.museum", +"localhistory.museum", +"london.museum", +"losangeles.museum", +"louvre.museum", +"loyalist.museum", +"lucerne.museum", +"luxembourg.museum", +"luzern.museum", +"mad.museum", +"madrid.museum", +"mallorca.museum", +"manchester.museum", +"mansion.museum", +"mansions.museum", +"manx.museum", +"marburg.museum", +"maritime.museum", +"maritimo.museum", +"maryland.museum", +"marylhurst.museum", +"media.museum", +"medical.museum", +"medizinhistorisches.museum", +"meeres.museum", +"memorial.museum", +"mesaverde.museum", +"michigan.museum", +"midatlantic.museum", +"military.museum", +"mill.museum", +"miners.museum", +"mining.museum", +"minnesota.museum", +"missile.museum", +"missoula.museum", +"modern.museum", +"moma.museum", +"money.museum", +"monmouth.museum", +"monticello.museum", +"montreal.museum", +"moscow.museum", +"motorcycle.museum", +"muenchen.museum", +"muenster.museum", +"mulhouse.museum", +"muncie.museum", +"museet.museum", +"museumcenter.museum", +"museumvereniging.museum", +"music.museum", +"national.museum", +"nationalfirearms.museum", +"nationalheritage.museum", +"nativeamerican.museum", +"naturalhistory.museum", +"naturalhistorymuseum.museum", +"naturalsciences.museum", +"nature.museum", +"naturhistorisches.museum", +"natuurwetenschappen.museum", +"naumburg.museum", +"naval.museum", +"nebraska.museum", +"neues.museum", +"newhampshire.museum", +"newjersey.museum", +"newmexico.museum", +"newport.museum", +"newspaper.museum", +"newyork.museum", +"niepce.museum", +"norfolk.museum", +"north.museum", +"nrw.museum", +"nyc.museum", +"nyny.museum", +"oceanographic.museum", +"oceanographique.museum", +"omaha.museum", +"online.museum", +"ontario.museum", +"openair.museum", +"oregon.museum", +"oregontrail.museum", +"otago.museum", +"oxford.museum", +"pacific.museum", +"paderborn.museum", +"palace.museum", +"paleo.museum", +"palmsprings.museum", +"panama.museum", +"paris.museum", +"pasadena.museum", +"pharmacy.museum", +"philadelphia.museum", +"philadelphiaarea.museum", +"philately.museum", +"phoenix.museum", +"photography.museum", +"pilots.museum", +"pittsburgh.museum", +"planetarium.museum", +"plantation.museum", +"plants.museum", +"plaza.museum", +"portal.museum", +"portland.museum", +"portlligat.museum", +"posts-and-telecommunications.museum", +"preservation.museum", +"presidio.museum", +"press.museum", +"project.museum", +"public.museum", +"pubol.museum", +"quebec.museum", +"railroad.museum", +"railway.museum", +"research.museum", +"resistance.museum", +"riodejaneiro.museum", +"rochester.museum", +"rockart.museum", +"roma.museum", +"russia.museum", +"saintlouis.museum", +"salem.museum", +"salvadordali.museum", +"salzburg.museum", +"sandiego.museum", +"sanfrancisco.museum", +"santabarbara.museum", +"santacruz.museum", +"santafe.museum", +"saskatchewan.museum", +"satx.museum", +"savannahga.museum", +"schlesisches.museum", +"schoenbrunn.museum", +"schokoladen.museum", +"school.museum", +"schweiz.museum", +"science.museum", +"scienceandhistory.museum", +"scienceandindustry.museum", +"sciencecenter.museum", +"sciencecenters.museum", +"science-fiction.museum", +"sciencehistory.museum", +"sciences.museum", +"sciencesnaturelles.museum", +"scotland.museum", +"seaport.museum", +"settlement.museum", +"settlers.museum", +"shell.museum", +"sherbrooke.museum", +"sibenik.museum", +"silk.museum", +"ski.museum", +"skole.museum", +"society.museum", +"sologne.museum", +"soundandvision.museum", +"southcarolina.museum", +"southwest.museum", +"space.museum", +"spy.museum", +"square.museum", +"stadt.museum", +"stalbans.museum", +"starnberg.museum", +"state.museum", +"stateofdelaware.museum", +"station.museum", +"steam.museum", +"steiermark.museum", +"stjohn.museum", +"stockholm.museum", +"stpetersburg.museum", +"stuttgart.museum", +"suisse.museum", +"surgeonshall.museum", +"surrey.museum", +"svizzera.museum", +"sweden.museum", +"sydney.museum", +"tank.museum", +"tcm.museum", +"technology.museum", +"telekommunikation.museum", +"television.museum", +"texas.museum", +"textile.museum", +"theater.museum", +"time.museum", +"timekeeping.museum", +"topology.museum", +"torino.museum", +"touch.museum", +"town.museum", +"transport.museum", +"tree.museum", +"trolley.museum", +"trust.museum", +"trustee.museum", +"uhren.museum", +"ulm.museum", +"undersea.museum", +"university.museum", +"usa.museum", +"usantiques.museum", +"usarts.museum", +"uscountryestate.museum", +"usculture.museum", +"usdecorativearts.museum", +"usgarden.museum", +"ushistory.museum", +"ushuaia.museum", +"uslivinghistory.museum", +"utah.museum", +"uvic.museum", +"valley.museum", +"vantaa.museum", +"versailles.museum", +"viking.museum", +"village.museum", +"virginia.museum", +"virtual.museum", +"virtuel.museum", +"vlaanderen.museum", +"volkenkunde.museum", +"wales.museum", +"wallonie.museum", +"war.museum", +"washingtondc.museum", +"watchandclock.museum", +"watch-and-clock.museum", +"western.museum", +"westfalen.museum", +"whaling.museum", +"wildlife.museum", +"williamsburg.museum", +"windmill.museum", +"workshop.museum", +"york.museum", +"yorkshire.museum", +"yosemite.museum", +"youth.museum", +"zoological.museum", +"zoology.museum", +"ירושלים.museum", +"иком.museum", +"mv", +"aero.mv", +"biz.mv", +"com.mv", +"coop.mv", +"edu.mv", +"gov.mv", +"info.mv", +"int.mv", +"mil.mv", +"museum.mv", +"name.mv", +"net.mv", +"org.mv", +"pro.mv", +"mw", +"ac.mw", +"biz.mw", +"co.mw", +"com.mw", +"coop.mw", +"edu.mw", +"gov.mw", +"int.mw", +"museum.mw", +"net.mw", +"org.mw", +"mx", +"com.mx", +"org.mx", +"gob.mx", +"edu.mx", +"net.mx", +"my", +"com.my", +"net.my", +"org.my", +"gov.my", +"edu.my", +"mil.my", +"name.my", +"mz", +"ac.mz", +"adv.mz", +"co.mz", +"edu.mz", +"gov.mz", +"mil.mz", +"net.mz", +"org.mz", +"na", +"info.na", +"pro.na", +"name.na", +"school.na", +"or.na", +"dr.na", +"us.na", +"mx.na", +"ca.na", +"in.na", +"cc.na", +"tv.na", +"ws.na", +"mobi.na", +"co.na", +"com.na", +"org.na", +"name", +"nc", +"asso.nc", +"nom.nc", +"ne", +"net", +"nf", +"com.nf", +"net.nf", +"per.nf", +"rec.nf", +"web.nf", +"arts.nf", +"firm.nf", +"info.nf", +"other.nf", +"store.nf", +"ng", +"com.ng", +"edu.ng", +"gov.ng", +"i.ng", +"mil.ng", +"mobi.ng", +"name.ng", +"net.ng", +"org.ng", +"sch.ng", +"ni", +"ac.ni", +"biz.ni", +"co.ni", +"com.ni", +"edu.ni", +"gob.ni", +"in.ni", +"info.ni", +"int.ni", +"mil.ni", +"net.ni", +"nom.ni", +"org.ni", +"web.ni", +"nl", +"no", +"fhs.no", +"vgs.no", +"fylkesbibl.no", +"folkebibl.no", +"museum.no", +"idrett.no", +"priv.no", +"mil.no", +"stat.no", +"dep.no", +"kommune.no", +"herad.no", +"aa.no", +"ah.no", +"bu.no", +"fm.no", +"hl.no", +"hm.no", +"jan-mayen.no", +"mr.no", +"nl.no", +"nt.no", +"of.no", +"ol.no", +"oslo.no", +"rl.no", +"sf.no", +"st.no", +"svalbard.no", +"tm.no", +"tr.no", +"va.no", +"vf.no", +"gs.aa.no", +"gs.ah.no", +"gs.bu.no", +"gs.fm.no", +"gs.hl.no", +"gs.hm.no", +"gs.jan-mayen.no", +"gs.mr.no", +"gs.nl.no", +"gs.nt.no", +"gs.of.no", +"gs.ol.no", +"gs.oslo.no", +"gs.rl.no", +"gs.sf.no", +"gs.st.no", +"gs.svalbard.no", +"gs.tm.no", +"gs.tr.no", +"gs.va.no", +"gs.vf.no", +"akrehamn.no", +"åkrehamn.no", +"algard.no", +"ålgård.no", +"arna.no", +"brumunddal.no", +"bryne.no", +"bronnoysund.no", +"brønnøysund.no", +"drobak.no", +"drøbak.no", +"egersund.no", +"fetsund.no", +"floro.no", +"florø.no", +"fredrikstad.no", +"hokksund.no", +"honefoss.no", +"hønefoss.no", +"jessheim.no", +"jorpeland.no", +"jørpeland.no", +"kirkenes.no", +"kopervik.no", +"krokstadelva.no", +"langevag.no", +"langevåg.no", +"leirvik.no", +"mjondalen.no", +"mjøndalen.no", +"mo-i-rana.no", +"mosjoen.no", +"mosjøen.no", +"nesoddtangen.no", +"orkanger.no", +"osoyro.no", +"osøyro.no", +"raholt.no", +"råholt.no", +"sandnessjoen.no", +"sandnessjøen.no", +"skedsmokorset.no", +"slattum.no", +"spjelkavik.no", +"stathelle.no", +"stavern.no", +"stjordalshalsen.no", +"stjørdalshalsen.no", +"tananger.no", +"tranby.no", +"vossevangen.no", +"afjord.no", +"åfjord.no", +"agdenes.no", +"al.no", +"ål.no", +"alesund.no", +"ålesund.no", +"alstahaug.no", +"alta.no", +"áltá.no", +"alaheadju.no", +"álaheadju.no", +"alvdal.no", +"amli.no", +"åmli.no", +"amot.no", +"åmot.no", +"andebu.no", +"andoy.no", +"andøy.no", +"andasuolo.no", +"ardal.no", +"årdal.no", +"aremark.no", +"arendal.no", +"ås.no", +"aseral.no", +"åseral.no", +"asker.no", +"askim.no", +"askvoll.no", +"askoy.no", +"askøy.no", +"asnes.no", +"åsnes.no", +"audnedaln.no", +"aukra.no", +"aure.no", +"aurland.no", +"aurskog-holand.no", +"aurskog-høland.no", +"austevoll.no", +"austrheim.no", +"averoy.no", +"averøy.no", +"balestrand.no", +"ballangen.no", +"balat.no", +"bálát.no", +"balsfjord.no", +"bahccavuotna.no", +"báhccavuotna.no", +"bamble.no", +"bardu.no", +"beardu.no", +"beiarn.no", +"bajddar.no", +"bájddar.no", +"baidar.no", +"báidár.no", +"berg.no", +"bergen.no", +"berlevag.no", +"berlevåg.no", +"bearalvahki.no", +"bearalváhki.no", +"bindal.no", +"birkenes.no", +"bjarkoy.no", +"bjarkøy.no", +"bjerkreim.no", +"bjugn.no", +"bodo.no", +"bodø.no", +"badaddja.no", +"bådåddjå.no", +"budejju.no", +"bokn.no", +"bremanger.no", +"bronnoy.no", +"brønnøy.no", +"bygland.no", +"bykle.no", +"barum.no", +"bærum.no", +"bo.telemark.no", +"bø.telemark.no", +"bo.nordland.no", +"bø.nordland.no", +"bievat.no", +"bievát.no", +"bomlo.no", +"bømlo.no", +"batsfjord.no", +"båtsfjord.no", +"bahcavuotna.no", +"báhcavuotna.no", +"dovre.no", +"drammen.no", +"drangedal.no", +"dyroy.no", +"dyrøy.no", +"donna.no", +"dønna.no", +"eid.no", +"eidfjord.no", +"eidsberg.no", +"eidskog.no", +"eidsvoll.no", +"eigersund.no", +"elverum.no", +"enebakk.no", +"engerdal.no", +"etne.no", +"etnedal.no", +"evenes.no", +"evenassi.no", +"evenášši.no", +"evje-og-hornnes.no", +"farsund.no", +"fauske.no", +"fuossko.no", +"fuoisku.no", +"fedje.no", +"fet.no", +"finnoy.no", +"finnøy.no", +"fitjar.no", +"fjaler.no", +"fjell.no", +"flakstad.no", +"flatanger.no", +"flekkefjord.no", +"flesberg.no", +"flora.no", +"fla.no", +"flå.no", +"folldal.no", +"forsand.no", +"fosnes.no", +"frei.no", +"frogn.no", +"froland.no", +"frosta.no", +"frana.no", +"fræna.no", +"froya.no", +"frøya.no", +"fusa.no", +"fyresdal.no", +"forde.no", +"førde.no", +"gamvik.no", +"gangaviika.no", +"gáŋgaviika.no", +"gaular.no", +"gausdal.no", +"gildeskal.no", +"gildeskål.no", +"giske.no", +"gjemnes.no", +"gjerdrum.no", +"gjerstad.no", +"gjesdal.no", +"gjovik.no", +"gjøvik.no", +"gloppen.no", +"gol.no", +"gran.no", +"grane.no", +"granvin.no", +"gratangen.no", +"grimstad.no", +"grong.no", +"kraanghke.no", +"kråanghke.no", +"grue.no", +"gulen.no", +"hadsel.no", +"halden.no", +"halsa.no", +"hamar.no", +"hamaroy.no", +"habmer.no", +"hábmer.no", +"hapmir.no", +"hápmir.no", +"hammerfest.no", +"hammarfeasta.no", +"hámmárfeasta.no", +"haram.no", +"hareid.no", +"harstad.no", +"hasvik.no", +"aknoluokta.no", +"ákŋoluokta.no", +"hattfjelldal.no", +"aarborte.no", +"haugesund.no", +"hemne.no", +"hemnes.no", +"hemsedal.no", +"heroy.more-og-romsdal.no", +"herøy.møre-og-romsdal.no", +"heroy.nordland.no", +"herøy.nordland.no", +"hitra.no", +"hjartdal.no", +"hjelmeland.no", +"hobol.no", +"hobøl.no", +"hof.no", +"hol.no", +"hole.no", +"holmestrand.no", +"holtalen.no", +"holtålen.no", +"hornindal.no", +"horten.no", +"hurdal.no", +"hurum.no", +"hvaler.no", +"hyllestad.no", +"hagebostad.no", +"hægebostad.no", +"hoyanger.no", +"høyanger.no", +"hoylandet.no", +"høylandet.no", +"ha.no", +"hå.no", +"ibestad.no", +"inderoy.no", +"inderøy.no", +"iveland.no", +"jevnaker.no", +"jondal.no", +"jolster.no", +"jølster.no", +"karasjok.no", +"karasjohka.no", +"kárášjohka.no", +"karlsoy.no", +"galsa.no", +"gálsá.no", +"karmoy.no", +"karmøy.no", +"kautokeino.no", +"guovdageaidnu.no", +"klepp.no", +"klabu.no", +"klæbu.no", +"kongsberg.no", +"kongsvinger.no", +"kragero.no", +"kragerø.no", +"kristiansand.no", +"kristiansund.no", +"krodsherad.no", +"krødsherad.no", +"kvalsund.no", +"rahkkeravju.no", +"ráhkkerávju.no", +"kvam.no", +"kvinesdal.no", +"kvinnherad.no", +"kviteseid.no", +"kvitsoy.no", +"kvitsøy.no", +"kvafjord.no", +"kvæfjord.no", +"giehtavuoatna.no", +"kvanangen.no", +"kvænangen.no", +"navuotna.no", +"návuotna.no", +"kafjord.no", +"kåfjord.no", +"gaivuotna.no", +"gáivuotna.no", +"larvik.no", +"lavangen.no", +"lavagis.no", +"loabat.no", +"loabát.no", +"lebesby.no", +"davvesiida.no", +"leikanger.no", +"leirfjord.no", +"leka.no", +"leksvik.no", +"lenvik.no", +"leangaviika.no", +"leaŋgaviika.no", +"lesja.no", +"levanger.no", +"lier.no", +"lierne.no", +"lillehammer.no", +"lillesand.no", +"lindesnes.no", +"lindas.no", +"lindås.no", +"lom.no", +"loppa.no", +"lahppi.no", +"láhppi.no", +"lund.no", +"lunner.no", +"luroy.no", +"lurøy.no", +"luster.no", +"lyngdal.no", +"lyngen.no", +"ivgu.no", +"lardal.no", +"lerdal.no", +"lærdal.no", +"lodingen.no", +"lødingen.no", +"lorenskog.no", +"lørenskog.no", +"loten.no", +"løten.no", +"malvik.no", +"masoy.no", +"måsøy.no", +"muosat.no", +"muosát.no", +"mandal.no", +"marker.no", +"marnardal.no", +"masfjorden.no", +"meland.no", +"meldal.no", +"melhus.no", +"meloy.no", +"meløy.no", +"meraker.no", +"meråker.no", +"moareke.no", +"moåreke.no", +"midsund.no", +"midtre-gauldal.no", +"modalen.no", +"modum.no", +"molde.no", +"moskenes.no", +"moss.no", +"mosvik.no", +"malselv.no", +"målselv.no", +"malatvuopmi.no", +"málatvuopmi.no", +"namdalseid.no", +"aejrie.no", +"namsos.no", +"namsskogan.no", +"naamesjevuemie.no", +"nååmesjevuemie.no", +"laakesvuemie.no", +"nannestad.no", +"narvik.no", +"narviika.no", +"naustdal.no", +"nedre-eiker.no", +"nes.akershus.no", +"nes.buskerud.no", +"nesna.no", +"nesodden.no", +"nesseby.no", +"unjarga.no", +"unjárga.no", +"nesset.no", +"nissedal.no", +"nittedal.no", +"nord-aurdal.no", +"nord-fron.no", +"nord-odal.no", +"norddal.no", +"nordkapp.no", +"davvenjarga.no", +"davvenjárga.no", +"nordre-land.no", +"nordreisa.no", +"raisa.no", +"ráisa.no", +"nore-og-uvdal.no", +"notodden.no", +"naroy.no", +"nærøy.no", +"notteroy.no", +"nøtterøy.no", +"odda.no", +"oksnes.no", +"øksnes.no", +"oppdal.no", +"oppegard.no", +"oppegård.no", +"orkdal.no", +"orland.no", +"ørland.no", +"orskog.no", +"ørskog.no", +"orsta.no", +"ørsta.no", +"os.hedmark.no", +"os.hordaland.no", +"osen.no", +"osteroy.no", +"osterøy.no", +"ostre-toten.no", +"østre-toten.no", +"overhalla.no", +"ovre-eiker.no", +"øvre-eiker.no", +"oyer.no", +"øyer.no", +"oygarden.no", +"øygarden.no", +"oystre-slidre.no", +"øystre-slidre.no", +"porsanger.no", +"porsangu.no", +"porsáŋgu.no", +"porsgrunn.no", +"radoy.no", +"radøy.no", +"rakkestad.no", +"rana.no", +"ruovat.no", +"randaberg.no", +"rauma.no", +"rendalen.no", +"rennebu.no", +"rennesoy.no", +"rennesøy.no", +"rindal.no", +"ringebu.no", +"ringerike.no", +"ringsaker.no", +"rissa.no", +"risor.no", +"risør.no", +"roan.no", +"rollag.no", +"rygge.no", +"ralingen.no", +"rælingen.no", +"rodoy.no", +"rødøy.no", +"romskog.no", +"rømskog.no", +"roros.no", +"røros.no", +"rost.no", +"røst.no", +"royken.no", +"røyken.no", +"royrvik.no", +"røyrvik.no", +"rade.no", +"råde.no", +"salangen.no", +"siellak.no", +"saltdal.no", +"salat.no", +"sálát.no", +"sálat.no", +"samnanger.no", +"sande.more-og-romsdal.no", +"sande.møre-og-romsdal.no", +"sande.vestfold.no", +"sandefjord.no", +"sandnes.no", +"sandoy.no", +"sandøy.no", +"sarpsborg.no", +"sauda.no", +"sauherad.no", +"sel.no", +"selbu.no", +"selje.no", +"seljord.no", +"sigdal.no", +"siljan.no", +"sirdal.no", +"skaun.no", +"skedsmo.no", +"ski.no", +"skien.no", +"skiptvet.no", +"skjervoy.no", +"skjervøy.no", +"skierva.no", +"skiervá.no", +"skjak.no", +"skjåk.no", +"skodje.no", +"skanland.no", +"skånland.no", +"skanit.no", +"skánit.no", +"smola.no", +"smøla.no", +"snillfjord.no", +"snasa.no", +"snåsa.no", +"snoasa.no", +"snaase.no", +"snåase.no", +"sogndal.no", +"sokndal.no", +"sola.no", +"solund.no", +"songdalen.no", +"sortland.no", +"spydeberg.no", +"stange.no", +"stavanger.no", +"steigen.no", +"steinkjer.no", +"stjordal.no", +"stjørdal.no", +"stokke.no", +"stor-elvdal.no", +"stord.no", +"stordal.no", +"storfjord.no", +"omasvuotna.no", +"strand.no", +"stranda.no", +"stryn.no", +"sula.no", +"suldal.no", +"sund.no", +"sunndal.no", +"surnadal.no", +"sveio.no", +"svelvik.no", +"sykkylven.no", +"sogne.no", +"søgne.no", +"somna.no", +"sømna.no", +"sondre-land.no", +"søndre-land.no", +"sor-aurdal.no", +"sør-aurdal.no", +"sor-fron.no", +"sør-fron.no", +"sor-odal.no", +"sør-odal.no", +"sor-varanger.no", +"sør-varanger.no", +"matta-varjjat.no", +"mátta-várjjat.no", +"sorfold.no", +"sørfold.no", +"sorreisa.no", +"sørreisa.no", +"sorum.no", +"sørum.no", +"tana.no", +"deatnu.no", +"time.no", +"tingvoll.no", +"tinn.no", +"tjeldsund.no", +"dielddanuorri.no", +"tjome.no", +"tjøme.no", +"tokke.no", +"tolga.no", +"torsken.no", +"tranoy.no", +"tranøy.no", +"tromso.no", +"tromsø.no", +"tromsa.no", +"romsa.no", +"trondheim.no", +"troandin.no", +"trysil.no", +"trana.no", +"træna.no", +"trogstad.no", +"trøgstad.no", +"tvedestrand.no", +"tydal.no", +"tynset.no", +"tysfjord.no", +"divtasvuodna.no", +"divttasvuotna.no", +"tysnes.no", +"tysvar.no", +"tysvær.no", +"tonsberg.no", +"tønsberg.no", +"ullensaker.no", +"ullensvang.no", +"ulvik.no", +"utsira.no", +"vadso.no", +"vadsø.no", +"cahcesuolo.no", +"čáhcesuolo.no", +"vaksdal.no", +"valle.no", +"vang.no", +"vanylven.no", +"vardo.no", +"vardø.no", +"varggat.no", +"várggát.no", +"vefsn.no", +"vaapste.no", +"vega.no", +"vegarshei.no", +"vegårshei.no", +"vennesla.no", +"verdal.no", +"verran.no", +"vestby.no", +"vestnes.no", +"vestre-slidre.no", +"vestre-toten.no", +"vestvagoy.no", +"vestvågøy.no", +"vevelstad.no", +"vik.no", +"vikna.no", +"vindafjord.no", +"volda.no", +"voss.no", +"varoy.no", +"værøy.no", +"vagan.no", +"vågan.no", +"voagat.no", +"vagsoy.no", +"vågsøy.no", +"vaga.no", +"vågå.no", +"valer.ostfold.no", +"våler.østfold.no", +"valer.hedmark.no", +"våler.hedmark.no", +"*.np", +"nr", +"biz.nr", +"info.nr", +"gov.nr", +"edu.nr", +"org.nr", +"net.nr", +"com.nr", +"nu", +"nz", +"ac.nz", +"co.nz", +"cri.nz", +"geek.nz", +"gen.nz", +"govt.nz", +"health.nz", +"iwi.nz", +"kiwi.nz", +"maori.nz", +"mil.nz", +"māori.nz", +"net.nz", +"org.nz", +"parliament.nz", +"school.nz", +"om", +"co.om", +"com.om", +"edu.om", +"gov.om", +"med.om", +"museum.om", +"net.om", +"org.om", +"pro.om", +"onion", +"org", +"pa", +"ac.pa", +"gob.pa", +"com.pa", +"org.pa", +"sld.pa", +"edu.pa", +"net.pa", +"ing.pa", +"abo.pa", +"med.pa", +"nom.pa", +"pe", +"edu.pe", +"gob.pe", +"nom.pe", +"mil.pe", +"org.pe", +"com.pe", +"net.pe", +"pf", +"com.pf", +"org.pf", +"edu.pf", +"*.pg", +"ph", +"com.ph", +"net.ph", +"org.ph", +"gov.ph", +"edu.ph", +"ngo.ph", +"mil.ph", +"i.ph", +"pk", +"com.pk", +"net.pk", +"edu.pk", +"org.pk", +"fam.pk", +"biz.pk", +"web.pk", +"gov.pk", +"gob.pk", +"gok.pk", +"gon.pk", +"gop.pk", +"gos.pk", +"info.pk", +"pl", +"com.pl", +"net.pl", +"org.pl", +"aid.pl", +"agro.pl", +"atm.pl", +"auto.pl", +"biz.pl", +"edu.pl", +"gmina.pl", +"gsm.pl", +"info.pl", +"mail.pl", +"miasta.pl", +"media.pl", +"mil.pl", +"nieruchomosci.pl", +"nom.pl", +"pc.pl", +"powiat.pl", +"priv.pl", +"realestate.pl", +"rel.pl", +"sex.pl", +"shop.pl", +"sklep.pl", +"sos.pl", +"szkola.pl", +"targi.pl", +"tm.pl", +"tourism.pl", +"travel.pl", +"turystyka.pl", +"gov.pl", +"ap.gov.pl", +"ic.gov.pl", +"is.gov.pl", +"us.gov.pl", +"kmpsp.gov.pl", +"kppsp.gov.pl", +"kwpsp.gov.pl", +"psp.gov.pl", +"wskr.gov.pl", +"kwp.gov.pl", +"mw.gov.pl", +"ug.gov.pl", +"um.gov.pl", +"umig.gov.pl", +"ugim.gov.pl", +"upow.gov.pl", +"uw.gov.pl", +"starostwo.gov.pl", +"pa.gov.pl", +"po.gov.pl", +"psse.gov.pl", +"pup.gov.pl", +"rzgw.gov.pl", +"sa.gov.pl", +"so.gov.pl", +"sr.gov.pl", +"wsa.gov.pl", +"sko.gov.pl", +"uzs.gov.pl", +"wiih.gov.pl", +"winb.gov.pl", +"pinb.gov.pl", +"wios.gov.pl", +"witd.gov.pl", +"wzmiuw.gov.pl", +"piw.gov.pl", +"wiw.gov.pl", +"griw.gov.pl", +"wif.gov.pl", +"oum.gov.pl", +"sdn.gov.pl", +"zp.gov.pl", +"uppo.gov.pl", +"mup.gov.pl", +"wuoz.gov.pl", +"konsulat.gov.pl", +"oirm.gov.pl", +"augustow.pl", +"babia-gora.pl", +"bedzin.pl", +"beskidy.pl", +"bialowieza.pl", +"bialystok.pl", +"bielawa.pl", +"bieszczady.pl", +"boleslawiec.pl", +"bydgoszcz.pl", +"bytom.pl", +"cieszyn.pl", +"czeladz.pl", +"czest.pl", +"dlugoleka.pl", +"elblag.pl", +"elk.pl", +"glogow.pl", +"gniezno.pl", +"gorlice.pl", +"grajewo.pl", +"ilawa.pl", +"jaworzno.pl", +"jelenia-gora.pl", +"jgora.pl", +"kalisz.pl", +"kazimierz-dolny.pl", +"karpacz.pl", +"kartuzy.pl", +"kaszuby.pl", +"katowice.pl", +"kepno.pl", +"ketrzyn.pl", +"klodzko.pl", +"kobierzyce.pl", +"kolobrzeg.pl", +"konin.pl", +"konskowola.pl", +"kutno.pl", +"lapy.pl", +"lebork.pl", +"legnica.pl", +"lezajsk.pl", +"limanowa.pl", +"lomza.pl", +"lowicz.pl", +"lubin.pl", +"lukow.pl", +"malbork.pl", +"malopolska.pl", +"mazowsze.pl", +"mazury.pl", +"mielec.pl", +"mielno.pl", +"mragowo.pl", +"naklo.pl", +"nowaruda.pl", +"nysa.pl", +"olawa.pl", +"olecko.pl", +"olkusz.pl", +"olsztyn.pl", +"opoczno.pl", +"opole.pl", +"ostroda.pl", +"ostroleka.pl", +"ostrowiec.pl", +"ostrowwlkp.pl", +"pila.pl", +"pisz.pl", +"podhale.pl", +"podlasie.pl", +"polkowice.pl", +"pomorze.pl", +"pomorskie.pl", +"prochowice.pl", +"pruszkow.pl", +"przeworsk.pl", +"pulawy.pl", +"radom.pl", +"rawa-maz.pl", +"rybnik.pl", +"rzeszow.pl", +"sanok.pl", +"sejny.pl", +"slask.pl", +"slupsk.pl", +"sosnowiec.pl", +"stalowa-wola.pl", +"skoczow.pl", +"starachowice.pl", +"stargard.pl", +"suwalki.pl", +"swidnica.pl", +"swiebodzin.pl", +"swinoujscie.pl", +"szczecin.pl", +"szczytno.pl", +"tarnobrzeg.pl", +"tgory.pl", +"turek.pl", +"tychy.pl", +"ustka.pl", +"walbrzych.pl", +"warmia.pl", +"warszawa.pl", +"waw.pl", +"wegrow.pl", +"wielun.pl", +"wlocl.pl", +"wloclawek.pl", +"wodzislaw.pl", +"wolomin.pl", +"wroclaw.pl", +"zachpomor.pl", +"zagan.pl", +"zarow.pl", +"zgora.pl", +"zgorzelec.pl", +"pm", +"pn", +"gov.pn", +"co.pn", +"org.pn", +"edu.pn", +"net.pn", +"post", +"pr", +"com.pr", +"net.pr", +"org.pr", +"gov.pr", +"edu.pr", +"isla.pr", +"pro.pr", +"biz.pr", +"info.pr", +"name.pr", +"est.pr", +"prof.pr", +"ac.pr", +"pro", +"aaa.pro", +"aca.pro", +"acct.pro", +"avocat.pro", +"bar.pro", +"cpa.pro", +"eng.pro", +"jur.pro", +"law.pro", +"med.pro", +"recht.pro", +"ps", +"edu.ps", +"gov.ps", +"sec.ps", +"plo.ps", +"com.ps", +"org.ps", +"net.ps", +"pt", +"net.pt", +"gov.pt", +"org.pt", +"edu.pt", +"int.pt", +"publ.pt", +"com.pt", +"nome.pt", +"pw", +"co.pw", +"ne.pw", +"or.pw", +"ed.pw", +"go.pw", +"belau.pw", +"py", +"com.py", +"coop.py", +"edu.py", +"gov.py", +"mil.py", +"net.py", +"org.py", +"qa", +"com.qa", +"edu.qa", +"gov.qa", +"mil.qa", +"name.qa", +"net.qa", +"org.qa", +"sch.qa", +"re", +"asso.re", +"com.re", +"nom.re", +"ro", +"arts.ro", +"com.ro", +"firm.ro", +"info.ro", +"nom.ro", +"nt.ro", +"org.ro", +"rec.ro", +"store.ro", +"tm.ro", +"www.ro", +"rs", +"ac.rs", +"co.rs", +"edu.rs", +"gov.rs", +"in.rs", +"org.rs", +"ru", +"rw", +"ac.rw", +"co.rw", +"coop.rw", +"gov.rw", +"mil.rw", +"net.rw", +"org.rw", +"sa", +"com.sa", +"net.sa", +"org.sa", +"gov.sa", +"med.sa", +"pub.sa", +"edu.sa", +"sch.sa", +"sb", +"com.sb", +"edu.sb", +"gov.sb", +"net.sb", +"org.sb", +"sc", +"com.sc", +"gov.sc", +"net.sc", +"org.sc", +"edu.sc", +"sd", +"com.sd", +"net.sd", +"org.sd", +"edu.sd", +"med.sd", +"tv.sd", +"gov.sd", +"info.sd", +"se", +"a.se", +"ac.se", +"b.se", +"bd.se", +"brand.se", +"c.se", +"d.se", +"e.se", +"f.se", +"fh.se", +"fhsk.se", +"fhv.se", +"g.se", +"h.se", +"i.se", +"k.se", +"komforb.se", +"kommunalforbund.se", +"komvux.se", +"l.se", +"lanbib.se", +"m.se", +"n.se", +"naturbruksgymn.se", +"o.se", +"org.se", +"p.se", +"parti.se", +"pp.se", +"press.se", +"r.se", +"s.se", +"t.se", +"tm.se", +"u.se", +"w.se", +"x.se", +"y.se", +"z.se", +"sg", +"com.sg", +"net.sg", +"org.sg", +"gov.sg", +"edu.sg", +"per.sg", +"sh", +"com.sh", +"net.sh", +"gov.sh", +"org.sh", +"mil.sh", +"si", +"sj", +"sk", +"sl", +"com.sl", +"net.sl", +"edu.sl", +"gov.sl", +"org.sl", +"sm", +"sn", +"art.sn", +"com.sn", +"edu.sn", +"gouv.sn", +"org.sn", +"perso.sn", +"univ.sn", +"so", +"com.so", +"edu.so", +"gov.so", +"me.so", +"net.so", +"org.so", +"sr", +"ss", +"biz.ss", +"com.ss", +"edu.ss", +"gov.ss", +"net.ss", +"org.ss", +"st", +"co.st", +"com.st", +"consulado.st", +"edu.st", +"embaixada.st", +"gov.st", +"mil.st", +"net.st", +"org.st", +"principe.st", +"saotome.st", +"store.st", +"su", +"sv", +"com.sv", +"edu.sv", +"gob.sv", +"org.sv", +"red.sv", +"sx", +"gov.sx", +"sy", +"edu.sy", +"gov.sy", +"net.sy", +"mil.sy", +"com.sy", +"org.sy", +"sz", +"co.sz", +"ac.sz", +"org.sz", +"tc", +"td", +"tel", +"tf", +"tg", +"th", +"ac.th", +"co.th", +"go.th", +"in.th", +"mi.th", +"net.th", +"or.th", +"tj", +"ac.tj", +"biz.tj", +"co.tj", +"com.tj", +"edu.tj", +"go.tj", +"gov.tj", +"int.tj", +"mil.tj", +"name.tj", +"net.tj", +"nic.tj", +"org.tj", +"test.tj", +"web.tj", +"tk", +"tl", +"gov.tl", +"tm", +"com.tm", +"co.tm", +"org.tm", +"net.tm", +"nom.tm", +"gov.tm", +"mil.tm", +"edu.tm", +"tn", +"com.tn", +"ens.tn", +"fin.tn", +"gov.tn", +"ind.tn", +"intl.tn", +"nat.tn", +"net.tn", +"org.tn", +"info.tn", +"perso.tn", +"tourism.tn", +"edunet.tn", +"rnrt.tn", +"rns.tn", +"rnu.tn", +"mincom.tn", +"agrinet.tn", +"defense.tn", +"turen.tn", +"to", +"com.to", +"gov.to", +"net.to", +"org.to", +"edu.to", +"mil.to", +"tr", +"av.tr", +"bbs.tr", +"bel.tr", +"biz.tr", +"com.tr", +"dr.tr", +"edu.tr", +"gen.tr", +"gov.tr", +"info.tr", +"mil.tr", +"k12.tr", +"kep.tr", +"name.tr", +"net.tr", +"org.tr", +"pol.tr", +"tel.tr", +"tsk.tr", +"tv.tr", +"web.tr", +"nc.tr", +"gov.nc.tr", +"tt", +"co.tt", +"com.tt", +"org.tt", +"net.tt", +"biz.tt", +"info.tt", +"pro.tt", +"int.tt", +"coop.tt", +"jobs.tt", +"mobi.tt", +"travel.tt", +"museum.tt", +"aero.tt", +"name.tt", +"gov.tt", +"edu.tt", +"tv", +"tw", +"edu.tw", +"gov.tw", +"mil.tw", +"com.tw", +"net.tw", +"org.tw", +"idv.tw", +"game.tw", +"ebiz.tw", +"club.tw", +"網路.tw", +"組織.tw", +"商業.tw", +"tz", +"ac.tz", +"co.tz", +"go.tz", +"hotel.tz", +"info.tz", +"me.tz", +"mil.tz", +"mobi.tz", +"ne.tz", +"or.tz", +"sc.tz", +"tv.tz", +"ua", +"com.ua", +"edu.ua", +"gov.ua", +"in.ua", +"net.ua", +"org.ua", +"cherkassy.ua", +"cherkasy.ua", +"chernigov.ua", +"chernihiv.ua", +"chernivtsi.ua", +"chernovtsy.ua", +"ck.ua", +"cn.ua", +"cr.ua", +"crimea.ua", +"cv.ua", +"dn.ua", +"dnepropetrovsk.ua", +"dnipropetrovsk.ua", +"dominic.ua", +"donetsk.ua", +"dp.ua", +"if.ua", +"ivano-frankivsk.ua", +"kh.ua", +"kharkiv.ua", +"kharkov.ua", +"kherson.ua", +"khmelnitskiy.ua", +"khmelnytskyi.ua", +"kiev.ua", +"kirovograd.ua", +"km.ua", +"kr.ua", +"krym.ua", +"ks.ua", +"kv.ua", +"kyiv.ua", +"lg.ua", +"lt.ua", +"lugansk.ua", +"lutsk.ua", +"lv.ua", +"lviv.ua", +"mk.ua", +"mykolaiv.ua", +"nikolaev.ua", +"od.ua", +"odesa.ua", +"odessa.ua", +"pl.ua", +"poltava.ua", +"rivne.ua", +"rovno.ua", +"rv.ua", +"sb.ua", +"sebastopol.ua", +"sevastopol.ua", +"sm.ua", +"sumy.ua", +"te.ua", +"ternopil.ua", +"uz.ua", +"uzhgorod.ua", +"vinnica.ua", +"vinnytsia.ua", +"vn.ua", +"volyn.ua", +"yalta.ua", +"zaporizhzhe.ua", +"zaporizhzhia.ua", +"zhitomir.ua", +"zhytomyr.ua", +"zp.ua", +"zt.ua", +"ug", +"co.ug", +"or.ug", +"ac.ug", +"sc.ug", +"go.ug", +"ne.ug", +"com.ug", +"org.ug", +"uk", +"ac.uk", +"co.uk", +"gov.uk", +"ltd.uk", +"me.uk", +"net.uk", +"nhs.uk", +"org.uk", +"plc.uk", +"police.uk", +"*.sch.uk", +"us", +"dni.us", +"fed.us", +"isa.us", +"kids.us", +"nsn.us", +"ak.us", +"al.us", +"ar.us", +"as.us", +"az.us", +"ca.us", +"co.us", +"ct.us", +"dc.us", +"de.us", +"fl.us", +"ga.us", +"gu.us", +"hi.us", +"ia.us", +"id.us", +"il.us", +"in.us", +"ks.us", +"ky.us", +"la.us", +"ma.us", +"md.us", +"me.us", +"mi.us", +"mn.us", +"mo.us", +"ms.us", +"mt.us", +"nc.us", +"nd.us", +"ne.us", +"nh.us", +"nj.us", +"nm.us", +"nv.us", +"ny.us", +"oh.us", +"ok.us", +"or.us", +"pa.us", +"pr.us", +"ri.us", +"sc.us", +"sd.us", +"tn.us", +"tx.us", +"ut.us", +"vi.us", +"vt.us", +"va.us", +"wa.us", +"wi.us", +"wv.us", +"wy.us", +"k12.ak.us", +"k12.al.us", +"k12.ar.us", +"k12.as.us", +"k12.az.us", +"k12.ca.us", +"k12.co.us", +"k12.ct.us", +"k12.dc.us", +"k12.de.us", +"k12.fl.us", +"k12.ga.us", +"k12.gu.us", +"k12.ia.us", +"k12.id.us", +"k12.il.us", +"k12.in.us", +"k12.ks.us", +"k12.ky.us", +"k12.la.us", +"k12.ma.us", +"k12.md.us", +"k12.me.us", +"k12.mi.us", +"k12.mn.us", +"k12.mo.us", +"k12.ms.us", +"k12.mt.us", +"k12.nc.us", +"k12.ne.us", +"k12.nh.us", +"k12.nj.us", +"k12.nm.us", +"k12.nv.us", +"k12.ny.us", +"k12.oh.us", +"k12.ok.us", +"k12.or.us", +"k12.pa.us", +"k12.pr.us", +"k12.ri.us", +"k12.sc.us", +"k12.tn.us", +"k12.tx.us", +"k12.ut.us", +"k12.vi.us", +"k12.vt.us", +"k12.va.us", +"k12.wa.us", +"k12.wi.us", +"k12.wy.us", +"cc.ak.us", +"cc.al.us", +"cc.ar.us", +"cc.as.us", +"cc.az.us", +"cc.ca.us", +"cc.co.us", +"cc.ct.us", +"cc.dc.us", +"cc.de.us", +"cc.fl.us", +"cc.ga.us", +"cc.gu.us", +"cc.hi.us", +"cc.ia.us", +"cc.id.us", +"cc.il.us", +"cc.in.us", +"cc.ks.us", +"cc.ky.us", +"cc.la.us", +"cc.ma.us", +"cc.md.us", +"cc.me.us", +"cc.mi.us", +"cc.mn.us", +"cc.mo.us", +"cc.ms.us", +"cc.mt.us", +"cc.nc.us", +"cc.nd.us", +"cc.ne.us", +"cc.nh.us", +"cc.nj.us", +"cc.nm.us", +"cc.nv.us", +"cc.ny.us", +"cc.oh.us", +"cc.ok.us", +"cc.or.us", +"cc.pa.us", +"cc.pr.us", +"cc.ri.us", +"cc.sc.us", +"cc.sd.us", +"cc.tn.us", +"cc.tx.us", +"cc.ut.us", +"cc.vi.us", +"cc.vt.us", +"cc.va.us", +"cc.wa.us", +"cc.wi.us", +"cc.wv.us", +"cc.wy.us", +"lib.ak.us", +"lib.al.us", +"lib.ar.us", +"lib.as.us", +"lib.az.us", +"lib.ca.us", +"lib.co.us", +"lib.ct.us", +"lib.dc.us", +"lib.fl.us", +"lib.ga.us", +"lib.gu.us", +"lib.hi.us", +"lib.ia.us", +"lib.id.us", +"lib.il.us", +"lib.in.us", +"lib.ks.us", +"lib.ky.us", +"lib.la.us", +"lib.ma.us", +"lib.md.us", +"lib.me.us", +"lib.mi.us", +"lib.mn.us", +"lib.mo.us", +"lib.ms.us", +"lib.mt.us", +"lib.nc.us", +"lib.nd.us", +"lib.ne.us", +"lib.nh.us", +"lib.nj.us", +"lib.nm.us", +"lib.nv.us", +"lib.ny.us", +"lib.oh.us", +"lib.ok.us", +"lib.or.us", +"lib.pa.us", +"lib.pr.us", +"lib.ri.us", +"lib.sc.us", +"lib.sd.us", +"lib.tn.us", +"lib.tx.us", +"lib.ut.us", +"lib.vi.us", +"lib.vt.us", +"lib.va.us", +"lib.wa.us", +"lib.wi.us", +"lib.wy.us", +"pvt.k12.ma.us", +"chtr.k12.ma.us", +"paroch.k12.ma.us", +"ann-arbor.mi.us", +"cog.mi.us", +"dst.mi.us", +"eaton.mi.us", +"gen.mi.us", +"mus.mi.us", +"tec.mi.us", +"washtenaw.mi.us", +"uy", +"com.uy", +"edu.uy", +"gub.uy", +"mil.uy", +"net.uy", +"org.uy", +"uz", +"co.uz", +"com.uz", +"net.uz", +"org.uz", +"va", +"vc", +"com.vc", +"net.vc", +"org.vc", +"gov.vc", +"mil.vc", +"edu.vc", +"ve", +"arts.ve", +"co.ve", +"com.ve", +"e12.ve", +"edu.ve", +"firm.ve", +"gob.ve", +"gov.ve", +"info.ve", +"int.ve", +"mil.ve", +"net.ve", +"org.ve", +"rec.ve", +"store.ve", +"tec.ve", +"web.ve", +"vg", +"vi", +"co.vi", +"com.vi", +"k12.vi", +"net.vi", +"org.vi", +"vn", +"com.vn", +"net.vn", +"org.vn", +"edu.vn", +"gov.vn", +"int.vn", +"ac.vn", +"biz.vn", +"info.vn", +"name.vn", +"pro.vn", +"health.vn", +"vu", +"com.vu", +"edu.vu", +"net.vu", +"org.vu", +"wf", +"ws", +"com.ws", +"net.ws", +"org.ws", +"gov.ws", +"edu.ws", +"yt", +"امارات", +"հայ", +"বাংলা", +"бг", +"бел", +"中国", +"中國", +"الجزائر", +"مصر", +"ею", +"ευ", +"موريتانيا", +"გე", +"ελ", +"香港", +"公司.香港", +"教育.香港", +"政府.香港", +"個人.香港", +"網絡.香港", +"組織.香港", +"ಭಾರತ", +"ଭାରତ", +"ভাৰত", +"भारतम्", +"भारोत", +"ڀارت", +"ഭാരതം", +"भारत", +"بارت", +"بھارت", +"భారత్", +"ભારત", +"ਭਾਰਤ", +"ভারত", +"இந்தியா", +"ایران", +"ايران", +"عراق", +"الاردن", +"한국", +"қаз", +"ලංකා", +"இலங்கை", +"المغرب", +"мкд", +"мон", +"澳門", +"澳门", +"مليسيا", +"عمان", +"پاکستان", +"پاكستان", +"فلسطين", +"срб", +"пр.срб", +"орг.срб", +"обр.срб", +"од.срб", +"упр.срб", +"ак.срб", +"рф", +"قطر", +"السعودية", +"السعودیة", +"السعودیۃ", +"السعوديه", +"سودان", +"新加坡", +"சிங்கப்பூர்", +"سورية", +"سوريا", +"ไทย", +"ศึกษา.ไทย", +"ธุรกิจ.ไทย", +"รัฐบาล.ไทย", +"ทหาร.ไทย", +"เน็ต.ไทย", +"องค์กร.ไทย", +"تونس", +"台灣", +"台湾", +"臺灣", +"укр", +"اليمن", +"xxx", +"*.ye", +"ac.za", +"agric.za", +"alt.za", +"co.za", +"edu.za", +"gov.za", +"grondar.za", +"law.za", +"mil.za", +"net.za", +"ngo.za", +"nic.za", +"nis.za", +"nom.za", +"org.za", +"school.za", +"tm.za", +"web.za", +"zm", +"ac.zm", +"biz.zm", +"co.zm", +"com.zm", +"edu.zm", +"gov.zm", +"info.zm", +"mil.zm", +"net.zm", +"org.zm", +"sch.zm", +"zw", +"ac.zw", +"co.zw", +"gov.zw", +"mil.zw", +"org.zw", +"aaa", +"aarp", +"abarth", +"abb", +"abbott", +"abbvie", +"abc", +"able", +"abogado", +"abudhabi", +"academy", +"accenture", +"accountant", +"accountants", +"aco", +"actor", +"adac", +"ads", +"adult", +"aeg", +"aetna", +"afamilycompany", +"afl", +"africa", +"agakhan", +"agency", +"aig", +"aigo", +"airbus", +"airforce", +"airtel", +"akdn", +"alfaromeo", +"alibaba", +"alipay", +"allfinanz", +"allstate", +"ally", +"alsace", +"alstom", +"amazon", +"americanexpress", +"americanfamily", +"amex", +"amfam", +"amica", +"amsterdam", +"analytics", +"android", +"anquan", +"anz", +"aol", +"apartments", +"app", +"apple", +"aquarelle", +"arab", +"aramco", +"archi", +"army", +"art", +"arte", +"asda", +"associates", +"athleta", +"attorney", +"auction", +"audi", +"audible", +"audio", +"auspost", +"author", +"auto", +"autos", +"avianca", +"aws", +"axa", +"azure", +"baby", +"baidu", +"banamex", +"bananarepublic", +"band", +"bank", +"bar", +"barcelona", +"barclaycard", +"barclays", +"barefoot", +"bargains", +"baseball", +"basketball", +"bauhaus", +"bayern", +"bbc", +"bbt", +"bbva", +"bcg", +"bcn", +"beats", +"beauty", +"beer", +"bentley", +"berlin", +"best", +"bestbuy", +"bet", +"bharti", +"bible", +"bid", +"bike", +"bing", +"bingo", +"bio", +"black", +"blackfriday", +"blockbuster", +"blog", +"bloomberg", +"blue", +"bms", +"bmw", +"bnpparibas", +"boats", +"boehringer", +"bofa", +"bom", +"bond", +"boo", +"book", +"booking", +"bosch", +"bostik", +"boston", +"bot", +"boutique", +"box", +"bradesco", +"bridgestone", +"broadway", +"broker", +"brother", +"brussels", +"budapest", +"bugatti", +"build", +"builders", +"business", +"buy", +"buzz", +"bzh", +"cab", +"cafe", +"cal", +"call", +"calvinklein", +"cam", +"camera", +"camp", +"cancerresearch", +"canon", +"capetown", +"capital", +"capitalone", +"car", +"caravan", +"cards", +"care", +"career", +"careers", +"cars", +"casa", +"case", +"caseih", +"cash", +"casino", +"catering", +"catholic", +"cba", +"cbn", +"cbre", +"cbs", +"ceb", +"center", +"ceo", +"cern", +"cfa", +"cfd", +"chanel", +"channel", +"charity", +"chase", +"chat", +"cheap", +"chintai", +"christmas", +"chrome", +"church", +"cipriani", +"circle", +"cisco", +"citadel", +"citi", +"citic", +"city", +"cityeats", +"claims", +"cleaning", +"click", +"clinic", +"clinique", +"clothing", +"cloud", +"club", +"clubmed", +"coach", +"codes", +"coffee", +"college", +"cologne", +"comcast", +"commbank", +"community", +"company", +"compare", +"computer", +"comsec", +"condos", +"construction", +"consulting", +"contact", +"contractors", +"cooking", +"cookingchannel", +"cool", +"corsica", +"country", +"coupon", +"coupons", +"courses", +"cpa", +"credit", +"creditcard", +"creditunion", +"cricket", +"crown", +"crs", +"cruise", +"cruises", +"csc", +"cuisinella", +"cymru", +"cyou", +"dabur", +"dad", +"dance", +"data", +"date", +"dating", +"datsun", +"day", +"dclk", +"dds", +"deal", +"dealer", +"deals", +"degree", +"delivery", +"dell", +"deloitte", +"delta", +"democrat", +"dental", +"dentist", +"desi", +"design", +"dev", +"dhl", +"diamonds", +"diet", +"digital", +"direct", +"directory", +"discount", +"discover", +"dish", +"diy", +"dnp", +"docs", +"doctor", +"dog", +"domains", +"dot", +"download", +"drive", +"dtv", +"dubai", +"duck", +"dunlop", +"dupont", +"durban", +"dvag", +"dvr", +"earth", +"eat", +"eco", +"edeka", +"education", +"email", +"emerck", +"energy", +"engineer", +"engineering", +"enterprises", +"epson", +"equipment", +"ericsson", +"erni", +"esq", +"estate", +"esurance", +"etisalat", +"eurovision", +"eus", +"events", +"exchange", +"expert", +"exposed", +"express", +"extraspace", +"fage", +"fail", +"fairwinds", +"faith", +"family", +"fan", +"fans", +"farm", +"farmers", +"fashion", +"fast", +"fedex", +"feedback", +"ferrari", +"ferrero", +"fiat", +"fidelity", +"fido", +"film", +"final", +"finance", +"financial", +"fire", +"firestone", +"firmdale", +"fish", +"fishing", +"fit", +"fitness", +"flickr", +"flights", +"flir", +"florist", +"flowers", +"fly", +"foo", +"food", +"foodnetwork", +"football", +"ford", +"forex", +"forsale", +"forum", +"foundation", +"fox", +"free", +"fresenius", +"frl", +"frogans", +"frontdoor", +"frontier", +"ftr", +"fujitsu", +"fujixerox", +"fun", +"fund", +"furniture", +"futbol", +"fyi", +"gal", +"gallery", +"gallo", +"gallup", +"game", +"games", +"gap", +"garden", +"gay", +"gbiz", +"gdn", +"gea", +"gent", +"genting", +"george", +"ggee", +"gift", +"gifts", +"gives", +"giving", +"glade", +"glass", +"gle", +"global", +"globo", +"gmail", +"gmbh", +"gmo", +"gmx", +"godaddy", +"gold", +"goldpoint", +"golf", +"goo", +"goodyear", +"goog", +"google", +"gop", +"got", +"grainger", +"graphics", +"gratis", +"green", +"gripe", +"grocery", +"group", +"guardian", +"gucci", +"guge", +"guide", +"guitars", +"guru", +"hair", +"hamburg", +"hangout", +"haus", +"hbo", +"hdfc", +"hdfcbank", +"health", +"healthcare", +"help", +"helsinki", +"here", +"hermes", +"hgtv", +"hiphop", +"hisamitsu", +"hitachi", +"hiv", +"hkt", +"hockey", +"holdings", +"holiday", +"homedepot", +"homegoods", +"homes", +"homesense", +"honda", +"horse", +"hospital", +"host", +"hosting", +"hot", +"hoteles", +"hotels", +"hotmail", +"house", +"how", +"hsbc", +"hughes", +"hyatt", +"hyundai", +"ibm", +"icbc", +"ice", +"icu", +"ieee", +"ifm", +"ikano", +"imamat", +"imdb", +"immo", +"immobilien", +"inc", +"industries", +"infiniti", +"ing", +"ink", +"institute", +"insurance", +"insure", +"intel", +"international", +"intuit", +"investments", +"ipiranga", +"irish", +"ismaili", +"ist", +"istanbul", +"itau", +"itv", +"iveco", +"jaguar", +"java", +"jcb", +"jcp", +"jeep", +"jetzt", +"jewelry", +"jio", +"jll", +"jmp", +"jnj", +"joburg", +"jot", +"joy", +"jpmorgan", +"jprs", +"juegos", +"juniper", +"kaufen", +"kddi", +"kerryhotels", +"kerrylogistics", +"kerryproperties", +"kfh", +"kia", +"kim", +"kinder", +"kindle", +"kitchen", +"kiwi", +"koeln", +"komatsu", +"kosher", +"kpmg", +"kpn", +"krd", +"kred", +"kuokgroup", +"kyoto", +"lacaixa", +"lamborghini", +"lamer", +"lancaster", +"lancia", +"land", +"landrover", +"lanxess", +"lasalle", +"lat", +"latino", +"latrobe", +"law", +"lawyer", +"lds", +"lease", +"leclerc", +"lefrak", +"legal", +"lego", +"lexus", +"lgbt", +"lidl", +"life", +"lifeinsurance", +"lifestyle", +"lighting", +"like", +"lilly", +"limited", +"limo", +"lincoln", +"linde", +"link", +"lipsy", +"live", +"living", +"lixil", +"llc", +"llp", +"loan", +"loans", +"locker", +"locus", +"loft", +"lol", +"london", +"lotte", +"lotto", +"love", +"lpl", +"lplfinancial", +"ltd", +"ltda", +"lundbeck", +"lupin", +"luxe", +"luxury", +"macys", +"madrid", +"maif", +"maison", +"makeup", +"man", +"management", +"mango", +"map", +"market", +"marketing", +"markets", +"marriott", +"marshalls", +"maserati", +"mattel", +"mba", +"mckinsey", +"med", +"media", +"meet", +"melbourne", +"meme", +"memorial", +"men", +"menu", +"merckmsd", +"metlife", +"miami", +"microsoft", +"mini", +"mint", +"mit", +"mitsubishi", +"mlb", +"mls", +"mma", +"mobile", +"moda", +"moe", +"moi", +"mom", +"monash", +"money", +"monster", +"mormon", +"mortgage", +"moscow", +"moto", +"motorcycles", +"mov", +"movie", +"msd", +"mtn", +"mtr", +"mutual", +"nab", +"nadex", +"nagoya", +"nationwide", +"natura", +"navy", +"nba", +"nec", +"netbank", +"netflix", +"network", +"neustar", +"new", +"newholland", +"news", +"next", +"nextdirect", +"nexus", +"nfl", +"ngo", +"nhk", +"nico", +"nike", +"nikon", +"ninja", +"nissan", +"nissay", +"nokia", +"northwesternmutual", +"norton", +"now", +"nowruz", +"nowtv", +"nra", +"nrw", +"ntt", +"nyc", +"obi", +"observer", +"off", +"office", +"okinawa", +"olayan", +"olayangroup", +"oldnavy", +"ollo", +"omega", +"one", +"ong", +"onl", +"online", +"onyourside", +"ooo", +"open", +"oracle", +"orange", +"organic", +"origins", +"osaka", +"otsuka", +"ott", +"ovh", +"page", +"panasonic", +"paris", +"pars", +"partners", +"parts", +"party", +"passagens", +"pay", +"pccw", +"pet", +"pfizer", +"pharmacy", +"phd", +"philips", +"phone", +"photo", +"photography", +"photos", +"physio", +"pics", +"pictet", +"pictures", +"pid", +"pin", +"ping", +"pink", +"pioneer", +"pizza", +"place", +"play", +"playstation", +"plumbing", +"plus", +"pnc", +"pohl", +"poker", +"politie", +"porn", +"pramerica", +"praxi", +"press", +"prime", +"prod", +"productions", +"prof", +"progressive", +"promo", +"properties", +"property", +"protection", +"pru", +"prudential", +"pub", +"pwc", +"qpon", +"quebec", +"quest", +"qvc", +"racing", +"radio", +"raid", +"read", +"realestate", +"realtor", +"realty", +"recipes", +"red", +"redstone", +"redumbrella", +"rehab", +"reise", +"reisen", +"reit", +"reliance", +"ren", +"rent", +"rentals", +"repair", +"report", +"republican", +"rest", +"restaurant", +"review", +"reviews", +"rexroth", +"rich", +"richardli", +"ricoh", +"rightathome", +"ril", +"rio", +"rip", +"rmit", +"rocher", +"rocks", +"rodeo", +"rogers", +"room", +"rsvp", +"rugby", +"ruhr", +"run", +"rwe", +"ryukyu", +"saarland", +"safe", +"safety", +"sakura", +"sale", +"salon", +"samsclub", +"samsung", +"sandvik", +"sandvikcoromant", +"sanofi", +"sap", +"sarl", +"sas", +"save", +"saxo", +"sbi", +"sbs", +"sca", +"scb", +"schaeffler", +"schmidt", +"scholarships", +"school", +"schule", +"schwarz", +"science", +"scjohnson", +"scor", +"scot", +"search", +"seat", +"secure", +"security", +"seek", +"select", +"sener", +"services", +"ses", +"seven", +"sew", +"sex", +"sexy", +"sfr", +"shangrila", +"sharp", +"shaw", +"shell", +"shia", +"shiksha", +"shoes", +"shop", +"shopping", +"shouji", +"show", +"showtime", +"shriram", +"silk", +"sina", +"singles", +"site", +"ski", +"skin", +"sky", +"skype", +"sling", +"smart", +"smile", +"sncf", +"soccer", +"social", +"softbank", +"software", +"sohu", +"solar", +"solutions", +"song", +"sony", +"soy", +"spa", +"space", +"sport", +"spot", +"spreadbetting", +"srl", +"stada", +"staples", +"star", +"statebank", +"statefarm", +"stc", +"stcgroup", +"stockholm", +"storage", +"store", +"stream", +"studio", +"study", +"style", +"sucks", +"supplies", +"supply", +"support", +"surf", +"surgery", +"suzuki", +"swatch", +"swiftcover", +"swiss", +"sydney", +"symantec", +"systems", +"tab", +"taipei", +"talk", +"taobao", +"target", +"tatamotors", +"tatar", +"tattoo", +"tax", +"taxi", +"tci", +"tdk", +"team", +"tech", +"technology", +"temasek", +"tennis", +"teva", +"thd", +"theater", +"theatre", +"tiaa", +"tickets", +"tienda", +"tiffany", +"tips", +"tires", +"tirol", +"tjmaxx", +"tjx", +"tkmaxx", +"tmall", +"today", +"tokyo", +"tools", +"top", +"toray", +"toshiba", +"total", +"tours", +"town", +"toyota", +"toys", +"trade", +"trading", +"training", +"travel", +"travelchannel", +"travelers", +"travelersinsurance", +"trust", +"trv", +"tube", +"tui", +"tunes", +"tushu", +"tvs", +"ubank", +"ubs", +"unicom", +"university", +"uno", +"uol", +"ups", +"vacations", +"vana", +"vanguard", +"vegas", +"ventures", +"verisign", +"versicherung", +"vet", +"viajes", +"video", +"vig", +"viking", +"villas", +"vin", +"vip", +"virgin", +"visa", +"vision", +"viva", +"vivo", +"vlaanderen", +"vodka", +"volkswagen", +"volvo", +"vote", +"voting", +"voto", +"voyage", +"vuelos", +"wales", +"walmart", +"walter", +"wang", +"wanggou", +"watch", +"watches", +"weather", +"weatherchannel", +"webcam", +"weber", +"website", +"wed", +"wedding", +"weibo", +"weir", +"whoswho", +"wien", +"wiki", +"williamhill", +"win", +"windows", +"wine", +"winners", +"wme", +"wolterskluwer", +"woodside", +"work", +"works", +"world", +"wow", +"wtc", +"wtf", +"xbox", +"xerox", +"xfinity", +"xihuan", +"xin", +"कॉम", +"セール", +"佛山", +"慈善", +"集团", +"在线", +"大众汽车", +"点看", +"คอม", +"八卦", +"موقع", +"公益", +"公司", +"香格里拉", +"网站", +"移动", +"我爱你", +"москва", +"католик", +"онлайн", +"сайт", +"联通", +"קום", +"时尚", +"微博", +"淡马锡", +"ファッション", +"орг", +"नेट", +"ストア", +"アマゾン", +"삼성", +"商标", +"商店", +"商城", +"дети", +"ポイント", +"新闻", +"工行", +"家電", +"كوم", +"中文网", +"中信", +"娱乐", +"谷歌", +"電訊盈科", +"购物", +"クラウド", +"通販", +"网店", +"संगठन", +"餐厅", +"网络", +"ком", +"亚马逊", +"诺基亚", +"食品", +"飞利浦", +"手表", +"手机", +"ارامكو", +"العليان", +"اتصالات", +"بازار", +"ابوظبي", +"كاثوليك", +"همراه", +"닷컴", +"政府", +"شبكة", +"بيتك", +"عرب", +"机构", +"组织机构", +"健康", +"招聘", +"рус", +"珠宝", +"大拿", +"みんな", +"グーグル", +"世界", +"書籍", +"网址", +"닷넷", +"コム", +"天主教", +"游戏", +"vermögensberater", +"vermögensberatung", +"企业", +"信息", +"嘉里大酒店", +"嘉里", +"广东", +"政务", +"xyz", +"yachts", +"yahoo", +"yamaxun", +"yandex", +"yodobashi", +"yoga", +"yokohama", +"you", +"youtube", +"yun", +"zappos", +"zara", +"zero", +"zip", +"zone", +"zuerich", +"cc.ua", +"inf.ua", +"ltd.ua", +"adobeaemcloud.com", +"adobeaemcloud.net", +"*.dev.adobeaemcloud.com", +"beep.pl", +"barsy.ca", +"*.compute.estate", +"*.alces.network", +"altervista.org", +"alwaysdata.net", +"cloudfront.net", +"*.compute.amazonaws.com", +"*.compute-1.amazonaws.com", +"*.compute.amazonaws.com.cn", +"us-east-1.amazonaws.com", +"cn-north-1.eb.amazonaws.com.cn", +"cn-northwest-1.eb.amazonaws.com.cn", +"elasticbeanstalk.com", +"ap-northeast-1.elasticbeanstalk.com", +"ap-northeast-2.elasticbeanstalk.com", +"ap-northeast-3.elasticbeanstalk.com", +"ap-south-1.elasticbeanstalk.com", +"ap-southeast-1.elasticbeanstalk.com", +"ap-southeast-2.elasticbeanstalk.com", +"ca-central-1.elasticbeanstalk.com", +"eu-central-1.elasticbeanstalk.com", +"eu-west-1.elasticbeanstalk.com", +"eu-west-2.elasticbeanstalk.com", +"eu-west-3.elasticbeanstalk.com", +"sa-east-1.elasticbeanstalk.com", +"us-east-1.elasticbeanstalk.com", +"us-east-2.elasticbeanstalk.com", +"us-gov-west-1.elasticbeanstalk.com", +"us-west-1.elasticbeanstalk.com", +"us-west-2.elasticbeanstalk.com", +"*.elb.amazonaws.com", +"*.elb.amazonaws.com.cn", +"s3.amazonaws.com", +"s3-ap-northeast-1.amazonaws.com", +"s3-ap-northeast-2.amazonaws.com", +"s3-ap-south-1.amazonaws.com", +"s3-ap-southeast-1.amazonaws.com", +"s3-ap-southeast-2.amazonaws.com", +"s3-ca-central-1.amazonaws.com", +"s3-eu-central-1.amazonaws.com", +"s3-eu-west-1.amazonaws.com", +"s3-eu-west-2.amazonaws.com", +"s3-eu-west-3.amazonaws.com", +"s3-external-1.amazonaws.com", +"s3-fips-us-gov-west-1.amazonaws.com", +"s3-sa-east-1.amazonaws.com", +"s3-us-gov-west-1.amazonaws.com", +"s3-us-east-2.amazonaws.com", +"s3-us-west-1.amazonaws.com", +"s3-us-west-2.amazonaws.com", +"s3.ap-northeast-2.amazonaws.com", +"s3.ap-south-1.amazonaws.com", +"s3.cn-north-1.amazonaws.com.cn", +"s3.ca-central-1.amazonaws.com", +"s3.eu-central-1.amazonaws.com", +"s3.eu-west-2.amazonaws.com", +"s3.eu-west-3.amazonaws.com", +"s3.us-east-2.amazonaws.com", +"s3.dualstack.ap-northeast-1.amazonaws.com", +"s3.dualstack.ap-northeast-2.amazonaws.com", +"s3.dualstack.ap-south-1.amazonaws.com", +"s3.dualstack.ap-southeast-1.amazonaws.com", +"s3.dualstack.ap-southeast-2.amazonaws.com", +"s3.dualstack.ca-central-1.amazonaws.com", +"s3.dualstack.eu-central-1.amazonaws.com", +"s3.dualstack.eu-west-1.amazonaws.com", +"s3.dualstack.eu-west-2.amazonaws.com", +"s3.dualstack.eu-west-3.amazonaws.com", +"s3.dualstack.sa-east-1.amazonaws.com", +"s3.dualstack.us-east-1.amazonaws.com", +"s3.dualstack.us-east-2.amazonaws.com", +"s3-website-us-east-1.amazonaws.com", +"s3-website-us-west-1.amazonaws.com", +"s3-website-us-west-2.amazonaws.com", +"s3-website-ap-northeast-1.amazonaws.com", +"s3-website-ap-southeast-1.amazonaws.com", +"s3-website-ap-southeast-2.amazonaws.com", +"s3-website-eu-west-1.amazonaws.com", +"s3-website-sa-east-1.amazonaws.com", +"s3-website.ap-northeast-2.amazonaws.com", +"s3-website.ap-south-1.amazonaws.com", +"s3-website.ca-central-1.amazonaws.com", +"s3-website.eu-central-1.amazonaws.com", +"s3-website.eu-west-2.amazonaws.com", +"s3-website.eu-west-3.amazonaws.com", +"s3-website.us-east-2.amazonaws.com", +"amsw.nl", +"t3l3p0rt.net", +"tele.amune.org", +"apigee.io", +"on-aptible.com", +"user.aseinet.ne.jp", +"gv.vc", +"d.gv.vc", +"user.party.eus", +"pimienta.org", +"poivron.org", +"potager.org", +"sweetpepper.org", +"myasustor.com", +"myfritz.net", +"*.awdev.ca", +"*.advisor.ws", +"b-data.io", +"backplaneapp.io", +"balena-devices.com", +"app.banzaicloud.io", +"betainabox.com", +"bnr.la", +"blackbaudcdn.net", +"boomla.net", +"boxfuse.io", +"square7.ch", +"bplaced.com", +"bplaced.de", +"square7.de", +"bplaced.net", +"square7.net", +"browsersafetymark.io", +"uk0.bigv.io", +"dh.bytemark.co.uk", +"vm.bytemark.co.uk", +"mycd.eu", +"carrd.co", +"crd.co", +"uwu.ai", +"ae.org", +"ar.com", +"br.com", +"cn.com", +"com.de", +"com.se", +"de.com", +"eu.com", +"gb.com", +"gb.net", +"hu.com", +"hu.net", +"jp.net", +"jpn.com", +"kr.com", +"mex.com", +"no.com", +"qc.com", +"ru.com", +"sa.com", +"se.net", +"uk.com", +"uk.net", +"us.com", +"uy.com", +"za.bz", +"za.com", +"africa.com", +"gr.com", +"in.net", +"us.org", +"co.com", +"c.la", +"certmgr.org", +"xenapponazure.com", +"discourse.group", +"discourse.team", +"virtueeldomein.nl", +"cleverapps.io", +"*.lcl.dev", +"*.stg.dev", +"c66.me", +"cloud66.ws", +"cloud66.zone", +"jdevcloud.com", +"wpdevcloud.com", +"cloudaccess.host", +"freesite.host", +"cloudaccess.net", +"cloudcontrolled.com", +"cloudcontrolapp.com", +"cloudera.site", +"trycloudflare.com", +"workers.dev", +"wnext.app", +"co.ca", +"*.otap.co", +"co.cz", +"c.cdn77.org", +"cdn77-ssl.net", +"r.cdn77.net", +"rsc.cdn77.org", +"ssl.origin.cdn77-secure.org", +"cloudns.asia", +"cloudns.biz", +"cloudns.club", +"cloudns.cc", +"cloudns.eu", +"cloudns.in", +"cloudns.info", +"cloudns.org", +"cloudns.pro", +"cloudns.pw", +"cloudns.us", +"cloudeity.net", +"cnpy.gdn", +"co.nl", +"co.no", +"webhosting.be", +"hosting-cluster.nl", +"ac.ru", +"edu.ru", +"gov.ru", +"int.ru", +"mil.ru", +"test.ru", +"dyn.cosidns.de", +"dynamisches-dns.de", +"dnsupdater.de", +"internet-dns.de", +"l-o-g-i-n.de", +"dynamic-dns.info", +"feste-ip.net", +"knx-server.net", +"static-access.net", +"realm.cz", +"*.cryptonomic.net", +"cupcake.is", +"*.customer-oci.com", +"*.oci.customer-oci.com", +"*.ocp.customer-oci.com", +"*.ocs.customer-oci.com", +"cyon.link", +"cyon.site", +"daplie.me", +"localhost.daplie.me", +"dattolocal.com", +"dattorelay.com", +"dattoweb.com", +"mydatto.com", +"dattolocal.net", +"mydatto.net", +"biz.dk", +"co.dk", +"firm.dk", +"reg.dk", +"store.dk", +"*.dapps.earth", +"*.bzz.dapps.earth", +"builtwithdark.com", +"edgestack.me", +"debian.net", +"dedyn.io", +"dnshome.de", +"online.th", +"shop.th", +"drayddns.com", +"dreamhosters.com", +"mydrobo.com", +"drud.io", +"drud.us", +"duckdns.org", +"dy.fi", +"tunk.org", +"dyndns-at-home.com", +"dyndns-at-work.com", +"dyndns-blog.com", +"dyndns-free.com", +"dyndns-home.com", +"dyndns-ip.com", +"dyndns-mail.com", +"dyndns-office.com", +"dyndns-pics.com", +"dyndns-remote.com", +"dyndns-server.com", +"dyndns-web.com", +"dyndns-wiki.com", +"dyndns-work.com", +"dyndns.biz", +"dyndns.info", +"dyndns.org", +"dyndns.tv", +"at-band-camp.net", +"ath.cx", +"barrel-of-knowledge.info", +"barrell-of-knowledge.info", +"better-than.tv", +"blogdns.com", +"blogdns.net", +"blogdns.org", +"blogsite.org", +"boldlygoingnowhere.org", +"broke-it.net", +"buyshouses.net", +"cechire.com", +"dnsalias.com", +"dnsalias.net", +"dnsalias.org", +"dnsdojo.com", +"dnsdojo.net", +"dnsdojo.org", +"does-it.net", +"doesntexist.com", +"doesntexist.org", +"dontexist.com", +"dontexist.net", +"dontexist.org", +"doomdns.com", +"doomdns.org", +"dvrdns.org", +"dyn-o-saur.com", +"dynalias.com", +"dynalias.net", +"dynalias.org", +"dynathome.net", +"dyndns.ws", +"endofinternet.net", +"endofinternet.org", +"endoftheinternet.org", +"est-a-la-maison.com", +"est-a-la-masion.com", +"est-le-patron.com", +"est-mon-blogueur.com", +"for-better.biz", +"for-more.biz", +"for-our.info", +"for-some.biz", +"for-the.biz", +"forgot.her.name", +"forgot.his.name", +"from-ak.com", +"from-al.com", +"from-ar.com", +"from-az.net", +"from-ca.com", +"from-co.net", +"from-ct.com", +"from-dc.com", +"from-de.com", +"from-fl.com", +"from-ga.com", +"from-hi.com", +"from-ia.com", +"from-id.com", +"from-il.com", +"from-in.com", +"from-ks.com", +"from-ky.com", +"from-la.net", +"from-ma.com", +"from-md.com", +"from-me.org", +"from-mi.com", +"from-mn.com", +"from-mo.com", +"from-ms.com", +"from-mt.com", +"from-nc.com", +"from-nd.com", +"from-ne.com", +"from-nh.com", +"from-nj.com", +"from-nm.com", +"from-nv.com", +"from-ny.net", +"from-oh.com", +"from-ok.com", +"from-or.com", +"from-pa.com", +"from-pr.com", +"from-ri.com", +"from-sc.com", +"from-sd.com", +"from-tn.com", +"from-tx.com", +"from-ut.com", +"from-va.com", +"from-vt.com", +"from-wa.com", +"from-wi.com", +"from-wv.com", +"from-wy.com", +"ftpaccess.cc", +"fuettertdasnetz.de", +"game-host.org", +"game-server.cc", +"getmyip.com", +"gets-it.net", +"go.dyndns.org", +"gotdns.com", +"gotdns.org", +"groks-the.info", +"groks-this.info", +"ham-radio-op.net", +"here-for-more.info", +"hobby-site.com", +"hobby-site.org", +"home.dyndns.org", +"homedns.org", +"homeftp.net", +"homeftp.org", +"homeip.net", +"homelinux.com", +"homelinux.net", +"homelinux.org", +"homeunix.com", +"homeunix.net", +"homeunix.org", +"iamallama.com", +"in-the-band.net", +"is-a-anarchist.com", +"is-a-blogger.com", +"is-a-bookkeeper.com", +"is-a-bruinsfan.org", +"is-a-bulls-fan.com", +"is-a-candidate.org", +"is-a-caterer.com", +"is-a-celticsfan.org", +"is-a-chef.com", +"is-a-chef.net", +"is-a-chef.org", +"is-a-conservative.com", +"is-a-cpa.com", +"is-a-cubicle-slave.com", +"is-a-democrat.com", +"is-a-designer.com", +"is-a-doctor.com", +"is-a-financialadvisor.com", +"is-a-geek.com", +"is-a-geek.net", +"is-a-geek.org", +"is-a-green.com", +"is-a-guru.com", +"is-a-hard-worker.com", +"is-a-hunter.com", +"is-a-knight.org", +"is-a-landscaper.com", +"is-a-lawyer.com", +"is-a-liberal.com", +"is-a-libertarian.com", +"is-a-linux-user.org", +"is-a-llama.com", +"is-a-musician.com", +"is-a-nascarfan.com", +"is-a-nurse.com", +"is-a-painter.com", +"is-a-patsfan.org", +"is-a-personaltrainer.com", +"is-a-photographer.com", +"is-a-player.com", +"is-a-republican.com", +"is-a-rockstar.com", +"is-a-socialist.com", +"is-a-soxfan.org", +"is-a-student.com", +"is-a-teacher.com", +"is-a-techie.com", +"is-a-therapist.com", +"is-an-accountant.com", +"is-an-actor.com", +"is-an-actress.com", +"is-an-anarchist.com", +"is-an-artist.com", +"is-an-engineer.com", +"is-an-entertainer.com", +"is-by.us", +"is-certified.com", +"is-found.org", +"is-gone.com", +"is-into-anime.com", +"is-into-cars.com", +"is-into-cartoons.com", +"is-into-games.com", +"is-leet.com", +"is-lost.org", +"is-not-certified.com", +"is-saved.org", +"is-slick.com", +"is-uberleet.com", +"is-very-bad.org", +"is-very-evil.org", +"is-very-good.org", +"is-very-nice.org", +"is-very-sweet.org", +"is-with-theband.com", +"isa-geek.com", +"isa-geek.net", +"isa-geek.org", +"isa-hockeynut.com", +"issmarterthanyou.com", +"isteingeek.de", +"istmein.de", +"kicks-ass.net", +"kicks-ass.org", +"knowsitall.info", +"land-4-sale.us", +"lebtimnetz.de", +"leitungsen.de", +"likes-pie.com", +"likescandy.com", +"merseine.nu", +"mine.nu", +"misconfused.org", +"mypets.ws", +"myphotos.cc", +"neat-url.com", +"office-on-the.net", +"on-the-web.tv", +"podzone.net", +"podzone.org", +"readmyblog.org", +"saves-the-whales.com", +"scrapper-site.net", +"scrapping.cc", +"selfip.biz", +"selfip.com", +"selfip.info", +"selfip.net", +"selfip.org", +"sells-for-less.com", +"sells-for-u.com", +"sells-it.net", +"sellsyourhome.org", +"servebbs.com", +"servebbs.net", +"servebbs.org", +"serveftp.net", +"serveftp.org", +"servegame.org", +"shacknet.nu", +"simple-url.com", +"space-to-rent.com", +"stuff-4-sale.org", +"stuff-4-sale.us", +"teaches-yoga.com", +"thruhere.net", +"traeumtgerade.de", +"webhop.biz", +"webhop.info", +"webhop.net", +"webhop.org", +"worse-than.tv", +"writesthisblog.com", +"ddnss.de", +"dyn.ddnss.de", +"dyndns.ddnss.de", +"dyndns1.de", +"dyn-ip24.de", +"home-webserver.de", +"dyn.home-webserver.de", +"myhome-server.de", +"ddnss.org", +"definima.net", +"definima.io", +"bci.dnstrace.pro", +"ddnsfree.com", +"ddnsgeek.com", +"giize.com", +"gleeze.com", +"kozow.com", +"loseyourip.com", +"ooguy.com", +"theworkpc.com", +"casacam.net", +"dynu.net", +"accesscam.org", +"camdvr.org", +"freeddns.org", +"mywire.org", +"webredirect.org", +"myddns.rocks", +"blogsite.xyz", +"dynv6.net", +"e4.cz", +"en-root.fr", +"mytuleap.com", +"onred.one", +"staging.onred.one", +"enonic.io", +"customer.enonic.io", +"eu.org", +"al.eu.org", +"asso.eu.org", +"at.eu.org", +"au.eu.org", +"be.eu.org", +"bg.eu.org", +"ca.eu.org", +"cd.eu.org", +"ch.eu.org", +"cn.eu.org", +"cy.eu.org", +"cz.eu.org", +"de.eu.org", +"dk.eu.org", +"edu.eu.org", +"ee.eu.org", +"es.eu.org", +"fi.eu.org", +"fr.eu.org", +"gr.eu.org", +"hr.eu.org", +"hu.eu.org", +"ie.eu.org", +"il.eu.org", +"in.eu.org", +"int.eu.org", +"is.eu.org", +"it.eu.org", +"jp.eu.org", +"kr.eu.org", +"lt.eu.org", +"lu.eu.org", +"lv.eu.org", +"mc.eu.org", +"me.eu.org", +"mk.eu.org", +"mt.eu.org", +"my.eu.org", +"net.eu.org", +"ng.eu.org", +"nl.eu.org", +"no.eu.org", +"nz.eu.org", +"paris.eu.org", +"pl.eu.org", +"pt.eu.org", +"q-a.eu.org", +"ro.eu.org", +"ru.eu.org", +"se.eu.org", +"si.eu.org", +"sk.eu.org", +"tr.eu.org", +"uk.eu.org", +"us.eu.org", +"eu-1.evennode.com", +"eu-2.evennode.com", +"eu-3.evennode.com", +"eu-4.evennode.com", +"us-1.evennode.com", +"us-2.evennode.com", +"us-3.evennode.com", +"us-4.evennode.com", +"twmail.cc", +"twmail.net", +"twmail.org", +"mymailer.com.tw", +"url.tw", +"apps.fbsbx.com", +"ru.net", +"adygeya.ru", +"bashkiria.ru", +"bir.ru", +"cbg.ru", +"com.ru", +"dagestan.ru", +"grozny.ru", +"kalmykia.ru", +"kustanai.ru", +"marine.ru", +"mordovia.ru", +"msk.ru", +"mytis.ru", +"nalchik.ru", +"nov.ru", +"pyatigorsk.ru", +"spb.ru", +"vladikavkaz.ru", +"vladimir.ru", +"abkhazia.su", +"adygeya.su", +"aktyubinsk.su", +"arkhangelsk.su", +"armenia.su", +"ashgabad.su", +"azerbaijan.su", +"balashov.su", +"bashkiria.su", +"bryansk.su", +"bukhara.su", +"chimkent.su", +"dagestan.su", +"east-kazakhstan.su", +"exnet.su", +"georgia.su", +"grozny.su", +"ivanovo.su", +"jambyl.su", +"kalmykia.su", +"kaluga.su", +"karacol.su", +"karaganda.su", +"karelia.su", +"khakassia.su", +"krasnodar.su", +"kurgan.su", +"kustanai.su", +"lenug.su", +"mangyshlak.su", +"mordovia.su", +"msk.su", +"murmansk.su", +"nalchik.su", +"navoi.su", +"north-kazakhstan.su", +"nov.su", +"obninsk.su", +"penza.su", +"pokrovsk.su", +"sochi.su", +"spb.su", +"tashkent.su", +"termez.su", +"togliatti.su", +"troitsk.su", +"tselinograd.su", +"tula.su", +"tuva.su", +"vladikavkaz.su", +"vladimir.su", +"vologda.su", +"channelsdvr.net", +"u.channelsdvr.net", +"fastly-terrarium.com", +"fastlylb.net", +"map.fastlylb.net", +"freetls.fastly.net", +"map.fastly.net", +"a.prod.fastly.net", +"global.prod.fastly.net", +"a.ssl.fastly.net", +"b.ssl.fastly.net", +"global.ssl.fastly.net", +"fastpanel.direct", +"fastvps-server.com", +"fhapp.xyz", +"fedorainfracloud.org", +"fedorapeople.org", +"cloud.fedoraproject.org", +"app.os.fedoraproject.org", +"app.os.stg.fedoraproject.org", +"mydobiss.com", +"filegear.me", +"filegear-au.me", +"filegear-de.me", +"filegear-gb.me", +"filegear-ie.me", +"filegear-jp.me", +"filegear-sg.me", +"firebaseapp.com", +"flynnhub.com", +"flynnhosting.net", +"0e.vc", +"freebox-os.com", +"freeboxos.com", +"fbx-os.fr", +"fbxos.fr", +"freebox-os.fr", +"freeboxos.fr", +"freedesktop.org", +"*.futurecms.at", +"*.ex.futurecms.at", +"*.in.futurecms.at", +"futurehosting.at", +"futuremailing.at", +"*.ex.ortsinfo.at", +"*.kunden.ortsinfo.at", +"*.statics.cloud", +"service.gov.uk", +"gehirn.ne.jp", +"usercontent.jp", +"gentapps.com", +"lab.ms", +"github.io", +"githubusercontent.com", +"gitlab.io", +"glitch.me", +"lolipop.io", +"cloudapps.digital", +"london.cloudapps.digital", +"homeoffice.gov.uk", +"ro.im", +"shop.ro", +"goip.de", +"run.app", +"a.run.app", +"web.app", +"*.0emm.com", +"appspot.com", +"*.r.appspot.com", +"blogspot.ae", +"blogspot.al", +"blogspot.am", +"blogspot.ba", +"blogspot.be", +"blogspot.bg", +"blogspot.bj", +"blogspot.ca", +"blogspot.cf", +"blogspot.ch", +"blogspot.cl", +"blogspot.co.at", +"blogspot.co.id", +"blogspot.co.il", +"blogspot.co.ke", +"blogspot.co.nz", +"blogspot.co.uk", +"blogspot.co.za", +"blogspot.com", +"blogspot.com.ar", +"blogspot.com.au", +"blogspot.com.br", +"blogspot.com.by", +"blogspot.com.co", +"blogspot.com.cy", +"blogspot.com.ee", +"blogspot.com.eg", +"blogspot.com.es", +"blogspot.com.mt", +"blogspot.com.ng", +"blogspot.com.tr", +"blogspot.com.uy", +"blogspot.cv", +"blogspot.cz", +"blogspot.de", +"blogspot.dk", +"blogspot.fi", +"blogspot.fr", +"blogspot.gr", +"blogspot.hk", +"blogspot.hr", +"blogspot.hu", +"blogspot.ie", +"blogspot.in", +"blogspot.is", +"blogspot.it", +"blogspot.jp", +"blogspot.kr", +"blogspot.li", +"blogspot.lt", +"blogspot.lu", +"blogspot.md", +"blogspot.mk", +"blogspot.mr", +"blogspot.mx", +"blogspot.my", +"blogspot.nl", +"blogspot.no", +"blogspot.pe", +"blogspot.pt", +"blogspot.qa", +"blogspot.re", +"blogspot.ro", +"blogspot.rs", +"blogspot.ru", +"blogspot.se", +"blogspot.sg", +"blogspot.si", +"blogspot.sk", +"blogspot.sn", +"blogspot.td", +"blogspot.tw", +"blogspot.ug", +"blogspot.vn", +"cloudfunctions.net", +"cloud.goog", +"codespot.com", +"googleapis.com", +"googlecode.com", +"pagespeedmobilizer.com", +"publishproxy.com", +"withgoogle.com", +"withyoutube.com", +"awsmppl.com", +"fin.ci", +"free.hr", +"caa.li", +"ua.rs", +"conf.se", +"hs.zone", +"hs.run", +"hashbang.sh", +"hasura.app", +"hasura-app.io", +"hepforge.org", +"herokuapp.com", +"herokussl.com", +"myravendb.com", +"ravendb.community", +"ravendb.me", +"development.run", +"ravendb.run", +"bpl.biz", +"orx.biz", +"ng.city", +"biz.gl", +"ng.ink", +"col.ng", +"firm.ng", +"gen.ng", +"ltd.ng", +"ngo.ng", +"ng.school", +"sch.so", +"häkkinen.fi", +"*.moonscale.io", +"moonscale.net", +"iki.fi", +"dyn-berlin.de", +"in-berlin.de", +"in-brb.de", +"in-butter.de", +"in-dsl.de", +"in-dsl.net", +"in-dsl.org", +"in-vpn.de", +"in-vpn.net", +"in-vpn.org", +"biz.at", +"info.at", +"info.cx", +"ac.leg.br", +"al.leg.br", +"am.leg.br", +"ap.leg.br", +"ba.leg.br", +"ce.leg.br", +"df.leg.br", +"es.leg.br", +"go.leg.br", +"ma.leg.br", +"mg.leg.br", +"ms.leg.br", +"mt.leg.br", +"pa.leg.br", +"pb.leg.br", +"pe.leg.br", +"pi.leg.br", +"pr.leg.br", +"rj.leg.br", +"rn.leg.br", +"ro.leg.br", +"rr.leg.br", +"rs.leg.br", +"sc.leg.br", +"se.leg.br", +"sp.leg.br", +"to.leg.br", +"pixolino.com", +"ipifony.net", +"mein-iserv.de", +"test-iserv.de", +"iserv.dev", +"iobb.net", +"myjino.ru", +"*.hosting.myjino.ru", +"*.landing.myjino.ru", +"*.spectrum.myjino.ru", +"*.vps.myjino.ru", +"*.triton.zone", +"*.cns.joyent.com", +"js.org", +"kaas.gg", +"khplay.nl", +"keymachine.de", +"kinghost.net", +"uni5.net", +"knightpoint.systems", +"oya.to", +"co.krd", +"edu.krd", +"git-repos.de", +"lcube-server.de", +"svn-repos.de", +"leadpages.co", +"lpages.co", +"lpusercontent.com", +"lelux.site", +"co.business", +"co.education", +"co.events", +"co.financial", +"co.network", +"co.place", +"co.technology", +"app.lmpm.com", +"linkitools.space", +"linkyard.cloud", +"linkyard-cloud.ch", +"members.linode.com", +"nodebalancer.linode.com", +"we.bs", +"loginline.app", +"loginline.dev", +"loginline.io", +"loginline.services", +"loginline.site", +"krasnik.pl", +"leczna.pl", +"lubartow.pl", +"lublin.pl", +"poniatowa.pl", +"swidnik.pl", +"uklugs.org", +"glug.org.uk", +"lug.org.uk", +"lugs.org.uk", +"barsy.bg", +"barsy.co.uk", +"barsyonline.co.uk", +"barsycenter.com", +"barsyonline.com", +"barsy.club", +"barsy.de", +"barsy.eu", +"barsy.in", +"barsy.info", +"barsy.io", +"barsy.me", +"barsy.menu", +"barsy.mobi", +"barsy.net", +"barsy.online", +"barsy.org", +"barsy.pro", +"barsy.pub", +"barsy.shop", +"barsy.site", +"barsy.support", +"barsy.uk", +"*.magentosite.cloud", +"mayfirst.info", +"mayfirst.org", +"hb.cldmail.ru", +"miniserver.com", +"memset.net", +"cloud.metacentrum.cz", +"custom.metacentrum.cz", +"flt.cloud.muni.cz", +"usr.cloud.muni.cz", +"meteorapp.com", +"eu.meteorapp.com", +"co.pl", +"azurecontainer.io", +"azurewebsites.net", +"azure-mobile.net", +"cloudapp.net", +"mozilla-iot.org", +"bmoattachments.org", +"net.ru", +"org.ru", +"pp.ru", +"ui.nabu.casa", +"pony.club", +"of.fashion", +"on.fashion", +"of.football", +"in.london", +"of.london", +"for.men", +"and.mom", +"for.mom", +"for.one", +"for.sale", +"of.work", +"to.work", +"nctu.me", +"bitballoon.com", +"netlify.com", +"4u.com", +"ngrok.io", +"nh-serv.co.uk", +"nfshost.com", +"dnsking.ch", +"mypi.co", +"n4t.co", +"001www.com", +"ddnslive.com", +"myiphost.com", +"forumz.info", +"16-b.it", +"32-b.it", +"64-b.it", +"soundcast.me", +"tcp4.me", +"dnsup.net", +"hicam.net", +"now-dns.net", +"ownip.net", +"vpndns.net", +"dynserv.org", +"now-dns.org", +"x443.pw", +"now-dns.top", +"ntdll.top", +"freeddns.us", +"crafting.xyz", +"zapto.xyz", +"nsupdate.info", +"nerdpol.ovh", +"blogsyte.com", +"brasilia.me", +"cable-modem.org", +"ciscofreak.com", +"collegefan.org", +"couchpotatofries.org", +"damnserver.com", +"ddns.me", +"ditchyourip.com", +"dnsfor.me", +"dnsiskinky.com", +"dvrcam.info", +"dynns.com", +"eating-organic.net", +"fantasyleague.cc", +"geekgalaxy.com", +"golffan.us", +"health-carereform.com", +"homesecuritymac.com", +"homesecuritypc.com", +"hopto.me", +"ilovecollege.info", +"loginto.me", +"mlbfan.org", +"mmafan.biz", +"myactivedirectory.com", +"mydissent.net", +"myeffect.net", +"mymediapc.net", +"mypsx.net", +"mysecuritycamera.com", +"mysecuritycamera.net", +"mysecuritycamera.org", +"net-freaks.com", +"nflfan.org", +"nhlfan.net", +"no-ip.ca", +"no-ip.co.uk", +"no-ip.net", +"noip.us", +"onthewifi.com", +"pgafan.net", +"point2this.com", +"pointto.us", +"privatizehealthinsurance.net", +"quicksytes.com", +"read-books.org", +"securitytactics.com", +"serveexchange.com", +"servehumour.com", +"servep2p.com", +"servesarcasm.com", +"stufftoread.com", +"ufcfan.org", +"unusualperson.com", +"workisboring.com", +"3utilities.com", +"bounceme.net", +"ddns.net", +"ddnsking.com", +"gotdns.ch", +"hopto.org", +"myftp.biz", +"myftp.org", +"myvnc.com", +"no-ip.biz", +"no-ip.info", +"no-ip.org", +"noip.me", +"redirectme.net", +"servebeer.com", +"serveblog.net", +"servecounterstrike.com", +"serveftp.com", +"servegame.com", +"servehalflife.com", +"servehttp.com", +"serveirc.com", +"serveminecraft.net", +"servemp3.com", +"servepics.com", +"servequake.com", +"sytes.net", +"webhop.me", +"zapto.org", +"stage.nodeart.io", +"nodum.co", +"nodum.io", +"pcloud.host", +"nyc.mn", +"nom.ae", +"nom.af", +"nom.ai", +"nom.al", +"nym.by", +"nom.bz", +"nym.bz", +"nom.cl", +"nym.ec", +"nom.gd", +"nom.ge", +"nom.gl", +"nym.gr", +"nom.gt", +"nym.gy", +"nym.hk", +"nom.hn", +"nym.ie", +"nom.im", +"nom.ke", +"nym.kz", +"nym.la", +"nym.lc", +"nom.li", +"nym.li", +"nym.lt", +"nym.lu", +"nom.lv", +"nym.me", +"nom.mk", +"nym.mn", +"nym.mx", +"nom.nu", +"nym.nz", +"nym.pe", +"nym.pt", +"nom.pw", +"nom.qa", +"nym.ro", +"nom.rs", +"nom.si", +"nym.sk", +"nom.st", +"nym.su", +"nym.sx", +"nom.tj", +"nym.tw", +"nom.ug", +"nom.uy", +"nom.vc", +"nom.vg", +"static.observableusercontent.com", +"cya.gg", +"cloudycluster.net", +"nid.io", +"opencraft.hosting", +"operaunite.com", +"skygearapp.com", +"outsystemscloud.com", +"ownprovider.com", +"own.pm", +"ox.rs", +"oy.lc", +"pgfog.com", +"pagefrontapp.com", +"art.pl", +"gliwice.pl", +"krakow.pl", +"poznan.pl", +"wroc.pl", +"zakopane.pl", +"pantheonsite.io", +"gotpantheon.com", +"mypep.link", +"perspecta.cloud", +"on-web.fr", +"*.platform.sh", +"*.platformsh.site", +"dyn53.io", +"co.bn", +"xen.prgmr.com", +"priv.at", +"prvcy.page", +"*.dweb.link", +"protonet.io", +"chirurgiens-dentistes-en-france.fr", +"byen.site", +"pubtls.org", +"qualifioapp.com", +"qbuser.com", +"instantcloud.cn", +"ras.ru", +"qa2.com", +"qcx.io", +"*.sys.qcx.io", +"dev-myqnapcloud.com", +"alpha-myqnapcloud.com", +"myqnapcloud.com", +"*.quipelements.com", +"vapor.cloud", +"vaporcloud.io", +"rackmaze.com", +"rackmaze.net", +"*.on-k3s.io", +"*.on-rancher.cloud", +"*.on-rio.io", +"readthedocs.io", +"rhcloud.com", +"app.render.com", +"onrender.com", +"repl.co", +"repl.run", +"resindevice.io", +"devices.resinstaging.io", +"hzc.io", +"wellbeingzone.eu", +"ptplus.fit", +"wellbeingzone.co.uk", +"git-pages.rit.edu", +"sandcats.io", +"logoip.de", +"logoip.com", +"schokokeks.net", +"gov.scot", +"scrysec.com", +"firewall-gateway.com", +"firewall-gateway.de", +"my-gateway.de", +"my-router.de", +"spdns.de", +"spdns.eu", +"firewall-gateway.net", +"my-firewall.org", +"myfirewall.org", +"spdns.org", +"senseering.net", +"biz.ua", +"co.ua", +"pp.ua", +"shiftedit.io", +"myshopblocks.com", +"shopitsite.com", +"mo-siemens.io", +"1kapp.com", +"appchizi.com", +"applinzi.com", +"sinaapp.com", +"vipsinaapp.com", +"siteleaf.net", +"bounty-full.com", +"alpha.bounty-full.com", +"beta.bounty-full.com", +"stackhero-network.com", +"static.land", +"dev.static.land", +"sites.static.land", +"apps.lair.io", +"*.stolos.io", +"spacekit.io", +"customer.speedpartner.de", +"api.stdlib.com", +"storj.farm", +"utwente.io", +"soc.srcf.net", +"user.srcf.net", +"temp-dns.com", +"applicationcloud.io", +"scapp.io", +"*.s5y.io", +"*.sensiosite.cloud", +"syncloud.it", +"diskstation.me", +"dscloud.biz", +"dscloud.me", +"dscloud.mobi", +"dsmynas.com", +"dsmynas.net", +"dsmynas.org", +"familyds.com", +"familyds.net", +"familyds.org", +"i234.me", +"myds.me", +"synology.me", +"vpnplus.to", +"direct.quickconnect.to", +"taifun-dns.de", +"gda.pl", +"gdansk.pl", +"gdynia.pl", +"med.pl", +"sopot.pl", +"edugit.org", +"telebit.app", +"telebit.io", +"*.telebit.xyz", +"gwiddle.co.uk", +"thingdustdata.com", +"cust.dev.thingdust.io", +"cust.disrec.thingdust.io", +"cust.prod.thingdust.io", +"cust.testing.thingdust.io", +"arvo.network", +"azimuth.network", +"bloxcms.com", +"townnews-staging.com", +"12hp.at", +"2ix.at", +"4lima.at", +"lima-city.at", +"12hp.ch", +"2ix.ch", +"4lima.ch", +"lima-city.ch", +"trafficplex.cloud", +"de.cool", +"12hp.de", +"2ix.de", +"4lima.de", +"lima-city.de", +"1337.pictures", +"clan.rip", +"lima-city.rocks", +"webspace.rocks", +"lima.zone", +"*.transurl.be", +"*.transurl.eu", +"*.transurl.nl", +"tuxfamily.org", +"dd-dns.de", +"diskstation.eu", +"diskstation.org", +"dray-dns.de", +"draydns.de", +"dyn-vpn.de", +"dynvpn.de", +"mein-vigor.de", +"my-vigor.de", +"my-wan.de", +"syno-ds.de", +"synology-diskstation.de", +"synology-ds.de", +"uber.space", +"*.uberspace.de", +"hk.com", +"hk.org", +"ltd.hk", +"inc.hk", +"virtualuser.de", +"virtual-user.de", +"urown.cloud", +"dnsupdate.info", +"lib.de.us", +"2038.io", +"router.management", +"v-info.info", +"voorloper.cloud", +"v.ua", +"wafflecell.com", +"*.webhare.dev", +"wedeploy.io", +"wedeploy.me", +"wedeploy.sh", +"remotewd.com", +"wmflabs.org", +"myforum.community", +"community-pro.de", +"diskussionsbereich.de", +"community-pro.net", +"meinforum.net", +"half.host", +"xnbay.com", +"u2.xnbay.com", +"u2-local.xnbay.com", +"cistron.nl", +"demon.nl", +"xs4all.space", +"yandexcloud.net", +"storage.yandexcloud.net", +"website.yandexcloud.net", +"official.academy", +"yolasite.com", +"ybo.faith", +"yombo.me", +"homelink.one", +"ybo.party", +"ybo.review", +"ybo.science", +"ybo.trade", +"nohost.me", +"noho.st", +"za.net", +"za.org", +"now.sh", +"bss.design", +"basicserver.io", +"virtualserver.io", +"enterprisecloud.nu" +] \ No newline at end of file diff --git a/node_modules/psl/dist/psl.js b/node_modules/psl/dist/psl.js new file mode 100644 index 00000000..f4b9b892 --- /dev/null +++ b/node_modules/psl/dist/psl.js @@ -0,0 +1,9645 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.psl = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= punySuffix.length) { + // return memo; + // } + //} + return rule; + }, null); +}; + + +// +// Error codes and messages. +// +exports.errorCodes = { + DOMAIN_TOO_SHORT: 'Domain name too short.', + DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.', + LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.', + LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.', + LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.', + LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.', + LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.' +}; + + +// +// Validate domain name and throw if not valid. +// +// From wikipedia: +// +// Hostnames are composed of series of labels concatenated with dots, as are all +// domain names. Each label must be between 1 and 63 characters long, and the +// entire hostname (including the delimiting dots) has a maximum of 255 chars. +// +// Allowed chars: +// +// * `a-z` +// * `0-9` +// * `-` but not as a starting or ending character +// * `.` as a separator for the textual portions of a domain name +// +// * http://en.wikipedia.org/wiki/Domain_name +// * http://en.wikipedia.org/wiki/Hostname +// +internals.validate = function (input) { + + // Before we can validate we need to take care of IDNs with unicode chars. + var ascii = Punycode.toASCII(input); + + if (ascii.length < 1) { + return 'DOMAIN_TOO_SHORT'; + } + if (ascii.length > 255) { + return 'DOMAIN_TOO_LONG'; + } + + // Check each part's length and allowed chars. + var labels = ascii.split('.'); + var label; + + for (var i = 0; i < labels.length; ++i) { + label = labels[i]; + if (!label.length) { + return 'LABEL_TOO_SHORT'; + } + if (label.length > 63) { + return 'LABEL_TOO_LONG'; + } + if (label.charAt(0) === '-') { + return 'LABEL_STARTS_WITH_DASH'; + } + if (label.charAt(label.length - 1) === '-') { + return 'LABEL_ENDS_WITH_DASH'; + } + if (!/^[a-z0-9\-]+$/.test(label)) { + return 'LABEL_INVALID_CHARS'; + } + } +}; + + +// +// Public API +// + + +// +// Parse domain. +// +exports.parse = function (input) { + + if (typeof input !== 'string') { + throw new TypeError('Domain name must be a string.'); + } + + // Force domain to lowercase. + var domain = input.slice(0).toLowerCase(); + + // Handle FQDN. + // TODO: Simply remove trailing dot? + if (domain.charAt(domain.length - 1) === '.') { + domain = domain.slice(0, domain.length - 1); + } + + // Validate and sanitise input. + var error = internals.validate(domain); + if (error) { + return { + input: input, + error: { + message: exports.errorCodes[error], + code: error + } + }; + } + + var parsed = { + input: input, + tld: null, + sld: null, + domain: null, + subdomain: null, + listed: false + }; + + var domainParts = domain.split('.'); + + // Non-Internet TLD + if (domainParts[domainParts.length - 1] === 'local') { + return parsed; + } + + var handlePunycode = function () { + + if (!/xn--/.test(domain)) { + return parsed; + } + if (parsed.domain) { + parsed.domain = Punycode.toASCII(parsed.domain); + } + if (parsed.subdomain) { + parsed.subdomain = Punycode.toASCII(parsed.subdomain); + } + return parsed; + }; + + var rule = internals.findRule(domain); + + // Unlisted tld. + if (!rule) { + if (domainParts.length < 2) { + return parsed; + } + parsed.tld = domainParts.pop(); + parsed.sld = domainParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + if (domainParts.length) { + parsed.subdomain = domainParts.pop(); + } + return handlePunycode(); + } + + // At this point we know the public suffix is listed. + parsed.listed = true; + + var tldParts = rule.suffix.split('.'); + var privateParts = domainParts.slice(0, domainParts.length - tldParts.length); + + if (rule.exception) { + privateParts.push(tldParts.shift()); + } + + parsed.tld = tldParts.join('.'); + + if (!privateParts.length) { + return handlePunycode(); + } + + if (rule.wildcard) { + tldParts.unshift(privateParts.pop()); + parsed.tld = tldParts.join('.'); + } + + if (!privateParts.length) { + return handlePunycode(); + } + + parsed.sld = privateParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + + if (privateParts.length) { + parsed.subdomain = privateParts.join('.'); + } + + return handlePunycode(); +}; + + +// +// Get domain. +// +exports.get = function (domain) { + + if (!domain) { + return null; + } + return exports.parse(domain).domain || null; +}; + + +// +// Check whether domain belongs to a known public suffix. +// +exports.isValid = function (domain) { + + var parsed = exports.parse(domain); + return Boolean(parsed.domain && parsed.listed); +}; + +},{"./data/rules.json":1,"punycode":3}],3:[function(require,module,exports){ +(function (global){ +/*! https://mths.be/punycode v1.4.1 by @mathias */ +;(function(root) { + + /** Detect free variables */ + var freeExports = typeof exports == 'object' && exports && + !exports.nodeType && exports; + var freeModule = typeof module == 'object' && module && + !module.nodeType && module; + var freeGlobal = typeof global == 'object' && global; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal || + freeGlobal.self === freeGlobal + ) { + root = freeGlobal; + } + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = '-', // '\x2D' + + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + + /** Error messages */ + errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw new RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '1.4.1', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define('punycode', function() { + return punycode; + }); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { + // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { + // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } + } else { + // in Rhino or a web browser + root.punycode = punycode; + } + +}(this)); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[2])(2) +}); diff --git a/node_modules/psl/dist/psl.min.js b/node_modules/psl/dist/psl.min.js new file mode 100644 index 00000000..d5c787e4 --- /dev/null +++ b/node_modules/psl/dist/psl.min.js @@ -0,0 +1 @@ +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).psl=a()}}(function(){return function s(m,t,u){function r(o,a){if(!t[o]){if(!m[o]){var i="function"==typeof require&&require;if(!a&&i)return i(o,!0);if(p)return p(o,!0);var e=new Error("Cannot find module '"+o+"'");throw e.code="MODULE_NOT_FOUND",e}var n=t[o]={exports:{}};m[o][0].call(n.exports,function(a){return r(m[o][1][a]||a)},n,n.exports,s,m,t,u)}return t[o].exports}for(var p="function"==typeof require&&require,a=0;a= 0x80 (not a basic code point)","invalid-input":"Invalid input"},c=b-y,x=Math.floor,q=String.fromCharCode;function A(a){throw new RangeError(k[a])}function l(a,o){for(var i=a.length,e=[];i--;)e[i]=o(a[i]);return e}function g(a,o){var i=a.split("@"),e="";return 1>>10&1023|55296),a=56320|1023&a),o+=q(a)}).join("")}function L(a,o){return a+22+75*(a<26)-((0!=o)<<5)}function I(a,o,i){var e=0;for(a=i?x(a/t):a>>1,a+=x(a/o);c*f>>1x((d-g)/m))&&A("overflow"),g+=u*m,!(u<(r=t<=j?y:j+f<=t?f:t-j));t+=b)m>x(d/(p=b-r))&&A("overflow"),m*=p;j=I(g-s,o=c.length+1,0==s),x(g/o)>d-h&&A("overflow"),h+=x(g/o),g%=o,c.splice(g++,0,h)}return _(c)}function j(a){var o,i,e,n,s,m,t,u,r,p,k,c,l,g,h,j=[];for(c=(a=O(a)).length,o=w,s=v,m=i=0;mx((d-i)/(l=e+1))&&A("overflow"),i+=(t-o)*l,o=t,m=0;md&&A("overflow"),k==o){for(u=i,r=b;!(u<(p=r<=s?y:s+f<=r?f:r-s));r+=b)h=u-p,g=b-p,j.push(q(L(p+h%g,0))),u=x(h/g);j.push(q(L(u,0))),s=I(i,l,e==n),i=0,++e}++i,++o}return j.join("")}if(n={version:"1.4.1",ucs2:{decode:O,encode:_},decode:h,encode:j,toASCII:function(a){return g(a,function(a){return r.test(a)?"xn--"+j(a):a})},toUnicode:function(a){return g(a,function(a){return u.test(a)?h(a.slice(4).toLowerCase()):a})}},0,o&&i)if(T.exports==o)i.exports=n;else for(s in n)n.hasOwnProperty(s)&&(o[s]=n[s]);else a.punycode=n}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[2])(2)}); diff --git a/node_modules/psl/index.js b/node_modules/psl/index.js new file mode 100644 index 00000000..da7bc121 --- /dev/null +++ b/node_modules/psl/index.js @@ -0,0 +1,269 @@ +/*eslint no-var:0, prefer-arrow-callback: 0, object-shorthand: 0 */ +'use strict'; + + +var Punycode = require('punycode'); + + +var internals = {}; + + +// +// Read rules from file. +// +internals.rules = require('./data/rules.json').map(function (rule) { + + return { + rule: rule, + suffix: rule.replace(/^(\*\.|\!)/, ''), + punySuffix: -1, + wildcard: rule.charAt(0) === '*', + exception: rule.charAt(0) === '!' + }; +}); + + +// +// Check is given string ends with `suffix`. +// +internals.endsWith = function (str, suffix) { + + return str.indexOf(suffix, str.length - suffix.length) !== -1; +}; + + +// +// Find rule for a given domain. +// +internals.findRule = function (domain) { + + var punyDomain = Punycode.toASCII(domain); + return internals.rules.reduce(function (memo, rule) { + + if (rule.punySuffix === -1){ + rule.punySuffix = Punycode.toASCII(rule.suffix); + } + if (!internals.endsWith(punyDomain, '.' + rule.punySuffix) && punyDomain !== rule.punySuffix) { + return memo; + } + // This has been commented out as it never seems to run. This is because + // sub tlds always appear after their parents and we never find a shorter + // match. + //if (memo) { + // var memoSuffix = Punycode.toASCII(memo.suffix); + // if (memoSuffix.length >= punySuffix.length) { + // return memo; + // } + //} + return rule; + }, null); +}; + + +// +// Error codes and messages. +// +exports.errorCodes = { + DOMAIN_TOO_SHORT: 'Domain name too short.', + DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.', + LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.', + LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.', + LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.', + LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.', + LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.' +}; + + +// +// Validate domain name and throw if not valid. +// +// From wikipedia: +// +// Hostnames are composed of series of labels concatenated with dots, as are all +// domain names. Each label must be between 1 and 63 characters long, and the +// entire hostname (including the delimiting dots) has a maximum of 255 chars. +// +// Allowed chars: +// +// * `a-z` +// * `0-9` +// * `-` but not as a starting or ending character +// * `.` as a separator for the textual portions of a domain name +// +// * http://en.wikipedia.org/wiki/Domain_name +// * http://en.wikipedia.org/wiki/Hostname +// +internals.validate = function (input) { + + // Before we can validate we need to take care of IDNs with unicode chars. + var ascii = Punycode.toASCII(input); + + if (ascii.length < 1) { + return 'DOMAIN_TOO_SHORT'; + } + if (ascii.length > 255) { + return 'DOMAIN_TOO_LONG'; + } + + // Check each part's length and allowed chars. + var labels = ascii.split('.'); + var label; + + for (var i = 0; i < labels.length; ++i) { + label = labels[i]; + if (!label.length) { + return 'LABEL_TOO_SHORT'; + } + if (label.length > 63) { + return 'LABEL_TOO_LONG'; + } + if (label.charAt(0) === '-') { + return 'LABEL_STARTS_WITH_DASH'; + } + if (label.charAt(label.length - 1) === '-') { + return 'LABEL_ENDS_WITH_DASH'; + } + if (!/^[a-z0-9\-]+$/.test(label)) { + return 'LABEL_INVALID_CHARS'; + } + } +}; + + +// +// Public API +// + + +// +// Parse domain. +// +exports.parse = function (input) { + + if (typeof input !== 'string') { + throw new TypeError('Domain name must be a string.'); + } + + // Force domain to lowercase. + var domain = input.slice(0).toLowerCase(); + + // Handle FQDN. + // TODO: Simply remove trailing dot? + if (domain.charAt(domain.length - 1) === '.') { + domain = domain.slice(0, domain.length - 1); + } + + // Validate and sanitise input. + var error = internals.validate(domain); + if (error) { + return { + input: input, + error: { + message: exports.errorCodes[error], + code: error + } + }; + } + + var parsed = { + input: input, + tld: null, + sld: null, + domain: null, + subdomain: null, + listed: false + }; + + var domainParts = domain.split('.'); + + // Non-Internet TLD + if (domainParts[domainParts.length - 1] === 'local') { + return parsed; + } + + var handlePunycode = function () { + + if (!/xn--/.test(domain)) { + return parsed; + } + if (parsed.domain) { + parsed.domain = Punycode.toASCII(parsed.domain); + } + if (parsed.subdomain) { + parsed.subdomain = Punycode.toASCII(parsed.subdomain); + } + return parsed; + }; + + var rule = internals.findRule(domain); + + // Unlisted tld. + if (!rule) { + if (domainParts.length < 2) { + return parsed; + } + parsed.tld = domainParts.pop(); + parsed.sld = domainParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + if (domainParts.length) { + parsed.subdomain = domainParts.pop(); + } + return handlePunycode(); + } + + // At this point we know the public suffix is listed. + parsed.listed = true; + + var tldParts = rule.suffix.split('.'); + var privateParts = domainParts.slice(0, domainParts.length - tldParts.length); + + if (rule.exception) { + privateParts.push(tldParts.shift()); + } + + parsed.tld = tldParts.join('.'); + + if (!privateParts.length) { + return handlePunycode(); + } + + if (rule.wildcard) { + tldParts.unshift(privateParts.pop()); + parsed.tld = tldParts.join('.'); + } + + if (!privateParts.length) { + return handlePunycode(); + } + + parsed.sld = privateParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + + if (privateParts.length) { + parsed.subdomain = privateParts.join('.'); + } + + return handlePunycode(); +}; + + +// +// Get domain. +// +exports.get = function (domain) { + + if (!domain) { + return null; + } + return exports.parse(domain).domain || null; +}; + + +// +// Check whether domain belongs to a known public suffix. +// +exports.isValid = function (domain) { + + var parsed = exports.parse(domain); + return Boolean(parsed.domain && parsed.listed); +}; diff --git a/node_modules/psl/package.json b/node_modules/psl/package.json new file mode 100644 index 00000000..ee2da19f --- /dev/null +++ b/node_modules/psl/package.json @@ -0,0 +1,44 @@ +{ + "name": "psl", + "version": "1.8.0", + "description": "Domain name parser based on the Public Suffix List", + "repository": { + "type": "git", + "url": "git@github.com:lupomontero/psl.git" + }, + "main": "index.js", + "scripts": { + "pretest": "eslint .", + "test": "mocha test && karma start ./karma.conf.js --single-run", + "watch": "mocha test --watch", + "prebuild": "./scripts/update-rules.js", + "build": "browserify ./index.js --standalone=psl > ./dist/psl.js", + "postbuild": "cat ./dist/psl.js | uglifyjs -c -m > ./dist/psl.min.js", + "commit-and-pr": "commit-and-pr", + "changelog": "git log $(git describe --tags --abbrev=0)..HEAD --oneline --format=\"%h %s (%an <%ae>)\"" + }, + "keywords": [ + "publicsuffix", + "publicsuffixlist" + ], + "author": "Lupo Montero (https://lupomontero.com/)", + "license": "MIT", + "devDependencies": { + "JSONStream": "^1.3.5", + "browserify": "^16.5.0", + "commit-and-pr": "^1.0.4", + "eslint": "^6.8.0", + "eslint-config-hapi": "^12.0.0", + "eslint-plugin-hapi": "^4.1.0", + "karma": "^4.4.1", + "karma-browserify": "^7.0.0", + "karma-mocha": "^1.3.0", + "karma-mocha-reporter": "^2.2.5", + "karma-phantomjs-launcher": "^1.0.4", + "mocha": "^7.1.1", + "phantomjs-prebuilt": "^2.1.16", + "request": "^2.88.2", + "uglify-js": "^3.8.0", + "watchify": "^3.11.1" + } +} diff --git a/node_modules/pump/.travis.yml b/node_modules/pump/.travis.yml new file mode 100644 index 00000000..17f94330 --- /dev/null +++ b/node_modules/pump/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - "0.10" + +script: "npm test" diff --git a/node_modules/pump/LICENSE b/node_modules/pump/LICENSE new file mode 100644 index 00000000..757562ec --- /dev/null +++ b/node_modules/pump/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/pump/README.md b/node_modules/pump/README.md new file mode 100644 index 00000000..5029b27d --- /dev/null +++ b/node_modules/pump/README.md @@ -0,0 +1,56 @@ +# pump + +pump is a small node module that pipes streams together and destroys all of them if one of them closes. + +``` +npm install pump +``` + +[![build status](http://img.shields.io/travis/mafintosh/pump.svg?style=flat)](http://travis-ci.org/mafintosh/pump) + +## What problem does it solve? + +When using standard `source.pipe(dest)` source will _not_ be destroyed if dest emits close or an error. +You are also not able to provide a callback to tell when then pipe has finished. + +pump does these two things for you + +## Usage + +Simply pass the streams you want to pipe together to pump and add an optional callback + +``` js +var pump = require('pump') +var fs = require('fs') + +var source = fs.createReadStream('/dev/random') +var dest = fs.createWriteStream('/dev/null') + +pump(source, dest, function(err) { + console.log('pipe finished', err) +}) + +setTimeout(function() { + dest.destroy() // when dest is closed pump will destroy source +}, 1000) +``` + +You can use pump to pipe more than two streams together as well + +``` js +var transform = someTransformStream() + +pump(source, transform, anotherTransform, dest, function(err) { + console.log('pipe finished', err) +}) +``` + +If `source`, `transform`, `anotherTransform` or `dest` closes all of them will be destroyed. + +## License + +MIT + +## Related + +`pump` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one. diff --git a/node_modules/pump/index.js b/node_modules/pump/index.js new file mode 100644 index 00000000..d9ca0335 --- /dev/null +++ b/node_modules/pump/index.js @@ -0,0 +1,82 @@ +var once = require('once') +var eos = require('end-of-stream') +var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes + +var noop = function () {} +var ancient = /^v?\.0/.test(process.version) + +var isFn = function (fn) { + return typeof fn === 'function' +} + +var isFS = function (stream) { + if (!ancient) return false // newer node version do not need to care about fs is a special way + if (!fs) return false // browser + return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) +} + +var isRequest = function (stream) { + return stream.setHeader && isFn(stream.abort) +} + +var destroyer = function (stream, reading, writing, callback) { + callback = once(callback) + + var closed = false + stream.on('close', function () { + closed = true + }) + + eos(stream, {readable: reading, writable: writing}, function (err) { + if (err) return callback(err) + closed = true + callback() + }) + + var destroyed = false + return function (err) { + if (closed) return + if (destroyed) return + destroyed = true + + if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks + if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want + + if (isFn(stream.destroy)) return stream.destroy() + + callback(err || new Error('stream was destroyed')) + } +} + +var call = function (fn) { + fn() +} + +var pipe = function (from, to) { + return from.pipe(to) +} + +var pump = function () { + var streams = Array.prototype.slice.call(arguments) + var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop + + if (Array.isArray(streams[0])) streams = streams[0] + if (streams.length < 2) throw new Error('pump requires two streams per minimum') + + var error + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1 + var writing = i > 0 + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err + if (err) destroys.forEach(call) + if (reading) return + destroys.forEach(call) + callback(error) + }) + }) + + streams.reduce(pipe) +} + +module.exports = pump diff --git a/node_modules/pump/package.json b/node_modules/pump/package.json new file mode 100644 index 00000000..0f921f6c --- /dev/null +++ b/node_modules/pump/package.json @@ -0,0 +1,24 @@ +{ + "name": "pump", + "version": "2.0.1", + "repository": "git://github.com/mafintosh/pump.git", + "license": "MIT", + "description": "pipe streams together and close all of them if one of them closes", + "browser": { + "fs": false + }, + "keywords": [ + "streams", + "pipe", + "destroy", + "callback" + ], + "author": "Mathias Buus Madsen ", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + }, + "scripts": { + "test": "node test-browser.js && node test-node.js" + } +} diff --git a/node_modules/pump/test-browser.js b/node_modules/pump/test-browser.js new file mode 100644 index 00000000..75ea4a29 --- /dev/null +++ b/node_modules/pump/test-browser.js @@ -0,0 +1,62 @@ +var stream = require('stream') +var pump = require('./index') + +var rs = new stream.Readable() +var ws = new stream.Writable() + +rs._read = function (size) { + this.push(Buffer(size).fill('abc')) +} + +ws._write = function (chunk, encoding, cb) { + setTimeout(function () { + cb() + }, 100) +} + +var toHex = function () { + var reverse = new (require('stream').Transform)() + + reverse._transform = function (chunk, enc, callback) { + reverse.push(chunk.toString('hex')) + callback() + } + + return reverse +} + +var wsClosed = false +var rsClosed = false +var callbackCalled = false + +var check = function () { + if (wsClosed && rsClosed && callbackCalled) { + console.log('test-browser.js passes') + clearTimeout(timeout) + } +} + +ws.on('finish', function () { + wsClosed = true + check() +}) + +rs.on('end', function () { + rsClosed = true + check() +}) + +pump(rs, toHex(), toHex(), toHex(), ws, function () { + callbackCalled = true + check() +}) + +setTimeout(function () { + rs.push(null) + rs.emit('close') +}, 1000) + +var timeout = setTimeout(function () { + check() + throw new Error('timeout') +}, 5000) diff --git a/node_modules/pump/test-node.js b/node_modules/pump/test-node.js new file mode 100644 index 00000000..034a6541 --- /dev/null +++ b/node_modules/pump/test-node.js @@ -0,0 +1,53 @@ +var pump = require('./index') + +var rs = require('fs').createReadStream('/dev/random') +var ws = require('fs').createWriteStream('/dev/null') + +var toHex = function () { + var reverse = new (require('stream').Transform)() + + reverse._transform = function (chunk, enc, callback) { + reverse.push(chunk.toString('hex')) + callback() + } + + return reverse +} + +var wsClosed = false +var rsClosed = false +var callbackCalled = false + +var check = function () { + if (wsClosed && rsClosed && callbackCalled) { + console.log('test-node.js passes') + clearTimeout(timeout) + } +} + +ws.on('close', function () { + wsClosed = true + check() +}) + +rs.on('close', function () { + rsClosed = true + check() +}) + +var res = pump(rs, toHex(), toHex(), toHex(), ws, function () { + callbackCalled = true + check() +}) + +if (res) { + process.exit(1) +} + +setTimeout(function () { + rs.destroy() +}, 1000) + +var timeout = setTimeout(function () { + throw new Error('timeout') +}, 5000) diff --git a/node_modules/pumpify/.travis.yml b/node_modules/pumpify/.travis.yml new file mode 100644 index 00000000..32e71a6b --- /dev/null +++ b/node_modules/pumpify/.travis.yml @@ -0,0 +1,8 @@ +language: node_js + +node_js: + - "0.10" + - "4" + - "5" + +sudo: false diff --git a/node_modules/pumpify/LICENSE b/node_modules/pumpify/LICENSE new file mode 100644 index 00000000..757562ec --- /dev/null +++ b/node_modules/pumpify/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/pumpify/README.md b/node_modules/pumpify/README.md new file mode 100644 index 00000000..4988f7b1 --- /dev/null +++ b/node_modules/pumpify/README.md @@ -0,0 +1,56 @@ +# pumpify + +Combine an array of streams into a single duplex stream using [pump](https://github.com/mafintosh/pump) and [duplexify](https://github.com/mafintosh/duplexify). +If one of the streams closes/errors all streams in the pipeline will be destroyed. + +``` +npm install pumpify +``` + +[![build status](http://img.shields.io/travis/mafintosh/pumpify.svg?style=flat)](http://travis-ci.org/mafintosh/pumpify) + +## Usage + +Pass the streams you want to pipe together to pumpify `pipeline = pumpify(s1, s2, s3, ...)`. +`pipeline` is a duplex stream that writes to the first streams and reads from the last one. +Streams are piped together using [pump](https://github.com/mafintosh/pump) so if one of them closes +all streams will be destroyed. + +``` js +var pumpify = require('pumpify') +var tar = require('tar-fs') +var zlib = require('zlib') +var fs = require('fs') + +var untar = pumpify(zlib.createGunzip(), tar.extract('output-folder')) +// you can also pass an array instead +// var untar = pumpify([zlib.createGunzip(), tar.extract('output-folder')]) + +fs.createReadStream('some-gzipped-tarball.tgz').pipe(untar) +``` + +If you are pumping object streams together use `pipeline = pumpify.obj(s1, s2, ...)`. +Call `pipeline.destroy()` to destroy the pipeline (including the streams passed to pumpify). + +### Using `setPipeline(s1, s2, ...)` + +Similar to [duplexify](https://github.com/mafintosh/duplexify) you can also define the pipeline asynchronously using `setPipeline(s1, s2, ...)` + +``` js +var untar = pumpify() + +setTimeout(function() { + // will start draining the input now + untar.setPipeline(zlib.createGunzip(), tar.extract('output-folder')) +}, 1000) + +fs.createReadStream('some-gzipped-tarball.tgz').pipe(untar) +``` + +## License + +MIT + +## Related + +`pumpify` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one. diff --git a/node_modules/pumpify/index.js b/node_modules/pumpify/index.js new file mode 100644 index 00000000..473e2566 --- /dev/null +++ b/node_modules/pumpify/index.js @@ -0,0 +1,60 @@ +var pump = require('pump') +var inherits = require('inherits') +var Duplexify = require('duplexify') + +var toArray = function(args) { + if (!args.length) return [] + return Array.isArray(args[0]) ? args[0] : Array.prototype.slice.call(args) +} + +var define = function(opts) { + var Pumpify = function() { + var streams = toArray(arguments) + if (!(this instanceof Pumpify)) return new Pumpify(streams) + Duplexify.call(this, null, null, opts) + if (streams.length) this.setPipeline(streams) + } + + inherits(Pumpify, Duplexify) + + Pumpify.prototype.setPipeline = function() { + var streams = toArray(arguments) + var self = this + var ended = false + var w = streams[0] + var r = streams[streams.length-1] + + r = r.readable ? r : null + w = w.writable ? w : null + + var onclose = function() { + streams[0].emit('error', new Error('stream was destroyed')) + } + + this.on('close', onclose) + this.on('prefinish', function() { + if (!ended) self.cork() + }) + + pump(streams, function(err) { + self.removeListener('close', onclose) + if (err) return self.destroy(err.message === 'premature close' ? null : err) + ended = true + // pump ends after the last stream is not writable *but* + // pumpify still forwards the readable part so we need to catch errors + // still, so reenable autoDestroy in this case + if (self._autoDestroy === false) self._autoDestroy = true + self.uncork() + }) + + if (this.destroyed) return onclose() + this.setWritable(w) + this.setReadable(r) + } + + return Pumpify +} + +module.exports = define({autoDestroy:false, destroy:false}) +module.exports.obj = define({autoDestroy: false, destroy:false, objectMode:true, highWaterMark:16}) +module.exports.ctor = define diff --git a/node_modules/pumpify/package.json b/node_modules/pumpify/package.json new file mode 100644 index 00000000..616e3c34 --- /dev/null +++ b/node_modules/pumpify/package.json @@ -0,0 +1,37 @@ +{ + "name": "pumpify", + "version": "1.5.1", + "description": "Combine an array of streams into a single duplex stream using pump and duplexify", + "main": "index.js", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "devDependencies": { + "tape": "^4.8.0", + "through2": "^2.0.3" + }, + "scripts": { + "test": "tape test.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/mafintosh/pumpify" + }, + "keywords": [ + "pump", + "duplexify", + "duplex", + "streams", + "stream", + "pipeline", + "combine" + ], + "author": "Mathias Buus", + "license": "MIT", + "bugs": { + "url": "https://github.com/mafintosh/pumpify/issues" + }, + "homepage": "https://github.com/mafintosh/pumpify" +} diff --git a/node_modules/pumpify/test.js b/node_modules/pumpify/test.js new file mode 100644 index 00000000..b603c4d8 --- /dev/null +++ b/node_modules/pumpify/test.js @@ -0,0 +1,235 @@ +var tape = require('tape') +var through = require('through2') +var pumpify = require('./') +var stream = require('stream') +var duplexify = require('duplexify') + +tape('basic', function(t) { + t.plan(3) + + var pipeline = pumpify( + through(function(data, enc, cb) { + t.same(data.toString(), 'hello') + cb(null, data.toString().toUpperCase()) + }), + through(function(data, enc, cb) { + t.same(data.toString(), 'HELLO') + cb(null, data.toString().toLowerCase()) + }) + ) + + pipeline.write('hello') + pipeline.on('data', function(data) { + t.same(data.toString(), 'hello') + t.end() + }) +}) + +tape('3 times', function(t) { + t.plan(4) + + var pipeline = pumpify( + through(function(data, enc, cb) { + t.same(data.toString(), 'hello') + cb(null, data.toString().toUpperCase()) + }), + through(function(data, enc, cb) { + t.same(data.toString(), 'HELLO') + cb(null, data.toString().toLowerCase()) + }), + through(function(data, enc, cb) { + t.same(data.toString(), 'hello') + cb(null, data.toString().toUpperCase()) + }) + ) + + pipeline.write('hello') + pipeline.on('data', function(data) { + t.same(data.toString(), 'HELLO') + t.end() + }) +}) + +tape('destroy', function(t) { + var test = through() + test.destroy = function() { + t.ok(true) + t.end() + } + + var pipeline = pumpify(through(), test) + + pipeline.destroy() +}) + +tape('close', function(t) { + var test = through() + var pipeline = pumpify(through(), test) + + pipeline.on('error', function(err) { + t.same(err.message, 'lol') + t.end() + }) + + test.emit('error', new Error('lol')) +}) + +tape('end waits for last one', function(t) { + var ran = false + + var a = through() + var b = through() + var c = through(function(data, enc, cb) { + setTimeout(function() { + ran = true + cb() + }, 100) + }) + + var pipeline = pumpify(a, b, c) + + pipeline.write('foo') + pipeline.end(function() { + t.ok(ran) + t.end() + }) + + t.ok(!ran) +}) + +tape('always wait for finish', function(t) { + var a = new stream.Readable() + a._read = function() {} + a.push('hello') + + var pipeline = pumpify(a, through(), through()) + var ran = false + + pipeline.on('finish', function() { + t.ok(ran) + t.end() + }) + + setTimeout(function() { + ran = true + a.push(null) + }, 100) +}) + +tape('async', function(t) { + var pipeline = pumpify() + + t.plan(4) + + pipeline.write('hello') + pipeline.on('data', function(data) { + t.same(data.toString(), 'HELLO') + t.end() + }) + + setTimeout(function() { + pipeline.setPipeline( + through(function(data, enc, cb) { + t.same(data.toString(), 'hello') + cb(null, data.toString().toUpperCase()) + }), + through(function(data, enc, cb) { + t.same(data.toString(), 'HELLO') + cb(null, data.toString().toLowerCase()) + }), + through(function(data, enc, cb) { + t.same(data.toString(), 'hello') + cb(null, data.toString().toUpperCase()) + }) + ) + }, 100) +}) + +tape('early destroy', function(t) { + var a = through() + var b = through() + var c = through() + + b.destroy = function() { + t.ok(true) + t.end() + } + + var pipeline = pumpify() + + pipeline.destroy() + setTimeout(function() { + pipeline.setPipeline(a, b, c) + }, 100) +}) + +tape('preserves error', function (t) { + var a = through() + var b = through(function (data, enc, cb) { + cb(new Error('stop')) + }) + var c = through() + var s = pumpify() + + s.on('error', function (err) { + t.same(err.message, 'stop') + t.end() + }) + + s.setPipeline(a, b, c) + s.resume() + s.write('hi') +}) + +tape('preserves error again', function (t) { + var ws = new stream.Writable() + var rs = new stream.Readable({highWaterMark: 16}) + + ws._write = function (data, enc, cb) { + cb(null) + } + + rs._read = function () { + process.nextTick(function () { + rs.push('hello world') + }) + } + + var pumpifyErr = pumpify( + through(), + through(function(chunk, _, cb) { + cb(new Error('test')) + }), + ws + ) + + rs.pipe(pumpifyErr) + .on('error', function (err) { + t.ok(err) + t.ok(err.message !== 'premature close', 'does not close with premature close') + t.end() + }) +}) + +tape('returns error from duplexify', function (t) { + var a = through() + var b = duplexify() + var s = pumpify() + + s.setPipeline(a, b) + + s.on('error', function (err) { + t.same(err.message, 'stop') + t.end() + }) + + s.write('data') + // Test passes if `.end()` is not called + s.end() + + b.setWritable(through()) + + setImmediate(function () { + b.destroy(new Error('stop')) + }) +}) diff --git a/node_modules/punycode/LICENSE-MIT.txt b/node_modules/punycode/LICENSE-MIT.txt new file mode 100644 index 00000000..a41e0a7e --- /dev/null +++ b/node_modules/punycode/LICENSE-MIT.txt @@ -0,0 +1,20 @@ +Copyright Mathias Bynens + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/punycode/README.md b/node_modules/punycode/README.md new file mode 100644 index 00000000..ee2f9d63 --- /dev/null +++ b/node_modules/punycode/README.md @@ -0,0 +1,122 @@ +# Punycode.js [![Build status](https://travis-ci.org/bestiejs/punycode.js.svg?branch=master)](https://travis-ci.org/bestiejs/punycode.js) [![Code coverage status](http://img.shields.io/codecov/c/github/bestiejs/punycode.js.svg)](https://codecov.io/gh/bestiejs/punycode.js) [![Dependency status](https://gemnasium.com/bestiejs/punycode.js.svg)](https://gemnasium.com/bestiejs/punycode.js) + +Punycode.js is a robust Punycode converter that fully complies to [RFC 3492](https://tools.ietf.org/html/rfc3492) and [RFC 5891](https://tools.ietf.org/html/rfc5891). + +This JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm: + +* [The C example code from RFC 3492](https://tools.ietf.org/html/rfc3492#appendix-C) +* [`punycode.c` by _Markus W. Scherer_ (IBM)](http://opensource.apple.com/source/ICU/ICU-400.42/icuSources/common/punycode.c) +* [`punycode.c` by _Ben Noordhuis_](https://github.com/bnoordhuis/punycode/blob/master/punycode.c) +* [JavaScript implementation by _some_](http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion/301287#301287) +* [`punycode.js` by _Ben Noordhuis_](https://github.com/joyent/node/blob/426298c8c1c0d5b5224ac3658c41e7c2a3fe9377/lib/punycode.js) (note: [not fully compliant](https://github.com/joyent/node/issues/2072)) + +This project was [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with Node.js from [v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc) until [v7](https://github.com/nodejs/node/pull/7941) (soft-deprecated). + +The current version supports recent versions of Node.js only. It provides a CommonJS module and an ES6 module. For the old version that offers the same functionality with broader support, including Rhino, Ringo, Narwhal, and web browsers, see [v1.4.1](https://github.com/bestiejs/punycode.js/releases/tag/v1.4.1). + +## Installation + +Via [npm](https://www.npmjs.com/): + +```bash +npm install punycode --save +``` + +In [Node.js](https://nodejs.org/): + +```js +const punycode = require('punycode'); +``` + +## API + +### `punycode.decode(string)` + +Converts a Punycode string of ASCII symbols to a string of Unicode symbols. + +```js +// decode domain name parts +punycode.decode('maana-pta'); // 'mañana' +punycode.decode('--dqo34k'); // '☃-⌘' +``` + +### `punycode.encode(string)` + +Converts a string of Unicode symbols to a Punycode string of ASCII symbols. + +```js +// encode domain name parts +punycode.encode('mañana'); // 'maana-pta' +punycode.encode('☃-⌘'); // '--dqo34k' +``` + +### `punycode.toUnicode(input)` + +Converts a Punycode string representing a domain name or an email address to Unicode. Only the Punycoded parts of the input will be converted, i.e. it doesn’t matter if you call it on a string that has already been converted to Unicode. + +```js +// decode domain names +punycode.toUnicode('xn--maana-pta.com'); +// → 'mañana.com' +punycode.toUnicode('xn----dqo34k.com'); +// → '☃-⌘.com' + +// decode email addresses +punycode.toUnicode('джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'); +// → 'джумла@джpумлатест.bрфa' +``` + +### `punycode.toASCII(input)` + +Converts a lowercased Unicode string representing a domain name or an email address to Punycode. Only the non-ASCII parts of the input will be converted, i.e. it doesn’t matter if you call it with a domain that’s already in ASCII. + +```js +// encode domain names +punycode.toASCII('mañana.com'); +// → 'xn--maana-pta.com' +punycode.toASCII('☃-⌘.com'); +// → 'xn----dqo34k.com' + +// encode email addresses +punycode.toASCII('джумла@джpумлатест.bрфa'); +// → 'джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq' +``` + +### `punycode.ucs2` + +#### `punycode.ucs2.decode(string)` + +Creates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](https://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16. + +```js +punycode.ucs2.decode('abc'); +// → [0x61, 0x62, 0x63] +// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE: +punycode.ucs2.decode('\uD834\uDF06'); +// → [0x1D306] +``` + +#### `punycode.ucs2.encode(codePoints)` + +Creates a string based on an array of numeric code point values. + +```js +punycode.ucs2.encode([0x61, 0x62, 0x63]); +// → 'abc' +punycode.ucs2.encode([0x1D306]); +// → '\uD834\uDF06' +``` + +### `punycode.version` + +A string representing the current Punycode.js version number. + +## Author + +| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | +|---| +| [Mathias Bynens](https://mathiasbynens.be/) | + +## License + +Punycode.js is available under the [MIT](https://mths.be/mit) license. diff --git a/node_modules/punycode/package.json b/node_modules/punycode/package.json new file mode 100644 index 00000000..9202ccf8 --- /dev/null +++ b/node_modules/punycode/package.json @@ -0,0 +1,58 @@ +{ + "name": "punycode", + "version": "2.1.1", + "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.", + "homepage": "https://mths.be/punycode", + "main": "punycode.js", + "jsnext:main": "punycode.es6.js", + "module": "punycode.es6.js", + "engines": { + "node": ">=6" + }, + "keywords": [ + "punycode", + "unicode", + "idn", + "idna", + "dns", + "url", + "domain" + ], + "license": "MIT", + "author": { + "name": "Mathias Bynens", + "url": "https://mathiasbynens.be/" + }, + "contributors": [ + { + "name": "Mathias Bynens", + "url": "https://mathiasbynens.be/" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/bestiejs/punycode.js.git" + }, + "bugs": "https://github.com/bestiejs/punycode.js/issues", + "files": [ + "LICENSE-MIT.txt", + "punycode.js", + "punycode.es6.js" + ], + "scripts": { + "test": "mocha tests", + "prepublish": "node scripts/prepublish.js" + }, + "devDependencies": { + "codecov": "^1.0.1", + "istanbul": "^0.4.1", + "mocha": "^2.5.3" + }, + "jspm": { + "map": { + "./punycode.js": { + "node": "@node/punycode" + } + } + } +} diff --git a/node_modules/punycode/punycode.es6.js b/node_modules/punycode/punycode.es6.js new file mode 100644 index 00000000..4610bc9e --- /dev/null +++ b/node_modules/punycode/punycode.es6.js @@ -0,0 +1,441 @@ +'use strict'; + +/** Highest positive signed 32-bit float value */ +const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +const base = 36; +const tMin = 1; +const tMax = 26; +const skew = 38; +const damp = 700; +const initialBias = 72; +const initialN = 128; // 0x80 +const delimiter = '-'; // '\x2D' + +/** Regular expressions */ +const regexPunycode = /^xn--/; +const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +const errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +const baseMinusTMin = base - tMin; +const floor = Math.floor; +const stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + const result = []; + let length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + const parts = string.split('@'); + let result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + const labels = string.split('.'); + const encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + const output = []; + let counter = 0; + const length = string.length; + while (counter < length) { + const value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + const extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +const ucs2encode = array => String.fromCodePoint(...array); + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +const basicToDigit = function(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +const digitToBasic = function(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +const adapt = function(delta, numPoints, firstTime) { + let k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +const decode = function(input) { + // Don't use UCS-2. + const output = []; + const inputLength = input.length; + let i = 0; + let n = initialN; + let bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + let basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (let j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + let oldi = i; + for (let w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + const digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + const baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + const out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + + } + + return String.fromCodePoint(...output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +const encode = function(input) { + const output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + let inputLength = input.length; + + // Initialize the state. + let n = initialN; + let delta = 0; + let bias = initialBias; + + // Handle the basic code points. + for (const currentValue of input) { + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + let basicLength = output.length; + let handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + let m = maxInt; + for (const currentValue of input) { + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + const handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (const currentValue of input) { + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + if (currentValue == n) { + // Represent delta as a generalized variable-length integer. + let q = delta; + for (let k = base; /* no condition */; k += base) { + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + const qMinusT = q - t; + const baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +const toUnicode = function(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +const toASCII = function(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +const punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +export { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode }; +export default punycode; diff --git a/node_modules/punycode/punycode.js b/node_modules/punycode/punycode.js new file mode 100644 index 00000000..ea61fd0d --- /dev/null +++ b/node_modules/punycode/punycode.js @@ -0,0 +1,440 @@ +'use strict'; + +/** Highest positive signed 32-bit float value */ +const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +const base = 36; +const tMin = 1; +const tMax = 26; +const skew = 38; +const damp = 700; +const initialBias = 72; +const initialN = 128; // 0x80 +const delimiter = '-'; // '\x2D' + +/** Regular expressions */ +const regexPunycode = /^xn--/; +const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +const errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +const baseMinusTMin = base - tMin; +const floor = Math.floor; +const stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + const result = []; + let length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + const parts = string.split('@'); + let result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + const labels = string.split('.'); + const encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + const output = []; + let counter = 0; + const length = string.length; + while (counter < length) { + const value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + const extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +const ucs2encode = array => String.fromCodePoint(...array); + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +const basicToDigit = function(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +const digitToBasic = function(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +const adapt = function(delta, numPoints, firstTime) { + let k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +const decode = function(input) { + // Don't use UCS-2. + const output = []; + const inputLength = input.length; + let i = 0; + let n = initialN; + let bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + let basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (let j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + let oldi = i; + for (let w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + const digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + const baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + const out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + + } + + return String.fromCodePoint(...output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +const encode = function(input) { + const output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + let inputLength = input.length; + + // Initialize the state. + let n = initialN; + let delta = 0; + let bias = initialBias; + + // Handle the basic code points. + for (const currentValue of input) { + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + let basicLength = output.length; + let handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + let m = maxInt; + for (const currentValue of input) { + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + const handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (const currentValue of input) { + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + if (currentValue == n) { + // Represent delta as a generalized variable-length integer. + let q = delta; + for (let k = base; /* no condition */; k += base) { + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + const qMinusT = q - t; + const baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +const toUnicode = function(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +const toASCII = function(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +const punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +module.exports = punycode; diff --git a/node_modules/qs/.editorconfig b/node_modules/qs/.editorconfig new file mode 100644 index 00000000..b2654e7a --- /dev/null +++ b/node_modules/qs/.editorconfig @@ -0,0 +1,30 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 140 + +[test/*] +max_line_length = off + +[*.md] +max_line_length = off + +[*.json] +max_line_length = off + +[Makefile] +max_line_length = off + +[CHANGELOG.md] +indent_style = space +indent_size = 2 + +[LICENSE] +indent_size = 2 +max_line_length = off diff --git a/node_modules/qs/.eslintignore b/node_modules/qs/.eslintignore new file mode 100644 index 00000000..1521c8b7 --- /dev/null +++ b/node_modules/qs/.eslintignore @@ -0,0 +1 @@ +dist diff --git a/node_modules/qs/.eslintrc b/node_modules/qs/.eslintrc new file mode 100644 index 00000000..b7a87b93 --- /dev/null +++ b/node_modules/qs/.eslintrc @@ -0,0 +1,19 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "complexity": 0, + "consistent-return": 1, + "func-name-matching": 0, + "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], + "indent": [2, 4], + "max-params": [2, 12], + "max-statements": [2, 45], + "no-continue": 1, + "no-magic-numbers": 0, + "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], + "operator-linebreak": [2, "before"], + } +} diff --git a/node_modules/qs/CHANGELOG.md b/node_modules/qs/CHANGELOG.md new file mode 100644 index 00000000..fe523209 --- /dev/null +++ b/node_modules/qs/CHANGELOG.md @@ -0,0 +1,226 @@ +## **6.5.2** +- [Fix] use `safer-buffer` instead of `Buffer` constructor +- [Refactor] utils: `module.exports` one thing, instead of mutating `exports` (#230) +- [Dev Deps] update `browserify`, `eslint`, `iconv-lite`, `safer-buffer`, `tape`, `browserify` + +## **6.5.1** +- [Fix] Fix parsing & compacting very deep objects (#224) +- [Refactor] name utils functions +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` +- [Tests] up to `node` `v8.4`; use `nvm install-latest-npm` so newer npm doesn’t break older node +- [Tests] Use precise dist for Node.js 0.6 runtime (#225) +- [Tests] make 0.6 required, now that it’s passing +- [Tests] on `node` `v8.2`; fix npm on node 0.6 + +## **6.5.0** +- [New] add `utils.assign` +- [New] pass default encoder/decoder to custom encoder/decoder functions (#206) +- [New] `parse`/`stringify`: add `ignoreQueryPrefix`/`addQueryPrefix` options, respectively (#213) +- [Fix] Handle stringifying empty objects with addQueryPrefix (#217) +- [Fix] do not mutate `options` argument (#207) +- [Refactor] `parse`: cache index to reuse in else statement (#182) +- [Docs] add various badges to readme (#208) +- [Dev Deps] update `eslint`, `browserify`, `iconv-lite`, `tape` +- [Tests] up to `node` `v8.1`, `v7.10`, `v6.11`; npm v4.6 breaks on node < v1; npm v5+ breaks on node < v4 +- [Tests] add `editorconfig-tools` + +## **6.4.0** +- [New] `qs.stringify`: add `encodeValuesOnly` option +- [Fix] follow `allowPrototypes` option during merge (#201, #201) +- [Fix] support keys starting with brackets (#202, #200) +- [Fix] chmod a-x +- [Dev Deps] update `eslint` +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds +- [eslint] reduce warnings + +## **6.3.2** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Dev Deps] update `eslint` +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.3.1** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties (thanks, @snyk!) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `iconv-lite`, `qs-iconv`, `tape` +- [Tests] on all node minors; improve test matrix +- [Docs] document stringify option `allowDots` (#195) +- [Docs] add empty object and array values example (#195) +- [Docs] Fix minor inconsistency/typo (#192) +- [Docs] document stringify option `sort` (#191) +- [Refactor] `stringify`: throw faster with an invalid encoder +- [Refactor] remove unnecessary escapes (#184) +- Remove contributing.md, since `qs` is no longer part of `hapi` (#183) + +## **6.3.0** +- [New] Add support for RFC 1738 (#174, #173) +- [New] `stringify`: Add `serializeDate` option to customize Date serialization (#159) +- [Fix] ensure `utils.merge` handles merging two arrays +- [Refactor] only constructors should be capitalized +- [Refactor] capitalized var names are for constructors only +- [Refactor] avoid using a sparse array +- [Robustness] `formats`: cache `String#replace` +- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`; add `safe-publish-latest` +- [Tests] up to `node` `v6.8`, `v4.6`; improve test matrix +- [Tests] flesh out arrayLimit/arrayFormat tests (#107) +- [Tests] skip Object.create tests when null objects are not available +- [Tests] Turn on eslint for test files (#175) + +## **6.2.3** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.2.2** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties + +## **6.2.1** +- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values +- [Refactor] Be explicit and use `Object.prototype.hasOwnProperty.call` +- [Tests] remove `parallelshell` since it does not reliably report failures +- [Tests] up to `node` `v6.3`, `v5.12` +- [Dev Deps] update `tape`, `eslint`, `@ljharb/eslint-config`, `qs-iconv` + +## [**6.2.0**](https://github.com/ljharb/qs/issues?milestone=36&state=closed) +- [New] pass Buffers to the encoder/decoder directly (#161) +- [New] add "encoder" and "decoder" options, for custom param encoding/decoding (#160) +- [Fix] fix compacting of nested sparse arrays (#150) + +## **6.1.2 +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.1.1** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties + +## [**6.1.0**](https://github.com/ljharb/qs/issues?milestone=35&state=closed) +- [New] allowDots option for `stringify` (#151) +- [Fix] "sort" option should work at a depth of 3 or more (#151) +- [Fix] Restore `dist` directory; will be removed in v7 (#148) + +## **6.0.4** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.0.3** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties +- [Fix] Restore `dist` directory; will be removed in v7 (#148) + +## [**6.0.2**](https://github.com/ljharb/qs/issues?milestone=33&state=closed) +- Revert ES6 requirement and restore support for node down to v0.8. + +## [**6.0.1**](https://github.com/ljharb/qs/issues?milestone=32&state=closed) +- [**#127**](https://github.com/ljharb/qs/pull/127) Fix engines definition in package.json + +## [**6.0.0**](https://github.com/ljharb/qs/issues?milestone=31&state=closed) +- [**#124**](https://github.com/ljharb/qs/issues/124) Use ES6 and drop support for node < v4 + +## **5.2.1** +- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values + +## [**5.2.0**](https://github.com/ljharb/qs/issues?milestone=30&state=closed) +- [**#64**](https://github.com/ljharb/qs/issues/64) Add option to sort object keys in the query string + +## [**5.1.0**](https://github.com/ljharb/qs/issues?milestone=29&state=closed) +- [**#117**](https://github.com/ljharb/qs/issues/117) make URI encoding stringified results optional +- [**#106**](https://github.com/ljharb/qs/issues/106) Add flag `skipNulls` to optionally skip null values in stringify + +## [**5.0.0**](https://github.com/ljharb/qs/issues?milestone=28&state=closed) +- [**#114**](https://github.com/ljharb/qs/issues/114) default allowDots to false +- [**#100**](https://github.com/ljharb/qs/issues/100) include dist to npm + +## [**4.0.0**](https://github.com/ljharb/qs/issues?milestone=26&state=closed) +- [**#98**](https://github.com/ljharb/qs/issues/98) make returning plain objects and allowing prototype overwriting properties optional + +## [**3.1.0**](https://github.com/ljharb/qs/issues?milestone=24&state=closed) +- [**#89**](https://github.com/ljharb/qs/issues/89) Add option to disable "Transform dot notation to bracket notation" + +## [**3.0.0**](https://github.com/ljharb/qs/issues?milestone=23&state=closed) +- [**#80**](https://github.com/ljharb/qs/issues/80) qs.parse silently drops properties +- [**#77**](https://github.com/ljharb/qs/issues/77) Perf boost +- [**#60**](https://github.com/ljharb/qs/issues/60) Add explicit option to disable array parsing +- [**#74**](https://github.com/ljharb/qs/issues/74) Bad parse when turning array into object +- [**#81**](https://github.com/ljharb/qs/issues/81) Add a `filter` option +- [**#68**](https://github.com/ljharb/qs/issues/68) Fixed issue with recursion and passing strings into objects. +- [**#66**](https://github.com/ljharb/qs/issues/66) Add mixed array and object dot notation support Closes: #47 +- [**#76**](https://github.com/ljharb/qs/issues/76) RFC 3986 +- [**#85**](https://github.com/ljharb/qs/issues/85) No equal sign +- [**#84**](https://github.com/ljharb/qs/issues/84) update license attribute + +## [**2.4.1**](https://github.com/ljharb/qs/issues?milestone=20&state=closed) +- [**#73**](https://github.com/ljharb/qs/issues/73) Property 'hasOwnProperty' of object # is not a function + +## [**2.4.0**](https://github.com/ljharb/qs/issues?milestone=19&state=closed) +- [**#70**](https://github.com/ljharb/qs/issues/70) Add arrayFormat option + +## [**2.3.3**](https://github.com/ljharb/qs/issues?milestone=18&state=closed) +- [**#59**](https://github.com/ljharb/qs/issues/59) make sure array indexes are >= 0, closes #57 +- [**#58**](https://github.com/ljharb/qs/issues/58) make qs usable for browser loader + +## [**2.3.2**](https://github.com/ljharb/qs/issues?milestone=17&state=closed) +- [**#55**](https://github.com/ljharb/qs/issues/55) allow merging a string into an object + +## [**2.3.1**](https://github.com/ljharb/qs/issues?milestone=16&state=closed) +- [**#52**](https://github.com/ljharb/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError". + +## [**2.3.0**](https://github.com/ljharb/qs/issues?milestone=15&state=closed) +- [**#50**](https://github.com/ljharb/qs/issues/50) add option to omit array indices, closes #46 + +## [**2.2.5**](https://github.com/ljharb/qs/issues?milestone=14&state=closed) +- [**#39**](https://github.com/ljharb/qs/issues/39) Is there an alternative to Buffer.isBuffer? +- [**#49**](https://github.com/ljharb/qs/issues/49) refactor utils.merge, fixes #45 +- [**#41**](https://github.com/ljharb/qs/issues/41) avoid browserifying Buffer, for #39 + +## [**2.2.4**](https://github.com/ljharb/qs/issues?milestone=13&state=closed) +- [**#38**](https://github.com/ljharb/qs/issues/38) how to handle object keys beginning with a number + +## [**2.2.3**](https://github.com/ljharb/qs/issues?milestone=12&state=closed) +- [**#37**](https://github.com/ljharb/qs/issues/37) parser discards first empty value in array +- [**#36**](https://github.com/ljharb/qs/issues/36) Update to lab 4.x + +## [**2.2.2**](https://github.com/ljharb/qs/issues?milestone=11&state=closed) +- [**#33**](https://github.com/ljharb/qs/issues/33) Error when plain object in a value +- [**#34**](https://github.com/ljharb/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty +- [**#24**](https://github.com/ljharb/qs/issues/24) Changelog? Semver? + +## [**2.2.1**](https://github.com/ljharb/qs/issues?milestone=10&state=closed) +- [**#32**](https://github.com/ljharb/qs/issues/32) account for circular references properly, closes #31 +- [**#31**](https://github.com/ljharb/qs/issues/31) qs.parse stackoverflow on circular objects + +## [**2.2.0**](https://github.com/ljharb/qs/issues?milestone=9&state=closed) +- [**#26**](https://github.com/ljharb/qs/issues/26) Don't use Buffer global if it's not present +- [**#30**](https://github.com/ljharb/qs/issues/30) Bug when merging non-object values into arrays +- [**#29**](https://github.com/ljharb/qs/issues/29) Don't call Utils.clone at the top of Utils.merge +- [**#23**](https://github.com/ljharb/qs/issues/23) Ability to not limit parameters? + +## [**2.1.0**](https://github.com/ljharb/qs/issues?milestone=8&state=closed) +- [**#22**](https://github.com/ljharb/qs/issues/22) Enable using a RegExp as delimiter + +## [**2.0.0**](https://github.com/ljharb/qs/issues?milestone=7&state=closed) +- [**#18**](https://github.com/ljharb/qs/issues/18) Why is there arrayLimit? +- [**#20**](https://github.com/ljharb/qs/issues/20) Configurable parametersLimit +- [**#21**](https://github.com/ljharb/qs/issues/21) make all limits optional, for #18, for #20 + +## [**1.2.2**](https://github.com/ljharb/qs/issues?milestone=6&state=closed) +- [**#19**](https://github.com/ljharb/qs/issues/19) Don't overwrite null values + +## [**1.2.1**](https://github.com/ljharb/qs/issues?milestone=5&state=closed) +- [**#16**](https://github.com/ljharb/qs/issues/16) ignore non-string delimiters +- [**#15**](https://github.com/ljharb/qs/issues/15) Close code block + +## [**1.2.0**](https://github.com/ljharb/qs/issues?milestone=4&state=closed) +- [**#12**](https://github.com/ljharb/qs/issues/12) Add optional delim argument +- [**#13**](https://github.com/ljharb/qs/issues/13) fix #11: flattened keys in array are now correctly parsed + +## [**1.1.0**](https://github.com/ljharb/qs/issues?milestone=3&state=closed) +- [**#7**](https://github.com/ljharb/qs/issues/7) Empty values of a POST array disappear after being submitted +- [**#9**](https://github.com/ljharb/qs/issues/9) Should not omit equals signs (=) when value is null +- [**#6**](https://github.com/ljharb/qs/issues/6) Minor grammar fix in README + +## [**1.0.2**](https://github.com/ljharb/qs/issues?milestone=2&state=closed) +- [**#5**](https://github.com/ljharb/qs/issues/5) array holes incorrectly copied into object on large index diff --git a/node_modules/qs/LICENSE b/node_modules/qs/LICENSE new file mode 100644 index 00000000..d4569487 --- /dev/null +++ b/node_modules/qs/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2014 Nathan LaFreniere and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors diff --git a/node_modules/qs/README.md b/node_modules/qs/README.md new file mode 100644 index 00000000..d8119666 --- /dev/null +++ b/node_modules/qs/README.md @@ -0,0 +1,475 @@ +# qs [![Version Badge][2]][1] + +[![Build Status][3]][4] +[![dependency status][5]][6] +[![dev dependency status][7]][8] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][11]][1] + +A querystring parsing and stringifying library with some added security. + +Lead Maintainer: [Jordan Harband](https://github.com/ljharb) + +The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). + +## Usage + +```javascript +var qs = require('qs'); +var assert = require('assert'); + +var obj = qs.parse('a=c'); +assert.deepEqual(obj, { a: 'c' }); + +var str = qs.stringify(obj); +assert.equal(str, 'a=c'); +``` + +### Parsing Objects + +[](#preventEval) +```javascript +qs.parse(string, [options]); +``` + +**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`. +For example, the string `'foo[bar]=baz'` converts to: + +```javascript +assert.deepEqual(qs.parse('foo[bar]=baz'), { + foo: { + bar: 'baz' + } +}); +``` + +When using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like: + +```javascript +var nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true }); +assert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } }); +``` + +By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option. + +```javascript +var protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }); +assert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } }); +``` + +URI encoded strings work too: + +```javascript +assert.deepEqual(qs.parse('a%5Bb%5D=c'), { + a: { b: 'c' } +}); +``` + +You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: + +```javascript +assert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), { + foo: { + bar: { + baz: 'foobarbaz' + } + } +}); +``` + +By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like +`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: + +```javascript +var expected = { + a: { + b: { + c: { + d: { + e: { + f: { + '[g][h][i]': 'j' + } + } + } + } + } + } +}; +var string = 'a[b][c][d][e][f][g][h][i]=j'; +assert.deepEqual(qs.parse(string), expected); +``` + +This depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`: + +```javascript +var deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 }); +assert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } }); +``` + +The depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. + +For similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option: + +```javascript +var limited = qs.parse('a=b&c=d', { parameterLimit: 1 }); +assert.deepEqual(limited, { a: 'b' }); +``` + +To bypass the leading question mark, use `ignoreQueryPrefix`: + +```javascript +var prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true }); +assert.deepEqual(prefixed, { a: 'b', c: 'd' }); +``` + +An optional delimiter can also be passed: + +```javascript +var delimited = qs.parse('a=b;c=d', { delimiter: ';' }); +assert.deepEqual(delimited, { a: 'b', c: 'd' }); +``` + +Delimiters can be a regular expression too: + +```javascript +var regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ }); +assert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' }); +``` + +Option `allowDots` can be used to enable dot notation: + +```javascript +var withDots = qs.parse('a.b=c', { allowDots: true }); +assert.deepEqual(withDots, { a: { b: 'c' } }); +``` + +### Parsing Arrays + +**qs** can also parse arrays using a similar `[]` notation: + +```javascript +var withArray = qs.parse('a[]=b&a[]=c'); +assert.deepEqual(withArray, { a: ['b', 'c'] }); +``` + +You may specify an index as well: + +```javascript +var withIndexes = qs.parse('a[1]=c&a[0]=b'); +assert.deepEqual(withIndexes, { a: ['b', 'c'] }); +``` + +Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number +to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving +their order: + +```javascript +var noSparse = qs.parse('a[1]=b&a[15]=c'); +assert.deepEqual(noSparse, { a: ['b', 'c'] }); +``` + +Note that an empty string is also a value, and will be preserved: + +```javascript +var withEmptyString = qs.parse('a[]=&a[]=b'); +assert.deepEqual(withEmptyString, { a: ['', 'b'] }); + +var withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c'); +assert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] }); +``` + +**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will +instead be converted to an object with the index as the key: + +```javascript +var withMaxIndex = qs.parse('a[100]=b'); +assert.deepEqual(withMaxIndex, { a: { '100': 'b' } }); +``` + +This limit can be overridden by passing an `arrayLimit` option: + +```javascript +var withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 }); +assert.deepEqual(withArrayLimit, { a: { '1': 'b' } }); +``` + +To disable array parsing entirely, set `parseArrays` to `false`. + +```javascript +var noParsingArrays = qs.parse('a[]=b', { parseArrays: false }); +assert.deepEqual(noParsingArrays, { a: { '0': 'b' } }); +``` + +If you mix notations, **qs** will merge the two items into an object: + +```javascript +var mixedNotation = qs.parse('a[0]=b&a[b]=c'); +assert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } }); +``` + +You can also create arrays of objects: + +```javascript +var arraysOfObjects = qs.parse('a[][b]=c'); +assert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] }); +``` + +### Stringifying + +[](#preventEval) +```javascript +qs.stringify(object, [options]); +``` + +When stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect: + +```javascript +assert.equal(qs.stringify({ a: 'b' }), 'a=b'); +assert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); +``` + +This encoding can be disabled by setting the `encode` option to `false`: + +```javascript +var unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false }); +assert.equal(unencoded, 'a[b]=c'); +``` + +Encoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`: +```javascript +var encodedValues = qs.stringify( + { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, + { encodeValuesOnly: true } +); +assert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h'); +``` + +This encoding can also be replaced by a custom encoding method set as `encoder` option: + +```javascript +var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) { + // Passed in values `a`, `b`, `c` + return // Return encoded string +}}) +``` + +_(Note: the `encoder` option does not apply if `encode` is `false`)_ + +Analogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values: + +```javascript +var decoded = qs.parse('x=z', { decoder: function (str) { + // Passed in values `x`, `z` + return // Return decoded string +}}) +``` + +Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. + +When arrays are stringified, by default they are given explicit indices: + +```javascript +qs.stringify({ a: ['b', 'c', 'd'] }); +// 'a[0]=b&a[1]=c&a[2]=d' +``` + +You may override this by setting the `indices` option to `false`: + +```javascript +qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); +// 'a=b&a=c&a=d' +``` + +You may use the `arrayFormat` option to specify the format of the output array: + +```javascript +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }) +// 'a[0]=b&a[1]=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }) +// 'a[]=b&a[]=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) +// 'a=b&a=c' +``` + +When objects are stringified, by default they use bracket notation: + +```javascript +qs.stringify({ a: { b: { c: 'd', e: 'f' } } }); +// 'a[b][c]=d&a[b][e]=f' +``` + +You may override this to use dot notation by setting the `allowDots` option to `true`: + +```javascript +qs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true }); +// 'a.b.c=d&a.b.e=f' +``` + +Empty strings and null values will omit the value, but the equals sign (=) remains in place: + +```javascript +assert.equal(qs.stringify({ a: '' }), 'a='); +``` + +Key with no values (such as an empty object or array) will return nothing: + +```javascript +assert.equal(qs.stringify({ a: [] }), ''); +assert.equal(qs.stringify({ a: {} }), ''); +assert.equal(qs.stringify({ a: [{}] }), ''); +assert.equal(qs.stringify({ a: { b: []} }), ''); +assert.equal(qs.stringify({ a: { b: {}} }), ''); +``` + +Properties that are set to `undefined` will be omitted entirely: + +```javascript +assert.equal(qs.stringify({ a: null, b: undefined }), 'a='); +``` + +The query string may optionally be prepended with a question mark: + +```javascript +assert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d'); +``` + +The delimiter may be overridden with stringify as well: + +```javascript +assert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); +``` + +If you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option: + +```javascript +var date = new Date(7); +assert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A')); +assert.equal( + qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }), + 'a=7' +); +``` + +You may use the `sort` option to affect the order of parameter keys: + +```javascript +function alphabeticalSort(a, b) { + return a.localeCompare(b); +} +assert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y'); +``` + +Finally, you can use the `filter` option to restrict which keys will be included in the stringified output. +If you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you +pass an array, it will be used to select properties and array indices for stringification: + +```javascript +function filterFunc(prefix, value) { + if (prefix == 'b') { + // Return an `undefined` value to omit a property. + return; + } + if (prefix == 'e[f]') { + return value.getTime(); + } + if (prefix == 'e[g][0]') { + return value * 2; + } + return value; +} +qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc }); +// 'a=b&c=d&e[f]=123&e[g][0]=4' +qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] }); +// 'a=b&e=f' +qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] }); +// 'a[0]=b&a[2]=d' +``` + +### Handling of `null` values + +By default, `null` values are treated like empty strings: + +```javascript +var withNull = qs.stringify({ a: null, b: '' }); +assert.equal(withNull, 'a=&b='); +``` + +Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings. + +```javascript +var equalsInsensitive = qs.parse('a&b='); +assert.deepEqual(equalsInsensitive, { a: '', b: '' }); +``` + +To distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null` +values have no `=` sign: + +```javascript +var strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true }); +assert.equal(strictNull, 'a&b='); +``` + +To parse values without `=` back to `null` use the `strictNullHandling` flag: + +```javascript +var parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true }); +assert.deepEqual(parsedStrictNull, { a: null, b: '' }); +``` + +To completely skip rendering keys with `null` values, use the `skipNulls` flag: + +```javascript +var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true }); +assert.equal(nullsSkipped, 'a=b'); +``` + +### Dealing with special character sets + +By default the encoding and decoding of characters is done in `utf-8`. If you +wish to encode querystrings to a different character set (i.e. +[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the +[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library: + +```javascript +var encoder = require('qs-iconv/encoder')('shift_jis'); +var shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder }); +assert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I'); +``` + +This also works for decoding of query strings: + +```javascript +var decoder = require('qs-iconv/decoder')('shift_jis'); +var obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder }); +assert.deepEqual(obj, { a: 'こんにちは!' }); +``` + +### RFC 3986 and RFC 1738 space encoding + +RFC3986 used as default option and encodes ' ' to *%20* which is backward compatible. +In the same time, output can be stringified as per RFC1738 with ' ' equal to '+'. + +``` +assert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); +assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c'); +assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c'); +``` + +[1]: https://npmjs.org/package/qs +[2]: http://versionbadg.es/ljharb/qs.svg +[3]: https://api.travis-ci.org/ljharb/qs.svg +[4]: https://travis-ci.org/ljharb/qs +[5]: https://david-dm.org/ljharb/qs.svg +[6]: https://david-dm.org/ljharb/qs +[7]: https://david-dm.org/ljharb/qs/dev-status.svg +[8]: https://david-dm.org/ljharb/qs?type=dev +[9]: https://ci.testling.com/ljharb/qs.png +[10]: https://ci.testling.com/ljharb/qs +[11]: https://nodei.co/npm/qs.png?downloads=true&stars=true +[license-image]: http://img.shields.io/npm/l/qs.svg +[license-url]: LICENSE +[downloads-image]: http://img.shields.io/npm/dm/qs.svg +[downloads-url]: http://npm-stat.com/charts.html?package=qs diff --git a/node_modules/qs/dist/qs.js b/node_modules/qs/dist/qs.js new file mode 100644 index 00000000..ecf7ba44 --- /dev/null +++ b/node_modules/qs/dist/qs.js @@ -0,0 +1,638 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]') { + obj = []; + obj = obj.concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys + // that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options); +}; + +module.exports = function (str, opts) { + var options = opts ? utils.assign({}, opts) : {}; + + if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + options.ignoreQueryPrefix = options.ignoreQueryPrefix === true; + options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; + options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; + options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; + options.parseArrays = options.parseArrays !== false; + options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; + options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; + options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; + options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; + options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; + options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options); + obj = utils.merge(obj, newObj, options); + } + + return utils.compact(obj); +}; + +},{"./utils":5}],4:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var formats = require('./formats'); + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { // eslint-disable-line func-name-matching + return prefix + '[]'; + }, + indices: function indices(prefix, key) { // eslint-disable-line func-name-matching + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { // eslint-disable-line func-name-matching + return prefix; + } +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( // eslint-disable-line func-name-matching + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly +) { + var obj = object; + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix; + } + + obj = ''; + } + + if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (Array.isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + if (Array.isArray(obj)) { + values = values.concat(stringify( + obj[key], + generateArrayPrefix(prefix, key), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } else { + values = values.concat(stringify( + obj[key], + prefix + (allowDots ? '.' + key : '[' + key + ']'), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } + } + + return values; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = opts ? utils.assign({}, opts) : {}; + + if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; + var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; + var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; + var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; + var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder; + var sort = typeof options.sort === 'function' ? options.sort : null; + var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; + var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; + var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly; + if (typeof options.format === 'undefined') { + options.format = formats['default']; + } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { + throw new TypeError('Unknown format option provided.'); + } + var formatter = formats.formatters[options.format]; + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (Array.isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (options.arrayFormat in arrayPrefixGenerators) { + arrayFormat = options.arrayFormat; + } else if ('indices' in options) { + arrayFormat = options.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (sort) { + objKeys.sort(sort); + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + keys = keys.concat(stringify( + obj[key], + key, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encode ? encoder : null, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } + + var joined = keys.join(delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + return joined.length > 0 ? prefix + joined : ''; +}; + +},{"./formats":1,"./utils":5}],5:[function(require,module,exports){ +'use strict'; + +var has = Object.prototype.hasOwnProperty; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + var obj; + + while (queue.length) { + var item = queue.pop(); + obj = item.obj[item.prop]; + + if (Array.isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } + + return obj; +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (Array.isArray(target)) { + target.push(source); + } else if (typeof target === 'object') { + if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (Array.isArray(target) && !Array.isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (Array.isArray(target) && Array.isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + if (target[i] && typeof target[i] === 'object') { + target[i] = merge(target[i], item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str) { + try { + return decodeURIComponent(str.replace(/\+/g, ' ')); + } catch (e) { + return str; + } +}; + +var encode = function encode(str) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = typeof str === 'string' ? str : String(str); + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + return compactQueue(queue); +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + merge: merge +}; + +},{}]},{},[2])(2) +}); diff --git a/node_modules/qs/package.json b/node_modules/qs/package.json new file mode 100644 index 00000000..2c654900 --- /dev/null +++ b/node_modules/qs/package.json @@ -0,0 +1,52 @@ +{ + "name": "qs", + "description": "A querystring parser that supports nesting and arrays, with a depth limit", + "homepage": "https://github.com/ljharb/qs", + "version": "6.5.2", + "repository": { + "type": "git", + "url": "https://github.com/ljharb/qs.git" + }, + "main": "lib/index.js", + "contributors": [ + { + "name": "Jordan Harband", + "email": "ljharb@gmail.com", + "url": "http://ljharb.codes" + } + ], + "keywords": [ + "querystring", + "qs" + ], + "engines": { + "node": ">=0.6" + }, + "dependencies": {}, + "devDependencies": { + "@ljharb/eslint-config": "^12.2.1", + "browserify": "^16.2.0", + "covert": "^1.1.0", + "editorconfig-tools": "^0.1.1", + "eslint": "^4.19.1", + "evalmd": "^0.0.17", + "iconv-lite": "^0.4.21", + "mkdirp": "^0.5.1", + "qs-iconv": "^1.0.4", + "safe-publish-latest": "^1.1.1", + "safer-buffer": "^2.1.2", + "tape": "^4.9.0" + }, + "scripts": { + "prepublish": "safe-publish-latest && npm run dist", + "pretest": "npm run --silent readme && npm run --silent lint", + "test": "npm run --silent coverage", + "tests-only": "node test", + "readme": "evalmd README.md", + "prelint": "editorconfig-tools check * lib/* test/*", + "lint": "eslint lib/*.js test/*.js", + "coverage": "covert test", + "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js" + }, + "license": "BSD-3-Clause" +} diff --git a/node_modules/qs/test/.eslintrc b/node_modules/qs/test/.eslintrc new file mode 100644 index 00000000..20175d64 --- /dev/null +++ b/node_modules/qs/test/.eslintrc @@ -0,0 +1,15 @@ +{ + "rules": { + "array-bracket-newline": 0, + "array-element-newline": 0, + "consistent-return": 2, + "max-lines": 0, + "max-nested-callbacks": [2, 3], + "max-statements": 0, + "no-buffer-constructor": 0, + "no-extend-native": 0, + "no-magic-numbers": 0, + "object-curly-newline": 0, + "sort-keys": 0 + } +} diff --git a/node_modules/qs/test/index.js b/node_modules/qs/test/index.js new file mode 100644 index 00000000..5e6bc8fb --- /dev/null +++ b/node_modules/qs/test/index.js @@ -0,0 +1,7 @@ +'use strict'; + +require('./parse'); + +require('./stringify'); + +require('./utils'); diff --git a/node_modules/qs/test/parse.js b/node_modules/qs/test/parse.js new file mode 100644 index 00000000..0f8fe457 --- /dev/null +++ b/node_modules/qs/test/parse.js @@ -0,0 +1,574 @@ +'use strict'; + +var test = require('tape'); +var qs = require('../'); +var utils = require('../lib/utils'); +var iconv = require('iconv-lite'); +var SaferBuffer = require('safer-buffer').Buffer; + +test('parse()', function (t) { + t.test('parses a simple string', function (st) { + st.deepEqual(qs.parse('0=foo'), { 0: 'foo' }); + st.deepEqual(qs.parse('foo=c++'), { foo: 'c ' }); + st.deepEqual(qs.parse('a[>=]=23'), { a: { '>=': '23' } }); + st.deepEqual(qs.parse('a[<=>]==23'), { a: { '<=>': '=23' } }); + st.deepEqual(qs.parse('a[==]=23'), { a: { '==': '23' } }); + st.deepEqual(qs.parse('foo', { strictNullHandling: true }), { foo: null }); + st.deepEqual(qs.parse('foo'), { foo: '' }); + st.deepEqual(qs.parse('foo='), { foo: '' }); + st.deepEqual(qs.parse('foo=bar'), { foo: 'bar' }); + st.deepEqual(qs.parse(' foo = bar = baz '), { ' foo ': ' bar = baz ' }); + st.deepEqual(qs.parse('foo=bar=baz'), { foo: 'bar=baz' }); + st.deepEqual(qs.parse('foo=bar&bar=baz'), { foo: 'bar', bar: 'baz' }); + st.deepEqual(qs.parse('foo2=bar2&baz2='), { foo2: 'bar2', baz2: '' }); + st.deepEqual(qs.parse('foo=bar&baz', { strictNullHandling: true }), { foo: 'bar', baz: null }); + st.deepEqual(qs.parse('foo=bar&baz'), { foo: 'bar', baz: '' }); + st.deepEqual(qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World'), { + cht: 'p3', + chd: 't:60,40', + chs: '250x100', + chl: 'Hello|World' + }); + st.end(); + }); + + t.test('allows enabling dot notation', function (st) { + st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' }); + st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } }); + st.end(); + }); + + t.deepEqual(qs.parse('a[b]=c'), { a: { b: 'c' } }, 'parses a single nested string'); + t.deepEqual(qs.parse('a[b][c]=d'), { a: { b: { c: 'd' } } }, 'parses a double nested string'); + t.deepEqual( + qs.parse('a[b][c][d][e][f][g][h]=i'), + { a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }, + 'defaults to a depth of 5' + ); + + t.test('only parses one level when depth = 1', function (st) { + st.deepEqual(qs.parse('a[b][c]=d', { depth: 1 }), { a: { b: { '[c]': 'd' } } }); + st.deepEqual(qs.parse('a[b][c][d]=e', { depth: 1 }), { a: { b: { '[c][d]': 'e' } } }); + st.end(); + }); + + t.deepEqual(qs.parse('a=b&a=c'), { a: ['b', 'c'] }, 'parses a simple array'); + + t.test('parses an explicit array', function (st) { + st.deepEqual(qs.parse('a[]=b'), { a: ['b'] }); + st.deepEqual(qs.parse('a[]=b&a[]=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a[]=c&a[]=d'), { a: ['b', 'c', 'd'] }); + st.end(); + }); + + t.test('parses a mix of simple and explicit arrays', function (st) { + st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[0]=b&a=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] }); + + st.deepEqual(qs.parse('a[1]=b&a=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); + + st.deepEqual(qs.parse('a=b&a[1]=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); + + st.end(); + }); + + t.test('parses a nested array', function (st) { + st.deepEqual(qs.parse('a[b][]=c&a[b][]=d'), { a: { b: ['c', 'd'] } }); + st.deepEqual(qs.parse('a[>=]=25'), { a: { '>=': '25' } }); + st.end(); + }); + + t.test('allows to specify array indices', function (st) { + st.deepEqual(qs.parse('a[1]=c&a[0]=b&a[2]=d'), { a: ['b', 'c', 'd'] }); + st.deepEqual(qs.parse('a[1]=c&a[0]=b'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 20 }), { a: ['c'] }); + st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 0 }), { a: { 1: 'c' } }); + st.deepEqual(qs.parse('a[1]=c'), { a: ['c'] }); + st.end(); + }); + + t.test('limits specific array indices to arrayLimit', function (st) { + st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: ['a'] }); + st.deepEqual(qs.parse('a[21]=a', { arrayLimit: 20 }), { a: { 21: 'a' } }); + st.end(); + }); + + t.deepEqual(qs.parse('a[12b]=c'), { a: { '12b': 'c' } }, 'supports keys that begin with a number'); + + t.test('supports encoded = signs', function (st) { + st.deepEqual(qs.parse('he%3Dllo=th%3Dere'), { 'he=llo': 'th=ere' }); + st.end(); + }); + + t.test('is ok with url encoded strings', function (st) { + st.deepEqual(qs.parse('a[b%20c]=d'), { a: { 'b c': 'd' } }); + st.deepEqual(qs.parse('a[b]=c%20d'), { a: { b: 'c d' } }); + st.end(); + }); + + t.test('allows brackets in the value', function (st) { + st.deepEqual(qs.parse('pets=["tobi"]'), { pets: '["tobi"]' }); + st.deepEqual(qs.parse('operators=[">=", "<="]'), { operators: '[">=", "<="]' }); + st.end(); + }); + + t.test('allows empty values', function (st) { + st.deepEqual(qs.parse(''), {}); + st.deepEqual(qs.parse(null), {}); + st.deepEqual(qs.parse(undefined), {}); + st.end(); + }); + + t.test('transforms arrays to objects', function (st) { + st.deepEqual(qs.parse('foo[0]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[0]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo'), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); + st.deepEqual(qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb'), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); + + st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: false }), { a: { 0: 'b', t: 'u' } }); + st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: true }), { a: { 0: 'b', t: 'u', hasOwnProperty: 'c' } }); + st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: false }), { a: { 0: 'b', x: 'y' } }); + st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: true }), { a: { 0: 'b', hasOwnProperty: 'c', x: 'y' } }); + st.end(); + }); + + t.test('transforms arrays to objects (dot notation)', function (st) { + st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: 'baz' } }); + st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad.boo=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } }); + st.deepEqual(qs.parse('foo[0][0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } }); + st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15'], bar: '2' }] }); + st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15', '16'], bar: '2' }] }); + st.deepEqual(qs.parse('foo.bad=baz&foo[0]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[]=bar&foo.bad=baz', { allowDots: true }), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); + st.deepEqual(qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb', { allowDots: true }), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); + st.end(); + }); + + t.test('correctly prunes undefined values when converting an array to an object', function (st) { + st.deepEqual(qs.parse('a[2]=b&a[99999999]=c'), { a: { 2: 'b', 99999999: 'c' } }); + st.end(); + }); + + t.test('supports malformed uri characters', function (st) { + st.deepEqual(qs.parse('{%:%}', { strictNullHandling: true }), { '{%:%}': null }); + st.deepEqual(qs.parse('{%:%}='), { '{%:%}': '' }); + st.deepEqual(qs.parse('foo=%:%}'), { foo: '%:%}' }); + st.end(); + }); + + t.test('doesn\'t produce empty keys', function (st) { + st.deepEqual(qs.parse('_r=1&'), { _r: '1' }); + st.end(); + }); + + t.test('cannot access Object prototype', function (st) { + qs.parse('constructor[prototype][bad]=bad'); + qs.parse('bad[constructor][prototype][bad]=bad'); + st.equal(typeof Object.prototype.bad, 'undefined'); + st.end(); + }); + + t.test('parses arrays of objects', function (st) { + st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); + st.deepEqual(qs.parse('a[0][b]=c'), { a: [{ b: 'c' }] }); + st.end(); + }); + + t.test('allows for empty strings in arrays', function (st) { + st.deepEqual(qs.parse('a[]=b&a[]=&a[]=c'), { a: ['b', '', 'c'] }); + + st.deepEqual( + qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true, arrayLimit: 20 }), + { a: ['b', null, 'c', ''] }, + 'with arrayLimit 20 + array indices: null then empty string works' + ); + st.deepEqual( + qs.parse('a[]=b&a[]&a[]=c&a[]=', { strictNullHandling: true, arrayLimit: 0 }), + { a: ['b', null, 'c', ''] }, + 'with arrayLimit 0 + array brackets: null then empty string works' + ); + + st.deepEqual( + qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true, arrayLimit: 20 }), + { a: ['b', '', 'c', null] }, + 'with arrayLimit 20 + array indices: empty string then null works' + ); + st.deepEqual( + qs.parse('a[]=b&a[]=&a[]=c&a[]', { strictNullHandling: true, arrayLimit: 0 }), + { a: ['b', '', 'c', null] }, + 'with arrayLimit 0 + array brackets: empty string then null works' + ); + + st.deepEqual( + qs.parse('a[]=&a[]=b&a[]=c'), + { a: ['', 'b', 'c'] }, + 'array brackets: empty strings work' + ); + st.end(); + }); + + t.test('compacts sparse arrays', function (st) { + st.deepEqual(qs.parse('a[10]=1&a[2]=2', { arrayLimit: 20 }), { a: ['2', '1'] }); + st.deepEqual(qs.parse('a[1][b][2][c]=1', { arrayLimit: 20 }), { a: [{ b: [{ c: '1' }] }] }); + st.deepEqual(qs.parse('a[1][2][3][c]=1', { arrayLimit: 20 }), { a: [[[{ c: '1' }]]] }); + st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { arrayLimit: 20 }), { a: [[[{ c: ['1'] }]]] }); + st.end(); + }); + + t.test('parses semi-parsed strings', function (st) { + st.deepEqual(qs.parse({ 'a[b]': 'c' }), { a: { b: 'c' } }); + st.deepEqual(qs.parse({ 'a[b]': 'c', 'a[d]': 'e' }), { a: { b: 'c', d: 'e' } }); + st.end(); + }); + + t.test('parses buffers correctly', function (st) { + var b = SaferBuffer.from('test'); + st.deepEqual(qs.parse({ a: b }), { a: b }); + st.end(); + }); + + t.test('continues parsing when no parent is found', function (st) { + st.deepEqual(qs.parse('[]=&a=b'), { 0: '', a: 'b' }); + st.deepEqual(qs.parse('[]&a=b', { strictNullHandling: true }), { 0: null, a: 'b' }); + st.deepEqual(qs.parse('[foo]=bar'), { foo: 'bar' }); + st.end(); + }); + + t.test('does not error when parsing a very long array', function (st) { + var str = 'a[]=a'; + while (Buffer.byteLength(str) < 128 * 1024) { + str = str + '&' + str; + } + + st.doesNotThrow(function () { + qs.parse(str); + }); + + st.end(); + }); + + t.test('should not throw when a native prototype has an enumerable property', { parallel: false }, function (st) { + Object.prototype.crash = ''; + Array.prototype.crash = ''; + st.doesNotThrow(qs.parse.bind(null, 'a=b')); + st.deepEqual(qs.parse('a=b'), { a: 'b' }); + st.doesNotThrow(qs.parse.bind(null, 'a[][b]=c')); + st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); + delete Object.prototype.crash; + delete Array.prototype.crash; + st.end(); + }); + + t.test('parses a string with an alternative string delimiter', function (st) { + st.deepEqual(qs.parse('a=b;c=d', { delimiter: ';' }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('parses a string with an alternative RegExp delimiter', function (st) { + st.deepEqual(qs.parse('a=b; c=d', { delimiter: /[;,] */ }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('does not use non-splittable objects as delimiters', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { delimiter: true }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('allows overriding parameter limit', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: 1 }), { a: 'b' }); + st.end(); + }); + + t.test('allows setting the parameter limit to Infinity', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: Infinity }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('allows overriding array limit', function (st) { + st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { 0: 'b' } }); + st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } }); + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } }); + st.end(); + }); + + t.test('allows disabling array parsing', function (st) { + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { parseArrays: false }), { a: { 0: 'b', 1: 'c' } }); + st.end(); + }); + + t.test('allows for query string prefix', function (st) { + st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); + st.deepEqual(qs.parse('foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); + st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: false }), { '?foo': 'bar' }); + st.end(); + }); + + t.test('parses an object', function (st) { + var input = { + 'user[name]': { 'pop[bob]': 3 }, + 'user[email]': null + }; + + var expected = { + user: { + name: { 'pop[bob]': 3 }, + email: null + } + }; + + var result = qs.parse(input); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('parses an object in dot notation', function (st) { + var input = { + 'user.name': { 'pop[bob]': 3 }, + 'user.email.': null + }; + + var expected = { + user: { + name: { 'pop[bob]': 3 }, + email: null + } + }; + + var result = qs.parse(input, { allowDots: true }); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('parses an object and not child values', function (st) { + var input = { + 'user[name]': { 'pop[bob]': { test: 3 } }, + 'user[email]': null + }; + + var expected = { + user: { + name: { 'pop[bob]': { test: 3 } }, + email: null + } + }; + + var result = qs.parse(input); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('does not blow up when Buffer global is missing', function (st) { + var tempBuffer = global.Buffer; + delete global.Buffer; + var result = qs.parse('a=b&c=d'); + global.Buffer = tempBuffer; + st.deepEqual(result, { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('does not crash when parsing circular references', function (st) { + var a = {}; + a.b = a; + + var parsed; + + st.doesNotThrow(function () { + parsed = qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a }); + }); + + st.equal('foo' in parsed, true, 'parsed has "foo" property'); + st.equal('bar' in parsed.foo, true); + st.equal('baz' in parsed.foo, true); + st.equal(parsed.foo.bar, 'baz'); + st.deepEqual(parsed.foo.baz, a); + st.end(); + }); + + t.test('does not crash when parsing deep objects', function (st) { + var parsed; + var str = 'foo'; + + for (var i = 0; i < 5000; i++) { + str += '[p]'; + } + + str += '=bar'; + + st.doesNotThrow(function () { + parsed = qs.parse(str, { depth: 5000 }); + }); + + st.equal('foo' in parsed, true, 'parsed has "foo" property'); + + var depth = 0; + var ref = parsed.foo; + while ((ref = ref.p)) { + depth += 1; + } + + st.equal(depth, 5000, 'parsed is 5000 properties deep'); + + st.end(); + }); + + t.test('parses null objects correctly', { skip: !Object.create }, function (st) { + var a = Object.create(null); + a.b = 'c'; + + st.deepEqual(qs.parse(a), { b: 'c' }); + var result = qs.parse({ a: a }); + st.equal('a' in result, true, 'result has "a" property'); + st.deepEqual(result.a, a); + st.end(); + }); + + t.test('parses dates correctly', function (st) { + var now = new Date(); + st.deepEqual(qs.parse({ a: now }), { a: now }); + st.end(); + }); + + t.test('parses regular expressions correctly', function (st) { + var re = /^test$/; + st.deepEqual(qs.parse({ a: re }), { a: re }); + st.end(); + }); + + t.test('does not allow overwriting prototype properties', function (st) { + st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: false }), {}); + st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: false }), {}); + + st.deepEqual( + qs.parse('toString', { allowPrototypes: false }), + {}, + 'bare "toString" results in {}' + ); + + st.end(); + }); + + t.test('can allow overwriting prototype properties', function (st) { + st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }), { a: { hasOwnProperty: 'b' } }); + st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: true }), { hasOwnProperty: 'b' }); + + st.deepEqual( + qs.parse('toString', { allowPrototypes: true }), + { toString: '' }, + 'bare "toString" results in { toString: "" }' + ); + + st.end(); + }); + + t.test('params starting with a closing bracket', function (st) { + st.deepEqual(qs.parse(']=toString'), { ']': 'toString' }); + st.deepEqual(qs.parse(']]=toString'), { ']]': 'toString' }); + st.deepEqual(qs.parse(']hello]=toString'), { ']hello]': 'toString' }); + st.end(); + }); + + t.test('params starting with a starting bracket', function (st) { + st.deepEqual(qs.parse('[=toString'), { '[': 'toString' }); + st.deepEqual(qs.parse('[[=toString'), { '[[': 'toString' }); + st.deepEqual(qs.parse('[hello[=toString'), { '[hello[': 'toString' }); + st.end(); + }); + + t.test('add keys to objects', function (st) { + st.deepEqual( + qs.parse('a[b]=c&a=d'), + { a: { b: 'c', d: true } }, + 'can add keys to objects' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString'), + { a: { b: 'c' } }, + 'can not overwrite prototype' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString', { allowPrototypes: true }), + { a: { b: 'c', toString: true } }, + 'can overwrite prototype with allowPrototypes true' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString', { plainObjects: true }), + { a: { b: 'c', toString: true } }, + 'can overwrite prototype with plainObjects true' + ); + + st.end(); + }); + + t.test('can return null objects', { skip: !Object.create }, function (st) { + var expected = Object.create(null); + expected.a = Object.create(null); + expected.a.b = 'c'; + expected.a.hasOwnProperty = 'd'; + st.deepEqual(qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true }), expected); + st.deepEqual(qs.parse(null, { plainObjects: true }), Object.create(null)); + var expectedArray = Object.create(null); + expectedArray.a = Object.create(null); + expectedArray.a[0] = 'b'; + expectedArray.a.c = 'd'; + st.deepEqual(qs.parse('a[]=b&a[c]=d', { plainObjects: true }), expectedArray); + st.end(); + }); + + t.test('can parse with custom encoding', function (st) { + st.deepEqual(qs.parse('%8c%a7=%91%e5%8d%e3%95%7b', { + decoder: function (str) { + var reg = /%([0-9A-F]{2})/ig; + var result = []; + var parts = reg.exec(str); + while (parts) { + result.push(parseInt(parts[1], 16)); + parts = reg.exec(str); + } + return iconv.decode(SaferBuffer.from(result), 'shift_jis').toString(); + } + }), { 県: '大阪府' }); + st.end(); + }); + + t.test('receives the default decoder as a second argument', function (st) { + st.plan(1); + qs.parse('a', { + decoder: function (str, defaultDecoder) { + st.equal(defaultDecoder, utils.decode); + } + }); + st.end(); + }); + + t.test('throws error with wrong decoder', function (st) { + st['throws'](function () { + qs.parse({}, { decoder: 'string' }); + }, new TypeError('Decoder has to be a function.')); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.parse('a[b]=true', options); + st.deepEqual(options, {}); + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/qs/test/stringify.js b/node_modules/qs/test/stringify.js new file mode 100644 index 00000000..165ac621 --- /dev/null +++ b/node_modules/qs/test/stringify.js @@ -0,0 +1,597 @@ +'use strict'; + +var test = require('tape'); +var qs = require('../'); +var utils = require('../lib/utils'); +var iconv = require('iconv-lite'); +var SaferBuffer = require('safer-buffer').Buffer; + +test('stringify()', function (t) { + t.test('stringifies a querystring object', function (st) { + st.equal(qs.stringify({ a: 'b' }), 'a=b'); + st.equal(qs.stringify({ a: 1 }), 'a=1'); + st.equal(qs.stringify({ a: 1, b: 2 }), 'a=1&b=2'); + st.equal(qs.stringify({ a: 'A_Z' }), 'a=A_Z'); + st.equal(qs.stringify({ a: '€' }), 'a=%E2%82%AC'); + st.equal(qs.stringify({ a: '' }), 'a=%EE%80%80'); + st.equal(qs.stringify({ a: 'א' }), 'a=%D7%90'); + st.equal(qs.stringify({ a: '𐐷' }), 'a=%F0%90%90%B7'); + st.end(); + }); + + t.test('adds query prefix', function (st) { + st.equal(qs.stringify({ a: 'b' }, { addQueryPrefix: true }), '?a=b'); + st.end(); + }); + + t.test('with query prefix, outputs blank string given an empty object', function (st) { + st.equal(qs.stringify({}, { addQueryPrefix: true }), ''); + st.end(); + }); + + t.test('stringifies a nested object', function (st) { + st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); + st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }), 'a%5Bb%5D%5Bc%5D%5Bd%5D=e'); + st.end(); + }); + + t.test('stringifies a nested object with dots notation', function (st) { + st.equal(qs.stringify({ a: { b: 'c' } }, { allowDots: true }), 'a.b=c'); + st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }, { allowDots: true }), 'a.b.c.d=e'); + st.end(); + }); + + t.test('stringifies an array value', function (st) { + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'indices' }), + 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'brackets' }), + 'a%5B%5D=b&a%5B%5D=c&a%5B%5D=d', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }), + 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', + 'default => indices' + ); + st.end(); + }); + + t.test('omits nulls when asked', function (st) { + st.equal(qs.stringify({ a: 'b', c: null }, { skipNulls: true }), 'a=b'); + st.end(); + }); + + t.test('omits nested nulls when asked', function (st) { + st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('omits array indices when asked', function (st) { + st.equal(qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }), 'a=b&a=c&a=d'); + st.end(); + }); + + t.test('stringifies a nested array value', function (st) { + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'indices' }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'brackets' }), 'a%5Bb%5D%5B%5D=c&a%5Bb%5D%5B%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.end(); + }); + + t.test('stringifies a nested array value with dots notation', function (st) { + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a.b[0]=c&a.b[1]=d', + 'indices: stringifies with dots + indices' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a.b[]=c&a.b[]=d', + 'brackets: stringifies with dots + brackets' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false } + ), + 'a.b[0]=c&a.b[1]=d', + 'default: stringifies with dots + indices' + ); + st.end(); + }); + + t.test('stringifies an object inside an array', function (st) { + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'indices' }), + 'a%5B0%5D%5Bb%5D=c', + 'indices => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D=c', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }), + 'a%5B0%5D%5Bb%5D=c', + 'default => indices' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'indices' }), + 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', + 'indices => indices' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D%5Bc%5D%5B%5D=1', + 'brackets => brackets' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }), + 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', + 'default => indices' + ); + + st.end(); + }); + + t.test('stringifies an array with mixed objects and primitives', function (st) { + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'indices' }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'brackets' }), + 'a[][b]=1&a[]=2&a[]=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'default => indices' + ); + + st.end(); + }); + + t.test('stringifies an object inside an array with dots notation', function (st) { + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a[0].b=c', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a[].b=c', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false } + ), + 'a[0].b=c', + 'default => indices' + ); + + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a[0].b.c[0]=1', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a[].b.c[]=1', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false } + ), + 'a[0].b.c[0]=1', + 'default => indices' + ); + + st.end(); + }); + + t.test('does not omit object keys when indices = false', function (st) { + st.equal(qs.stringify({ a: [{ b: 'c' }] }, { indices: false }), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when indices=true', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { indices: true }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when no arrayFormat is specified', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when no arrayFormat=indices', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses repeat notation for arrays when no arrayFormat=repeat', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }), 'a=b&a=c'); + st.end(); + }); + + t.test('uses brackets notation for arrays when no arrayFormat=brackets', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }), 'a%5B%5D=b&a%5B%5D=c'); + st.end(); + }); + + t.test('stringifies a complicated object', function (st) { + st.equal(qs.stringify({ a: { b: 'c', d: 'e' } }), 'a%5Bb%5D=c&a%5Bd%5D=e'); + st.end(); + }); + + t.test('stringifies an empty value', function (st) { + st.equal(qs.stringify({ a: '' }), 'a='); + st.equal(qs.stringify({ a: null }, { strictNullHandling: true }), 'a'); + + st.equal(qs.stringify({ a: '', b: '' }), 'a=&b='); + st.equal(qs.stringify({ a: null, b: '' }, { strictNullHandling: true }), 'a&b='); + + st.equal(qs.stringify({ a: { b: '' } }), 'a%5Bb%5D='); + st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: true }), 'a%5Bb%5D'); + st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: false }), 'a%5Bb%5D='); + + st.end(); + }); + + t.test('stringifies a null object', { skip: !Object.create }, function (st) { + var obj = Object.create(null); + obj.a = 'b'; + st.equal(qs.stringify(obj), 'a=b'); + st.end(); + }); + + t.test('returns an empty string for invalid input', function (st) { + st.equal(qs.stringify(undefined), ''); + st.equal(qs.stringify(false), ''); + st.equal(qs.stringify(null), ''); + st.equal(qs.stringify(''), ''); + st.end(); + }); + + t.test('stringifies an object with a null object as a child', { skip: !Object.create }, function (st) { + var obj = { a: Object.create(null) }; + + obj.a.b = 'c'; + st.equal(qs.stringify(obj), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('drops keys with a value of undefined', function (st) { + st.equal(qs.stringify({ a: undefined }), ''); + + st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true }), 'a%5Bc%5D'); + st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false }), 'a%5Bc%5D='); + st.equal(qs.stringify({ a: { b: undefined, c: '' } }), 'a%5Bc%5D='); + st.end(); + }); + + t.test('url encodes values', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.end(); + }); + + t.test('stringifies a date', function (st) { + var now = new Date(); + var str = 'a=' + encodeURIComponent(now.toISOString()); + st.equal(qs.stringify({ a: now }), str); + st.end(); + }); + + t.test('stringifies the weird object from qs', function (st) { + st.equal(qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' }), 'my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F'); + st.end(); + }); + + t.test('skips properties that are part of the object prototype', function (st) { + Object.prototype.crash = 'test'; + st.equal(qs.stringify({ a: 'b' }), 'a=b'); + st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); + delete Object.prototype.crash; + st.end(); + }); + + t.test('stringifies boolean values', function (st) { + st.equal(qs.stringify({ a: true }), 'a=true'); + st.equal(qs.stringify({ a: { b: true } }), 'a%5Bb%5D=true'); + st.equal(qs.stringify({ b: false }), 'b=false'); + st.equal(qs.stringify({ b: { c: false } }), 'b%5Bc%5D=false'); + st.end(); + }); + + t.test('stringifies buffer values', function (st) { + st.equal(qs.stringify({ a: SaferBuffer.from('test') }), 'a=test'); + st.equal(qs.stringify({ a: { b: SaferBuffer.from('test') } }), 'a%5Bb%5D=test'); + st.end(); + }); + + t.test('stringifies an object using an alternative delimiter', function (st) { + st.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); + st.end(); + }); + + t.test('doesn\'t blow up when Buffer global is missing', function (st) { + var tempBuffer = global.Buffer; + delete global.Buffer; + var result = qs.stringify({ a: 'b', c: 'd' }); + global.Buffer = tempBuffer; + st.equal(result, 'a=b&c=d'); + st.end(); + }); + + t.test('selects properties when filter=array', function (st) { + st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b'); + st.equal(qs.stringify({ a: 1 }, { filter: [] }), ''); + + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2], arrayFormat: 'indices' } + ), + 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2], arrayFormat: 'brackets' } + ), + 'a%5Bb%5D%5B%5D=1&a%5Bb%5D%5B%5D=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2] } + ), + 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', + 'default => indices' + ); + + st.end(); + }); + + t.test('supports custom representations when filter=function', function (st) { + var calls = 0; + var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } }; + var filterFunc = function (prefix, value) { + calls += 1; + if (calls === 1) { + st.equal(prefix, '', 'prefix is empty'); + st.equal(value, obj); + } else if (prefix === 'c') { + return void 0; + } else if (value instanceof Date) { + st.equal(prefix, 'e[f]'); + return value.getTime(); + } + return value; + }; + + st.equal(qs.stringify(obj, { filter: filterFunc }), 'a=b&e%5Bf%5D=1257894000000'); + st.equal(calls, 5); + st.end(); + }); + + t.test('can disable uri encoding', function (st) { + st.equal(qs.stringify({ a: 'b' }, { encode: false }), 'a=b'); + st.equal(qs.stringify({ a: { b: 'c' } }, { encode: false }), 'a[b]=c'); + st.equal(qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false }), 'a=b&c'); + st.end(); + }); + + t.test('can sort the keys', function (st) { + var sort = function (a, b) { + return a.localeCompare(b); + }; + st.equal(qs.stringify({ a: 'c', z: 'y', b: 'f' }, { sort: sort }), 'a=c&b=f&z=y'); + st.equal(qs.stringify({ a: 'c', z: { j: 'a', i: 'b' }, b: 'f' }, { sort: sort }), 'a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a'); + st.end(); + }); + + t.test('can sort the keys at depth 3 or more too', function (st) { + var sort = function (a, b) { + return a.localeCompare(b); + }; + st.equal( + qs.stringify( + { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, + { sort: sort, encode: false } + ), + 'a=a&b=b&z[zi][zia]=zia&z[zi][zib]=zib&z[zj][zja]=zja&z[zj][zjb]=zjb' + ); + st.equal( + qs.stringify( + { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, + { sort: null, encode: false } + ), + 'a=a&z[zj][zjb]=zjb&z[zj][zja]=zja&z[zi][zib]=zib&z[zi][zia]=zia&b=b' + ); + st.end(); + }); + + t.test('can stringify with custom encoding', function (st) { + st.equal(qs.stringify({ 県: '大阪府', '': '' }, { + encoder: function (str) { + if (str.length === 0) { + return ''; + } + var buf = iconv.encode(str, 'shiftjis'); + var result = []; + for (var i = 0; i < buf.length; ++i) { + result.push(buf.readUInt8(i).toString(16)); + } + return '%' + result.join('%'); + } + }), '%8c%a7=%91%e5%8d%e3%95%7b&='); + st.end(); + }); + + t.test('receives the default encoder as a second argument', function (st) { + st.plan(2); + qs.stringify({ a: 1 }, { + encoder: function (str, defaultEncoder) { + st.equal(defaultEncoder, utils.encode); + } + }); + st.end(); + }); + + t.test('throws error with wrong encoder', function (st) { + st['throws'](function () { + qs.stringify({}, { encoder: 'string' }); + }, new TypeError('Encoder has to be a function.')); + st.end(); + }); + + t.test('can use custom encoder for a buffer object', { skip: typeof Buffer === 'undefined' }, function (st) { + st.equal(qs.stringify({ a: SaferBuffer.from([1]) }, { + encoder: function (buffer) { + if (typeof buffer === 'string') { + return buffer; + } + return String.fromCharCode(buffer.readUInt8(0) + 97); + } + }), 'a=b'); + st.end(); + }); + + t.test('serializeDate option', function (st) { + var date = new Date(); + st.equal( + qs.stringify({ a: date }), + 'a=' + date.toISOString().replace(/:/g, '%3A'), + 'default is toISOString' + ); + + var mutatedDate = new Date(); + mutatedDate.toISOString = function () { + throw new SyntaxError(); + }; + st['throws'](function () { + mutatedDate.toISOString(); + }, SyntaxError); + st.equal( + qs.stringify({ a: mutatedDate }), + 'a=' + Date.prototype.toISOString.call(mutatedDate).replace(/:/g, '%3A'), + 'toISOString works even when method is not locally present' + ); + + var specificDate = new Date(6); + st.equal( + qs.stringify( + { a: specificDate }, + { serializeDate: function (d) { return d.getTime() * 7; } } + ), + 'a=42', + 'custom serializeDate function called' + ); + + st.end(); + }); + + t.test('RFC 1738 spaces serialization', function (st) { + st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC1738 }), 'a=b+c'); + st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC1738 }), 'a+b=c+d'); + st.end(); + }); + + t.test('RFC 3986 spaces serialization', function (st) { + st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC3986 }), 'a=b%20c'); + st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC3986 }), 'a%20b=c%20d'); + st.end(); + }); + + t.test('Backward compatibility to RFC 3986', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.end(); + }); + + t.test('Edge cases and unknown formats', function (st) { + ['UFO1234', false, 1234, null, {}, []].forEach( + function (format) { + st['throws']( + function () { + qs.stringify({ a: 'b c' }, { format: format }); + }, + new TypeError('Unknown format option provided.') + ); + } + ); + st.end(); + }); + + t.test('encodeValuesOnly', function (st) { + st.equal( + qs.stringify( + { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, + { encodeValuesOnly: true } + ), + 'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h' + ); + st.equal( + qs.stringify( + { a: 'b', c: ['d', 'e'], f: [['g'], ['h']] } + ), + 'a=b&c%5B0%5D=d&c%5B1%5D=e&f%5B0%5D%5B0%5D=g&f%5B1%5D%5B0%5D=h' + ); + st.end(); + }); + + t.test('encodeValuesOnly - strictNullHandling', function (st) { + st.equal( + qs.stringify( + { a: { b: null } }, + { encodeValuesOnly: true, strictNullHandling: true } + ), + 'a[b]' + ); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.stringify({}, options); + st.deepEqual(options, {}); + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/qs/test/utils.js b/node_modules/qs/test/utils.js new file mode 100644 index 00000000..eff4011a --- /dev/null +++ b/node_modules/qs/test/utils.js @@ -0,0 +1,34 @@ +'use strict'; + +var test = require('tape'); +var utils = require('../lib/utils'); + +test('merge()', function (t) { + t.deepEqual(utils.merge({ a: 'b' }, { a: 'c' }), { a: ['b', 'c'] }, 'merges two objects with the same key'); + + var oneMerged = utils.merge({ foo: 'bar' }, { foo: { first: '123' } }); + t.deepEqual(oneMerged, { foo: ['bar', { first: '123' }] }, 'merges a standalone and an object into an array'); + + var twoMerged = utils.merge({ foo: ['bar', { first: '123' }] }, { foo: { second: '456' } }); + t.deepEqual(twoMerged, { foo: { 0: 'bar', 1: { first: '123' }, second: '456' } }, 'merges a standalone and two objects into an array'); + + var sandwiched = utils.merge({ foo: ['bar', { first: '123', second: '456' }] }, { foo: 'baz' }); + t.deepEqual(sandwiched, { foo: ['bar', { first: '123', second: '456' }, 'baz'] }, 'merges an object sandwiched by two standalones into an array'); + + var nestedArrays = utils.merge({ foo: ['baz'] }, { foo: ['bar', 'xyzzy'] }); + t.deepEqual(nestedArrays, { foo: ['baz', 'bar', 'xyzzy'] }); + + t.end(); +}); + +test('assign()', function (t) { + var target = { a: 1, b: 2 }; + var source = { b: 3, c: 4 }; + var result = utils.assign(target, source); + + t.equal(result, target, 'returns the target'); + t.deepEqual(target, { a: 1, b: 3, c: 4 }, 'target and source are merged'); + t.deepEqual(source, { b: 3, c: 4 }, 'source is untouched'); + + t.end(); +}); diff --git a/node_modules/read-pkg-up/index.js b/node_modules/read-pkg-up/index.js new file mode 100644 index 00000000..beb3d483 --- /dev/null +++ b/node_modules/read-pkg-up/index.js @@ -0,0 +1,31 @@ +'use strict'; +var findUp = require('find-up'); +var readPkg = require('read-pkg'); + +module.exports = function (opts) { + return findUp('package.json', opts).then(function (fp) { + if (!fp) { + return {}; + } + + return readPkg(fp, opts).then(function (pkg) { + return { + pkg: pkg, + path: fp + }; + }); + }); +}; + +module.exports.sync = function (opts) { + var fp = findUp.sync('package.json', opts); + + if (!fp) { + return {}; + } + + return { + pkg: readPkg.sync(fp, opts), + path: fp + }; +}; diff --git a/node_modules/read-pkg-up/license b/node_modules/read-pkg-up/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/read-pkg-up/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/read-pkg-up/package.json b/node_modules/read-pkg-up/package.json new file mode 100644 index 00000000..0f7ff70b --- /dev/null +++ b/node_modules/read-pkg-up/package.json @@ -0,0 +1,59 @@ +{ + "name": "read-pkg-up", + "version": "1.0.1", + "description": "Read the closest package.json file", + "license": "MIT", + "repository": "sindresorhus/read-pkg-up", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "json", + "read", + "parse", + "file", + "fs", + "graceful", + "load", + "pkg", + "package", + "find", + "up", + "find-up", + "findup", + "look-up", + "look", + "file", + "search", + "match", + "package", + "resolve", + "parent", + "parents", + "folder", + "directory", + "dir", + "walk", + "walking", + "path" + ], + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/read-pkg-up/readme.md b/node_modules/read-pkg-up/readme.md new file mode 100644 index 00000000..dbd88f31 --- /dev/null +++ b/node_modules/read-pkg-up/readme.md @@ -0,0 +1,79 @@ +# read-pkg-up [![Build Status](https://travis-ci.org/sindresorhus/read-pkg-up.svg?branch=master)](https://travis-ci.org/sindresorhus/read-pkg-up) + +> Read the closest package.json file + + +## Why + +- [Finds the closest package.json](https://github.com/sindresorhus/find-up) +- [Gracefully handles filesystem issues](https://github.com/isaacs/node-graceful-fs) +- [Strips UTF-8 BOM](https://github.com/sindresorhus/strip-bom) +- [Throws more helpful JSON errors](https://github.com/sindresorhus/parse-json) +- [Normalizes the data](https://github.com/npm/normalize-package-data#what-normalization-currently-entails) + + +## Install + +``` +$ npm install --save read-pkg-up +``` + + +## Usage + +```js +var readPkgUp = require('read-pkg-up'); + +readPkgUp().then(function (result) { + console.log(result); + /* + { + pkg: { + name: 'awesome-package', + version: '1.0.0', + ... + }, + path: '/Users/sindresorhus/dev/awesome-package' + } + */ +}); +``` + + +## API + +### readPkgUp([options]) + +Returns a promise that resolves to a result object. + +### readPkgUp.sync([options]) + +Returns a result object. + +#### options + +##### cwd + +Type: `string` +Default: `.` + +Directory to start looking for a package.json file. + +##### normalize + +Type: `boolean` +Default: `true` + +[Normalize](https://github.com/npm/normalize-package-data#what-normalization-currently-entails) the package data. + + +## Related + +- [read-pkg](https://github.com/sindresorhus/read-pkg) - Read a package.json file +- [find-up](https://github.com/sindresorhus/find-up) - Find a file by walking up parent directories +- [pkg-conf](https://github.com/sindresorhus/pkg-conf) - Get namespaced config from the closest package.json + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/read-pkg/index.js b/node_modules/read-pkg/index.js new file mode 100644 index 00000000..c5c3afa8 --- /dev/null +++ b/node_modules/read-pkg/index.js @@ -0,0 +1,48 @@ +'use strict'; +var path = require('path'); +var loadJsonFile = require('load-json-file'); +var normalizePackageData = require('normalize-package-data'); +var pathType = require('path-type'); + +module.exports = function (fp, opts) { + if (typeof fp !== 'string') { + opts = fp; + fp = '.'; + } + + opts = opts || {}; + + return pathType.dir(fp) + .then(function (isDir) { + if (isDir) { + fp = path.join(fp, 'package.json'); + } + + return loadJsonFile(fp); + }) + .then(function (x) { + if (opts.normalize !== false) { + normalizePackageData(x); + } + + return x; + }); +}; + +module.exports.sync = function (fp, opts) { + if (typeof fp !== 'string') { + opts = fp; + fp = '.'; + } + + opts = opts || {}; + fp = pathType.dirSync(fp) ? path.join(fp, 'package.json') : fp; + + var x = loadJsonFile.sync(fp); + + if (opts.normalize !== false) { + normalizePackageData(x); + } + + return x; +}; diff --git a/node_modules/read-pkg/license b/node_modules/read-pkg/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/read-pkg/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/read-pkg/package.json b/node_modules/read-pkg/package.json new file mode 100644 index 00000000..594b0c28 --- /dev/null +++ b/node_modules/read-pkg/package.json @@ -0,0 +1,42 @@ +{ + "name": "read-pkg", + "version": "1.1.0", + "description": "Read a package.json file", + "license": "MIT", + "repository": "sindresorhus/read-pkg", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "json", + "read", + "parse", + "file", + "fs", + "graceful", + "load", + "pkg", + "package", + "normalize" + ], + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/read-pkg/readme.md b/node_modules/read-pkg/readme.md new file mode 100644 index 00000000..9a0d4cc4 --- /dev/null +++ b/node_modules/read-pkg/readme.md @@ -0,0 +1,79 @@ +# read-pkg [![Build Status](https://travis-ci.org/sindresorhus/read-pkg.svg?branch=master)](https://travis-ci.org/sindresorhus/read-pkg) + +> Read a package.json file + + +## Why + +- [Gracefully handles filesystem issues](https://github.com/isaacs/node-graceful-fs) +- [Strips UTF-8 BOM](https://github.com/sindresorhus/strip-bom) +- [Throws more helpful JSON errors](https://github.com/sindresorhus/parse-json) +- [Normalizes the data](https://github.com/npm/normalize-package-data#what-normalization-currently-entails) + + +## Install + +``` +$ npm install --save read-pkg +``` + + +## Usage + +```js +var readPkg = require('read-pkg'); + +readPkg().then(function (pkg) { + console.log(pkg); + //=> {name: 'read-pkg', ...} +}); + +readPkg(__dirname).then(function (pkg) { + console.log(pkg); + //=> {name: 'read-pkg', ...} +}); + +readPkg(path.join('unicorn', 'package.json')).then(function (pkg) { + console.log(pkg); + //=> {name: 'read-pkg', ...} +}); +``` + + +## API + +### readPkg([path], [options]) + +Returns a promise that resolves to the parsed JSON. + +### readPkg.sync([path], [options]) + +Returns the parsed JSON. + +#### path + +Type: `string` +Default: `.` + +Path to a `package.json` file or its directory. + +#### options + +##### normalize + +Type: `boolean` +Default: `true` + +[Normalize](https://github.com/npm/normalize-package-data#what-normalization-currently-entails) the package data. + + +## Related + +- [read-pkg-up](https://github.com/sindresorhus/read-pkg-up) - Read the closest package.json file +- [write-pkg](https://github.com/sindresorhus/write-pkg) - Write a `package.json` file +- [load-json-file](https://github.com/sindresorhus/load-json-file) - Read and parse a JSON file + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/readable-stream/.travis.yml b/node_modules/readable-stream/.travis.yml new file mode 100644 index 00000000..f62cdac0 --- /dev/null +++ b/node_modules/readable-stream/.travis.yml @@ -0,0 +1,34 @@ +sudo: false +language: node_js +before_install: + - (test $NPM_LEGACY && npm install -g npm@2 && npm install -g npm@3) || true +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: NPM_LEGACY=true + - node_js: '0.10' + env: NPM_LEGACY=true + - node_js: '0.11' + env: NPM_LEGACY=true + - node_js: '0.12' + env: NPM_LEGACY=true + - node_js: 1 + env: NPM_LEGACY=true + - node_js: 2 + env: NPM_LEGACY=true + - node_js: 3 + env: NPM_LEGACY=true + - node_js: 4 + - node_js: 5 + - node_js: 6 + - node_js: 7 + - node_js: 8 + - node_js: 9 +script: "npm run test" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 00000000..f478d58d --- /dev/null +++ b/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/readable-stream/GOVERNANCE.md b/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 00000000..16ffb93f --- /dev/null +++ b/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/readable-stream/LICENSE b/node_modules/readable-stream/LICENSE new file mode 100644 index 00000000..2873b3b2 --- /dev/null +++ b/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" diff --git a/node_modules/readable-stream/README.md b/node_modules/readable-stream/README.md new file mode 100644 index 00000000..23fe3f3e --- /dev/null +++ b/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 00000000..83275f19 --- /dev/null +++ b/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/readable-stream/duplex-browser.js b/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 00000000..f8b2db83 --- /dev/null +++ b/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/readable-stream/duplex.js b/node_modules/readable-stream/duplex.js new file mode 100644 index 00000000..46924cbf --- /dev/null +++ b/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/readable-stream/node_modules/safe-buffer/LICENSE b/node_modules/readable-stream/node_modules/safe-buffer/LICENSE new file mode 100644 index 00000000..0c068cee --- /dev/null +++ b/node_modules/readable-stream/node_modules/safe-buffer/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/readable-stream/node_modules/safe-buffer/README.md b/node_modules/readable-stream/node_modules/safe-buffer/README.md new file mode 100644 index 00000000..e9a81afd --- /dev/null +++ b/node_modules/readable-stream/node_modules/safe-buffer/README.md @@ -0,0 +1,584 @@ +# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url] + +[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg +[travis-url]: https://travis-ci.org/feross/safe-buffer +[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg +[npm-url]: https://npmjs.org/package/safe-buffer +[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg +[downloads-url]: https://npmjs.org/package/safe-buffer +[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg +[standard-url]: https://standardjs.com + +#### Safer Node.js Buffer API + +**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`, +`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.** + +**Uses the built-in implementation when available.** + +## install + +``` +npm install safe-buffer +``` + +## usage + +The goal of this package is to provide a safe replacement for the node.js `Buffer`. + +It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to +the top of your node.js modules: + +```js +var Buffer = require('safe-buffer').Buffer + +// Existing buffer code will continue to work without issues: + +new Buffer('hey', 'utf8') +new Buffer([1, 2, 3], 'utf8') +new Buffer(obj) +new Buffer(16) // create an uninitialized buffer (potentially unsafe) + +// But you can use these new explicit APIs to make clear what you want: + +Buffer.from('hey', 'utf8') // convert from many types to a Buffer +Buffer.alloc(16) // create a zero-filled buffer (safe) +Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe) +``` + +## api + +### Class Method: Buffer.from(array) + + +* `array` {Array} + +Allocates a new `Buffer` using an `array` of octets. + +```js +const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]); + // creates a new Buffer containing ASCII bytes + // ['b','u','f','f','e','r'] +``` + +A `TypeError` will be thrown if `array` is not an `Array`. + +### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]]) + + +* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or + a `new ArrayBuffer()` +* `byteOffset` {Number} Default: `0` +* `length` {Number} Default: `arrayBuffer.length - byteOffset` + +When passed a reference to the `.buffer` property of a `TypedArray` instance, +the newly created `Buffer` will share the same allocated memory as the +TypedArray. + +```js +const arr = new Uint16Array(2); +arr[0] = 5000; +arr[1] = 4000; + +const buf = Buffer.from(arr.buffer); // shares the memory with arr; + +console.log(buf); + // Prints: + +// changing the TypedArray changes the Buffer also +arr[1] = 6000; + +console.log(buf); + // Prints: +``` + +The optional `byteOffset` and `length` arguments specify a memory range within +the `arrayBuffer` that will be shared by the `Buffer`. + +```js +const ab = new ArrayBuffer(10); +const buf = Buffer.from(ab, 0, 2); +console.log(buf.length); + // Prints: 2 +``` + +A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`. + +### Class Method: Buffer.from(buffer) + + +* `buffer` {Buffer} + +Copies the passed `buffer` data onto a new `Buffer` instance. + +```js +const buf1 = Buffer.from('buffer'); +const buf2 = Buffer.from(buf1); + +buf1[0] = 0x61; +console.log(buf1.toString()); + // 'auffer' +console.log(buf2.toString()); + // 'buffer' (copy is not changed) +``` + +A `TypeError` will be thrown if `buffer` is not a `Buffer`. + +### Class Method: Buffer.from(str[, encoding]) + + +* `str` {String} String to encode. +* `encoding` {String} Encoding to use, Default: `'utf8'` + +Creates a new `Buffer` containing the given JavaScript string `str`. If +provided, the `encoding` parameter identifies the character encoding. +If not provided, `encoding` defaults to `'utf8'`. + +```js +const buf1 = Buffer.from('this is a tést'); +console.log(buf1.toString()); + // prints: this is a tést +console.log(buf1.toString('ascii')); + // prints: this is a tC)st + +const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex'); +console.log(buf2.toString()); + // prints: this is a tést +``` + +A `TypeError` will be thrown if `str` is not a string. + +### Class Method: Buffer.alloc(size[, fill[, encoding]]) + + +* `size` {Number} +* `fill` {Value} Default: `undefined` +* `encoding` {String} Default: `utf8` + +Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the +`Buffer` will be *zero-filled*. + +```js +const buf = Buffer.alloc(5); +console.log(buf); + // +``` + +The `size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +If `fill` is specified, the allocated `Buffer` will be initialized by calling +`buf.fill(fill)`. See [`buf.fill()`][] for more information. + +```js +const buf = Buffer.alloc(5, 'a'); +console.log(buf); + // +``` + +If both `fill` and `encoding` are specified, the allocated `Buffer` will be +initialized by calling `buf.fill(fill, encoding)`. For example: + +```js +const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64'); +console.log(buf); + // +``` + +Calling `Buffer.alloc(size)` can be significantly slower than the alternative +`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance +contents will *never contain sensitive data*. + +A `TypeError` will be thrown if `size` is not a number. + +### Class Method: Buffer.allocUnsafe(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* `Buffer` of `size` bytes. The `size` must +be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit +architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is +thrown. A zero-length Buffer will be created if a `size` less than or equal to +0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +```js +const buf = Buffer.allocUnsafe(5); +console.log(buf); + // + // (octets will be different, every time) +buf.fill(0); +console.log(buf); + // +``` + +A `TypeError` will be thrown if `size` is not a number. + +Note that the `Buffer` module pre-allocates an internal `Buffer` instance of +size `Buffer.poolSize` that is used as a pool for the fast allocation of new +`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated +`new Buffer(size)` constructor) only when `size` is less than or equal to +`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default +value of `Buffer.poolSize` is `8192` but can be modified. + +Use of this pre-allocated internal memory pool is a key difference between +calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`. +Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer +pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal +Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The +difference is subtle but can be important when an application requires the +additional performance that `Buffer.allocUnsafe(size)` provides. + +### Class Method: Buffer.allocUnsafeSlow(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes. The +`size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances, +allocations under 4KB are, by default, sliced from a single pre-allocated +`Buffer`. This allows applications to avoid the garbage collection overhead of +creating many individually allocated Buffers. This approach improves both +performance and memory usage by eliminating the need to track and cleanup as +many `Persistent` objects. + +However, in the case where a developer may need to retain a small chunk of +memory from a pool for an indeterminate amount of time, it may be appropriate +to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then +copy out the relevant bits. + +```js +// need to keep around a few small chunks of memory +const store = []; + +socket.on('readable', () => { + const data = socket.read(); + // allocate for retained data + const sb = Buffer.allocUnsafeSlow(10); + // copy the data into the new allocation + data.copy(sb, 0, 0, 10); + store.push(sb); +}); +``` + +Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after* +a developer has observed undue memory retention in their applications. + +A `TypeError` will be thrown if `size` is not a number. + +### All the Rest + +The rest of the `Buffer` API is exactly the same as in node.js. +[See the docs](https://nodejs.org/api/buffer.html). + + +## Related links + +- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660) +- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4) + +## Why is `Buffer` unsafe? + +Today, the node.js `Buffer` constructor is overloaded to handle many different argument +types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.), +`ArrayBuffer`, and also `Number`. + +The API is optimized for convenience: you can throw any type at it, and it will try to do +what you want. + +Because the Buffer constructor is so powerful, you often see code like this: + +```js +// Convert UTF-8 strings to hex +function toHex (str) { + return new Buffer(str).toString('hex') +} +``` + +***But what happens if `toHex` is called with a `Number` argument?*** + +### Remote Memory Disclosure + +If an attacker can make your program call the `Buffer` constructor with a `Number` +argument, then they can make it allocate uninitialized memory from the node.js process. +This could potentially disclose TLS private keys, user data, or database passwords. + +When the `Buffer` constructor is passed a `Number` argument, it returns an +**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like +this, you **MUST** overwrite the contents before returning it to the user. + +From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size): + +> `new Buffer(size)` +> +> - `size` Number +> +> The underlying memory for `Buffer` instances created in this way is not initialized. +> **The contents of a newly created `Buffer` are unknown and could contain sensitive +> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes. + +(Emphasis our own.) + +Whenever the programmer intended to create an uninitialized `Buffer` you often see code +like this: + +```js +var buf = new Buffer(16) + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### Would this ever be a problem in real code? + +Yes. It's surprisingly common to forget to check the type of your variables in a +dynamically-typed language like JavaScript. + +Usually the consequences of assuming the wrong type is that your program crashes with an +uncaught exception. But the failure mode for forgetting to check the type of arguments to +the `Buffer` constructor is more catastrophic. + +Here's an example of a vulnerable service that takes a JSON payload and converts it to +hex: + +```js +// Take a JSON payload {str: "some string"} and convert it to hex +var server = http.createServer(function (req, res) { + var data = '' + req.setEncoding('utf8') + req.on('data', function (chunk) { + data += chunk + }) + req.on('end', function () { + var body = JSON.parse(data) + res.end(new Buffer(body.str).toString('hex')) + }) +}) + +server.listen(8080) +``` + +In this example, an http client just has to send: + +```json +{ + "str": 1000 +} +``` + +and it will get back 1,000 bytes of uninitialized memory from the server. + +This is a very serious bug. It's similar in severity to the +[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process +memory by remote attackers. + + +### Which real-world packages were vulnerable? + +#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht) + +[Mathias Buus](https://github.com/mafintosh) and I +([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages, +[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow +anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get +them to reveal 20 bytes at a time of uninitialized memory from the node.js process. + +Here's +[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8) +that fixed it. We released a new fixed version, created a +[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all +vulnerable versions on npm so users will get a warning to upgrade to a newer version. + +#### [`ws`](https://www.npmjs.com/package/ws) + +That got us wondering if there were other vulnerable packages. Sure enough, within a short +period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the +most popular WebSocket implementation in node.js. + +If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as +expected, then uninitialized server memory would be disclosed to the remote peer. + +These were the vulnerable methods: + +```js +socket.send(number) +socket.ping(number) +socket.pong(number) +``` + +Here's a vulnerable socket server with some echo functionality: + +```js +server.on('connection', function (socket) { + socket.on('message', function (message) { + message = JSON.parse(message) + if (message.type === 'echo') { + socket.send(message.data) // send back the user's message + } + }) +}) +``` + +`socket.send(number)` called on the server, will disclose server memory. + +Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue +was fixed, with a more detailed explanation. Props to +[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the +[Node Security Project disclosure](https://nodesecurity.io/advisories/67). + + +### What's the solution? + +It's important that node.js offers a fast way to get memory otherwise performance-critical +applications would needlessly get a lot slower. + +But we need a better way to *signal our intent* as programmers. **When we want +uninitialized memory, we should request it explicitly.** + +Sensitive functionality should not be packed into a developer-friendly API that loosely +accepts many different types. This type of API encourages the lazy practice of passing +variables in without checking the type very carefully. + +#### A new API: `Buffer.allocUnsafe(number)` + +The functionality of creating buffers with uninitialized memory should be part of another +API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that +frequently gets user input of all sorts of different types passed into it. + +```js +var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory! + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### How do we fix node.js core? + +We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as +`semver-major`) which defends against one case: + +```js +var str = 16 +new Buffer(str, 'utf8') +``` + +In this situation, it's implied that the programmer intended the first argument to be a +string, since they passed an encoding as a second argument. Today, node.js will allocate +uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not +what the programmer intended. + +But this is only a partial solution, since if the programmer does `new Buffer(variable)` +(without an `encoding` parameter) there's no way to know what they intended. If `variable` +is sometimes a number, then uninitialized memory will sometimes be returned. + +### What's the real long-term fix? + +We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when +we need uninitialized memory. But that would break 1000s of packages. + +~~We believe the best solution is to:~~ + +~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~ + +~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~ + +#### Update + +We now support adding three new APIs: + +- `Buffer.from(value)` - convert from any type to a buffer +- `Buffer.alloc(size)` - create a zero-filled buffer +- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size + +This solves the core problem that affected `ws` and `bittorrent-dht` which is +`Buffer(variable)` getting tricked into taking a number argument. + +This way, existing code continues working and the impact on the npm ecosystem will be +minimal. Over time, npm maintainers can migrate performance-critical code to use +`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`. + + +### Conclusion + +We think there's a serious design issue with the `Buffer` API as it exists today. It +promotes insecure software by putting high-risk functionality into a convenient API +with friendly "developer ergonomics". + +This wasn't merely a theoretical exercise because we found the issue in some of the +most popular npm packages. + +Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of +`buffer`. + +```js +var Buffer = require('safe-buffer').Buffer +``` + +Eventually, we hope that node.js core can switch to this new, safer behavior. We believe +the impact on the ecosystem would be minimal since it's not a breaking change. +Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while +older, insecure packages would magically become safe from this attack vector. + + +## links + +- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514) +- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67) +- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68) + + +## credit + +The original issues in `bittorrent-dht` +([disclosure](https://nodesecurity.io/advisories/68)) and +`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by +[Mathias Buus](https://github.com/mafintosh) and +[Feross Aboukhadijeh](http://feross.org/). + +Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues +and for his work running the [Node Security Project](https://nodesecurity.io/). + +Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and +auditing the code. + + +## license + +MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org) diff --git a/node_modules/readable-stream/node_modules/safe-buffer/index.d.ts b/node_modules/readable-stream/node_modules/safe-buffer/index.d.ts new file mode 100644 index 00000000..e9fed809 --- /dev/null +++ b/node_modules/readable-stream/node_modules/safe-buffer/index.d.ts @@ -0,0 +1,187 @@ +declare module "safe-buffer" { + export class Buffer { + length: number + write(string: string, offset?: number, length?: number, encoding?: string): number; + toString(encoding?: string, start?: number, end?: number): string; + toJSON(): { type: 'Buffer', data: any[] }; + equals(otherBuffer: Buffer): boolean; + compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; + copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + slice(start?: number, end?: number): Buffer; + writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readUInt8(offset: number, noAssert?: boolean): number; + readUInt16LE(offset: number, noAssert?: boolean): number; + readUInt16BE(offset: number, noAssert?: boolean): number; + readUInt32LE(offset: number, noAssert?: boolean): number; + readUInt32BE(offset: number, noAssert?: boolean): number; + readInt8(offset: number, noAssert?: boolean): number; + readInt16LE(offset: number, noAssert?: boolean): number; + readInt16BE(offset: number, noAssert?: boolean): number; + readInt32LE(offset: number, noAssert?: boolean): number; + readInt32BE(offset: number, noAssert?: boolean): number; + readFloatLE(offset: number, noAssert?: boolean): number; + readFloatBE(offset: number, noAssert?: boolean): number; + readDoubleLE(offset: number, noAssert?: boolean): number; + readDoubleBE(offset: number, noAssert?: boolean): number; + swap16(): Buffer; + swap32(): Buffer; + swap64(): Buffer; + writeUInt8(value: number, offset: number, noAssert?: boolean): number; + writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeInt8(value: number, offset: number, noAssert?: boolean): number; + writeInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeFloatLE(value: number, offset: number, noAssert?: boolean): number; + writeFloatBE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; + fill(value: any, offset?: number, end?: number): this; + indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; + + /** + * Allocates a new buffer containing the given {str}. + * + * @param str String to store in buffer. + * @param encoding encoding to use, optional. Default is 'utf8' + */ + constructor (str: string, encoding?: string); + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + */ + constructor (size: number); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: Uint8Array); + /** + * Produces a Buffer backed by the same allocated memory as + * the given {ArrayBuffer}. + * + * + * @param arrayBuffer The ArrayBuffer with which to share memory. + */ + constructor (arrayBuffer: ArrayBuffer); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: any[]); + /** + * Copies the passed {buffer} data onto a new {Buffer} instance. + * + * @param buffer The buffer to copy. + */ + constructor (buffer: Buffer); + prototype: Buffer; + /** + * Allocates a new Buffer using an {array} of octets. + * + * @param array + */ + static from(array: any[]): Buffer; + /** + * When passed a reference to the .buffer property of a TypedArray instance, + * the newly created Buffer will share the same allocated memory as the TypedArray. + * The optional {byteOffset} and {length} arguments specify a memory range + * within the {arrayBuffer} that will be shared by the Buffer. + * + * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer() + * @param byteOffset + * @param length + */ + static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; + /** + * Copies the passed {buffer} data onto a new Buffer instance. + * + * @param buffer + */ + static from(buffer: Buffer): Buffer; + /** + * Creates a new Buffer containing the given JavaScript string {str}. + * If provided, the {encoding} parameter identifies the character encoding. + * If not provided, {encoding} defaults to 'utf8'. + * + * @param str + */ + static from(str: string, encoding?: string): Buffer; + /** + * Returns true if {obj} is a Buffer + * + * @param obj object to test. + */ + static isBuffer(obj: any): obj is Buffer; + /** + * Returns true if {encoding} is a valid encoding argument. + * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex' + * + * @param encoding string to test. + */ + static isEncoding(encoding: string): boolean; + /** + * Gives the actual byte length of a string. encoding defaults to 'utf8'. + * This is not the same as String.prototype.length since that returns the number of characters in a string. + * + * @param string string to test. + * @param encoding encoding used to evaluate (defaults to 'utf8') + */ + static byteLength(string: string, encoding?: string): number; + /** + * Returns a buffer which is the result of concatenating all the buffers in the list together. + * + * If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer. + * If the list has exactly one item, then the first item of the list is returned. + * If the list has more than one item, then a new Buffer is created. + * + * @param list An array of Buffer objects to concatenate + * @param totalLength Total length of the buffers when concatenated. + * If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly. + */ + static concat(list: Buffer[], totalLength?: number): Buffer; + /** + * The same as buf1.compare(buf2). + */ + static compare(buf1: Buffer, buf2: Buffer): number; + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + * @param fill if specified, buffer will be initialized by calling buf.fill(fill). + * If parameter is omitted, buffer will be filled with zeros. + * @param encoding encoding used for call to buf.fill while initalizing + */ + static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; + /** + * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafe(size: number): Buffer; + /** + * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafeSlow(size: number): Buffer; + } +} \ No newline at end of file diff --git a/node_modules/readable-stream/node_modules/safe-buffer/index.js b/node_modules/readable-stream/node_modules/safe-buffer/index.js new file mode 100644 index 00000000..22438dab --- /dev/null +++ b/node_modules/readable-stream/node_modules/safe-buffer/index.js @@ -0,0 +1,62 @@ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} diff --git a/node_modules/readable-stream/node_modules/safe-buffer/package.json b/node_modules/readable-stream/node_modules/safe-buffer/package.json new file mode 100644 index 00000000..623fbc3f --- /dev/null +++ b/node_modules/readable-stream/node_modules/safe-buffer/package.json @@ -0,0 +1,37 @@ +{ + "name": "safe-buffer", + "description": "Safer Node.js Buffer API", + "version": "5.1.2", + "author": { + "name": "Feross Aboukhadijeh", + "email": "feross@feross.org", + "url": "http://feross.org" + }, + "bugs": { + "url": "https://github.com/feross/safe-buffer/issues" + }, + "devDependencies": { + "standard": "*", + "tape": "^4.0.0" + }, + "homepage": "https://github.com/feross/safe-buffer", + "keywords": [ + "buffer", + "buffer allocate", + "node security", + "safe", + "safe-buffer", + "security", + "uninitialized" + ], + "license": "MIT", + "main": "index.js", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "git://github.com/feross/safe-buffer.git" + }, + "scripts": { + "test": "standard && tape test/*.js" + } +} diff --git a/node_modules/readable-stream/package.json b/node_modules/readable-stream/package.json new file mode 100644 index 00000000..2afa6fbd --- /dev/null +++ b/node_modules/readable-stream/package.json @@ -0,0 +1,52 @@ +{ + "name": "readable-stream", + "version": "2.3.7", + "description": "Streams3, a user-land copy of the stream library from Node.js", + "main": "readable.js", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "scripts": { + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js", + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov" + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream" + }, + "keywords": [ + "readable", + "stream", + "pipe" + ], + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "license": "MIT" +} diff --git a/node_modules/readable-stream/passthrough.js b/node_modules/readable-stream/passthrough.js new file mode 100644 index 00000000..ffd791d7 --- /dev/null +++ b/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/readable-stream/readable-browser.js b/node_modules/readable-stream/readable-browser.js new file mode 100644 index 00000000..e5037259 --- /dev/null +++ b/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/readable-stream/readable.js b/node_modules/readable-stream/readable.js new file mode 100644 index 00000000..ec89ec53 --- /dev/null +++ b/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/readable-stream/transform.js b/node_modules/readable-stream/transform.js new file mode 100644 index 00000000..b1baba26 --- /dev/null +++ b/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/readable-stream/writable-browser.js b/node_modules/readable-stream/writable-browser.js new file mode 100644 index 00000000..ebdde6a8 --- /dev/null +++ b/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/readable-stream/writable.js b/node_modules/readable-stream/writable.js new file mode 100644 index 00000000..3211a6f8 --- /dev/null +++ b/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/readdirp/LICENSE b/node_modules/readdirp/LICENSE new file mode 100644 index 00000000..8a63b80b --- /dev/null +++ b/node_modules/readdirp/LICENSE @@ -0,0 +1,20 @@ +This software is released under the MIT license: + +Copyright (c) 2012-2015 Thorsten Lorenz + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/readdirp/README.md b/node_modules/readdirp/README.md new file mode 100644 index 00000000..431f4025 --- /dev/null +++ b/node_modules/readdirp/README.md @@ -0,0 +1,204 @@ +# readdirp [![Build Status](https://secure.travis-ci.org/thlorenz/readdirp.svg)](http://travis-ci.org/thlorenz/readdirp) + +[![NPM](https://nodei.co/npm/readdirp.png?downloads=true&stars=true)](https://nodei.co/npm/readdirp/) + +Recursive version of [fs.readdir](http://nodejs.org/docs/latest/api/fs.html#fs_fs_readdir_path_callback). Exposes a **stream api**. + +```javascript +var readdirp = require('readdirp') + , path = require('path') + , es = require('event-stream'); + +// print out all JavaScript files along with their size + +var stream = readdirp({ root: path.join(__dirname), fileFilter: '*.js' }); +stream + .on('warn', function (err) { + console.error('non-fatal error', err); + // optionally call stream.destroy() here in order to abort and cause 'close' to be emitted + }) + .on('error', function (err) { console.error('fatal error', err); }) + .pipe(es.mapSync(function (entry) { + return { path: entry.path, size: entry.stat.size }; + })) + .pipe(es.stringify()) + .pipe(process.stdout); +``` + +Meant to be one of the recursive versions of [fs](http://nodejs.org/docs/latest/api/fs.html) functions, e.g., like [mkdirp](https://github.com/substack/node-mkdirp). + +**Table of Contents** *generated with [DocToc](http://doctoc.herokuapp.com/)* + +- [Installation](#installation) +- [API](#api) + - [entry stream](#entry-stream) + - [options](#options) + - [entry info](#entry-info) + - [Filters](#filters) + - [Callback API](#callback-api) + - [allProcessed ](#allprocessed) + - [fileProcessed](#fileprocessed) +- [More Examples](#more-examples) + - [stream api](#stream-api) + - [stream api pipe](#stream-api-pipe) + - [grep](#grep) + - [using callback api](#using-callback-api) + - [tests](#tests) + + +# Installation + + npm install readdirp + +# API + +***var entryStream = readdirp (options)*** + +Reads given root recursively and returns a `stream` of [entry info](#entry-info)s. + +## entry stream + +Behaves as follows: + +- `emit('data')` passes an [entry info](#entry-info) whenever one is found +- `emit('warn')` passes a non-fatal `Error` that prevents a file/directory from being processed (i.e., if it is + inaccessible to the user) +- `emit('error')` passes a fatal `Error` which also ends the stream (i.e., when illegal options where passed) +- `emit('end')` called when all entries were found and no more will be emitted (i.e., we are done) +- `emit('close')` called when the stream is destroyed via `stream.destroy()` (which could be useful if you want to + manually abort even on a non fatal error) - at that point the stream is no longer `readable` and no more entries, + warning or errors are emitted +- to learn more about streams, consult the very detailed + [nodejs streams documentation](http://nodejs.org/api/stream.html) or the + [stream-handbook](https://github.com/substack/stream-handbook) + + +## options + +- **root**: path in which to start reading and recursing into subdirectories + +- **fileFilter**: filter to include/exclude files found (see [Filters](#filters) for more) + +- **directoryFilter**: filter to include/exclude directories found and to recurse into (see [Filters](#filters) for more) + +- **depth**: depth at which to stop recursing even if more subdirectories are found + +- **entryType**: determines if data events on the stream should be emitted for `'files'`, `'directories'`, `'both'`, or `'all'`. Setting to `'all'` will also include entries for other types of file descriptors like character devices, unix sockets and named pipes. Defaults to `'files'`. + +- **lstat**: if `true`, readdirp uses `fs.lstat` instead of `fs.stat` in order to stat files and includes symlink entries in the stream along with files. + +## entry info + +Has the following properties: + +- **parentDir** : directory in which entry was found (relative to given root) +- **fullParentDir** : full path to parent directory +- **name** : name of the file/directory +- **path** : path to the file/directory (relative to given root) +- **fullPath** : full path to the file/directory found +- **stat** : built in [stat object](http://nodejs.org/docs/v0.4.9/api/fs.html#fs.Stats) +- **Example**: (assuming root was `/User/dev/readdirp`) + + parentDir : 'test/bed/root_dir1', + fullParentDir : '/User/dev/readdirp/test/bed/root_dir1', + name : 'root_dir1_subdir1', + path : 'test/bed/root_dir1/root_dir1_subdir1', + fullPath : '/User/dev/readdirp/test/bed/root_dir1/root_dir1_subdir1', + stat : [ ... ] + +## Filters + +There are three different ways to specify filters for files and directories respectively. + +- **function**: a function that takes an entry info as a parameter and returns true to include or false to exclude the entry + +- **glob string**: a string (e.g., `*.js`) which is matched using [minimatch](https://github.com/isaacs/minimatch), so go there for more + information. + + Globstars (`**`) are not supported since specifying a recursive pattern for an already recursive function doesn't make sense. + + Negated globs (as explained in the minimatch documentation) are allowed, e.g., `!*.txt` matches everything but text files. + +- **array of glob strings**: either need to be all inclusive or all exclusive (negated) patterns otherwise an error is thrown. + + `[ '*.json', '*.js' ]` includes all JavaScript and Json files. + + + `[ '!.git', '!node_modules' ]` includes all directories except the '.git' and 'node_modules'. + +Directories that do not pass a filter will not be recursed into. + +## Callback API + +Although the stream api is recommended, readdirp also exposes a callback based api. + +***readdirp (options, callback1 [, callback2])*** + +If callback2 is given, callback1 functions as the **fileProcessed** callback, and callback2 as the **allProcessed** callback. + +If only callback1 is given, it functions as the **allProcessed** callback. + +### allProcessed + +- function with err and res parameters, e.g., `function (err, res) { ... }` +- **err**: array of errors that occurred during the operation, **res may still be present, even if errors occurred** +- **res**: collection of file/directory [entry infos](#entry-info) + +### fileProcessed + +- function with [entry info](#entry-info) parameter e.g., `function (entryInfo) { ... }` + + +# More Examples + +`on('error', ..)`, `on('warn', ..)` and `on('end', ..)` handling omitted for brevity + +```javascript +var readdirp = require('readdirp'); + +// Glob file filter +readdirp({ root: './test/bed', fileFilter: '*.js' }) + .on('data', function (entry) { + // do something with each JavaScript file entry + }); + +// Combined glob file filters +readdirp({ root: './test/bed', fileFilter: [ '*.js', '*.json' ] }) + .on('data', function (entry) { + // do something with each JavaScript and Json file entry + }); + +// Combined negated directory filters +readdirp({ root: './test/bed', directoryFilter: [ '!.git', '!*modules' ] }) + .on('data', function (entry) { + // do something with each file entry found outside '.git' or any modules directory + }); + +// Function directory filter +readdirp({ root: './test/bed', directoryFilter: function (di) { return di.name.length === 9; } }) + .on('data', function (entry) { + // do something with each file entry found inside directories whose name has length 9 + }); + +// Limiting depth +readdirp({ root: './test/bed', depth: 1 }) + .on('data', function (entry) { + // do something with each file entry found up to 1 subdirectory deep + }); + +// callback api +readdirp({ root: '.' }, function(fileInfo) { + // do something with file entry here + }, function (err, res) { + // all done, move on or do final step for all file entries here +}); +``` + +Try more examples by following [instructions](https://github.com/paulmillr/readdirp/blob/master/examples/Readme.md) +on how to get going. + +## tests + +The [readdirp tests](https://github.com/paulmillr/readdirp/blob/master/test/readdirp.js) also will give you a good idea on +how things work. + diff --git a/node_modules/readdirp/package.json b/node_modules/readdirp/package.json new file mode 100644 index 00000000..39314a29 --- /dev/null +++ b/node_modules/readdirp/package.json @@ -0,0 +1,50 @@ +{ + "author": "Thorsten Lorenz (thlorenz.com)", + "name": "readdirp", + "description": "Recursive version of fs.readdir with streaming api.", + "version": "2.2.1", + "homepage": "https://github.com/paulmillr/readdirp", + "repository": { + "type": "git", + "url": "git://github.com/paulmillr/readdirp.git" + }, + "engines": { + "node": ">=0.10" + }, + "files": [ + "readdirp.js", + "stream-api.js" + ], + "keywords": [ + "recursive", + "fs", + "stream", + "streams", + "readdir", + "filesystem", + "find", + "filter" + ], + "main": "readdirp.js", + "scripts": { + "test-main": "(cd test && set -e; for t in ./*.js; do node $t; done)", + "test-0.10": "nave use 0.10 npm run test-main", + "test-0.12": "nave use 0.12 npm run test-main", + "test-4": "nave use 4.4 npm run test-main", + "test-6": "nave use 6.2 npm run test-main", + "test-all": "npm run test-main && npm run test-0.10 && npm run test-0.12 && npm run test-4 && npm run test-6", + "test": "npm run test-main" + }, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "devDependencies": { + "nave": "^0.5.1", + "proxyquire": "^1.7.9", + "tap": "1.3.2", + "through2": "^2.0.0" + }, + "license": "MIT" +} diff --git a/node_modules/readdirp/readdirp.js b/node_modules/readdirp/readdirp.js new file mode 100644 index 00000000..863bd17b --- /dev/null +++ b/node_modules/readdirp/readdirp.js @@ -0,0 +1,294 @@ +'use strict'; + +var fs = require('graceful-fs') + , path = require('path') + , micromatch = require('micromatch').isMatch + , toString = Object.prototype.toString + ; + + +// Standard helpers +function isFunction (obj) { + return toString.call(obj) === '[object Function]'; +} + +function isString (obj) { + return toString.call(obj) === '[object String]'; +} + +function isUndefined (obj) { + return obj === void 0; +} + +/** + * Main function which ends up calling readdirRec and reads all files and directories in given root recursively. + * @param { Object } opts Options to specify root (start directory), filters and recursion depth + * @param { function } callback1 When callback2 is given calls back for each processed file - function (fileInfo) { ... }, + * when callback2 is not given, it behaves like explained in callback2 + * @param { function } callback2 Calls back once all files have been processed with an array of errors and file infos + * function (err, fileInfos) { ... } + */ +function readdir(opts, callback1, callback2) { + var stream + , handleError + , handleFatalError + , errors = [] + , readdirResult = { + directories: [] + , files: [] + } + , fileProcessed + , allProcessed + , realRoot + , aborted = false + , paused = false + ; + + // If no callbacks were given we will use a streaming interface + if (isUndefined(callback1)) { + var api = require('./stream-api')(); + stream = api.stream; + callback1 = api.processEntry; + callback2 = api.done; + handleError = api.handleError; + handleFatalError = api.handleFatalError; + + stream.on('close', function () { aborted = true; }); + stream.on('pause', function () { paused = true; }); + stream.on('resume', function () { paused = false; }); + } else { + handleError = function (err) { errors.push(err); }; + handleFatalError = function (err) { + handleError(err); + allProcessed(errors, null); + }; + } + + if (isUndefined(opts)){ + handleFatalError(new Error ( + 'Need to pass at least one argument: opts! \n' + + 'https://github.com/paulmillr/readdirp#options' + ) + ); + return stream; + } + + opts.root = opts.root || '.'; + opts.fileFilter = opts.fileFilter || function() { return true; }; + opts.directoryFilter = opts.directoryFilter || function() { return true; }; + opts.depth = typeof opts.depth === 'undefined' ? 999999999 : opts.depth; + opts.entryType = opts.entryType || 'files'; + + var statfn = opts.lstat === true ? fs.lstat.bind(fs) : fs.stat.bind(fs); + + if (isUndefined(callback2)) { + fileProcessed = function() { }; + allProcessed = callback1; + } else { + fileProcessed = callback1; + allProcessed = callback2; + } + + function normalizeFilter (filter) { + + if (isUndefined(filter)) return undefined; + + function isNegated (filters) { + + function negated(f) { + return f.indexOf('!') === 0; + } + + var some = filters.some(negated); + if (!some) { + return false; + } else { + if (filters.every(negated)) { + return true; + } else { + // if we detect illegal filters, bail out immediately + throw new Error( + 'Cannot mix negated with non negated glob filters: ' + filters + '\n' + + 'https://github.com/paulmillr/readdirp#filters' + ); + } + } + } + + // Turn all filters into a function + if (isFunction(filter)) { + + return filter; + + } else if (isString(filter)) { + + return function (entryInfo) { + return micromatch(entryInfo.name, filter.trim()); + }; + + } else if (filter && Array.isArray(filter)) { + + if (filter) filter = filter.map(function (f) { + return f.trim(); + }); + + return isNegated(filter) ? + // use AND to concat multiple negated filters + function (entryInfo) { + return filter.every(function (f) { + return micromatch(entryInfo.name, f); + }); + } + : + // use OR to concat multiple inclusive filters + function (entryInfo) { + return filter.some(function (f) { + return micromatch(entryInfo.name, f); + }); + }; + } + } + + function processDir(currentDir, entries, callProcessed) { + if (aborted) return; + var total = entries.length + , processed = 0 + , entryInfos = [] + ; + + fs.realpath(currentDir, function(err, realCurrentDir) { + if (aborted) return; + if (err) { + handleError(err); + callProcessed(entryInfos); + return; + } + + var relDir = path.relative(realRoot, realCurrentDir); + + if (entries.length === 0) { + callProcessed([]); + } else { + entries.forEach(function (entry) { + + var fullPath = path.join(realCurrentDir, entry) + , relPath = path.join(relDir, entry); + + statfn(fullPath, function (err, stat) { + if (err) { + handleError(err); + } else { + entryInfos.push({ + name : entry + , path : relPath // relative to root + , fullPath : fullPath + + , parentDir : relDir // relative to root + , fullParentDir : realCurrentDir + + , stat : stat + }); + } + processed++; + if (processed === total) callProcessed(entryInfos); + }); + }); + } + }); + } + + function readdirRec(currentDir, depth, callCurrentDirProcessed) { + var args = arguments; + if (aborted) return; + if (paused) { + setImmediate(function () { + readdirRec.apply(null, args); + }) + return; + } + + fs.readdir(currentDir, function (err, entries) { + if (err) { + handleError(err); + callCurrentDirProcessed(); + return; + } + + processDir(currentDir, entries, function(entryInfos) { + + var subdirs = entryInfos + .filter(function (ei) { return ei.stat.isDirectory() && opts.directoryFilter(ei); }); + + subdirs.forEach(function (di) { + if(opts.entryType === 'directories' || opts.entryType === 'both' || opts.entryType === 'all') { + fileProcessed(di); + } + readdirResult.directories.push(di); + }); + + entryInfos + .filter(function(ei) { + var isCorrectType = opts.entryType === 'all' ? + !ei.stat.isDirectory() : ei.stat.isFile() || ei.stat.isSymbolicLink(); + return isCorrectType && opts.fileFilter(ei); + }) + .forEach(function (fi) { + if(opts.entryType === 'files' || opts.entryType === 'both' || opts.entryType === 'all') { + fileProcessed(fi); + } + readdirResult.files.push(fi); + }); + + var pendingSubdirs = subdirs.length; + + // Be done if no more subfolders exist or we reached the maximum desired depth + if(pendingSubdirs === 0 || depth === opts.depth) { + callCurrentDirProcessed(); + } else { + // recurse into subdirs, keeping track of which ones are done + // and call back once all are processed + subdirs.forEach(function (subdir) { + readdirRec(subdir.fullPath, depth + 1, function () { + pendingSubdirs = pendingSubdirs - 1; + if(pendingSubdirs === 0) { + callCurrentDirProcessed(); + } + }); + }); + } + }); + }); + } + + // Validate and normalize filters + try { + opts.fileFilter = normalizeFilter(opts.fileFilter); + opts.directoryFilter = normalizeFilter(opts.directoryFilter); + } catch (err) { + // if we detect illegal filters, bail out immediately + handleFatalError(err); + return stream; + } + + // If filters were valid get on with the show + fs.realpath(opts.root, function(err, res) { + if (err) { + handleFatalError(err); + return stream; + } + + realRoot = res; + readdirRec(opts.root, 0, function () { + // All errors are collected into the errors array + if (errors.length > 0) { + allProcessed(errors, readdirResult); + } else { + allProcessed(null, readdirResult); + } + }); + }); + + return stream; +} + +module.exports = readdir; diff --git a/node_modules/readdirp/stream-api.js b/node_modules/readdirp/stream-api.js new file mode 100644 index 00000000..bffd1a97 --- /dev/null +++ b/node_modules/readdirp/stream-api.js @@ -0,0 +1,98 @@ +'use strict'; + +var stream = require('readable-stream'); +var util = require('util'); + +var Readable = stream.Readable; + +module.exports = ReaddirpReadable; + +util.inherits(ReaddirpReadable, Readable); + +function ReaddirpReadable (opts) { + if (!(this instanceof ReaddirpReadable)) return new ReaddirpReadable(opts); + + opts = opts || {}; + + opts.objectMode = true; + Readable.call(this, opts); + + // backpressure not implemented at this point + this.highWaterMark = Infinity; + + this._destroyed = false; + this._paused = false; + this._warnings = []; + this._errors = []; + + this._pauseResumeErrors(); +} + +var proto = ReaddirpReadable.prototype; + +proto._pauseResumeErrors = function () { + var self = this; + self.on('pause', function () { self._paused = true }); + self.on('resume', function () { + if (self._destroyed) return; + self._paused = false; + + self._warnings.forEach(function (err) { self.emit('warn', err) }); + self._warnings.length = 0; + + self._errors.forEach(function (err) { self.emit('error', err) }); + self._errors.length = 0; + }) +} + +// called for each entry +proto._processEntry = function (entry) { + if (this._destroyed) return; + this.push(entry); +} + +proto._read = function () { } + +proto.destroy = function () { + // when stream is destroyed it will emit nothing further, not even errors or warnings + this.push(null); + this.readable = false; + this._destroyed = true; + this.emit('close'); +} + +proto._done = function () { + this.push(null); +} + +// we emit errors and warnings async since we may handle errors like invalid args +// within the initial event loop before any event listeners subscribed +proto._handleError = function (err) { + var self = this; + setImmediate(function () { + if (self._paused) return self._warnings.push(err); + if (!self._destroyed) self.emit('warn', err); + }); +} + +proto._handleFatalError = function (err) { + var self = this; + setImmediate(function () { + if (self._paused) return self._errors.push(err); + if (!self._destroyed) self.emit('error', err); + }); +} + +function createStreamAPI () { + var stream = new ReaddirpReadable(); + + return { + stream : stream + , processEntry : stream._processEntry.bind(stream) + , done : stream._done.bind(stream) + , handleError : stream._handleError.bind(stream) + , handleFatalError : stream._handleFatalError.bind(stream) + }; +} + +module.exports = createStreamAPI; diff --git a/node_modules/rechoir/.npmignore b/node_modules/rechoir/.npmignore new file mode 100644 index 00000000..9daeafb9 --- /dev/null +++ b/node_modules/rechoir/.npmignore @@ -0,0 +1 @@ +test diff --git a/node_modules/rechoir/.travis.yml b/node_modules/rechoir/.travis.yml new file mode 100644 index 00000000..57e9fdab --- /dev/null +++ b/node_modules/rechoir/.travis.yml @@ -0,0 +1,24 @@ +sudo: false +language: node_js +node_js: + - "0.10" + - "0.12" +env: + global: + - REMOVE_DEPS="" + matrix: + - "CUSTOM_DEPS=coffee-script@~1.3" + - "CUSTOM_DEPS=coffee-script@~1.5" + - "CUSTOM_DEPS=coffee-script@~1.7" + - "CUSTOM_DEPS=coffee-script@latest" + - "CUSTOM_DEPS=iced-coffee-script@1.6.3-j" + - "CUSTOM_DEPS=iced-coffee-script@latest" + - "CUSTOM_DEPS=LiveScript@1.3.1 REMOVE_DEPS=livescript" + - "CUSTOM_DEPS=typescript-require REMOVE_DEPS=typescript-register" +matrix: + fast_finish: true +before_install: + - "npm install -g npm" # needs the newest version of npm +before_script: + - "[ \"${REMOVE_DEPS}\" == \"\" ] || npm rm $REMOVE_DEPS" + - "npm install $CUSTOM_DEPS" # install a specific version of dependencies diff --git a/node_modules/rechoir/CHANGELOG b/node_modules/rechoir/CHANGELOG new file mode 100644 index 00000000..e10327b0 --- /dev/null +++ b/node_modules/rechoir/CHANGELOG @@ -0,0 +1,38 @@ +v0.6.2: + date: 2015-07-22 + changes: + - Return `undefined` when an unknown extension is provided to prepare and + the `nothrow` option is specified. +v0.6.1: + date: 2015-05-22 + changes: + - Add option for not throwing. +v0.6.0: + date: 2015-05-20 + changes: + - Include module name when prepare is successful. +v0.5.0: + date: 2015-05-20 + changes: + - Overhaul to support interpret 0.6.0. +v0.3.0: + date: 2015-01-10 + changes: + - Breaking: `load` method removed. + - Improved extension recognition. + - No longer fails upon dots in filenames. + - Support confuration objects. + - Support and test ES6. + - Support legacy module loading. +v0.2.2: + date: 2014-12-17 + changes: + - Expose interpret. +v0.2.0: + date: 2014-04-20 + changes: + - Simplify loading of coffee-script and iced-coffee-script. +v0.1.0: + date: 2014-04-20 + changes: + - Initial public release. diff --git a/node_modules/rechoir/LICENSE b/node_modules/rechoir/LICENSE new file mode 100644 index 00000000..f467993c --- /dev/null +++ b/node_modules/rechoir/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2015 Tyler Kellen + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/rechoir/README.md b/node_modules/rechoir/README.md new file mode 100644 index 00000000..32280c04 --- /dev/null +++ b/node_modules/rechoir/README.md @@ -0,0 +1,42 @@ +# rechoir [![Build Status](https://secure.travis-ci.org/tkellen/js-rechoir.png)](http://travis-ci.org/tkellen/js-rechoir) +> Require any supported file as a node module. + +[![NPM](https://nodei.co/npm/rechoir.png)](https://nodei.co/npm/rechoir/) + +## What is it? +This module, in conjunction with [interpret]-like objects can register any file type the npm ecosystem has a module loader for. This library is a dependency of [Liftoff]. + +## API + +### prepare(config, filepath, requireFrom) +Look for a module loader associated with the provided file and attempt require it. If necessary, run any setup required to inject it into [require.extensions](http://nodejs.org/api/globals.html#globals_require_extensions). + +`config` An [interpret]-like configuration object. + +`filepath` A file whose type you'd like to register a module loader for. + +`requireFrom` An optional path to start searching for the module required to load the requested file. Defaults to the directory of `filepath`. + +If calling this method is successful (aka: it doesn't throw), you can now require files of the type you requested natively. + +An error with a `failures` property will be thrown if the module loader(s) configured for a given extension cannot be registered. + +If a loader is already registered, this will simply return `true`. + +**Note:** While rechoir will automatically load and register transpilers like `coffee-script`, you must provide a local installation. The transpilers are **not** bundled with this module. + +#### Usage +```js +const config = require('interpret').extensions; +const rechoir = require('rechoir'); +rechoir.prepare(config, './test/fixtures/test.coffee'); +rechoir.prepare(config, './test/fixtures/test.csv'); +rechoir.prepare(config, './test/fixtures/test.toml'); + +console.log(require('./test/fixtures/test.coffee')); +console.log(require('./test/fixtures/test.csv')); +console.log(require('./test/fixtures/test.toml')); +``` + +[interpret]: http://github.com/tkellen/js-interpret +[Liftoff]: http://github.com/tkellen/js-liftoff diff --git a/node_modules/rechoir/index.js b/node_modules/rechoir/index.js new file mode 100644 index 00000000..0c36d058 --- /dev/null +++ b/node_modules/rechoir/index.js @@ -0,0 +1,59 @@ +const path = require('path'); + +const extension = require('./lib/extension'); +const normalize = require('./lib/normalize'); +const register = require('./lib/register'); + +exports.prepare = function (extensions, filepath, cwd, nothrow) { + var option, attempt; + var attempts = []; + var err; + var onlyErrors = false; + var ext = extension(filepath); + if (Object.keys(require.extensions).indexOf(ext) !== -1) { + return true; + } + var config = normalize(extensions[ext]); + if (!config) { + if (nothrow) { + return; + } else { + throw new Error('No module loader found for "'+ext+'".'); + } + } + if (!cwd) { + cwd = path.dirname(path.resolve(filepath)); + } + if (!Array.isArray(config)) { + config = [config]; + } + for (var i in config) { + option = config[i]; + attempt = register(cwd, option.module, option.register); + error = (attempt instanceof Error) ? attempt : null; + if (error) { + attempt = null; + } + attempts.push({ + moduleName: option.module, + module: attempt, + error: error + }); + if (!error) { + onlyErrors = false; + break; + } else { + onlyErrors = true; + } + } + if (onlyErrors) { + err = new Error('Unable to use specified module loaders for "'+ext+'".'); + err.failures = attempts; + if (nothrow) { + return err; + } else { + throw err; + } + } + return attempts; +}; diff --git a/node_modules/rechoir/package.json b/node_modules/rechoir/package.json new file mode 100644 index 00000000..5629390a --- /dev/null +++ b/node_modules/rechoir/package.json @@ -0,0 +1,88 @@ +{ + "name": "rechoir", + "description": "Require any supported file as a node module.", + "version": "0.6.2", + "homepage": "https://github.com/tkellen/node-rechoir", + "author": { + "name": "Tyler Kellen", + "url": "http://goingslowly.com/" + }, + "repository": { + "type": "git", + "url": "git://github.com/tkellen/node-rechoir.git" + }, + "bugs": { + "url": "https://github.com/tkellen/node-rechoir/issues" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/tkellen/node-rechoir/blob/master/LICENSE" + } + ], + "main": "index.js", + "engines": { + "node": ">= 0.10" + }, + "scripts": { + "test": "mocha -R spec test/index.js" + }, + "dependencies": { + "resolve": "^1.1.6" + }, + "devDependencies": { + "babel": "^5.4.3", + "chai": "^2.3.0", + "coco": "^0.9.1", + "coffee-script": "^1.9.2", + "earlgrey": "0.0.9", + "iced-coffee-script": "^1.8.0-d", + "interpret": "^0.6.1", + "json5": "^0.4.0", + "livescript": "^1.4.0", + "mocha": "^2.2.5", + "node-jsx": "^0.13.3", + "require-csv": "0.0.1", + "require-ini": "0.0.1", + "require-uncached": "^1.0.2", + "require-xml": "0.0.1", + "require-yaml": "0.0.1", + "rimraf": "^2.3.4", + "semver": "^4.3.4", + "sinon": "^1.14.1", + "toml-require": "^1.0.1", + "typescript-register": "^1.1.0" + }, + "keywords": [ + "require", + "cjsx", + "co", + "coco", + "coffee-script", + "coffee", + "coffee.md", + "csv", + "earlgrey", + "es", + "es6", + "iced", + "iced.md", + "iced-coffee-script", + "ini", + "js", + "json", + "json5", + "jsx", + "react", + "litcoffee", + "liticed", + "ls", + "livescript", + "toml", + "ts", + "typescript", + "xml", + "yaml", + "yml" + ] +} diff --git a/node_modules/redent/index.js b/node_modules/redent/index.js new file mode 100644 index 00000000..2b920205 --- /dev/null +++ b/node_modules/redent/index.js @@ -0,0 +1,7 @@ +'use strict'; +var stripIndent = require('strip-indent'); +var indentString = require('indent-string'); + +module.exports = function (str, count, indent) { + return indentString(stripIndent(str), indent || ' ', count || 0); +}; diff --git a/node_modules/redent/license b/node_modules/redent/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/redent/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/redent/node_modules/.bin/strip-indent b/node_modules/redent/node_modules/.bin/strip-indent new file mode 120000 index 00000000..9002b574 --- /dev/null +++ b/node_modules/redent/node_modules/.bin/strip-indent @@ -0,0 +1 @@ +../../../strip-indent/cli.js \ No newline at end of file diff --git a/node_modules/redent/package.json b/node_modules/redent/package.json new file mode 100644 index 00000000..3a28a27e --- /dev/null +++ b/node_modules/redent/package.json @@ -0,0 +1,43 @@ +{ + "name": "redent", + "version": "1.0.0", + "description": "Strip redundant indentation and indent the string", + "license": "MIT", + "repository": "sindresorhus/redent", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "string", + "str", + "strip", + "trim", + "indent", + "indentation", + "add", + "reindent", + "normalize", + "remove", + "whitespace", + "space" + ], + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/redent/readme.md b/node_modules/redent/readme.md new file mode 100644 index 00000000..8e7a8076 --- /dev/null +++ b/node_modules/redent/readme.md @@ -0,0 +1,48 @@ +# redent [![Build Status](https://travis-ci.org/sindresorhus/redent.svg?branch=master)](https://travis-ci.org/sindresorhus/redent) + +> [Strip redundant indentation](https://github.com/sindresorhus/strip-indent) and [indent the string](https://github.com/sindresorhus/indent-string) + + +## Install + +``` +$ npm install --save redent +``` + + +## Usage + +```js +const redent = require('redent'); + +redent('\n foo\n bar\n', 1); +//=> '\n foo\n bar\n' +``` + + +## API + +### redent(input, [count], [indent]) + +#### input + +Type: `string` + +#### count + +Type: `number` +Default: `0` + +How many times you want `indent` repeated. + +#### indent + +Type: `string` +Default: `' '` + +The string to use for the indent. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/regex-not/LICENSE b/node_modules/regex-not/LICENSE new file mode 100644 index 00000000..8ee09d91 --- /dev/null +++ b/node_modules/regex-not/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016, 2018, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/regex-not/README.md b/node_modules/regex-not/README.md new file mode 100644 index 00000000..24d00e7d --- /dev/null +++ b/node_modules/regex-not/README.md @@ -0,0 +1,133 @@ +# regex-not [![NPM version](https://img.shields.io/npm/v/regex-not.svg?style=flat)](https://www.npmjs.com/package/regex-not) [![NPM monthly downloads](https://img.shields.io/npm/dm/regex-not.svg?style=flat)](https://npmjs.org/package/regex-not) [![NPM total downloads](https://img.shields.io/npm/dt/regex-not.svg?style=flat)](https://npmjs.org/package/regex-not) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/regex-not.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/regex-not) + +> Create a javascript regular expression for matching everything except for the given string. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save regex-not +``` + +## Usage + +```js +var not = require('regex-not'); +``` + +The main export is a function that takes a string an options object. + +```js +not(string[, options]); +``` + +**Example** + +```js +var not = require('regex-not'); +console.log(not('foo')); +//=> /^(?:(?!^(?:foo)$).)+$/ +``` + +**Strict matching** + +By default, the returned regex is for strictly (not) matching the exact given pattern (in other words, "match this string if it does NOT _exactly equal_ `foo`"): + +```js +var re = not('foo'); +console.log(re.test('foo')); //=> false +console.log(re.test('bar')); //=> true +console.log(re.test('foobar')); //=> true +console.log(re.test('barfoo')); //=> true +``` + +### .create + +Returns a string to allow you to create your own regex: + +```js +console.log(not.create('foo')); +//=> '(?:(?!^(?:foo)$).)+' +``` + +### Options + +**options.contains** + +You can relax strict matching by setting `options.contains` to true (in other words, "match this string if it does NOT _contain_ `foo`"): + +```js +var re = not('foo'); +console.log(re.test('foo', {contains: true})); //=> false +console.log(re.test('bar', {contains: true})); //=> true +console.log(re.test('foobar', {contains: true})); //=> false +console.log(re.test('barfoo', {contains: true})); //=> false +``` + +## About + +
      +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
      + +
      +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
      + +
      +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
      + +### Related projects + +You might also be interested in these projects: + +* [regex-cache](https://www.npmjs.com/package/regex-cache): Memoize the results of a call to the RegExp constructor, avoiding repetitious runtime compilation of… [more](https://github.com/jonschlinkert/regex-cache) | [homepage](https://github.com/jonschlinkert/regex-cache "Memoize the results of a call to the RegExp constructor, avoiding repetitious runtime compilation of the same string and options, resulting in surprising performance improvements.") +* [to-regex](https://www.npmjs.com/package/to-regex): Generate a regex from a string or array of strings. | [homepage](https://github.com/jonschlinkert/to-regex "Generate a regex from a string or array of strings.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 9 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [doowb](https://github.com/doowb) | +| 1 | [EdwardBetts](https://github.com/EdwardBetts) | + +### Author + +**Jon Schlinkert** + +* [linkedin/in/jonschlinkert](https://linkedin.com/in/jonschlinkert) +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on February 19, 2018._ \ No newline at end of file diff --git a/node_modules/regex-not/index.js b/node_modules/regex-not/index.js new file mode 100644 index 00000000..02bfed4a --- /dev/null +++ b/node_modules/regex-not/index.js @@ -0,0 +1,72 @@ +'use strict'; + +var extend = require('extend-shallow'); +var safe = require('safe-regex'); + +/** + * The main export is a function that takes a `pattern` string and an `options` object. + * + * ```js + & var not = require('regex-not'); + & console.log(not('foo')); + & //=> /^(?:(?!^(?:foo)$).)*$/ + * ``` + * + * @param {String} `pattern` + * @param {Object} `options` + * @return {RegExp} Converts the given `pattern` to a regex using the specified `options`. + * @api public + */ + +function toRegex(pattern, options) { + return new RegExp(toRegex.create(pattern, options)); +} + +/** + * Create a regex-compatible string from the given `pattern` and `options`. + * + * ```js + & var not = require('regex-not'); + & console.log(not.create('foo')); + & //=> '^(?:(?!^(?:foo)$).)*$' + * ``` + * @param {String} `pattern` + * @param {Object} `options` + * @return {String} + * @api public + */ + +toRegex.create = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + var opts = extend({}, options); + if (opts.contains === true) { + opts.strictNegate = false; + } + + var open = opts.strictOpen !== false ? '^' : ''; + var close = opts.strictClose !== false ? '$' : ''; + var endChar = opts.endChar ? opts.endChar : '+'; + var str = pattern; + + if (opts.strictNegate === false) { + str = '(?:(?!(?:' + pattern + ')).)' + endChar; + } else { + str = '(?:(?!^(?:' + pattern + ')$).)' + endChar; + } + + var res = open + str + close; + if (opts.safe === true && safe(res) === false) { + throw new Error('potentially unsafe regular expression: ' + res); + } + + return res; +}; + +/** + * Expose `toRegex` + */ + +module.exports = toRegex; diff --git a/node_modules/regex-not/node_modules/extend-shallow/LICENSE b/node_modules/regex-not/node_modules/extend-shallow/LICENSE new file mode 100644 index 00000000..99c93691 --- /dev/null +++ b/node_modules/regex-not/node_modules/extend-shallow/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2015, 2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/regex-not/node_modules/extend-shallow/README.md b/node_modules/regex-not/node_modules/extend-shallow/README.md new file mode 100644 index 00000000..dee226f4 --- /dev/null +++ b/node_modules/regex-not/node_modules/extend-shallow/README.md @@ -0,0 +1,97 @@ +# extend-shallow [![NPM version](https://img.shields.io/npm/v/extend-shallow.svg?style=flat)](https://www.npmjs.com/package/extend-shallow) [![NPM monthly downloads](https://img.shields.io/npm/dm/extend-shallow.svg?style=flat)](https://npmjs.org/package/extend-shallow) [![NPM total downloads](https://img.shields.io/npm/dt/extend-shallow.svg?style=flat)](https://npmjs.org/package/extend-shallow) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/extend-shallow.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/extend-shallow) + +> Extend an object with the properties of additional objects. node.js/javascript util. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save extend-shallow +``` + +## Usage + +```js +var extend = require('extend-shallow'); + +extend({a: 'b'}, {c: 'd'}) +//=> {a: 'b', c: 'd'} +``` + +Pass an empty object to shallow clone: + +```js +var obj = {}; +extend(obj, {a: 'b'}, {c: 'd'}) +//=> {a: 'b', c: 'd'} +``` + +## About + +
      +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
      + +
      +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
      + +
      +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
      + +### Related projects + +You might also be interested in these projects: + +* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow "Extend an object with the properties of additional objects. node.js/javascript util.") +* [for-in](https://www.npmjs.com/package/for-in): Iterate over the own and inherited enumerable properties of an object, and return an object… [more](https://github.com/jonschlinkert/for-in) | [homepage](https://github.com/jonschlinkert/for-in "Iterate over the own and inherited enumerable properties of an object, and return an object with properties that evaluate to true from the callback. Exit early by returning `false`. JavaScript/Node.js") +* [for-own](https://www.npmjs.com/package/for-own): Iterate over the own enumerable properties of an object, and return an object with properties… [more](https://github.com/jonschlinkert/for-own) | [homepage](https://github.com/jonschlinkert/for-own "Iterate over the own enumerable properties of an object, and return an object with properties that evaluate to true from the callback. Exit early by returning `false`. JavaScript/Node.js.") +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") +* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 33 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [pdehaan](https://github.com/pdehaan) | + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on November 19, 2017._ \ No newline at end of file diff --git a/node_modules/regex-not/node_modules/extend-shallow/index.js b/node_modules/regex-not/node_modules/extend-shallow/index.js new file mode 100644 index 00000000..c9582f8f --- /dev/null +++ b/node_modules/regex-not/node_modules/extend-shallow/index.js @@ -0,0 +1,60 @@ +'use strict'; + +var isExtendable = require('is-extendable'); +var assignSymbols = require('assign-symbols'); + +module.exports = Object.assign || function(obj/*, objects*/) { + if (obj === null || typeof obj === 'undefined') { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!isObject(obj)) { + obj = {}; + } + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isString(val)) { + val = toObject(val); + } + if (isObject(val)) { + assign(obj, val); + assignSymbols(obj, val); + } + } + return obj; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +function isString(val) { + return (val && typeof val === 'string'); +} + +function toObject(str) { + var obj = {}; + for (var i in str) { + obj[i] = str[i]; + } + return obj; +} + +function isObject(val) { + return (val && typeof val === 'object') || isExtendable(val); +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +function isEnum(obj, key) { + return Object.prototype.propertyIsEnumerable.call(obj, key); +} diff --git a/node_modules/regex-not/node_modules/extend-shallow/package.json b/node_modules/regex-not/node_modules/extend-shallow/package.json new file mode 100644 index 00000000..e5e91053 --- /dev/null +++ b/node_modules/regex-not/node_modules/extend-shallow/package.json @@ -0,0 +1,83 @@ +{ + "name": "extend-shallow", + "description": "Extend an object with the properties of additional objects. node.js/javascript util.", + "version": "3.0.2", + "homepage": "https://github.com/jonschlinkert/extend-shallow", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Peter deHaan (http://about.me/peterdehaan)" + ], + "repository": "jonschlinkert/extend-shallow", + "bugs": { + "url": "https://github.com/jonschlinkert/extend-shallow/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "devDependencies": { + "array-slice": "^1.0.0", + "benchmarked": "^2.0.0", + "for-own": "^1.0.0", + "gulp-format-md": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.1", + "minimist": "^1.2.0", + "mocha": "^3.5.3", + "object-assign": "^4.1.1" + }, + "keywords": [ + "assign", + "clone", + "extend", + "merge", + "obj", + "object", + "object-assign", + "object.assign", + "prop", + "properties", + "property", + "props", + "shallow", + "util", + "utility", + "utils", + "value" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "related": { + "list": [ + "extend-shallow", + "for-in", + "for-own", + "is-plain-object", + "isobject", + "kind-of" + ] + }, + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/regex-not/node_modules/is-extendable/LICENSE b/node_modules/regex-not/node_modules/is-extendable/LICENSE new file mode 100644 index 00000000..c0d7f136 --- /dev/null +++ b/node_modules/regex-not/node_modules/is-extendable/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/regex-not/node_modules/is-extendable/README.md b/node_modules/regex-not/node_modules/is-extendable/README.md new file mode 100644 index 00000000..875b56a7 --- /dev/null +++ b/node_modules/regex-not/node_modules/is-extendable/README.md @@ -0,0 +1,88 @@ +# is-extendable [![NPM version](https://img.shields.io/npm/v/is-extendable.svg?style=flat)](https://www.npmjs.com/package/is-extendable) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-extendable.svg?style=flat)](https://npmjs.org/package/is-extendable) [![NPM total downloads](https://img.shields.io/npm/dt/is-extendable.svg?style=flat)](https://npmjs.org/package/is-extendable) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-extendable.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-extendable) + +> Returns true if a value is a plain object, array or function. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-extendable +``` + +## Usage + +```js +var isExtendable = require('is-extendable'); +``` + +Returns true if the value is any of the following: + +* array +* plain object +* function + +## Notes + +All objects in JavaScript can have keys, but it's a pain to check for this, since we ether need to verify that the value is not `null` or `undefined` and: + +* the value is not a primitive, or +* that the object is a plain object, function or array + +Also note that an `extendable` object is not the same as an [extensible object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible), which is one that (in es6) is not sealed, frozen, or marked as non-extensible using `preventExtensions`. + +## Release history + +### v1.0.0 - 2017/07/20 + +**Breaking changes** + +* No longer considers date, regex or error objects to be extendable + +## About + +### Related projects + +* [assign-deep](https://www.npmjs.com/package/assign-deep): Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target… [more](https://github.com/jonschlinkert/assign-deep) | [homepage](https://github.com/jonschlinkert/assign-deep "Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target (first) object.") +* [is-equal-shallow](https://www.npmjs.com/package/is-equal-shallow): Does a shallow comparison of two objects, returning false if the keys or values differ. | [homepage](https://github.com/jonschlinkert/is-equal-shallow "Does a shallow comparison of two objects, returning false if the keys or values differ.") +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") +* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 20, 2017._ \ No newline at end of file diff --git a/node_modules/regex-not/node_modules/is-extendable/index.d.ts b/node_modules/regex-not/node_modules/is-extendable/index.d.ts new file mode 100644 index 00000000..b96d5075 --- /dev/null +++ b/node_modules/regex-not/node_modules/is-extendable/index.d.ts @@ -0,0 +1,5 @@ +export = isExtendable; + +declare function isExtendable(val: any): boolean; + +declare namespace isExtendable {} diff --git a/node_modules/regex-not/node_modules/is-extendable/index.js b/node_modules/regex-not/node_modules/is-extendable/index.js new file mode 100644 index 00000000..a8b26ad0 --- /dev/null +++ b/node_modules/regex-not/node_modules/is-extendable/index.js @@ -0,0 +1,14 @@ +/*! + * is-extendable + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isPlainObject = require('is-plain-object'); + +module.exports = function isExtendable(val) { + return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); +}; diff --git a/node_modules/regex-not/node_modules/is-extendable/package.json b/node_modules/regex-not/node_modules/is-extendable/package.json new file mode 100644 index 00000000..2aaab65a --- /dev/null +++ b/node_modules/regex-not/node_modules/is-extendable/package.json @@ -0,0 +1,67 @@ +{ + "name": "is-extendable", + "description": "Returns true if a value is a plain object, array or function.", + "version": "1.0.1", + "homepage": "https://github.com/jonschlinkert/is-extendable", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/is-extendable", + "bugs": { + "url": "https://github.com/jonschlinkert/is-extendable/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "index.d.ts" + ], + "main": "index.js", + "types": "index.d.ts", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.4.2" + }, + "keywords": [ + "array", + "assign", + "check", + "date", + "extend", + "extendable", + "extensible", + "function", + "is", + "object", + "regex", + "test" + ], + "verb": { + "related": { + "list": [ + "assign-deep", + "is-equal-shallow", + "is-plain-object", + "isobject", + "kind-of" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/regex-not/package.json b/node_modules/regex-not/package.json new file mode 100644 index 00000000..0320d532 --- /dev/null +++ b/node_modules/regex-not/package.json @@ -0,0 +1,63 @@ +{ + "name": "regex-not", + "description": "Create a javascript regular expression for matching everything except for the given string.", + "version": "1.0.2", + "homepage": "https://github.com/jonschlinkert/regex-not", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/regex-not", + "bugs": { + "url": "https://github.com/jonschlinkert/regex-not/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "keywords": [ + "exec", + "match", + "negate", + "negation", + "not", + "regex", + "regular expression", + "test" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "regex-cache", + "to-regex" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/remove-bom-buffer/LICENSE b/node_modules/remove-bom-buffer/LICENSE new file mode 100644 index 00000000..c0d7f136 --- /dev/null +++ b/node_modules/remove-bom-buffer/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/remove-bom-buffer/README.md b/node_modules/remove-bom-buffer/README.md new file mode 100644 index 00000000..8ed18a48 --- /dev/null +++ b/node_modules/remove-bom-buffer/README.md @@ -0,0 +1,65 @@ +# remove-bom-buffer [![NPM version](https://img.shields.io/npm/v/remove-bom-buffer.svg?style=flat)](https://www.npmjs.com/package/remove-bom-buffer) [![NPM monthly downloads](https://img.shields.io/npm/dm/remove-bom-buffer.svg?style=flat)](https://npmjs.org/package/remove-bom-buffer) [![NPM total downloads](https://img.shields.io/npm/dt/remove-bom-buffer.svg?style=flat)](https://npmjs.org/package/remove-bom-buffer) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/remove-bom-buffer.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/remove-bom-buffer) + +> Remove a byte order mark (BOM) from a buffer. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save remove-bom-buffer +``` + +## Usage + +```js +var remove = require('remove-bom-buffer'); +remove(new Buffer('\ufefffoo')); +``` + +## About + +### Related projects + +* [cr](https://www.npmjs.com/package/cr): Strip windows carriage returns, or convert carriage returns to newlines. | [homepage](https://github.com/jonschlinkert/cr "Strip windows carriage returns, or convert carriage returns to newlines.") +* [has-bom](https://www.npmjs.com/package/has-bom): Returns true if a buffer or string has a byte order mark (BOM) | [homepage](https://github.com/jonschlinkert/has-bom "Returns true if a buffer or string has a byte order mark (BOM)") +* [read-file](https://www.npmjs.com/package/read-file): Thin wrapper around fs.readFile and fs.readFileSync that also strips byte order marks when `utf8` encoding… [more](https://github.com/jonschlinkert/read-file) | [homepage](https://github.com/jonschlinkert/read-file "Thin wrapper around fs.readFile and fs.readFileSync that also strips byte order marks when `utf8` encoding is chosen. Also optionally replaces windows newlines with unix newlines.") +* [strip-bom-string](https://www.npmjs.com/package/strip-bom-string): Strip a byte order mark (BOM) from a string. | [homepage](https://github.com/jonschlinkert/strip-bom-string "Strip a byte order mark (BOM) from a string.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 16, 2017._ \ No newline at end of file diff --git a/node_modules/remove-bom-buffer/index.js b/node_modules/remove-bom-buffer/index.js new file mode 100644 index 00000000..7a299ca3 --- /dev/null +++ b/node_modules/remove-bom-buffer/index.js @@ -0,0 +1,27 @@ +/*! + * remove-bom-buffer + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isUTF8 = require('is-utf8'); +var isBuffer = require('is-buffer'); + +function matchBOM(buf) { + return buf[0] === 0xEF && buf[1] === 0xBB && buf[2] === 0xBF; +} + +function maybeUTF8(buf) { + // Only "maybe" because we aren't sniffing the whole buffer + return isUTF8(buf.slice(3, 7)); +} + +module.exports = function(buf) { + if (isBuffer(buf) && matchBOM(buf) && maybeUTF8(buf)) { + return buf.slice(3); + } + return buf; +}; diff --git a/node_modules/remove-bom-buffer/package.json b/node_modules/remove-bom-buffer/package.json new file mode 100644 index 00000000..546b0108 --- /dev/null +++ b/node_modules/remove-bom-buffer/package.json @@ -0,0 +1,67 @@ +{ + "name": "remove-bom-buffer", + "description": "Remove a byte order mark (BOM) from a buffer.", + "version": "3.0.0", + "homepage": "https://github.com/jonschlinkert/remove-bom-buffer", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Blaine Bublitz (https://twitter.com/BlaineBublitz)", + "Erik Kemperman (https://github.com/erikkemperman)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "jonschlinkert/remove-bom-buffer", + "bugs": { + "url": "https://github.com/jonschlinkert/remove-bom-buffer/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "devDependencies": { + "gulp-format-md": "^0.1.11", + "mocha": "^3.2.0" + }, + "keywords": [ + "bom", + "buffer", + "byte-order-mark", + "normalize", + "remove", + "strip", + "strip-bom", + "strip-bom-buffer", + "strip-bom-string" + ], + "verb": { + "related": { + "list": [ + "cr", + "has-bom", + "read-file", + "strip-bom-string" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/remove-bom-stream/LICENSE b/node_modules/remove-bom-stream/LICENSE new file mode 100644 index 00000000..b8fc7433 --- /dev/null +++ b/node_modules/remove-bom-stream/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/remove-bom-stream/README.md b/node_modules/remove-bom-stream/README.md new file mode 100644 index 00000000..c4a05894 --- /dev/null +++ b/node_modules/remove-bom-stream/README.md @@ -0,0 +1,51 @@ +

      + + + +

      + +# remove-bom-stream + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Remove a UTF8 BOM at the start of the stream. + +## Usage + +```js +var fs = require('fs'); +var concat = require('concat-stream'); +var removeBOM = require('remove-bom-stream'); + +fs.createReadStream('utf8-file-with-bom.txt') + .pipe(removeBOM()) + .pipe(concat(function(result) { + // result won't have a BOM + })); +``` + +## API + +### `removeBOM()` + +Returns a `through2` stream that will remove a BOM, given the data is a UTF8 Buffer with a BOM at the beginning. If the data is not UTF8 or does not have a BOM, the data is not changed and this becomes a normal passthrough stream. + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/remove-bom-stream.svg +[npm-url]: https://npmjs.com/package/remove-bom-stream +[npm-image]: http://img.shields.io/npm/v/remove-bom-stream.svg + +[travis-url]: https://travis-ci.org/gulpjs/remove-bom-stream +[travis-image]: http://img.shields.io/travis/gulpjs/remove-bom-stream.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/remove-bom-stream +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/remove-bom-stream.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/remove-bom-stream +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/remove-bom-stream/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/node_modules/remove-bom-stream/index.js b/node_modules/remove-bom-stream/index.js new file mode 100644 index 00000000..93501f19 --- /dev/null +++ b/node_modules/remove-bom-stream/index.js @@ -0,0 +1,51 @@ +'use strict'; + +var through = require('through2'); +var removeBom = require('remove-bom-buffer'); +var SafeBuffer = require('safe-buffer').Buffer; + +function removeBomStream() { + var completed = false; + var buffer = SafeBuffer.alloc(0); + + return through(onChunk, onFlush); + + function removeAndCleanup(data) { + completed = true; + + buffer = null; + + return removeBom(data); + } + + function onChunk(data, enc, cb) { + if (completed) { + return cb(null, data); + } + + if (data.length >= 7) { + return cb(null, removeAndCleanup(data)); + } + + var bufferLength = buffer.length; + var chunkLength = data.length; + var totalLength = bufferLength + chunkLength; + + buffer = SafeBuffer.concat([buffer, data], totalLength); + + if (totalLength >= 7) { + return cb(null, removeAndCleanup(buffer)); + } + cb(); + } + + function onFlush(cb) { + if (completed || !buffer) { + return cb(); + } + + cb(null, removeAndCleanup(buffer)); + } +} + +module.exports = removeBomStream; diff --git a/node_modules/remove-bom-stream/node_modules/through2/LICENSE.md b/node_modules/remove-bom-stream/node_modules/through2/LICENSE.md new file mode 100644 index 00000000..a2429b63 --- /dev/null +++ b/node_modules/remove-bom-stream/node_modules/through2/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License (MIT) + +**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/remove-bom-stream/node_modules/through2/README.md b/node_modules/remove-bom-stream/node_modules/through2/README.md new file mode 100644 index 00000000..b5e44c7b --- /dev/null +++ b/node_modules/remove-bom-stream/node_modules/through2/README.md @@ -0,0 +1,134 @@ +# through2 + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node streams.Transform (Streams2/3) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +Note: As 2.x.x this module starts using **Streams3** instead of Stream2. To continue using a Streams2 version use `npm install through2@0` to fetch the latest version of 0.x.x. More information about Streams2 vs Streams3 and recommendations see the article **[Why I don't use Node's core 'stream' module](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html)**. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (var i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) + .on('finish', () => doSomethingSpecial()) +``` + +Or object streams: + +```js +var all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + var data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', (data) => { + all.push(data) + }) + .on('end', () => { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## API + +through2([ options, ] [ transformFunction ] [, flushFunction ]) + +Consult the **[stream.Transform](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + (chunk, enc, cb) => { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + ) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + (chunk, enc, cb) => cb(null, chunk), // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +through2.ctor([ options, ] transformFunction[, flushFunction ]) + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +var FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit == "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +var converter = new FToC() +// Or: +var converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +var converter = FToC({objectMode: true}) +``` + +## See Also + + - [through2-map](https://github.com/brycebaril/through2-map) - Array.prototype.map analog for streams. + - [through2-filter](https://github.com/brycebaril/through2-filter) - Array.prototype.filter analog for streams. + - [through2-reduce](https://github.com/brycebaril/through2-reduce) - Array.prototype.reduce analog for streams. + - [through2-spy](https://github.com/brycebaril/through2-spy) - Wrapper for simple stream.PassThrough spies. + - the [mississippi stream utility collection](https://github.com/maxogden/mississippi) includes `through2` as well as many more useful stream modules similar to this one + +## License + +**through2** is Copyright (c) Rod Vagg [@rvagg](https://twitter.com/rvagg) and additional contributors and licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/remove-bom-stream/node_modules/through2/package.json b/node_modules/remove-bom-stream/node_modules/through2/package.json new file mode 100644 index 00000000..15960b63 --- /dev/null +++ b/node_modules/remove-bom-stream/node_modules/through2/package.json @@ -0,0 +1,33 @@ +{ + "name": "through2", + "version": "2.0.5", + "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise", + "main": "through2.js", + "scripts": { + "test": "node test/test.js | faucet" + }, + "repository": { + "type": "git", + "url": "https://github.com/rvagg/through2.git" + }, + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "author": "Rod Vagg (https://github.com/rvagg)", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "devDependencies": { + "bl": "~2.0.1", + "faucet": "0.0.1", + "nyc": "~13.1.0", + "safe-buffer": "~5.1.2", + "stream-spigot": "~3.0.6", + "tape": "~4.9.1" + } +} diff --git a/node_modules/remove-bom-stream/node_modules/through2/through2.js b/node_modules/remove-bom-stream/node_modules/through2/through2.js new file mode 100644 index 00000000..6baa6a1e --- /dev/null +++ b/node_modules/remove-bom-stream/node_modules/through2/through2.js @@ -0,0 +1,96 @@ +var Transform = require('readable-stream').Transform + , inherits = require('util').inherits + , xtend = require('xtend') + +function DestroyableTransform(opts) { + Transform.call(this, opts) + this._destroyed = false +} + +inherits(DestroyableTransform, Transform) + +DestroyableTransform.prototype.destroy = function(err) { + if (this._destroyed) return + this._destroyed = true + + var self = this + process.nextTick(function() { + if (err) + self.emit('error', err) + self.emit('close') + }) +} + +// a noop _transform function +function noop (chunk, enc, callback) { + callback(null, chunk) +} + + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return function (options, transform, flush) { + if (typeof options == 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform != 'function') + transform = noop + + if (typeof flush != 'function') + flush = null + + return construct(options, transform, flush) + } +} + + +// main export, just make me a transform stream! +module.exports = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(options) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) + + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +module.exports.ctor = through2(function (options, transform, flush) { + function Through2 (override) { + if (!(this instanceof Through2)) + return new Through2(override) + + this.options = xtend(options, override) + + DestroyableTransform.call(this, this.options) + } + + inherits(Through2, DestroyableTransform) + + Through2.prototype._transform = transform + + if (flush) + Through2.prototype._flush = flush + + return Through2 +}) + + +module.exports.obj = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) diff --git a/node_modules/remove-bom-stream/package.json b/node_modules/remove-bom-stream/package.json new file mode 100644 index 00000000..b5488290 --- /dev/null +++ b/node_modules/remove-bom-stream/package.json @@ -0,0 +1,51 @@ +{ + "name": "remove-bom-stream", + "version": "1.2.0", + "description": "Remove a UTF8 BOM at the start of the stream.", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Blaine Bublitz " + ], + "repository": "gulpjs/remove-bom-stream", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint index.js test/ && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "safe-buffer": "^5.1.0", + "remove-bom-buffer": "^3.0.0", + "through2": "^2.0.3" + }, + "devDependencies": { + "buffer-equal": "^1.0.0", + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mississippi": "^1.3.0", + "mocha": "^3.2.0", + "stream-chunker": "^1.2.8" + }, + "keywords": [ + "bom", + "remove", + "utf8", + "streaming", + "stream" + ] +} diff --git a/node_modules/remove-trailing-separator/history.md b/node_modules/remove-trailing-separator/history.md new file mode 100644 index 00000000..e15e8a46 --- /dev/null +++ b/node_modules/remove-trailing-separator/history.md @@ -0,0 +1,17 @@ +## History + +### 1.1.0 - 16th Aug 2017 + +- [f4576e3](https://github.com/darsain/remove-trailing-separator/commit/f4576e3638c39b794998b533fffb27854dcbee01) Implement faster slash slicing + +### 1.0.2 - 07th Jun 2017 + +- [8e13ecb](https://github.com/darsain/remove-trailing-separator/commit/8e13ecbfd7b9f5fdf97c5d5ff923e4718b874e31) ES5 compatibility + +### 1.0.1 - 25th Sep 2016 + +- [b78606d](https://github.com/darsain/remove-trailing-separator/commit/af90b4e153a4527894741af6c7005acaeb78606d) Remove backslash only on win32 systems + +### 1.0.0 - 24th Sep 2016 + +Initial release. diff --git a/node_modules/remove-trailing-separator/index.js b/node_modules/remove-trailing-separator/index.js new file mode 100644 index 00000000..512306b8 --- /dev/null +++ b/node_modules/remove-trailing-separator/index.js @@ -0,0 +1,17 @@ +var isWin = process.platform === 'win32'; + +module.exports = function (str) { + var i = str.length - 1; + if (i < 2) { + return str; + } + while (isSeparator(str, i)) { + i--; + } + return str.substr(0, i + 1); +}; + +function isSeparator(str, i) { + var char = str[i]; + return i > 0 && (char === '/' || (isWin && char === '\\')); +} diff --git a/node_modules/remove-trailing-separator/license b/node_modules/remove-trailing-separator/license new file mode 100644 index 00000000..a169aff7 --- /dev/null +++ b/node_modules/remove-trailing-separator/license @@ -0,0 +1,3 @@ +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/node_modules/remove-trailing-separator/package.json b/node_modules/remove-trailing-separator/package.json new file mode 100644 index 00000000..47ef27a2 --- /dev/null +++ b/node_modules/remove-trailing-separator/package.json @@ -0,0 +1,37 @@ +{ + "name": "remove-trailing-separator", + "version": "1.1.0", + "description": "Removes separators from the end of the string.", + "main": "index.js", + "files": [ + "index.js" + ], + "scripts": { + "lint": "xo", + "pretest": "npm run lint", + "test": "nyc ava", + "report": "nyc report --reporter=html" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/darsain/remove-trailing-separator.git" + }, + "keywords": [ + "remove", + "strip", + "trailing", + "separator" + ], + "author": "darsain", + "license": "ISC", + "bugs": { + "url": "https://github.com/darsain/remove-trailing-separator/issues" + }, + "homepage": "https://github.com/darsain/remove-trailing-separator#readme", + "devDependencies": { + "ava": "^0.16.0", + "coveralls": "^2.11.14", + "nyc": "^8.3.0", + "xo": "^0.16.0" + } +} diff --git a/node_modules/remove-trailing-separator/readme.md b/node_modules/remove-trailing-separator/readme.md new file mode 100644 index 00000000..747086af --- /dev/null +++ b/node_modules/remove-trailing-separator/readme.md @@ -0,0 +1,51 @@ +# remove-trailing-separator + +[![NPM version][npm-img]][npm-url] [![Build Status: Linux][travis-img]][travis-url] [![Build Status: Windows][appveyor-img]][appveyor-url] [![Coverage Status][coveralls-img]][coveralls-url] + +Removes all separators from the end of a string. + +## Install + +``` +npm install remove-trailing-separator +``` + +## Examples + +```js +const removeTrailingSeparator = require('remove-trailing-separator'); + +removeTrailingSeparator('/foo/bar/') // '/foo/bar' +removeTrailingSeparator('/foo/bar///') // '/foo/bar' + +// leaves only/last separator +removeTrailingSeparator('/') // '/' +removeTrailingSeparator('///') // '/' + +// returns empty string +removeTrailingSeparator('') // '' +``` + +## Notable backslash, or win32 separator behavior + +`\` is considered a separator only on WIN32 systems. All POSIX compliant systems +see backslash as a valid file name character, so it would break POSIX compliance +to remove it there. + +In practice, this means that this code will return different things depending on +what system it runs on: + +```js +removeTrailingSeparator('\\foo\\') +// UNIX => '\\foo\\' +// WIN32 => '\\foo' +``` + +[npm-url]: https://npmjs.org/package/remove-trailing-separator +[npm-img]: https://badge.fury.io/js/remove-trailing-separator.svg +[travis-url]: https://travis-ci.org/darsain/remove-trailing-separator +[travis-img]: https://travis-ci.org/darsain/remove-trailing-separator.svg?branch=master +[appveyor-url]: https://ci.appveyor.com/project/darsain/remove-trailing-separator/branch/master +[appveyor-img]: https://ci.appveyor.com/api/projects/status/wvg9a93rrq95n2xl/branch/master?svg=true +[coveralls-url]: https://coveralls.io/github/darsain/remove-trailing-separator?branch=master +[coveralls-img]: https://coveralls.io/repos/github/darsain/remove-trailing-separator/badge.svg?branch=master diff --git a/node_modules/repeat-element/LICENSE b/node_modules/repeat-element/LICENSE new file mode 100644 index 00000000..7cccaf9e --- /dev/null +++ b/node_modules/repeat-element/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/repeat-element/README.md b/node_modules/repeat-element/README.md new file mode 100644 index 00000000..6006418b --- /dev/null +++ b/node_modules/repeat-element/README.md @@ -0,0 +1,99 @@ +# repeat-element [![NPM version](https://img.shields.io/npm/v/repeat-element.svg?style=flat)](https://www.npmjs.com/package/repeat-element) [![NPM monthly downloads](https://img.shields.io/npm/dm/repeat-element.svg?style=flat)](https://npmjs.org/package/repeat-element) [![NPM total downloads](https://img.shields.io/npm/dt/repeat-element.svg?style=flat)](https://npmjs.org/package/repeat-element) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/repeat-element.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/repeat-element) + +> Create an array by repeating the given value n times. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save repeat-element +``` + +## Usage + +```js +const repeat = require('repeat-element'); + +repeat('a', 5); +//=> ['a', 'a', 'a', 'a', 'a'] + +repeat('a', 1); +//=> ['a'] + +repeat('a', 0); +//=> [] + +repeat(null, 5) +//» [ null, null, null, null, null ] + +repeat({some: 'object'}, 5) +//» [ { some: 'object' }, +// { some: 'object' }, +// { some: 'object' }, +// { some: 'object' }, +// { some: 'object' } ] + +repeat(5, 5) +//» [ 5, 5, 5, 5, 5 ] +``` + +## About + +
      +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
      + +
      +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
      + +
      +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
      + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 17 | [jonschlinkert](https://github.com/jonschlinkert) | +| 3 | [LinusU](https://github.com/LinusU) | +| 1 | [architectcodes](https://github.com/architectcodes) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on August 19, 2018._ \ No newline at end of file diff --git a/node_modules/repeat-element/index.js b/node_modules/repeat-element/index.js new file mode 100644 index 00000000..06a8d01d --- /dev/null +++ b/node_modules/repeat-element/index.js @@ -0,0 +1,18 @@ +/*! + * repeat-element + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Licensed under the MIT license. + */ + +'use strict'; + +module.exports = function repeat(ele, num) { + var arr = new Array(num); + + for (var i = 0; i < num; i++) { + arr[i] = ele; + } + + return arr; +}; diff --git a/node_modules/repeat-element/package.json b/node_modules/repeat-element/package.json new file mode 100644 index 00000000..7f12ef98 --- /dev/null +++ b/node_modules/repeat-element/package.json @@ -0,0 +1,49 @@ +{ + "name": "repeat-element", + "description": "Create an array by repeating the given value n times.", + "version": "1.1.3", + "homepage": "https://github.com/jonschlinkert/repeat-element", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/repeat-element", + "bugs": { + "url": "https://github.com/jonschlinkert/repeat-element/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "benchmarked": "^2.0.0", + "chalk": "^2.4.1", + "glob": "^7.1.2", + "gulp-format-md": "^1.0.0", + "minimist": "^1.2.0", + "mocha": "^3.5.3" + }, + "keywords": [ + "array", + "element", + "repeat", + "string" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/repeat-string/LICENSE b/node_modules/repeat-string/LICENSE new file mode 100644 index 00000000..39245ac1 --- /dev/null +++ b/node_modules/repeat-string/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/repeat-string/README.md b/node_modules/repeat-string/README.md new file mode 100644 index 00000000..aaa5e91c --- /dev/null +++ b/node_modules/repeat-string/README.md @@ -0,0 +1,136 @@ +# repeat-string [![NPM version](https://img.shields.io/npm/v/repeat-string.svg?style=flat)](https://www.npmjs.com/package/repeat-string) [![NPM monthly downloads](https://img.shields.io/npm/dm/repeat-string.svg?style=flat)](https://npmjs.org/package/repeat-string) [![NPM total downloads](https://img.shields.io/npm/dt/repeat-string.svg?style=flat)](https://npmjs.org/package/repeat-string) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/repeat-string.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/repeat-string) + +> Repeat the given string n times. Fastest implementation for repeating a string. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save repeat-string +``` + +## Usage + +### [repeat](index.js#L41) + +Repeat the given `string` the specified `number` of times. + +**Example:** + +**Example** + +```js +var repeat = require('repeat-string'); +repeat('A', 5); +//=> AAAAA +``` + +**Params** + +* `string` **{String}**: The string to repeat +* `number` **{Number}**: The number of times to repeat the string +* `returns` **{String}**: Repeated string + +## Benchmarks + +Repeat string is significantly faster than the native method (which is itself faster than [repeating](https://github.com/sindresorhus/repeating)): + +```sh +# 2x +repeat-string █████████████████████████ (26,953,977 ops/sec) +repeating █████████ (9,855,695 ops/sec) +native ██████████████████ (19,453,895 ops/sec) + +# 3x +repeat-string █████████████████████████ (19,445,252 ops/sec) +repeating ███████████ (8,661,565 ops/sec) +native ████████████████████ (16,020,598 ops/sec) + +# 10x +repeat-string █████████████████████████ (23,792,521 ops/sec) +repeating █████████ (8,571,332 ops/sec) +native ███████████████ (14,582,955 ops/sec) + +# 50x +repeat-string █████████████████████████ (23,640,179 ops/sec) +repeating █████ (5,505,509 ops/sec) +native ██████████ (10,085,557 ops/sec) + +# 250x +repeat-string █████████████████████████ (23,489,618 ops/sec) +repeating ████ (3,962,937 ops/sec) +native ████████ (7,724,892 ops/sec) + +# 2000x +repeat-string █████████████████████████ (20,315,172 ops/sec) +repeating ████ (3,297,079 ops/sec) +native ███████ (6,203,331 ops/sec) + +# 20000x +repeat-string █████████████████████████ (23,382,915 ops/sec) +repeating ███ (2,980,058 ops/sec) +native █████ (5,578,808 ops/sec) +``` + +**Run the benchmarks** + +Install dev dependencies: + +```sh +npm i -d && node benchmark +``` + +## About + +### Related projects + +[repeat-element](https://www.npmjs.com/package/repeat-element): Create an array by repeating the given value n times. | [homepage](https://github.com/jonschlinkert/repeat-element "Create an array by repeating the given value n times.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor**
      | +| --- | --- | +| 51 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [LinusU](https://github.com/LinusU) | +| 2 | [tbusser](https://github.com/tbusser) | +| 1 | [doowb](https://github.com/doowb) | +| 1 | [wooorm](https://github.com/wooorm) | + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](http://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/repeat-string/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.2.0, on October 23, 2016._ \ No newline at end of file diff --git a/node_modules/repeat-string/index.js b/node_modules/repeat-string/index.js new file mode 100644 index 00000000..4459afd8 --- /dev/null +++ b/node_modules/repeat-string/index.js @@ -0,0 +1,70 @@ +/*! + * repeat-string + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +/** + * Results cache + */ + +var res = ''; +var cache; + +/** + * Expose `repeat` + */ + +module.exports = repeat; + +/** + * Repeat the given `string` the specified `number` + * of times. + * + * **Example:** + * + * ```js + * var repeat = require('repeat-string'); + * repeat('A', 5); + * //=> AAAAA + * ``` + * + * @param {String} `string` The string to repeat + * @param {Number} `number` The number of times to repeat the string + * @return {String} Repeated string + * @api public + */ + +function repeat(str, num) { + if (typeof str !== 'string') { + throw new TypeError('expected a string'); + } + + // cover common, quick use cases + if (num === 1) return str; + if (num === 2) return str + str; + + var max = str.length * num; + if (cache !== str || typeof cache === 'undefined') { + cache = str; + res = ''; + } else if (res.length >= max) { + return res.substr(0, max); + } + + while (max > res.length && num > 1) { + if (num & 1) { + res += str; + } + + num >>= 1; + str += str; + } + + res += str; + res = res.substr(0, max); + return res; +} diff --git a/node_modules/repeat-string/package.json b/node_modules/repeat-string/package.json new file mode 100644 index 00000000..09f88929 --- /dev/null +++ b/node_modules/repeat-string/package.json @@ -0,0 +1,77 @@ +{ + "name": "repeat-string", + "description": "Repeat the given string n times. Fastest implementation for repeating a string.", + "version": "1.6.1", + "homepage": "https://github.com/jonschlinkert/repeat-string", + "author": "Jon Schlinkert (http://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://github.com/doowb)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Linus Unnebäck (http://linus.unnebäck.se)", + "Thijs Busser (http://tbusser.net)", + "Titus (wooorm.com)" + ], + "repository": "jonschlinkert/repeat-string", + "bugs": { + "url": "https://github.com/jonschlinkert/repeat-string/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "ansi-cyan": "^0.1.1", + "benchmarked": "^0.2.5", + "gulp-format-md": "^0.1.11", + "isobject": "^2.1.0", + "mocha": "^3.1.2", + "repeating": "^3.0.0", + "text-table": "^0.2.0", + "yargs-parser": "^4.0.2" + }, + "keywords": [ + "fast", + "fastest", + "fill", + "left", + "left-pad", + "multiple", + "pad", + "padding", + "repeat", + "repeating", + "repetition", + "right", + "right-pad", + "string", + "times" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "repeat-element" + ] + }, + "helpers": [ + "./benchmark/helper.js" + ], + "reflinks": [ + "verb" + ] + } +} diff --git a/node_modules/repeating/index.js b/node_modules/repeating/index.js new file mode 100644 index 00000000..ccae0d7c --- /dev/null +++ b/node_modules/repeating/index.js @@ -0,0 +1,24 @@ +'use strict'; +var isFinite = require('is-finite'); + +module.exports = function (str, n) { + if (typeof str !== 'string') { + throw new TypeError('Expected `input` to be a string'); + } + + if (n < 0 || !isFinite(n)) { + throw new TypeError('Expected `count` to be a positive finite number'); + } + + var ret = ''; + + do { + if (n & 1) { + ret += str; + } + + str += str; + } while ((n >>= 1)); + + return ret; +}; diff --git a/node_modules/repeating/license b/node_modules/repeating/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/repeating/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/repeating/package.json b/node_modules/repeating/package.json new file mode 100644 index 00000000..0247a237 --- /dev/null +++ b/node_modules/repeating/package.json @@ -0,0 +1,37 @@ +{ + "name": "repeating", + "version": "2.0.1", + "description": "Repeat a string - fast", + "license": "MIT", + "repository": "sindresorhus/repeating", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "repeat", + "string", + "repeating", + "str", + "text", + "fill", + "pad" + ], + "dependencies": { + "is-finite": "^1.0.0" + }, + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/repeating/readme.md b/node_modules/repeating/readme.md new file mode 100644 index 00000000..06f0b69f --- /dev/null +++ b/node_modules/repeating/readme.md @@ -0,0 +1,30 @@ +# repeating [![Build Status](https://travis-ci.org/sindresorhus/repeating.svg?branch=master)](https://travis-ci.org/sindresorhus/repeating) + +> Repeat a string - fast + + +## Install + +``` +$ npm install --save repeating +``` + + +## Usage + +```js +const repeating = require('repeating'); + +repeating('unicorn ', 100); +//=> 'unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn ' +``` + + +## Related + +- [repeating-cli](https://github.com/sindresorhus/repeating-cli) - CLI for this module + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/replace-ext/LICENSE b/node_modules/replace-ext/LICENSE new file mode 100644 index 00000000..fd38d693 --- /dev/null +++ b/node_modules/replace-ext/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/replace-ext/README.md b/node_modules/replace-ext/README.md new file mode 100644 index 00000000..acfcfd0d --- /dev/null +++ b/node_modules/replace-ext/README.md @@ -0,0 +1,62 @@ +

      + + + +

      + +# replace-ext + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Replaces a file extension with another one. + +## Usage + +```js +var replaceExt = require('replace-ext'); + +var path = '/some/dir/file.js'; +var newPath = replaceExt(path, '.coffee'); + +console.log(newPath); // /some/dir/file.coffee +``` + +## API + +### `replaceExt(path, extension)` + +Replaces the extension from `path` with `extension` and returns the updated path string. + +Does not replace the extension if `path` is not a string or is empty. + + +## replace-ext for enterprise + +Available as part of the Tidelift Subscription + +The maintainers of replace-ext and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-replace-ext?utm_source=npm-replace-ext&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/replace-ext.svg +[npm-url]: https://www.npmjs.com/package/replace-ext +[npm-image]: http://img.shields.io/npm/v/replace-ext.svg + +[azure-pipelines-url]: https://dev.azure.com/gulpjs/replace-ext/_build/latest?branchName=master +[azure-pipelines-image]: https://dev.azure.com/gulpjs/replace-ext/_apis/build/status/replace-ext?branchName=master + +[travis-url]: https://travis-ci.org/gulpjs/replace-ext +[travis-image]: http://img.shields.io/travis/gulpjs/replace-ext.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/replace-ext +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/replace-ext.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/replace-ext +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/replace-ext/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg + diff --git a/node_modules/replace-ext/index.js b/node_modules/replace-ext/index.js new file mode 100644 index 00000000..7a782782 --- /dev/null +++ b/node_modules/replace-ext/index.js @@ -0,0 +1,33 @@ +'use strict'; + +var path = require('path'); + +function replaceExt(npath, ext) { + if (typeof npath !== 'string') { + return npath; + } + + if (npath.length === 0) { + return npath; + } + + var nFileName = path.basename(npath, path.extname(npath)) + ext; + var nFilepath = path.join(path.dirname(npath), nFileName); + + // Because `path.join` removes the head './' from the given path. + // This removal can cause a problem when passing the result to `require` or + // `import`. + if (startsWithSingleDot(npath)) { + return '.' + path.sep + nFilepath; + } + + return nFilepath; +} + +function startsWithSingleDot(fpath) { + var first2chars = fpath.slice(0, 2); + return (first2chars === '.' + path.sep) || + (first2chars === './'); +} + +module.exports = replaceExt; diff --git a/node_modules/replace-ext/package.json b/node_modules/replace-ext/package.json new file mode 100644 index 00000000..29aaef5c --- /dev/null +++ b/node_modules/replace-ext/package.json @@ -0,0 +1,43 @@ +{ + "name": "replace-ext", + "version": "1.0.1", + "description": "Replaces a file extension with another one", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Eric Schoffstall ", + "Blaine Bublitz " + ], + "repository": "gulpjs/replace-ext", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint .", + "pretest": "npm run lint", + "test": "nyc mocha --async-only", + "cover": "nyc --reporter=lcov --reporter=text-summary npm test", + "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", + "coveralls": "nyc report --reporter=text-lcov | coveralls" + }, + "dependencies": {}, + "devDependencies": { + "coveralls": "github:phated/node-coveralls#2.x", + "eslint": "^2.13.1", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "mocha": "^3.0.0", + "nyc": "^10.3.2" + }, + "keywords": [ + "gulp", + "extensions", + "filepath", + "basename" + ] +} diff --git a/node_modules/replace-homedir/LICENSE b/node_modules/replace-homedir/LICENSE new file mode 100644 index 00000000..b8fc7433 --- /dev/null +++ b/node_modules/replace-homedir/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/replace-homedir/README.md b/node_modules/replace-homedir/README.md new file mode 100644 index 00000000..70ba6bf0 --- /dev/null +++ b/node_modules/replace-homedir/README.md @@ -0,0 +1,48 @@ +

      + + + +

      + +# replace-homedir + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Replace user home in a string with another string. Useful for tildifying a path. + +## Usage + +```js +var replaceHomedir = require('replace-homedir'); + +var shortPath = replaceHomedir('/Users/phated/myProject', '~'); +// shortPath === '~/myProject' +``` + +## API + +### `replaceHomedir(path, replacement)` + +Takes a string `path` as the first argument and a string or function `replacement` as the second argument. If the `path` is absolute and begins with the User's homedir, the homedir portion of the path is replaced with `replacement` using String#replace. + +If `path` is not a string, the function will throw. + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/replace-homedir.svg +[npm-url]: https://www.npmjs.com/package/replace-homedir +[npm-image]: http://img.shields.io/npm/v/replace-homedir.svg + +[travis-url]: https://travis-ci.org/gulpjs/replace-homedir +[travis-image]: http://img.shields.io/travis/gulpjs/replace-homedir.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/replace-homedir +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/replace-homedir.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/replace-homedir +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/replace-homedir/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/replace-homedir/index.js b/node_modules/replace-homedir/index.js new file mode 100644 index 00000000..5ca7bee1 --- /dev/null +++ b/node_modules/replace-homedir/index.js @@ -0,0 +1,29 @@ +'use strict'; + +var path = require('path'); + +var homedir = require('homedir-polyfill'); +var isAbsolute = require('is-absolute'); +var removeTrailingSep = require('remove-trailing-separator'); + +function replaceHomedir(filepath, replacement) { + if (typeof filepath !== 'string') { + throw new Error('Path for replace-homedir must be a string.'); + } + + if (!isAbsolute(filepath)) { + return filepath; + } + + var home = removeTrailingSep(homedir()); + var lookupHome = home + path.sep; + var lookupPath = removeTrailingSep(filepath) + path.sep; + + if (lookupPath.indexOf(lookupHome) !== 0) { + return filepath; + } + + return filepath.replace(home, replacement); +} + +module.exports = replaceHomedir; diff --git a/node_modules/replace-homedir/package.json b/node_modules/replace-homedir/package.json new file mode 100644 index 00000000..c0fd800e --- /dev/null +++ b/node_modules/replace-homedir/package.json @@ -0,0 +1,50 @@ +{ + "name": "replace-homedir", + "version": "1.0.0", + "description": "Replace user home in a string with another string. Useful for tildifying a path.", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Blaine Bublitz " + ], + "repository": "gulpjs/replace-homedir", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint . && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "devDependencies": { + "eslint": "^1.7.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "mocha": "^2.4.5" + }, + "keywords": [ + "path", + "homedir", + "tilde", + "replace", + "subsitute", + "user home", + "tilde" + ] +} diff --git a/node_modules/request/CHANGELOG.md b/node_modules/request/CHANGELOG.md new file mode 100644 index 00000000..d3ffcd00 --- /dev/null +++ b/node_modules/request/CHANGELOG.md @@ -0,0 +1,717 @@ +## Change Log + +### v2.88.0 (2018/08/10) +- [#2996](https://github.com/request/request/pull/2996) fix(uuid): import versioned uuid (@kwonoj) +- [#2994](https://github.com/request/request/pull/2994) Update to oauth-sign 0.9.0 (@dlecocq) +- [#2993](https://github.com/request/request/pull/2993) Fix header tests (@simov) +- [#2904](https://github.com/request/request/pull/2904) #515, #2894 Strip port suffix from Host header if the protocol is known. (#2904) (@paambaati) +- [#2791](https://github.com/request/request/pull/2791) Improve AWS SigV4 support. (#2791) (@vikhyat) +- [#2977](https://github.com/request/request/pull/2977) Update test certificates (@simov) + +### v2.87.0 (2018/05/21) +- [#2943](https://github.com/request/request/pull/2943) Replace hawk dependency with a local implemenation (#2943) (@hueniverse) + +### v2.86.0 (2018/05/15) +- [#2885](https://github.com/request/request/pull/2885) Remove redundant code (for Node.js 0.9.4 and below) and dependency (@ChALkeR) +- [#2942](https://github.com/request/request/pull/2942) Make Test GREEN Again! (@simov) +- [#2923](https://github.com/request/request/pull/2923) Alterations for failing CI tests (@gareth-robinson) + +### v2.85.0 (2018/03/12) +- [#2880](https://github.com/request/request/pull/2880) Revert "Update hawk to 7.0.7 (#2880)" (@simov) + +### v2.84.0 (2018/03/12) +- [#2793](https://github.com/request/request/pull/2793) Fixed calculation of oauth_body_hash, issue #2792 (@dvishniakov) +- [#2880](https://github.com/request/request/pull/2880) Update hawk to 7.0.7 (#2880) (@kornel-kedzierski) + +### v2.83.0 (2017/09/27) +- [#2776](https://github.com/request/request/pull/2776) Updating tough-cookie due to security fix. (#2776) (@karlnorling) + +### v2.82.0 (2017/09/19) +- [#2703](https://github.com/request/request/pull/2703) Add Node.js v8 to Travis CI (@ryysud) +- [#2751](https://github.com/request/request/pull/2751) Update of hawk and qs to latest version (#2751) (@Olivier-Moreau) +- [#2658](https://github.com/request/request/pull/2658) Fixed some text in README.md (#2658) (@Marketionist) +- [#2635](https://github.com/request/request/pull/2635) chore(package): update aws-sign2 to version 0.7.0 (#2635) (@greenkeeperio-bot) +- [#2641](https://github.com/request/request/pull/2641) Update README to simplify & update convenience methods (#2641) (@FredKSchott) +- [#2541](https://github.com/request/request/pull/2541) Add convenience method for HTTP OPTIONS (#2541) (@jamesseanwright) +- [#2605](https://github.com/request/request/pull/2605) Add promise support section to README (#2605) (@FredKSchott) +- [#2579](https://github.com/request/request/pull/2579) refactor(lint): replace eslint with standard (#2579) (@ahmadnassri) +- [#2598](https://github.com/request/request/pull/2598) Update codecov to version 2.0.2 🚀 (@greenkeeperio-bot) +- [#2590](https://github.com/request/request/pull/2590) Adds test-timing keepAlive test (@nicjansma) +- [#2589](https://github.com/request/request/pull/2589) fix tabulation on request example README.MD (@odykyi) +- [#2594](https://github.com/request/request/pull/2594) chore(dependencies): har-validator to 5.x [removes babel dep] (@ahmadnassri) + +### v2.81.0 (2017/03/09) +- [#2584](https://github.com/request/request/pull/2584) Security issue: Upgrade qs to version 6.4.0 (@sergejmueller) +- [#2578](https://github.com/request/request/pull/2578) safe-buffer doesn't zero-fill by default, its just a polyfill. (#2578) (@mikeal) +- [#2566](https://github.com/request/request/pull/2566) Timings: Tracks 'lookup', adds 'wait' time, fixes connection re-use (#2566) (@nicjansma) +- [#2574](https://github.com/request/request/pull/2574) Migrating to safe-buffer for improved security. (@mikeal) +- [#2573](https://github.com/request/request/pull/2573) fixes #2572 (@ahmadnassri) + +### v2.80.0 (2017/03/04) +- [#2571](https://github.com/request/request/pull/2571) Correctly format the Host header for IPv6 addresses (@JamesMGreene) +- [#2558](https://github.com/request/request/pull/2558) Update README.md example snippet (@FredKSchott) +- [#2221](https://github.com/request/request/pull/2221) Adding a simple Response object reference in argument specification (@calamarico) +- [#2452](https://github.com/request/request/pull/2452) Adds .timings array with DNC, TCP, request and response times (@nicjansma) +- [#2553](https://github.com/request/request/pull/2553) add ISSUE_TEMPLATE, move PR template (@FredKSchott) +- [#2539](https://github.com/request/request/pull/2539) Create PULL_REQUEST_TEMPLATE.md (@FredKSchott) +- [#2524](https://github.com/request/request/pull/2524) Update caseless to version 0.12.0 🚀 (@greenkeeperio-bot) +- [#2460](https://github.com/request/request/pull/2460) Fix wrong MIME type in example (@OwnageIsMagic) +- [#2514](https://github.com/request/request/pull/2514) Change tags to keywords in package.json (@humphd) +- [#2492](https://github.com/request/request/pull/2492) More lenient gzip decompression (@addaleax) + +### v2.79.0 (2016/11/18) +- [#2368](https://github.com/request/request/pull/2368) Fix typeof check in test-pool.js (@forivall) +- [#2394](https://github.com/request/request/pull/2394) Use `files` in package.json (@SimenB) +- [#2463](https://github.com/request/request/pull/2463) AWS support for session tokens for temporary credentials (@simov) +- [#2467](https://github.com/request/request/pull/2467) Migrate to uuid (@simov, @antialias) +- [#2459](https://github.com/request/request/pull/2459) Update taper to version 0.5.0 🚀 (@greenkeeperio-bot) +- [#2448](https://github.com/request/request/pull/2448) Make other connect timeout test more reliable too (@mscdex) + +### v2.78.0 (2016/11/03) +- [#2447](https://github.com/request/request/pull/2447) Always set request timeout on keep-alive connections (@mscdex) + +### v2.77.0 (2016/11/03) +- [#2439](https://github.com/request/request/pull/2439) Fix socket 'connect' listener handling (@mscdex) +- [#2442](https://github.com/request/request/pull/2442) 👻😱 Node.js 0.10 is unmaintained 😱👻 (@greenkeeperio-bot) +- [#2435](https://github.com/request/request/pull/2435) Add followOriginalHttpMethod to redirect to original HTTP method (@kirrg001) +- [#2414](https://github.com/request/request/pull/2414) Improve test-timeout reliability (@mscdex) + +### v2.76.0 (2016/10/25) +- [#2424](https://github.com/request/request/pull/2424) Handle buffers directly instead of using "bl" (@zertosh) +- [#2415](https://github.com/request/request/pull/2415) Re-enable timeout tests on Travis + other fixes (@mscdex) +- [#2431](https://github.com/request/request/pull/2431) Improve timeouts accuracy and node v6.8.0+ compatibility (@mscdex, @greenkeeperio-bot) +- [#2428](https://github.com/request/request/pull/2428) Update qs to version 6.3.0 🚀 (@greenkeeperio-bot) +- [#2420](https://github.com/request/request/pull/2420) change .on to .once, remove possible memory leaks (@duereg) +- [#2426](https://github.com/request/request/pull/2426) Remove "isFunction" helper in favor of "typeof" check (@zertosh) +- [#2425](https://github.com/request/request/pull/2425) Simplify "defer" helper creation (@zertosh) +- [#2402](https://github.com/request/request/pull/2402) form-data@2.1.1 breaks build 🚨 (@greenkeeperio-bot) +- [#2393](https://github.com/request/request/pull/2393) Update form-data to version 2.1.0 🚀 (@greenkeeperio-bot) + +### v2.75.0 (2016/09/17) +- [#2381](https://github.com/request/request/pull/2381) Drop support for Node 0.10 (@simov) +- [#2377](https://github.com/request/request/pull/2377) Update form-data to version 2.0.0 🚀 (@greenkeeperio-bot) +- [#2353](https://github.com/request/request/pull/2353) Add greenkeeper ignored packages (@simov) +- [#2351](https://github.com/request/request/pull/2351) Update karma-tap to version 3.0.1 🚀 (@greenkeeperio-bot) +- [#2348](https://github.com/request/request/pull/2348) form-data@1.0.1 breaks build 🚨 (@greenkeeperio-bot) +- [#2349](https://github.com/request/request/pull/2349) Check error type instead of string (@scotttrinh) + +### v2.74.0 (2016/07/22) +- [#2295](https://github.com/request/request/pull/2295) Update tough-cookie to 2.3.0 (@stash-sfdc) +- [#2280](https://github.com/request/request/pull/2280) Update karma-tap to version 2.0.1 🚀 (@greenkeeperio-bot) + +### v2.73.0 (2016/07/09) +- [#2240](https://github.com/request/request/pull/2240) Remove connectionErrorHandler to fix #1903 (@zarenner) +- [#2251](https://github.com/request/request/pull/2251) tape@4.6.0 breaks build 🚨 (@greenkeeperio-bot) +- [#2225](https://github.com/request/request/pull/2225) Update docs (@ArtskydJ) +- [#2203](https://github.com/request/request/pull/2203) Update browserify to version 13.0.1 🚀 (@greenkeeperio-bot) +- [#2275](https://github.com/request/request/pull/2275) Update karma to version 1.1.1 🚀 (@greenkeeperio-bot) +- [#2204](https://github.com/request/request/pull/2204) Add codecov.yml and disable PR comments (@simov) +- [#2212](https://github.com/request/request/pull/2212) Fix link to http.IncomingMessage documentation (@nazieb) +- [#2208](https://github.com/request/request/pull/2208) Update to form-data RC4 and pass null values to it (@simov) +- [#2207](https://github.com/request/request/pull/2207) Move aws4 require statement to the top (@simov) +- [#2199](https://github.com/request/request/pull/2199) Update karma-coverage to version 1.0.0 🚀 (@greenkeeperio-bot) +- [#2206](https://github.com/request/request/pull/2206) Update qs to version 6.2.0 🚀 (@greenkeeperio-bot) +- [#2205](https://github.com/request/request/pull/2205) Use server-destory to close hanging sockets in tests (@simov) +- [#2200](https://github.com/request/request/pull/2200) Update karma-cli to version 1.0.0 🚀 (@greenkeeperio-bot) + +### v2.72.0 (2016/04/17) +- [#2176](https://github.com/request/request/pull/2176) Do not try to pipe Gzip responses with no body (@simov) +- [#2175](https://github.com/request/request/pull/2175) Add 'delete' alias for the 'del' API method (@simov, @MuhanZou) +- [#2172](https://github.com/request/request/pull/2172) Add support for deflate content encoding (@czardoz) +- [#2169](https://github.com/request/request/pull/2169) Add callback option (@simov) +- [#2165](https://github.com/request/request/pull/2165) Check for self.req existence inside the write method (@simov) +- [#2167](https://github.com/request/request/pull/2167) Fix TravisCI badge reference master branch (@a0viedo) + +### v2.71.0 (2016/04/12) +- [#2164](https://github.com/request/request/pull/2164) Catch errors from the underlying http module (@simov) + +### v2.70.0 (2016/04/05) +- [#2147](https://github.com/request/request/pull/2147) Update eslint to version 2.5.3 🚀 (@simov, @greenkeeperio-bot) +- [#2009](https://github.com/request/request/pull/2009) Support JSON stringify replacer argument. (@elyobo) +- [#2142](https://github.com/request/request/pull/2142) Update eslint to version 2.5.1 🚀 (@greenkeeperio-bot) +- [#2128](https://github.com/request/request/pull/2128) Update browserify-istanbul to version 2.0.0 🚀 (@greenkeeperio-bot) +- [#2115](https://github.com/request/request/pull/2115) Update eslint to version 2.3.0 🚀 (@simov, @greenkeeperio-bot) +- [#2089](https://github.com/request/request/pull/2089) Fix badges (@simov) +- [#2092](https://github.com/request/request/pull/2092) Update browserify-istanbul to version 1.0.0 🚀 (@greenkeeperio-bot) +- [#2079](https://github.com/request/request/pull/2079) Accept read stream as body option (@simov) +- [#2070](https://github.com/request/request/pull/2070) Update bl to version 1.1.2 🚀 (@greenkeeperio-bot) +- [#2063](https://github.com/request/request/pull/2063) Up bluebird and oauth-sign (@simov) +- [#2058](https://github.com/request/request/pull/2058) Karma fixes for latest versions (@eiriksm) +- [#2057](https://github.com/request/request/pull/2057) Update contributing guidelines (@simov) +- [#2054](https://github.com/request/request/pull/2054) Update qs to version 6.1.0 🚀 (@greenkeeperio-bot) + +### v2.69.0 (2016/01/27) +- [#2041](https://github.com/request/request/pull/2041) restore aws4 as regular dependency (@rmg) + +### v2.68.0 (2016/01/27) +- [#2036](https://github.com/request/request/pull/2036) Add AWS Signature Version 4 (@simov, @mirkods) +- [#2022](https://github.com/request/request/pull/2022) Convert numeric multipart bodies to string (@simov, @feross) +- [#2024](https://github.com/request/request/pull/2024) Update har-validator dependency for nsp advisory #76 (@TylerDixon) +- [#2016](https://github.com/request/request/pull/2016) Update qs to version 6.0.2 🚀 (@greenkeeperio-bot) +- [#2007](https://github.com/request/request/pull/2007) Use the `extend` module instead of util._extend (@simov) +- [#2003](https://github.com/request/request/pull/2003) Update browserify to version 13.0.0 🚀 (@greenkeeperio-bot) +- [#1989](https://github.com/request/request/pull/1989) Update buffer-equal to version 1.0.0 🚀 (@greenkeeperio-bot) +- [#1956](https://github.com/request/request/pull/1956) Check form-data content-length value before setting up the header (@jongyoonlee) +- [#1958](https://github.com/request/request/pull/1958) Use IncomingMessage.destroy method (@simov) +- [#1952](https://github.com/request/request/pull/1952) Adds example for Tor proxy (@prometheansacrifice) +- [#1943](https://github.com/request/request/pull/1943) Update eslint to version 1.10.3 🚀 (@simov, @greenkeeperio-bot) +- [#1924](https://github.com/request/request/pull/1924) Update eslint to version 1.10.1 🚀 (@greenkeeperio-bot) +- [#1915](https://github.com/request/request/pull/1915) Remove content-length and transfer-encoding headers from defaultProxyHeaderWhiteList (@yaxia) + +### v2.67.0 (2015/11/19) +- [#1913](https://github.com/request/request/pull/1913) Update http-signature to version 1.1.0 🚀 (@greenkeeperio-bot) + +### v2.66.0 (2015/11/18) +- [#1906](https://github.com/request/request/pull/1906) Update README URLs based on HTTP redirects (@ReadmeCritic) +- [#1905](https://github.com/request/request/pull/1905) Convert typed arrays into regular buffers (@simov) +- [#1902](https://github.com/request/request/pull/1902) node-uuid@1.4.7 breaks build 🚨 (@greenkeeperio-bot) +- [#1894](https://github.com/request/request/pull/1894) Fix tunneling after redirection from https (Original: #1881) (@simov, @falms) +- [#1893](https://github.com/request/request/pull/1893) Update eslint to version 1.9.0 🚀 (@greenkeeperio-bot) +- [#1852](https://github.com/request/request/pull/1852) Update eslint to version 1.7.3 🚀 (@simov, @greenkeeperio-bot, @paulomcnally, @michelsalib, @arbaaz, @nsklkn, @LoicMahieu, @JoshWillik, @jzaefferer, @ryanwholey, @djchie, @thisconnect, @mgenereu, @acroca, @Sebmaster, @KoltesDigital) +- [#1876](https://github.com/request/request/pull/1876) Implement loose matching for har mime types (@simov) +- [#1875](https://github.com/request/request/pull/1875) Update bluebird to version 3.0.2 🚀 (@simov, @greenkeeperio-bot) +- [#1871](https://github.com/request/request/pull/1871) Update browserify to version 12.0.1 🚀 (@greenkeeperio-bot) +- [#1866](https://github.com/request/request/pull/1866) Add missing quotes on x-token property in README (@miguelmota) +- [#1874](https://github.com/request/request/pull/1874) Fix typo in README.md (@gswalden) +- [#1860](https://github.com/request/request/pull/1860) Improve referer header tests and docs (@simov) +- [#1861](https://github.com/request/request/pull/1861) Remove redundant call to Stream constructor (@watson) +- [#1857](https://github.com/request/request/pull/1857) Fix Referer header to point to the original host name (@simov) +- [#1850](https://github.com/request/request/pull/1850) Update karma-coverage to version 0.5.3 🚀 (@greenkeeperio-bot) +- [#1847](https://github.com/request/request/pull/1847) Use node's latest version when building (@simov) +- [#1836](https://github.com/request/request/pull/1836) Tunnel: fix wrong property name (@KoltesDigital) +- [#1820](https://github.com/request/request/pull/1820) Set href as request.js uses it (@mgenereu) +- [#1840](https://github.com/request/request/pull/1840) Update http-signature to version 1.0.2 🚀 (@greenkeeperio-bot) +- [#1845](https://github.com/request/request/pull/1845) Update istanbul to version 0.4.0 🚀 (@greenkeeperio-bot) + +### v2.65.0 (2015/10/11) +- [#1833](https://github.com/request/request/pull/1833) Update aws-sign2 to version 0.6.0 🚀 (@greenkeeperio-bot) +- [#1811](https://github.com/request/request/pull/1811) Enable loose cookie parsing in tough-cookie (@Sebmaster) +- [#1830](https://github.com/request/request/pull/1830) Bring back tilde ranges for all dependencies (@simov) +- [#1821](https://github.com/request/request/pull/1821) Implement support for RFC 2617 MD5-sess algorithm. (@BigDSK) +- [#1828](https://github.com/request/request/pull/1828) Updated qs dependency to 5.2.0 (@acroca) +- [#1818](https://github.com/request/request/pull/1818) Extract `readResponseBody` method out of `onRequestResponse` (@pvoisin) +- [#1819](https://github.com/request/request/pull/1819) Run stringify once (@mgenereu) +- [#1814](https://github.com/request/request/pull/1814) Updated har-validator to version 2.0.2 (@greenkeeperio-bot) +- [#1807](https://github.com/request/request/pull/1807) Updated tough-cookie to version 2.1.0 (@greenkeeperio-bot) +- [#1800](https://github.com/request/request/pull/1800) Add caret ranges for devDependencies, except eslint (@simov) +- [#1799](https://github.com/request/request/pull/1799) Updated karma-browserify to version 4.4.0 (@greenkeeperio-bot) +- [#1797](https://github.com/request/request/pull/1797) Updated tape to version 4.2.0 (@greenkeeperio-bot) +- [#1788](https://github.com/request/request/pull/1788) Pinned all dependencies (@greenkeeperio-bot) + +### v2.64.0 (2015/09/25) +- [#1787](https://github.com/request/request/pull/1787) npm ignore examples, release.sh and disabled.appveyor.yml (@thisconnect) +- [#1775](https://github.com/request/request/pull/1775) Fix typo in README.md (@djchie) +- [#1776](https://github.com/request/request/pull/1776) Changed word 'conjuction' to read 'conjunction' in README.md (@ryanwholey) +- [#1785](https://github.com/request/request/pull/1785) Revert: Set default application/json content-type when using json option #1772 (@simov) + +### v2.63.0 (2015/09/21) +- [#1772](https://github.com/request/request/pull/1772) Set default application/json content-type when using json option (@jzaefferer) + +### v2.62.0 (2015/09/15) +- [#1768](https://github.com/request/request/pull/1768) Add node 4.0 to the list of build targets (@simov) +- [#1767](https://github.com/request/request/pull/1767) Query strings now cooperate with unix sockets (@JoshWillik) +- [#1750](https://github.com/request/request/pull/1750) Revert doc about installation of tough-cookie added in #884 (@LoicMahieu) +- [#1746](https://github.com/request/request/pull/1746) Missed comma in Readme (@nsklkn) +- [#1743](https://github.com/request/request/pull/1743) Fix options not being initialized in defaults method (@simov) + +### v2.61.0 (2015/08/19) +- [#1721](https://github.com/request/request/pull/1721) Minor fix in README.md (@arbaaz) +- [#1733](https://github.com/request/request/pull/1733) Avoid useless Buffer transformation (@michelsalib) +- [#1726](https://github.com/request/request/pull/1726) Update README.md (@paulomcnally) +- [#1715](https://github.com/request/request/pull/1715) Fix forever option in node > 0.10 #1709 (@calibr) +- [#1716](https://github.com/request/request/pull/1716) Do not create Buffer from Object in setContentLength(iojs v3.0 issue) (@calibr) +- [#1711](https://github.com/request/request/pull/1711) Add ability to detect connect timeouts (@kevinburke) +- [#1712](https://github.com/request/request/pull/1712) Set certificate expiration to August 2, 2018 (@kevinburke) +- [#1700](https://github.com/request/request/pull/1700) debug() when JSON.parse() on a response body fails (@phillipj) + +### v2.60.0 (2015/07/21) +- [#1687](https://github.com/request/request/pull/1687) Fix caseless bug - content-type not being set for multipart/form-data (@simov, @garymathews) + +### v2.59.0 (2015/07/20) +- [#1671](https://github.com/request/request/pull/1671) Add tests and docs for using the agent, agentClass, agentOptions and forever options. + Forever option defaults to using http(s).Agent in node 0.12+ (@simov) +- [#1679](https://github.com/request/request/pull/1679) Fix - do not remove OAuth param when using OAuth realm (@simov, @jhalickman) +- [#1668](https://github.com/request/request/pull/1668) updated dependencies (@deamme) +- [#1656](https://github.com/request/request/pull/1656) Fix form method (@simov) +- [#1651](https://github.com/request/request/pull/1651) Preserve HEAD method when using followAllRedirects (@simov) +- [#1652](https://github.com/request/request/pull/1652) Update `encoding` option documentation in README.md (@daniel347x) +- [#1650](https://github.com/request/request/pull/1650) Allow content-type overriding when using the `form` option (@simov) +- [#1646](https://github.com/request/request/pull/1646) Clarify the nature of setting `ca` in `agentOptions` (@jeffcharles) + +### v2.58.0 (2015/06/16) +- [#1638](https://github.com/request/request/pull/1638) Use the `extend` module to deep extend in the defaults method (@simov) +- [#1631](https://github.com/request/request/pull/1631) Move tunnel logic into separate module (@simov) +- [#1634](https://github.com/request/request/pull/1634) Fix OAuth query transport_method (@simov) +- [#1603](https://github.com/request/request/pull/1603) Add codecov (@simov) + +### v2.57.0 (2015/05/31) +- [#1615](https://github.com/request/request/pull/1615) Replace '.client' with '.socket' as the former was deprecated in 2.2.0. (@ChALkeR) + +### v2.56.0 (2015/05/28) +- [#1610](https://github.com/request/request/pull/1610) Bump module dependencies (@simov) +- [#1600](https://github.com/request/request/pull/1600) Extract the querystring logic into separate module (@simov) +- [#1607](https://github.com/request/request/pull/1607) Re-generate certificates (@simov) +- [#1599](https://github.com/request/request/pull/1599) Move getProxyFromURI logic below the check for Invaild URI (#1595) (@simov) +- [#1598](https://github.com/request/request/pull/1598) Fix the way http verbs are defined in order to please intellisense IDEs (@simov, @flannelJesus) +- [#1591](https://github.com/request/request/pull/1591) A few minor fixes: (@simov) +- [#1584](https://github.com/request/request/pull/1584) Refactor test-default tests (according to comments in #1430) (@simov) +- [#1585](https://github.com/request/request/pull/1585) Fixing documentation regarding TLS options (#1583) (@mainakae) +- [#1574](https://github.com/request/request/pull/1574) Refresh the oauth_nonce on redirect (#1573) (@simov) +- [#1570](https://github.com/request/request/pull/1570) Discovered tests that weren't properly running (@seanstrom) +- [#1569](https://github.com/request/request/pull/1569) Fix pause before response arrives (@kevinoid) +- [#1558](https://github.com/request/request/pull/1558) Emit error instead of throw (@simov) +- [#1568](https://github.com/request/request/pull/1568) Fix stall when piping gzipped response (@kevinoid) +- [#1560](https://github.com/request/request/pull/1560) Update combined-stream (@apechimp) +- [#1543](https://github.com/request/request/pull/1543) Initial support for oauth_body_hash on json payloads (@simov, @aesopwolf) +- [#1541](https://github.com/request/request/pull/1541) Fix coveralls (@simov) +- [#1540](https://github.com/request/request/pull/1540) Fix recursive defaults for convenience methods (@simov) +- [#1536](https://github.com/request/request/pull/1536) More eslint style rules (@froatsnook) +- [#1533](https://github.com/request/request/pull/1533) Adding dependency status bar to README.md (@YasharF) +- [#1539](https://github.com/request/request/pull/1539) ensure the latest version of har-validator is included (@ahmadnassri) +- [#1516](https://github.com/request/request/pull/1516) forever+pool test (@devTristan) + +### v2.55.0 (2015/04/05) +- [#1520](https://github.com/request/request/pull/1520) Refactor defaults (@simov) +- [#1525](https://github.com/request/request/pull/1525) Delete request headers with undefined value. (@froatsnook) +- [#1521](https://github.com/request/request/pull/1521) Add promise tests (@simov) +- [#1518](https://github.com/request/request/pull/1518) Fix defaults (@simov) +- [#1515](https://github.com/request/request/pull/1515) Allow static invoking of convenience methods (@simov) +- [#1505](https://github.com/request/request/pull/1505) Fix multipart boundary extraction regexp (@simov) +- [#1510](https://github.com/request/request/pull/1510) Fix basic auth form data (@simov) + +### v2.54.0 (2015/03/24) +- [#1501](https://github.com/request/request/pull/1501) HTTP Archive 1.2 support (@ahmadnassri) +- [#1486](https://github.com/request/request/pull/1486) Add a test for the forever agent (@akshayp) +- [#1500](https://github.com/request/request/pull/1500) Adding handling for no auth method and null bearer (@philberg) +- [#1498](https://github.com/request/request/pull/1498) Add table of contents in readme (@simov) +- [#1477](https://github.com/request/request/pull/1477) Add support for qs options via qsOptions key (@simov) +- [#1496](https://github.com/request/request/pull/1496) Parameters encoded to base 64 should be decoded as UTF-8, not ASCII. (@albanm) +- [#1494](https://github.com/request/request/pull/1494) Update eslint (@froatsnook) +- [#1474](https://github.com/request/request/pull/1474) Require Colon in Basic Auth (@erykwalder) +- [#1481](https://github.com/request/request/pull/1481) Fix baseUrl and redirections. (@burningtree) +- [#1469](https://github.com/request/request/pull/1469) Feature/base url (@froatsnook) +- [#1459](https://github.com/request/request/pull/1459) Add option to time request/response cycle (including rollup of redirects) (@aaron-em) +- [#1468](https://github.com/request/request/pull/1468) Re-enable io.js/node 0.12 build (@simov, @mikeal, @BBB) +- [#1442](https://github.com/request/request/pull/1442) Fixed the issue with strictSSL tests on 0.12 & io.js by explicitly setting a cipher that matches the cert. (@BBB, @nickmccurdy, @demohi, @simov, @0x4139) +- [#1460](https://github.com/request/request/pull/1460) localAddress or proxy config is lost when redirecting (@simov, @0x4139) +- [#1453](https://github.com/request/request/pull/1453) Test on Node.js 0.12 and io.js with allowed failures (@nickmccurdy, @demohi) +- [#1426](https://github.com/request/request/pull/1426) Fixing tests to pass on io.js and node 0.12 (only test-https.js stiff failing) (@mikeal) +- [#1446](https://github.com/request/request/pull/1446) Missing HTTP referer header with redirects Fixes #1038 (@simov, @guimon) +- [#1428](https://github.com/request/request/pull/1428) Deprecate Node v0.8.x (@nylen) +- [#1436](https://github.com/request/request/pull/1436) Add ability to set a requester without setting default options (@tikotzky) +- [#1435](https://github.com/request/request/pull/1435) dry up verb methods (@sethpollack) +- [#1423](https://github.com/request/request/pull/1423) Allow fully qualified multipart content-type header (@simov) +- [#1430](https://github.com/request/request/pull/1430) Fix recursive requester (@tikotzky) +- [#1429](https://github.com/request/request/pull/1429) Throw error when making HEAD request with a body (@tikotzky) +- [#1419](https://github.com/request/request/pull/1419) Add note that the project is broken in 0.12.x (@nylen) +- [#1413](https://github.com/request/request/pull/1413) Fix basic auth (@simov) +- [#1397](https://github.com/request/request/pull/1397) Improve pipe-from-file tests (@nylen) + +### v2.53.0 (2015/02/02) +- [#1396](https://github.com/request/request/pull/1396) Do not rfc3986 escape JSON bodies (@nylen, @simov) +- [#1392](https://github.com/request/request/pull/1392) Improve `timeout` option description (@watson) + +### v2.52.0 (2015/02/02) +- [#1383](https://github.com/request/request/pull/1383) Add missing HTTPS options that were not being passed to tunnel (@brichard19) (@nylen) +- [#1388](https://github.com/request/request/pull/1388) Upgrade mime-types package version (@roderickhsiao) +- [#1389](https://github.com/request/request/pull/1389) Revise Setup Tunnel Function (@seanstrom) +- [#1374](https://github.com/request/request/pull/1374) Allow explicitly disabling tunneling for proxied https destinations (@nylen) +- [#1376](https://github.com/request/request/pull/1376) Use karma-browserify for tests. Add browser test coverage reporter. (@eiriksm) +- [#1366](https://github.com/request/request/pull/1366) Refactor OAuth into separate module (@simov) +- [#1373](https://github.com/request/request/pull/1373) Rewrite tunnel test to be pure Node.js (@nylen) +- [#1371](https://github.com/request/request/pull/1371) Upgrade test reporter (@nylen) +- [#1360](https://github.com/request/request/pull/1360) Refactor basic, bearer, digest auth logic into separate class (@simov) +- [#1354](https://github.com/request/request/pull/1354) Remove circular dependency from debugging code (@nylen) +- [#1351](https://github.com/request/request/pull/1351) Move digest auth into private prototype method (@simov) +- [#1352](https://github.com/request/request/pull/1352) Update hawk dependency to ~2.3.0 (@mridgway) +- [#1353](https://github.com/request/request/pull/1353) Correct travis-ci badge (@dogancelik) +- [#1349](https://github.com/request/request/pull/1349) Make sure we return on errored browser requests. (@eiriksm) +- [#1346](https://github.com/request/request/pull/1346) getProxyFromURI Extraction Refactor (@seanstrom) +- [#1337](https://github.com/request/request/pull/1337) Standardize test ports on 6767 (@nylen) +- [#1341](https://github.com/request/request/pull/1341) Emit FormData error events as Request error events (@nylen, @rwky) +- [#1343](https://github.com/request/request/pull/1343) Clean up readme badges, and add Travis and Coveralls badges (@nylen) +- [#1345](https://github.com/request/request/pull/1345) Update README.md (@Aaron-Hartwig) +- [#1338](https://github.com/request/request/pull/1338) Always wait for server.close() callback in tests (@nylen) +- [#1342](https://github.com/request/request/pull/1342) Add mock https server and redo start of browser tests for this purpose. (@eiriksm) +- [#1339](https://github.com/request/request/pull/1339) Improve auth docs (@nylen) +- [#1335](https://github.com/request/request/pull/1335) Add support for OAuth plaintext signature method (@simov) +- [#1332](https://github.com/request/request/pull/1332) Add clean script to remove test-browser.js after the tests run (@seanstrom) +- [#1327](https://github.com/request/request/pull/1327) Fix errors generating coverage reports. (@nylen) +- [#1330](https://github.com/request/request/pull/1330) Return empty buffer upon empty response body and encoding is set to null (@seanstrom) +- [#1326](https://github.com/request/request/pull/1326) Use faster container-based infrastructure on Travis (@nylen) +- [#1315](https://github.com/request/request/pull/1315) Implement rfc3986 option (@simov, @nylen, @apoco, @DullReferenceException, @mmalecki, @oliamb, @cliffcrosland, @LewisJEllis, @eiriksm, @poislagarde) +- [#1314](https://github.com/request/request/pull/1314) Detect urlencoded form data header via regex (@simov) +- [#1317](https://github.com/request/request/pull/1317) Improve OAuth1.0 server side flow example (@simov) + +### v2.51.0 (2014/12/10) +- [#1310](https://github.com/request/request/pull/1310) Revert changes introduced in https://github.com/request/request/pull/1282 (@simov) + +### v2.50.0 (2014/12/09) +- [#1308](https://github.com/request/request/pull/1308) Add browser test to keep track of browserify compability. (@eiriksm) +- [#1299](https://github.com/request/request/pull/1299) Add optional support for jsonReviver (@poislagarde) +- [#1277](https://github.com/request/request/pull/1277) Add Coveralls configuration (@simov) +- [#1307](https://github.com/request/request/pull/1307) Upgrade form-data, add back browserify compability. Fixes #455. (@eiriksm) +- [#1305](https://github.com/request/request/pull/1305) Fix typo in README.md (@LewisJEllis) +- [#1288](https://github.com/request/request/pull/1288) Update README.md to explain custom file use case (@cliffcrosland) + +### v2.49.0 (2014/11/28) +- [#1295](https://github.com/request/request/pull/1295) fix(proxy): no-proxy false positive (@oliamb) +- [#1292](https://github.com/request/request/pull/1292) Upgrade `caseless` to 0.8.1 (@mmalecki) +- [#1276](https://github.com/request/request/pull/1276) Set transfer encoding for multipart/related to chunked by default (@simov) +- [#1275](https://github.com/request/request/pull/1275) Fix multipart content-type headers detection (@simov) +- [#1269](https://github.com/request/request/pull/1269) adds streams example for review (@tbuchok) +- [#1238](https://github.com/request/request/pull/1238) Add examples README.md (@simov) + +### v2.48.0 (2014/11/12) +- [#1263](https://github.com/request/request/pull/1263) Fixed a syntax error / typo in README.md (@xna2) +- [#1253](https://github.com/request/request/pull/1253) Add multipart chunked flag (@simov, @nylen) +- [#1251](https://github.com/request/request/pull/1251) Clarify that defaults() does not modify global defaults (@nylen) +- [#1250](https://github.com/request/request/pull/1250) Improve documentation for pool and maxSockets options (@nylen) +- [#1237](https://github.com/request/request/pull/1237) Documenting error handling when using streams (@vmattos) +- [#1244](https://github.com/request/request/pull/1244) Finalize changelog command (@nylen) +- [#1241](https://github.com/request/request/pull/1241) Fix typo (@alexanderGugel) +- [#1223](https://github.com/request/request/pull/1223) Show latest version number instead of "upcoming" in changelog (@nylen) +- [#1236](https://github.com/request/request/pull/1236) Document how to use custom CA in README (#1229) (@hypesystem) +- [#1228](https://github.com/request/request/pull/1228) Support for oauth with RSA-SHA1 signing (@nylen) +- [#1216](https://github.com/request/request/pull/1216) Made json and multipart options coexist (@nylen, @simov) +- [#1225](https://github.com/request/request/pull/1225) Allow header white/exclusive lists in any case. (@RReverser) + +### v2.47.0 (2014/10/26) +- [#1222](https://github.com/request/request/pull/1222) Move from mikeal/request to request/request (@nylen) +- [#1220](https://github.com/request/request/pull/1220) update qs dependency to 2.3.1 (@FredKSchott) +- [#1212](https://github.com/request/request/pull/1212) Improve tests/test-timeout.js (@nylen) +- [#1219](https://github.com/request/request/pull/1219) remove old globalAgent workaround for node 0.4 (@request) +- [#1214](https://github.com/request/request/pull/1214) Remove cruft left over from optional dependencies (@nylen) +- [#1215](https://github.com/request/request/pull/1215) Add proxyHeaderExclusiveList option for proxy-only headers. (@RReverser) +- [#1211](https://github.com/request/request/pull/1211) Allow 'Host' header instead of 'host' and remember case across redirects (@nylen) +- [#1208](https://github.com/request/request/pull/1208) Improve release script (@nylen) +- [#1213](https://github.com/request/request/pull/1213) Support for custom cookie store (@nylen, @mitsuru) +- [#1197](https://github.com/request/request/pull/1197) Clean up some code around setting the agent (@FredKSchott) +- [#1209](https://github.com/request/request/pull/1209) Improve multipart form append test (@simov) +- [#1207](https://github.com/request/request/pull/1207) Update changelog (@nylen) +- [#1185](https://github.com/request/request/pull/1185) Stream multipart/related bodies (@simov) + +### v2.46.0 (2014/10/23) +- [#1198](https://github.com/request/request/pull/1198) doc for TLS/SSL protocol options (@shawnzhu) +- [#1200](https://github.com/request/request/pull/1200) Add a Gitter chat badge to README.md (@gitter-badger) +- [#1196](https://github.com/request/request/pull/1196) Upgrade taper test reporter to v0.3.0 (@nylen) +- [#1199](https://github.com/request/request/pull/1199) Fix lint error: undeclared var i (@nylen) +- [#1191](https://github.com/request/request/pull/1191) Move self.proxy decision logic out of init and into a helper (@FredKSchott) +- [#1190](https://github.com/request/request/pull/1190) Move _buildRequest() logic back into init (@FredKSchott) +- [#1186](https://github.com/request/request/pull/1186) Support Smarter Unix URL Scheme (@FredKSchott) +- [#1178](https://github.com/request/request/pull/1178) update form documentation for new usage (@FredKSchott) +- [#1180](https://github.com/request/request/pull/1180) Enable no-mixed-requires linting rule (@nylen) +- [#1184](https://github.com/request/request/pull/1184) Don't forward authorization header across redirects to different hosts (@nylen) +- [#1183](https://github.com/request/request/pull/1183) Correct README about pre and postamble CRLF using multipart and not mult... (@netpoetica) +- [#1179](https://github.com/request/request/pull/1179) Lint tests directory (@nylen) +- [#1169](https://github.com/request/request/pull/1169) add metadata for form-data file field (@dotcypress) +- [#1173](https://github.com/request/request/pull/1173) remove optional dependencies (@seanstrom) +- [#1165](https://github.com/request/request/pull/1165) Cleanup event listeners and remove function creation from init (@FredKSchott) +- [#1174](https://github.com/request/request/pull/1174) update the request.cookie docs to have a valid cookie example (@seanstrom) +- [#1168](https://github.com/request/request/pull/1168) create a detach helper and use detach helper in replace of nextTick (@seanstrom) +- [#1171](https://github.com/request/request/pull/1171) in post can send form data and use callback (@MiroRadenovic) +- [#1159](https://github.com/request/request/pull/1159) accept charset for x-www-form-urlencoded content-type (@seanstrom) +- [#1157](https://github.com/request/request/pull/1157) Update README.md: body with json=true (@Rob--W) +- [#1164](https://github.com/request/request/pull/1164) Disable tests/test-timeout.js on Travis (@nylen) +- [#1153](https://github.com/request/request/pull/1153) Document how to run a single test (@nylen) +- [#1144](https://github.com/request/request/pull/1144) adds documentation for the "response" event within the streaming section (@tbuchok) +- [#1162](https://github.com/request/request/pull/1162) Update eslintrc file to no longer allow past errors (@FredKSchott) +- [#1155](https://github.com/request/request/pull/1155) Support/use self everywhere (@seanstrom) +- [#1161](https://github.com/request/request/pull/1161) fix no-use-before-define lint warnings (@emkay) +- [#1156](https://github.com/request/request/pull/1156) adding curly brackets to get rid of lint errors (@emkay) +- [#1151](https://github.com/request/request/pull/1151) Fix localAddress test on OS X (@nylen) +- [#1145](https://github.com/request/request/pull/1145) documentation: fix outdated reference to setCookieSync old name in README (@FredKSchott) +- [#1131](https://github.com/request/request/pull/1131) Update pool documentation (@FredKSchott) +- [#1143](https://github.com/request/request/pull/1143) Rewrite all tests to use tape (@nylen) +- [#1137](https://github.com/request/request/pull/1137) Add ability to specifiy querystring lib in options. (@jgrund) +- [#1138](https://github.com/request/request/pull/1138) allow hostname and port in place of host on uri (@cappslock) +- [#1134](https://github.com/request/request/pull/1134) Fix multiple redirects and `self.followRedirect` (@blakeembrey) +- [#1130](https://github.com/request/request/pull/1130) documentation fix: add note about npm test for contributing (@FredKSchott) +- [#1120](https://github.com/request/request/pull/1120) Support/refactor request setup tunnel (@seanstrom) +- [#1129](https://github.com/request/request/pull/1129) linting fix: convert double quote strings to use single quotes (@FredKSchott) +- [#1124](https://github.com/request/request/pull/1124) linting fix: remove unneccesary semi-colons (@FredKSchott) + +### v2.45.0 (2014/10/06) +- [#1128](https://github.com/request/request/pull/1128) Add test for setCookie regression (@nylen) +- [#1127](https://github.com/request/request/pull/1127) added tests around using objects as values in a query string (@bcoe) +- [#1103](https://github.com/request/request/pull/1103) Support/refactor request constructor (@nylen, @seanstrom) +- [#1119](https://github.com/request/request/pull/1119) add basic linting to request library (@FredKSchott) +- [#1121](https://github.com/request/request/pull/1121) Revert "Explicitly use sync versions of cookie functions" (@nylen) +- [#1118](https://github.com/request/request/pull/1118) linting fix: Restructure bad empty if statement (@FredKSchott) +- [#1117](https://github.com/request/request/pull/1117) Fix a bad check for valid URIs (@FredKSchott) +- [#1113](https://github.com/request/request/pull/1113) linting fix: space out operators (@FredKSchott) +- [#1116](https://github.com/request/request/pull/1116) Fix typo in `noProxyHost` definition (@FredKSchott) +- [#1114](https://github.com/request/request/pull/1114) linting fix: Added a `new` operator that was missing when creating and throwing a new error (@FredKSchott) +- [#1096](https://github.com/request/request/pull/1096) No_proxy support (@samcday) +- [#1107](https://github.com/request/request/pull/1107) linting-fix: remove unused variables (@FredKSchott) +- [#1112](https://github.com/request/request/pull/1112) linting fix: Make return values consistent and more straitforward (@FredKSchott) +- [#1111](https://github.com/request/request/pull/1111) linting fix: authPieces was getting redeclared (@FredKSchott) +- [#1105](https://github.com/request/request/pull/1105) Use strict mode in request (@FredKSchott) +- [#1110](https://github.com/request/request/pull/1110) linting fix: replace lazy '==' with more strict '===' (@FredKSchott) +- [#1109](https://github.com/request/request/pull/1109) linting fix: remove function call from if-else conditional statement (@FredKSchott) +- [#1102](https://github.com/request/request/pull/1102) Fix to allow setting a `requester` on recursive calls to `request.defaults` (@tikotzky) +- [#1095](https://github.com/request/request/pull/1095) Tweaking engines in package.json (@pdehaan) +- [#1082](https://github.com/request/request/pull/1082) Forward the socket event from the httpModule request (@seanstrom) +- [#972](https://github.com/request/request/pull/972) Clarify gzip handling in the README (@kevinoid) +- [#1089](https://github.com/request/request/pull/1089) Mention that encoding defaults to utf8, not Buffer (@stuartpb) +- [#1088](https://github.com/request/request/pull/1088) Fix cookie example in README.md and make it more clear (@pipi32167) +- [#1027](https://github.com/request/request/pull/1027) Add support for multipart form data in request options. (@crocket) +- [#1076](https://github.com/request/request/pull/1076) use Request.abort() to abort the request when the request has timed-out (@seanstrom) +- [#1068](https://github.com/request/request/pull/1068) add optional postamble required by .NET multipart requests (@netpoetica) + +### v2.43.0 (2014/09/18) +- [#1057](https://github.com/request/request/pull/1057) Defaults should not overwrite defined options (@davidwood) +- [#1046](https://github.com/request/request/pull/1046) Propagate datastream errors, useful in case gzip fails. (@ZJONSSON, @Janpot) +- [#1063](https://github.com/request/request/pull/1063) copy the input headers object #1060 (@finnp) +- [#1031](https://github.com/request/request/pull/1031) Explicitly use sync versions of cookie functions (@ZJONSSON) +- [#1056](https://github.com/request/request/pull/1056) Fix redirects when passing url.parse(x) as URL to convenience method (@nylen) + +### v2.42.0 (2014/09/04) +- [#1053](https://github.com/request/request/pull/1053) Fix #1051 Parse auth properly when using non-tunneling proxy (@isaacs) + +### v2.41.0 (2014/09/04) +- [#1050](https://github.com/request/request/pull/1050) Pass whitelisted headers to tunneling proxy. Organize all tunneling logic. (@isaacs, @Feldhacker) +- [#1035](https://github.com/request/request/pull/1035) souped up nodei.co badge (@rvagg) +- [#1048](https://github.com/request/request/pull/1048) Aws is now possible over a proxy (@steven-aerts) +- [#1039](https://github.com/request/request/pull/1039) extract out helper functions to a helper file (@seanstrom) +- [#1021](https://github.com/request/request/pull/1021) Support/refactor indexjs (@seanstrom) +- [#1033](https://github.com/request/request/pull/1033) Improve and document debug options (@nylen) +- [#1034](https://github.com/request/request/pull/1034) Fix readme headings (@nylen) +- [#1030](https://github.com/request/request/pull/1030) Allow recursive request.defaults (@tikotzky) +- [#1029](https://github.com/request/request/pull/1029) Fix a couple of typos (@nylen) +- [#675](https://github.com/request/request/pull/675) Checking for SSL fault on connection before reading SSL properties (@VRMink) +- [#989](https://github.com/request/request/pull/989) Added allowRedirect function. Should return true if redirect is allowed or false otherwise (@doronin) +- [#1025](https://github.com/request/request/pull/1025) [fixes #1023] Set self._ended to true once response has ended (@mridgway) +- [#1020](https://github.com/request/request/pull/1020) Add back removed debug metadata (@FredKSchott) +- [#1008](https://github.com/request/request/pull/1008) Moving to module instead of cutomer buffer concatenation. (@mikeal) +- [#770](https://github.com/request/request/pull/770) Added dependency badge for README file; (@timgluz, @mafintosh, @lalitkapoor, @stash, @bobyrizov) +- [#1016](https://github.com/request/request/pull/1016) toJSON no longer results in an infinite loop, returns simple objects (@FredKSchott) +- [#1018](https://github.com/request/request/pull/1018) Remove pre-0.4.4 HTTPS fix (@mmalecki) +- [#1006](https://github.com/request/request/pull/1006) Migrate to caseless, fixes #1001 (@mikeal) +- [#995](https://github.com/request/request/pull/995) Fix parsing array of objects (@sjonnet19) +- [#999](https://github.com/request/request/pull/999) Fix fallback for browserify for optional modules. (@eiriksm) +- [#996](https://github.com/request/request/pull/996) Wrong oauth signature when multiple same param keys exist [updated] (@bengl) + +### v2.40.0 (2014/08/06) +- [#992](https://github.com/request/request/pull/992) Fix security vulnerability. Update qs (@poeticninja) +- [#988](https://github.com/request/request/pull/988) “--” -> “—” (@upisfree) +- [#987](https://github.com/request/request/pull/987) Show optional modules as being loaded by the module that reqeusted them (@iarna) + +### v2.39.0 (2014/07/24) +- [#976](https://github.com/request/request/pull/976) Update README.md (@pvoznenko) + +### v2.38.0 (2014/07/22) +- [#952](https://github.com/request/request/pull/952) Adding support to client certificate with proxy use case (@ofirshaked) +- [#884](https://github.com/request/request/pull/884) Documented tough-cookie installation. (@wbyoung) +- [#935](https://github.com/request/request/pull/935) Correct repository url (@fritx) +- [#963](https://github.com/request/request/pull/963) Update changelog (@nylen) +- [#960](https://github.com/request/request/pull/960) Support gzip with encoding on node pre-v0.9.4 (@kevinoid) +- [#953](https://github.com/request/request/pull/953) Add async Content-Length computation when using form-data (@LoicMahieu) +- [#844](https://github.com/request/request/pull/844) Add support for HTTP[S]_PROXY environment variables. Fixes #595. (@jvmccarthy) +- [#946](https://github.com/request/request/pull/946) defaults: merge headers (@aj0strow) + +### v2.37.0 (2014/07/07) +- [#957](https://github.com/request/request/pull/957) Silence EventEmitter memory leak warning #311 (@watson) +- [#955](https://github.com/request/request/pull/955) check for content-length header before setting it in nextTick (@camilleanne) +- [#951](https://github.com/request/request/pull/951) Add support for gzip content decoding (@kevinoid) +- [#949](https://github.com/request/request/pull/949) Manually enter querystring in form option (@charlespwd) +- [#944](https://github.com/request/request/pull/944) Make request work with browserify (@eiriksm) +- [#943](https://github.com/request/request/pull/943) New mime module (@eiriksm) +- [#927](https://github.com/request/request/pull/927) Bump version of hawk dep. (@samccone) +- [#907](https://github.com/request/request/pull/907) append secureOptions to poolKey (@medovob) + +### v2.35.0 (2014/05/17) +- [#901](https://github.com/request/request/pull/901) Fixes #555 (@pigulla) +- [#897](https://github.com/request/request/pull/897) merge with default options (@vohof) +- [#891](https://github.com/request/request/pull/891) fixes 857 - options object is mutated by calling request (@lalitkapoor) +- [#869](https://github.com/request/request/pull/869) Pipefilter test (@tgohn) +- [#866](https://github.com/request/request/pull/866) Fix typo (@dandv) +- [#861](https://github.com/request/request/pull/861) Add support for RFC 6750 Bearer Tokens (@phedny) +- [#809](https://github.com/request/request/pull/809) upgrade tunnel-proxy to 0.4.0 (@ksato9700) +- [#850](https://github.com/request/request/pull/850) Fix word consistency in readme (@0xNobody) +- [#810](https://github.com/request/request/pull/810) add some exposition to mpu example in README.md (@mikermcneil) +- [#840](https://github.com/request/request/pull/840) improve error reporting for invalid protocols (@FND) +- [#821](https://github.com/request/request/pull/821) added secureOptions back (@nw) +- [#815](https://github.com/request/request/pull/815) Create changelog based on pull requests (@lalitkapoor) + +### v2.34.0 (2014/02/18) +- [#516](https://github.com/request/request/pull/516) UNIX Socket URL Support (@lyuzashi) +- [#801](https://github.com/request/request/pull/801) 794 ignore cookie parsing and domain errors (@lalitkapoor) +- [#802](https://github.com/request/request/pull/802) Added the Apache license to the package.json. (@keskival) +- [#793](https://github.com/request/request/pull/793) Adds content-length calculation when submitting forms using form-data li... (@Juul) +- [#785](https://github.com/request/request/pull/785) Provide ability to override content-type when `json` option used (@vvo) +- [#781](https://github.com/request/request/pull/781) simpler isReadStream function (@joaojeronimo) + +### v2.32.0 (2014/01/16) +- [#767](https://github.com/request/request/pull/767) Use tough-cookie CookieJar sync API (@stash) +- [#764](https://github.com/request/request/pull/764) Case-insensitive authentication scheme (@bobyrizov) +- [#763](https://github.com/request/request/pull/763) Upgrade tough-cookie to 0.10.0 (@stash) +- [#744](https://github.com/request/request/pull/744) Use Cookie.parse (@lalitkapoor) +- [#757](https://github.com/request/request/pull/757) require aws-sign2 (@mafintosh) + +### v2.31.0 (2014/01/08) +- [#645](https://github.com/request/request/pull/645) update twitter api url to v1.1 (@mick) +- [#746](https://github.com/request/request/pull/746) README: Markdown code highlight (@weakish) +- [#745](https://github.com/request/request/pull/745) updating setCookie example to make it clear that the callback is required (@emkay) +- [#742](https://github.com/request/request/pull/742) Add note about JSON output body type (@iansltx) +- [#741](https://github.com/request/request/pull/741) README example is using old cookie jar api (@emkay) +- [#736](https://github.com/request/request/pull/736) Fix callback arguments documentation (@mmalecki) +- [#732](https://github.com/request/request/pull/732) JSHINT: Creating global 'for' variable. Should be 'for (var ...'. (@Fritz-Lium) +- [#730](https://github.com/request/request/pull/730) better HTTP DIGEST support (@dai-shi) +- [#728](https://github.com/request/request/pull/728) Fix TypeError when calling request.cookie (@scarletmeow) +- [#727](https://github.com/request/request/pull/727) fix requester bug (@jchris) +- [#724](https://github.com/request/request/pull/724) README.md: add custom HTTP Headers example. (@tcort) +- [#719](https://github.com/request/request/pull/719) Made a comment gender neutral. (@unsetbit) +- [#715](https://github.com/request/request/pull/715) Request.multipart no longer crashes when header 'Content-type' present (@pastaclub) +- [#710](https://github.com/request/request/pull/710) Fixing listing in callback part of docs. (@lukasz-zak) +- [#696](https://github.com/request/request/pull/696) Edited README.md for formatting and clarity of phrasing (@Zearin) +- [#694](https://github.com/request/request/pull/694) Typo in README (@VRMink) +- [#690](https://github.com/request/request/pull/690) Handle blank password in basic auth. (@diversario) +- [#682](https://github.com/request/request/pull/682) Optional dependencies (@Turbo87) +- [#683](https://github.com/request/request/pull/683) Travis CI support (@Turbo87) +- [#674](https://github.com/request/request/pull/674) change cookie module,to tough-cookie.please check it . (@sxyizhiren) +- [#666](https://github.com/request/request/pull/666) make `ciphers` and `secureProtocol` to work in https request (@richarddong) +- [#656](https://github.com/request/request/pull/656) Test case for #304. (@diversario) +- [#662](https://github.com/request/request/pull/662) option.tunnel to explicitly disable tunneling (@seanmonstar) +- [#659](https://github.com/request/request/pull/659) fix failure when running with NODE_DEBUG=request, and a test for that (@jrgm) +- [#630](https://github.com/request/request/pull/630) Send random cnonce for HTTP Digest requests (@wprl) +- [#619](https://github.com/request/request/pull/619) decouple things a bit (@joaojeronimo) +- [#613](https://github.com/request/request/pull/613) Fixes #583, moved initialization of self.uri.pathname (@lexander) +- [#605](https://github.com/request/request/pull/605) Only include ":" + pass in Basic Auth if it's defined (fixes #602) (@bendrucker) +- [#596](https://github.com/request/request/pull/596) Global agent is being used when pool is specified (@Cauldrath) +- [#594](https://github.com/request/request/pull/594) Emit complete event when there is no callback (@RomainLK) +- [#601](https://github.com/request/request/pull/601) Fixed a small typo (@michalstanko) +- [#589](https://github.com/request/request/pull/589) Prevent setting headers after they are sent (@geek) +- [#587](https://github.com/request/request/pull/587) Global cookie jar disabled by default (@threepointone) +- [#544](https://github.com/request/request/pull/544) Update http-signature version. (@davidlehn) +- [#581](https://github.com/request/request/pull/581) Fix spelling of "ignoring." (@bigeasy) +- [#568](https://github.com/request/request/pull/568) use agentOptions to create agent when specified in request (@SamPlacette) +- [#564](https://github.com/request/request/pull/564) Fix redirections (@criloz) +- [#541](https://github.com/request/request/pull/541) The exported request function doesn't have an auth method (@tschaub) +- [#542](https://github.com/request/request/pull/542) Expose Request class (@regality) +- [#536](https://github.com/request/request/pull/536) Allow explicitly empty user field for basic authentication. (@mikeando) +- [#532](https://github.com/request/request/pull/532) fix typo (@fredericosilva) +- [#497](https://github.com/request/request/pull/497) Added redirect event (@Cauldrath) +- [#503](https://github.com/request/request/pull/503) Fix basic auth for passwords that contain colons (@tonistiigi) +- [#521](https://github.com/request/request/pull/521) Improving test-localAddress.js (@noway) +- [#529](https://github.com/request/request/pull/529) dependencies versions bump (@jodaka) +- [#523](https://github.com/request/request/pull/523) Updating dependencies (@noway) +- [#520](https://github.com/request/request/pull/520) Fixing test-tunnel.js (@noway) +- [#519](https://github.com/request/request/pull/519) Update internal path state on post-creation QS changes (@jblebrun) +- [#510](https://github.com/request/request/pull/510) Add HTTP Signature support. (@davidlehn) +- [#502](https://github.com/request/request/pull/502) Fix POST (and probably other) requests that are retried after 401 Unauthorized (@nylen) +- [#508](https://github.com/request/request/pull/508) Honor the .strictSSL option when using proxies (tunnel-agent) (@jhs) +- [#512](https://github.com/request/request/pull/512) Make password optional to support the format: http://username@hostname/ (@pajato1) +- [#513](https://github.com/request/request/pull/513) add 'localAddress' support (@yyfrankyy) +- [#498](https://github.com/request/request/pull/498) Moving response emit above setHeaders on destination streams (@kenperkins) +- [#490](https://github.com/request/request/pull/490) Empty response body (3-rd argument) must be passed to callback as an empty string (@Olegas) +- [#479](https://github.com/request/request/pull/479) Changing so if Accept header is explicitly set, sending json does not ov... (@RoryH) +- [#475](https://github.com/request/request/pull/475) Use `unescape` from `querystring` (@shimaore) +- [#473](https://github.com/request/request/pull/473) V0.10 compat (@isaacs) +- [#471](https://github.com/request/request/pull/471) Using querystring library from visionmedia (@kbackowski) +- [#461](https://github.com/request/request/pull/461) Strip the UTF8 BOM from a UTF encoded response (@kppullin) +- [#460](https://github.com/request/request/pull/460) hawk 0.10.0 (@hueniverse) +- [#462](https://github.com/request/request/pull/462) if query params are empty, then request path shouldn't end with a '?' (merges cleanly now) (@jaipandya) +- [#456](https://github.com/request/request/pull/456) hawk 0.9.0 (@hueniverse) +- [#429](https://github.com/request/request/pull/429) Copy options before adding callback. (@nrn, @nfriedly, @youurayy, @jplock, @kapetan, @landeiro, @othiym23, @mmalecki) +- [#454](https://github.com/request/request/pull/454) Destroy the response if present when destroying the request (clean merge) (@mafintosh) +- [#310](https://github.com/request/request/pull/310) Twitter Oauth Stuff Out of Date; Now Updated (@joemccann, @isaacs, @mscdex) +- [#413](https://github.com/request/request/pull/413) rename googledoodle.png to .jpg (@nfriedly, @youurayy, @jplock, @kapetan, @landeiro, @othiym23, @mmalecki) +- [#448](https://github.com/request/request/pull/448) Convenience method for PATCH (@mloar) +- [#444](https://github.com/request/request/pull/444) protect against double callbacks on error path (@spollack) +- [#433](https://github.com/request/request/pull/433) Added support for HTTPS cert & key (@mmalecki) +- [#430](https://github.com/request/request/pull/430) Respect specified {Host,host} headers, not just {host} (@andrewschaaf) +- [#415](https://github.com/request/request/pull/415) Fixed a typo. (@jerem) +- [#338](https://github.com/request/request/pull/338) Add more auth options, including digest support (@nylen) +- [#403](https://github.com/request/request/pull/403) Optimize environment lookup to happen once only (@mmalecki) +- [#398](https://github.com/request/request/pull/398) Add more reporting to tests (@mmalecki) +- [#388](https://github.com/request/request/pull/388) Ensure "safe" toJSON doesn't break EventEmitters (@othiym23) +- [#381](https://github.com/request/request/pull/381) Resolving "Invalid signature. Expected signature base string: " (@landeiro) +- [#380](https://github.com/request/request/pull/380) Fixes missing host header on retried request when using forever agent (@mac-) +- [#376](https://github.com/request/request/pull/376) Headers lost on redirect (@kapetan) +- [#375](https://github.com/request/request/pull/375) Fix for missing oauth_timestamp parameter (@jplock) +- [#374](https://github.com/request/request/pull/374) Correct Host header for proxy tunnel CONNECT (@youurayy) +- [#370](https://github.com/request/request/pull/370) Twitter reverse auth uses x_auth_mode not x_auth_type (@drudge) +- [#369](https://github.com/request/request/pull/369) Don't remove x_auth_mode for Twitter reverse auth (@drudge) +- [#344](https://github.com/request/request/pull/344) Make AWS auth signing find headers correctly (@nlf) +- [#363](https://github.com/request/request/pull/363) rfc3986 on base_uri, now passes tests (@jeffmarshall) +- [#362](https://github.com/request/request/pull/362) Running `rfc3986` on `base_uri` in `oauth.hmacsign` instead of just `encodeURIComponent` (@jeffmarshall) +- [#361](https://github.com/request/request/pull/361) Don't create a Content-Length header if we already have it set (@danjenkins) +- [#360](https://github.com/request/request/pull/360) Delete self._form along with everything else on redirect (@jgautier) +- [#355](https://github.com/request/request/pull/355) stop sending erroneous headers on redirected requests (@azylman) +- [#332](https://github.com/request/request/pull/332) Fix #296 - Only set Content-Type if body exists (@Marsup) +- [#343](https://github.com/request/request/pull/343) Allow AWS to work in more situations, added a note in the README on its usage (@nlf) +- [#320](https://github.com/request/request/pull/320) request.defaults() doesn't need to wrap jar() (@StuartHarris) +- [#322](https://github.com/request/request/pull/322) Fix + test for piped into request bumped into redirect. #321 (@alexindigo) +- [#326](https://github.com/request/request/pull/326) Do not try to remove listener from an undefined connection (@CartoDB) +- [#318](https://github.com/request/request/pull/318) Pass servername to tunneling secure socket creation (@isaacs) +- [#317](https://github.com/request/request/pull/317) Workaround for #313 (@isaacs) +- [#293](https://github.com/request/request/pull/293) Allow parser errors to bubble up to request (@mscdex) +- [#290](https://github.com/request/request/pull/290) A test for #289 (@isaacs) +- [#280](https://github.com/request/request/pull/280) Like in node.js print options if NODE_DEBUG contains the word request (@Filirom1) +- [#207](https://github.com/request/request/pull/207) Fix #206 Change HTTP/HTTPS agent when redirecting between protocols (@isaacs) +- [#214](https://github.com/request/request/pull/214) documenting additional behavior of json option (@jphaas, @vpulim) +- [#272](https://github.com/request/request/pull/272) Boundary begins with CRLF? (@elspoono, @timshadel, @naholyr, @nanodocumet, @TehShrike) +- [#284](https://github.com/request/request/pull/284) Remove stray `console.log()` call in multipart generator. (@bcherry) +- [#241](https://github.com/request/request/pull/241) Composability updates suggested by issue #239 (@polotek) +- [#282](https://github.com/request/request/pull/282) OAuth Authorization header contains non-"oauth_" parameters (@jplock) +- [#279](https://github.com/request/request/pull/279) fix tests with boundary by injecting boundry from header (@benatkin) +- [#273](https://github.com/request/request/pull/273) Pipe back pressure issue (@mafintosh) +- [#268](https://github.com/request/request/pull/268) I'm not OCD seriously (@TehShrike) +- [#263](https://github.com/request/request/pull/263) Bug in OAuth key generation for sha1 (@nanodocumet) +- [#265](https://github.com/request/request/pull/265) uncaughtException when redirected to invalid URI (@naholyr) +- [#262](https://github.com/request/request/pull/262) JSON test should check for equality (@timshadel) +- [#261](https://github.com/request/request/pull/261) Setting 'pool' to 'false' does NOT disable Agent pooling (@timshadel) +- [#249](https://github.com/request/request/pull/249) Fix for the fix of your (closed) issue #89 where self.headers[content-length] is set to 0 for all methods (@sethbridges, @polotek, @zephrax, @jeromegn) +- [#255](https://github.com/request/request/pull/255) multipart allow body === '' ( the empty string ) (@Filirom1) +- [#260](https://github.com/request/request/pull/260) fixed just another leak of 'i' (@sreuter) +- [#246](https://github.com/request/request/pull/246) Fixing the set-cookie header (@jeromegn) +- [#243](https://github.com/request/request/pull/243) Dynamic boundary (@zephrax) +- [#240](https://github.com/request/request/pull/240) don't error when null is passed for options (@polotek) +- [#211](https://github.com/request/request/pull/211) Replace all occurrences of special chars in RFC3986 (@chriso, @vpulim) +- [#224](https://github.com/request/request/pull/224) Multipart content-type change (@janjongboom) +- [#217](https://github.com/request/request/pull/217) need to use Authorization (titlecase) header with Tumblr OAuth (@visnup) +- [#203](https://github.com/request/request/pull/203) Fix cookie and redirect bugs and add auth support for HTTPS tunnel (@vpulim) +- [#199](https://github.com/request/request/pull/199) Tunnel (@isaacs) +- [#198](https://github.com/request/request/pull/198) Bugfix on forever usage of util.inherits (@isaacs) +- [#197](https://github.com/request/request/pull/197) Make ForeverAgent work with HTTPS (@isaacs) +- [#193](https://github.com/request/request/pull/193) Fixes GH-119 (@goatslacker) +- [#188](https://github.com/request/request/pull/188) Add abort support to the returned request (@itay) +- [#176](https://github.com/request/request/pull/176) Querystring option (@csainty) +- [#182](https://github.com/request/request/pull/182) Fix request.defaults to support (uri, options, callback) api (@twilson63) +- [#180](https://github.com/request/request/pull/180) Modified the post, put, head and del shortcuts to support uri optional param (@twilson63) +- [#179](https://github.com/request/request/pull/179) fix to add opts in .pipe(stream, opts) (@substack) +- [#177](https://github.com/request/request/pull/177) Issue #173 Support uri as first and optional config as second argument (@twilson63) +- [#170](https://github.com/request/request/pull/170) can't create a cookie in a wrapped request (defaults) (@fabianonunes) +- [#168](https://github.com/request/request/pull/168) Picking off an EasyFix by adding some missing mimetypes. (@serby) +- [#161](https://github.com/request/request/pull/161) Fix cookie jar/headers.cookie collision (#125) (@papandreou) +- [#162](https://github.com/request/request/pull/162) Fix issue #159 (@dpetukhov) +- [#90](https://github.com/request/request/pull/90) add option followAllRedirects to follow post/put redirects (@jroes) +- [#148](https://github.com/request/request/pull/148) Retry Agent (@thejh) +- [#146](https://github.com/request/request/pull/146) Multipart should respect content-type if previously set (@apeace) +- [#144](https://github.com/request/request/pull/144) added "form" option to readme (@petejkim) +- [#133](https://github.com/request/request/pull/133) Fixed cookies parsing (@afanasy) +- [#135](https://github.com/request/request/pull/135) host vs hostname (@iangreenleaf) +- [#132](https://github.com/request/request/pull/132) return the body as a Buffer when encoding is set to null (@jahewson) +- [#112](https://github.com/request/request/pull/112) Support using a custom http-like module (@jhs) +- [#104](https://github.com/request/request/pull/104) Cookie handling contains bugs (@janjongboom) +- [#121](https://github.com/request/request/pull/121) Another patch for cookie handling regression (@jhurliman) +- [#117](https://github.com/request/request/pull/117) Remove the global `i` (@3rd-Eden) +- [#110](https://github.com/request/request/pull/110) Update to Iris Couch URL (@jhs) +- [#86](https://github.com/request/request/pull/86) Can't post binary to multipart requests (@kkaefer) +- [#105](https://github.com/request/request/pull/105) added test for proxy option. (@dominictarr) +- [#102](https://github.com/request/request/pull/102) Implemented cookies - closes issue 82: https://github.com/mikeal/request/issues/82 (@alessioalex) +- [#97](https://github.com/request/request/pull/97) Typo in previous pull causes TypeError in non-0.5.11 versions (@isaacs) +- [#96](https://github.com/request/request/pull/96) Authless parsed url host support (@isaacs) +- [#81](https://github.com/request/request/pull/81) Enhance redirect handling (@danmactough) +- [#78](https://github.com/request/request/pull/78) Don't try to do strictSSL for non-ssl connections (@isaacs) +- [#76](https://github.com/request/request/pull/76) Bug when a request fails and a timeout is set (@Marsup) +- [#70](https://github.com/request/request/pull/70) add test script to package.json (@isaacs, @aheckmann) +- [#73](https://github.com/request/request/pull/73) Fix #71 Respect the strictSSL flag (@isaacs) +- [#69](https://github.com/request/request/pull/69) Flatten chunked requests properly (@isaacs) +- [#67](https://github.com/request/request/pull/67) fixed global variable leaks (@aheckmann) +- [#66](https://github.com/request/request/pull/66) Do not overwrite established content-type headers for read stream deliver (@voodootikigod) +- [#53](https://github.com/request/request/pull/53) Parse json: Issue #51 (@benatkin) +- [#45](https://github.com/request/request/pull/45) Added timeout option (@mbrevoort) +- [#35](https://github.com/request/request/pull/35) The "end" event isn't emitted for some responses (@voxpelli) +- [#31](https://github.com/request/request/pull/31) Error on piping a request to a destination (@tobowers) \ No newline at end of file diff --git a/node_modules/request/LICENSE b/node_modules/request/LICENSE new file mode 100644 index 00000000..a4a9aee0 --- /dev/null +++ b/node_modules/request/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/request/README.md b/node_modules/request/README.md new file mode 100644 index 00000000..9da0eb7d --- /dev/null +++ b/node_modules/request/README.md @@ -0,0 +1,1133 @@ +# Deprecated! + +As of Feb 11th 2020, request is fully deprecated. No new changes are expected land. In fact, none have landed for some time. + +For more information about why request is deprecated and possible alternatives refer to +[this issue](https://github.com/request/request/issues/3142). + +# Request - Simplified HTTP client + +[![npm package](https://nodei.co/npm/request.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/request/) + +[![Build status](https://img.shields.io/travis/request/request/master.svg?style=flat-square)](https://travis-ci.org/request/request) +[![Coverage](https://img.shields.io/codecov/c/github/request/request.svg?style=flat-square)](https://codecov.io/github/request/request?branch=master) +[![Coverage](https://img.shields.io/coveralls/request/request.svg?style=flat-square)](https://coveralls.io/r/request/request) +[![Dependency Status](https://img.shields.io/david/request/request.svg?style=flat-square)](https://david-dm.org/request/request) +[![Known Vulnerabilities](https://snyk.io/test/npm/request/badge.svg?style=flat-square)](https://snyk.io/test/npm/request) +[![Gitter](https://img.shields.io/badge/gitter-join_chat-blue.svg?style=flat-square)](https://gitter.im/request/request?utm_source=badge) + + +## Super simple to use + +Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default. + +```js +const request = require('request'); +request('http://www.google.com', function (error, response, body) { + console.error('error:', error); // Print the error if one occurred + console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received + console.log('body:', body); // Print the HTML for the Google homepage. +}); +``` + + +## Table of contents + +- [Streaming](#streaming) +- [Promises & Async/Await](#promises--asyncawait) +- [Forms](#forms) +- [HTTP Authentication](#http-authentication) +- [Custom HTTP Headers](#custom-http-headers) +- [OAuth Signing](#oauth-signing) +- [Proxies](#proxies) +- [Unix Domain Sockets](#unix-domain-sockets) +- [TLS/SSL Protocol](#tlsssl-protocol) +- [Support for HAR 1.2](#support-for-har-12) +- [**All Available Options**](#requestoptions-callback) + +Request also offers [convenience methods](#convenience-methods) like +`request.defaults` and `request.post`, and there are +lots of [usage examples](#examples) and several +[debugging techniques](#debugging). + + +--- + + +## Streaming + +You can stream any response to a file stream. + +```js +request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) +``` + +You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case `application/json`) and use the proper `content-type` in the PUT request (if the headers don’t already provide one). + +```js +fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) +``` + +Request can also `pipe` to itself. When doing so, `content-type` and `content-length` are preserved in the PUT headers. + +```js +request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) +``` + +Request emits a "response" event when a response is received. The `response` argument will be an instance of [http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage). + +```js +request + .get('http://google.com/img.png') + .on('response', function(response) { + console.log(response.statusCode) // 200 + console.log(response.headers['content-type']) // 'image/png' + }) + .pipe(request.put('http://mysite.com/img.png')) +``` + +To easily handle errors when streaming requests, listen to the `error` event before piping: + +```js +request + .get('http://mysite.com/doodle.png') + .on('error', function(err) { + console.error(err) + }) + .pipe(fs.createWriteStream('doodle.png')) +``` + +Now let’s get fancy. + +```js +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + if (req.method === 'PUT') { + req.pipe(request.put('http://mysite.com/doodle.png')) + } else if (req.method === 'GET' || req.method === 'HEAD') { + request.get('http://mysite.com/doodle.png').pipe(resp) + } + } +}) +``` + +You can also `pipe()` from `http.ServerRequest` instances, as well as to `http.ServerResponse` instances. The HTTP method, headers, and entity-body data will be sent. Which means that, if you don't really care about security, you can do: + +```js +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + const x = request('http://mysite.com/doodle.png') + req.pipe(x) + x.pipe(resp) + } +}) +``` + +And since `pipe()` returns the destination stream in ≥ Node 0.5.x you can do one line proxying. :) + +```js +req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) +``` + +Also, none of this new functionality conflicts with requests previous features, it just expands them. + +```js +const r = request.defaults({'proxy':'http://localproxy.com'}) + +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + r.get('http://google.com/doodle.png').pipe(resp) + } +}) +``` + +You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. + +[back to top](#table-of-contents) + + +--- + + +## Promises & Async/Await + +`request` supports both streaming and callback interfaces natively. If you'd like `request` to return a Promise instead, you can use an alternative interface wrapper for `request`. These wrappers can be useful if you prefer to work with Promises, or if you'd like to use `async`/`await` in ES2017. + +Several alternative interfaces are provided by the request team, including: +- [`request-promise`](https://github.com/request/request-promise) (uses [Bluebird](https://github.com/petkaantonov/bluebird) Promises) +- [`request-promise-native`](https://github.com/request/request-promise-native) (uses native Promises) +- [`request-promise-any`](https://github.com/request/request-promise-any) (uses [any-promise](https://www.npmjs.com/package/any-promise) Promises) + +Also, [`util.promisify`](https://nodejs.org/api/util.html#util_util_promisify_original), which is available from Node.js v8.0 can be used to convert a regular function that takes a callback to return a promise instead. + + +[back to top](#table-of-contents) + + +--- + + +## Forms + +`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API. + + +#### application/x-www-form-urlencoded (URL-Encoded Forms) + +URL-encoded forms are simple. + +```js +request.post('http://service.com/upload', {form:{key:'value'}}) +// or +request.post('http://service.com/upload').form({key:'value'}) +// or +request.post({url:'http://service.com/upload', form: {key:'value'}}, function(err,httpResponse,body){ /* ... */ }) +``` + + +#### multipart/form-data (Multipart Form Uploads) + +For `multipart/form-data` we use the [form-data](https://github.com/form-data/form-data) library by [@felixge](https://github.com/felixge). For the most cases, you can pass your upload form data via the `formData` option. + + +```js +const formData = { + // Pass a simple key-value pair + my_field: 'my_value', + // Pass data via Buffers + my_buffer: Buffer.from([1, 2, 3]), + // Pass data via Streams + my_file: fs.createReadStream(__dirname + '/unicycle.jpg'), + // Pass multiple values /w an Array + attachments: [ + fs.createReadStream(__dirname + '/attachment1.jpg'), + fs.createReadStream(__dirname + '/attachment2.jpg') + ], + // Pass optional meta-data with an 'options' object with style: {value: DATA, options: OPTIONS} + // Use case: for some types of streams, you'll need to provide "file"-related information manually. + // See the `form-data` README for more information about options: https://github.com/form-data/form-data + custom_file: { + value: fs.createReadStream('/dev/urandom'), + options: { + filename: 'topsecret.jpg', + contentType: 'image/jpeg' + } + } +}; +request.post({url:'http://service.com/upload', formData: formData}, function optionalCallback(err, httpResponse, body) { + if (err) { + return console.error('upload failed:', err); + } + console.log('Upload successful! Server responded with:', body); +}); +``` + +For advanced cases, you can access the form-data object itself via `r.form()`. This can be modified until the request is fired on the next cycle of the event-loop. (Note that this calling `form()` will clear the currently set form data for that request.) + +```js +// NOTE: Advanced use-case, for normal use see 'formData' usage above +const r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...}) +const form = r.form(); +form.append('my_field', 'my_value'); +form.append('my_buffer', Buffer.from([1, 2, 3])); +form.append('custom_file', fs.createReadStream(__dirname + '/unicycle.jpg'), {filename: 'unicycle.jpg'}); +``` +See the [form-data README](https://github.com/form-data/form-data) for more information & examples. + + +#### multipart/related + +Some variations in different HTTP implementations require a newline/CRLF before, after, or both before and after the boundary of a `multipart/related` request (using the multipart option). This has been observed in the .NET WebAPI version 4.0. You can turn on a boundary preambleCRLF or postamble by passing them as `true` to your request options. + +```js + request({ + method: 'PUT', + preambleCRLF: true, + postambleCRLF: true, + uri: 'http://service.com/upload', + multipart: [ + { + 'content-type': 'application/json', + body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + }, + { body: 'I am an attachment' }, + { body: fs.createReadStream('image.png') } + ], + // alternatively pass an object containing additional options + multipart: { + chunked: false, + data: [ + { + 'content-type': 'application/json', + body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + }, + { body: 'I am an attachment' } + ] + } + }, + function (error, response, body) { + if (error) { + return console.error('upload failed:', error); + } + console.log('Upload successful! Server responded with:', body); + }) +``` + +[back to top](#table-of-contents) + + +--- + + +## HTTP Authentication + +```js +request.get('http://some.server.com/').auth('username', 'password', false); +// or +request.get('http://some.server.com/', { + 'auth': { + 'user': 'username', + 'pass': 'password', + 'sendImmediately': false + } +}); +// or +request.get('http://some.server.com/').auth(null, null, true, 'bearerToken'); +// or +request.get('http://some.server.com/', { + 'auth': { + 'bearer': 'bearerToken' + } +}); +``` + +If passed as an option, `auth` should be a hash containing values: + +- `user` || `username` +- `pass` || `password` +- `sendImmediately` (optional) +- `bearer` (optional) + +The method form takes parameters +`auth(username, password, sendImmediately, bearer)`. + +`sendImmediately` defaults to `true`, which causes a basic or bearer +authentication header to be sent. If `sendImmediately` is `false`, then +`request` will retry with a proper authentication header after receiving a +`401` response from the server (which must contain a `WWW-Authenticate` header +indicating the required authentication method). + +Note that you can also specify basic authentication using the URL itself, as +detailed in [RFC 1738](http://www.ietf.org/rfc/rfc1738.txt). Simply pass the +`user:password` before the host with an `@` sign: + +```js +const username = 'username', + password = 'password', + url = 'http://' + username + ':' + password + '@some.server.com'; + +request({url}, function (error, response, body) { + // Do more stuff with 'body' here +}); +``` + +Digest authentication is supported, but it only works with `sendImmediately` +set to `false`; otherwise `request` will send basic authentication on the +initial request, which will probably cause the request to fail. + +Bearer authentication is supported, and is activated when the `bearer` value is +available. The value may be either a `String` or a `Function` returning a +`String`. Using a function to supply the bearer token is particularly useful if +used in conjunction with `defaults` to allow a single function to supply the +last known token at the time of sending a request, or to compute one on the fly. + +[back to top](#table-of-contents) + + +--- + + +## Custom HTTP Headers + +HTTP Headers, such as `User-Agent`, can be set in the `options` object. +In the example below, we call the github API to find out the number +of stars and forks for the request repository. This requires a +custom `User-Agent` header as well as https. + +```js +const request = require('request'); + +const options = { + url: 'https://api.github.com/repos/request/request', + headers: { + 'User-Agent': 'request' + } +}; + +function callback(error, response, body) { + if (!error && response.statusCode == 200) { + const info = JSON.parse(body); + console.log(info.stargazers_count + " Stars"); + console.log(info.forks_count + " Forks"); + } +} + +request(options, callback); +``` + +[back to top](#table-of-contents) + + +--- + + +## OAuth Signing + +[OAuth version 1.0](https://tools.ietf.org/html/rfc5849) is supported. The +default signing algorithm is +[HMAC-SHA1](https://tools.ietf.org/html/rfc5849#section-3.4.2): + +```js +// OAuth1.0 - 3-legged server side flow (Twitter example) +// step 1 +const qs = require('querystring') + , oauth = + { callback: 'http://mysite.com/callback/' + , consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + } + , url = 'https://api.twitter.com/oauth/request_token' + ; +request.post({url:url, oauth:oauth}, function (e, r, body) { + // Ideally, you would take the body in the response + // and construct a URL that a user clicks on (like a sign in button). + // The verifier is only available in the response after a user has + // verified with twitter that they are authorizing your app. + + // step 2 + const req_data = qs.parse(body) + const uri = 'https://api.twitter.com/oauth/authenticate' + + '?' + qs.stringify({oauth_token: req_data.oauth_token}) + // redirect the user to the authorize uri + + // step 3 + // after the user is redirected back to your server + const auth_data = qs.parse(body) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: auth_data.oauth_token + , token_secret: req_data.oauth_token_secret + , verifier: auth_data.oauth_verifier + } + , url = 'https://api.twitter.com/oauth/access_token' + ; + request.post({url:url, oauth:oauth}, function (e, r, body) { + // ready to make signed requests on behalf of the user + const perm_data = qs.parse(body) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: perm_data.oauth_token + , token_secret: perm_data.oauth_token_secret + } + , url = 'https://api.twitter.com/1.1/users/show.json' + , qs = + { screen_name: perm_data.screen_name + , user_id: perm_data.user_id + } + ; + request.get({url:url, oauth:oauth, qs:qs, json:true}, function (e, r, user) { + console.log(user) + }) + }) +}) +``` + +For [RSA-SHA1 signing](https://tools.ietf.org/html/rfc5849#section-3.4.3), make +the following changes to the OAuth options object: +* Pass `signature_method : 'RSA-SHA1'` +* Instead of `consumer_secret`, specify a `private_key` string in + [PEM format](http://how2ssl.com/articles/working_with_pem_files/) + +For [PLAINTEXT signing](http://oauth.net/core/1.0/#anchor22), make +the following changes to the OAuth options object: +* Pass `signature_method : 'PLAINTEXT'` + +To send OAuth parameters via query params or in a post body as described in The +[Consumer Request Parameters](http://oauth.net/core/1.0/#consumer_req_param) +section of the oauth1 spec: +* Pass `transport_method : 'query'` or `transport_method : 'body'` in the OAuth + options object. +* `transport_method` defaults to `'header'` + +To use [Request Body Hash](https://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html) you can either +* Manually generate the body hash and pass it as a string `body_hash: '...'` +* Automatically generate the body hash by passing `body_hash: true` + +[back to top](#table-of-contents) + + +--- + + +## Proxies + +If you specify a `proxy` option, then the request (and any subsequent +redirects) will be sent via a connection to the proxy server. + +If your endpoint is an `https` url, and you are using a proxy, then +request will send a `CONNECT` request to the proxy server *first*, and +then use the supplied connection to connect to the endpoint. + +That is, first it will make a request like: + +``` +HTTP/1.1 CONNECT endpoint-server.com:80 +Host: proxy-server.com +User-Agent: whatever user agent you specify +``` + +and then the proxy server make a TCP connection to `endpoint-server` +on port `80`, and return a response that looks like: + +``` +HTTP/1.1 200 OK +``` + +At this point, the connection is left open, and the client is +communicating directly with the `endpoint-server.com` machine. + +See [the wikipedia page on HTTP Tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel) +for more information. + +By default, when proxying `http` traffic, request will simply make a +standard proxied `http` request. This is done by making the `url` +section of the initial line of the request a fully qualified url to +the endpoint. + +For example, it will make a single request that looks like: + +``` +HTTP/1.1 GET http://endpoint-server.com/some-url +Host: proxy-server.com +Other-Headers: all go here + +request body or whatever +``` + +Because a pure "http over http" tunnel offers no additional security +or other features, it is generally simpler to go with a +straightforward HTTP proxy in this case. However, if you would like +to force a tunneling proxy, you may set the `tunnel` option to `true`. + +You can also make a standard proxied `http` request by explicitly setting +`tunnel : false`, but **note that this will allow the proxy to see the traffic +to/from the destination server**. + +If you are using a tunneling proxy, you may set the +`proxyHeaderWhiteList` to share certain headers with the proxy. + +You can also set the `proxyHeaderExclusiveList` to share certain +headers only with the proxy and not with destination host. + +By default, this set is: + +``` +accept +accept-charset +accept-encoding +accept-language +accept-ranges +cache-control +content-encoding +content-language +content-length +content-location +content-md5 +content-range +content-type +connection +date +expect +max-forwards +pragma +proxy-authorization +referer +te +transfer-encoding +user-agent +via +``` + +Note that, when using a tunneling proxy, the `proxy-authorization` +header and any headers from custom `proxyHeaderExclusiveList` are +*never* sent to the endpoint server, but only to the proxy server. + + +### Controlling proxy behaviour using environment variables + +The following environment variables are respected by `request`: + + * `HTTP_PROXY` / `http_proxy` + * `HTTPS_PROXY` / `https_proxy` + * `NO_PROXY` / `no_proxy` + +When `HTTP_PROXY` / `http_proxy` are set, they will be used to proxy non-SSL requests that do not have an explicit `proxy` configuration option present. Similarly, `HTTPS_PROXY` / `https_proxy` will be respected for SSL requests that do not have an explicit `proxy` configuration option. It is valid to define a proxy in one of the environment variables, but then override it for a specific request, using the `proxy` configuration option. Furthermore, the `proxy` configuration option can be explicitly set to false / null to opt out of proxying altogether for that request. + +`request` is also aware of the `NO_PROXY`/`no_proxy` environment variables. These variables provide a granular way to opt out of proxying, on a per-host basis. It should contain a comma separated list of hosts to opt out of proxying. It is also possible to opt of proxying when a particular destination port is used. Finally, the variable may be set to `*` to opt out of the implicit proxy configuration of the other environment variables. + +Here's some examples of valid `no_proxy` values: + + * `google.com` - don't proxy HTTP/HTTPS requests to Google. + * `google.com:443` - don't proxy HTTPS requests to Google, but *do* proxy HTTP requests to Google. + * `google.com:443, yahoo.com:80` - don't proxy HTTPS requests to Google, and don't proxy HTTP requests to Yahoo! + * `*` - ignore `https_proxy`/`http_proxy` environment variables altogether. + +[back to top](#table-of-contents) + + +--- + + +## UNIX Domain Sockets + +`request` supports making requests to [UNIX Domain Sockets](https://en.wikipedia.org/wiki/Unix_domain_socket). To make one, use the following URL scheme: + +```js +/* Pattern */ 'http://unix:SOCKET:PATH' +/* Example */ request.get('http://unix:/absolute/path/to/unix.socket:/request/path') +``` + +Note: The `SOCKET` path is assumed to be absolute to the root of the host file system. + +[back to top](#table-of-contents) + + +--- + + +## TLS/SSL Protocol + +TLS/SSL Protocol options, such as `cert`, `key` and `passphrase`, can be +set directly in `options` object, in the `agentOptions` property of the `options` object, or even in `https.globalAgent.options`. Keep in mind that, although `agentOptions` allows for a slightly wider range of configurations, the recommended way is via `options` object directly, as using `agentOptions` or `https.globalAgent.options` would not be applied in the same way in proxied environments (as data travels through a TLS connection instead of an http/https agent). + +```js +const fs = require('fs') + , path = require('path') + , certFile = path.resolve(__dirname, 'ssl/client.crt') + , keyFile = path.resolve(__dirname, 'ssl/client.key') + , caFile = path.resolve(__dirname, 'ssl/ca.cert.pem') + , request = require('request'); + +const options = { + url: 'https://api.some-server.com/', + cert: fs.readFileSync(certFile), + key: fs.readFileSync(keyFile), + passphrase: 'password', + ca: fs.readFileSync(caFile) +}; + +request.get(options); +``` + +### Using `options.agentOptions` + +In the example below, we call an API that requires client side SSL certificate +(in PEM format) with passphrase protected private key (in PEM format) and disable the SSLv3 protocol: + +```js +const fs = require('fs') + , path = require('path') + , certFile = path.resolve(__dirname, 'ssl/client.crt') + , keyFile = path.resolve(__dirname, 'ssl/client.key') + , request = require('request'); + +const options = { + url: 'https://api.some-server.com/', + agentOptions: { + cert: fs.readFileSync(certFile), + key: fs.readFileSync(keyFile), + // Or use `pfx` property replacing `cert` and `key` when using private key, certificate and CA certs in PFX or PKCS12 format: + // pfx: fs.readFileSync(pfxFilePath), + passphrase: 'password', + securityOptions: 'SSL_OP_NO_SSLv3' + } +}; + +request.get(options); +``` + +It is able to force using SSLv3 only by specifying `secureProtocol`: + +```js +request.get({ + url: 'https://api.some-server.com/', + agentOptions: { + secureProtocol: 'SSLv3_method' + } +}); +``` + +It is possible to accept other certificates than those signed by generally allowed Certificate Authorities (CAs). +This can be useful, for example, when using self-signed certificates. +To require a different root certificate, you can specify the signing CA by adding the contents of the CA's certificate file to the `agentOptions`. +The certificate the domain presents must be signed by the root certificate specified: + +```js +request.get({ + url: 'https://api.some-server.com/', + agentOptions: { + ca: fs.readFileSync('ca.cert.pem') + } +}); +``` + +The `ca` value can be an array of certificates, in the event you have a private or internal corporate public-key infrastructure hierarchy. For example, if you want to connect to https://api.some-server.com which presents a key chain consisting of: +1. its own public key, which is signed by: +2. an intermediate "Corp Issuing Server", that is in turn signed by: +3. a root CA "Corp Root CA"; + +you can configure your request as follows: + +```js +request.get({ + url: 'https://api.some-server.com/', + agentOptions: { + ca: [ + fs.readFileSync('Corp Issuing Server.pem'), + fs.readFileSync('Corp Root CA.pem') + ] + } +}); +``` + +[back to top](#table-of-contents) + + +--- + +## Support for HAR 1.2 + +The `options.har` property will override the values: `url`, `method`, `qs`, `headers`, `form`, `formData`, `body`, `json`, as well as construct multipart data and read files from disk when `request.postData.params[].fileName` is present without a matching `value`. + +A validation step will check if the HAR Request format matches the latest spec (v1.2) and will skip parsing if not matching. + +```js + const request = require('request') + request({ + // will be ignored + method: 'GET', + uri: 'http://www.google.com', + + // HTTP Archive Request Object + har: { + url: 'http://www.mockbin.com/har', + method: 'POST', + headers: [ + { + name: 'content-type', + value: 'application/x-www-form-urlencoded' + } + ], + postData: { + mimeType: 'application/x-www-form-urlencoded', + params: [ + { + name: 'foo', + value: 'bar' + }, + { + name: 'hello', + value: 'world' + } + ] + } + } + }) + + // a POST request will be sent to http://www.mockbin.com + // with body an application/x-www-form-urlencoded body: + // foo=bar&hello=world +``` + +[back to top](#table-of-contents) + + +--- + +## request(options, callback) + +The first argument can be either a `url` or an `options` object. The only required option is `uri`; all others are optional. + +- `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()` +- `baseUrl` - fully qualified uri string used as the base url. Most useful with `request.defaults`, for example when you want to do many requests to the same domain. If `baseUrl` is `https://example.com/api/`, then requesting `/end/point?test=true` will fetch `https://example.com/api/end/point?test=true`. When `baseUrl` is given, `uri` must also be a string. +- `method` - http method (default: `"GET"`) +- `headers` - http headers (default: `{}`) + +--- + +- `qs` - object containing querystring values to be appended to the `uri` +- `qsParseOptions` - object containing options to pass to the [qs.parse](https://github.com/hapijs/qs#parsing-objects) method. Alternatively pass options to the [querystring.parse](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_parse_str_sep_eq_options) method using this format `{sep:';', eq:':', options:{}}` +- `qsStringifyOptions` - object containing options to pass to the [qs.stringify](https://github.com/hapijs/qs#stringifying) method. Alternatively pass options to the [querystring.stringify](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options) method using this format `{sep:';', eq:':', options:{}}`. For example, to change the way arrays are converted to query strings using the `qs` module pass the `arrayFormat` option with one of `indices|brackets|repeat` +- `useQuerystring` - if true, use `querystring` to stringify and parse + querystrings, otherwise use `qs` (default: `false`). Set this option to + `true` if you need arrays to be serialized as `foo=bar&foo=baz` instead of the + default `foo[0]=bar&foo[1]=baz`. + +--- + +- `body` - entity body for PATCH, POST and PUT requests. Must be a `Buffer`, `String` or `ReadStream`. If `json` is `true`, then `body` must be a JSON-serializable object. +- `form` - when passed an object or a querystring, this sets `body` to a querystring representation of value, and adds `Content-type: application/x-www-form-urlencoded` header. When passed no options, a `FormData` instance is returned (and is piped to request). See "Forms" section above. +- `formData` - data to pass for a `multipart/form-data` request. See + [Forms](#forms) section above. +- `multipart` - array of objects which contain their own headers and `body` + attributes. Sends a `multipart/related` request. See [Forms](#forms) section + above. + - Alternatively you can pass in an object `{chunked: false, data: []}` where + `chunked` is used to specify whether the request is sent in + [chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding) + In non-chunked requests, data items with body streams are not allowed. +- `preambleCRLF` - append a newline/CRLF before the boundary of your `multipart/form-data` request. +- `postambleCRLF` - append a newline/CRLF at the end of the boundary of your `multipart/form-data` request. +- `json` - sets `body` to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as JSON. +- `jsonReviver` - a [reviver function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) that will be passed to `JSON.parse()` when parsing a JSON response body. +- `jsonReplacer` - a [replacer function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) that will be passed to `JSON.stringify()` when stringifying a JSON request body. + +--- + +- `auth` - a hash containing values `user` || `username`, `pass` || `password`, and `sendImmediately` (optional). See documentation above. +- `oauth` - options for OAuth HMAC-SHA1 signing. See documentation above. +- `hawk` - options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example). +- `aws` - `object` containing AWS signing information. Should have the properties `key`, `secret`, and optionally `session` (note that this only works for services that require session as part of the canonical string). Also requires the property `bucket`, unless you’re specifying your `bucket` as part of the path, or the request doesn’t use a bucket (i.e. GET Services). If you want to use AWS sign version 4 use the parameter `sign_version` with value `4` otherwise the default is version 2. If you are using SigV4, you can also include a `service` property that specifies the service name. **Note:** you need to `npm install aws4` first. +- `httpSignature` - options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options. + +--- + +- `followRedirect` - follow HTTP 3xx responses as redirects (default: `true`). This property can also be implemented as function which gets `response` object as a single argument and should return `true` if redirects should continue or `false` otherwise. +- `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects (default: `false`) +- `followOriginalHttpMethod` - by default we redirect to HTTP method GET. you can enable this property to redirect to the original HTTP method (default: `false`) +- `maxRedirects` - the maximum number of redirects to follow (default: `10`) +- `removeRefererHeader` - removes the referer header when a redirect happens (default: `false`). **Note:** if true, referer header set in the initial request is preserved during redirect chain. + +--- + +- `encoding` - encoding to be used on `setEncoding` of response data. If `null`, the `body` is returned as a `Buffer`. Anything else **(including the default value of `undefined`)** will be passed as the [encoding](http://nodejs.org/api/buffer.html#buffer_buffer) parameter to `toString()` (meaning this is effectively `utf8` by default). (**Note:** if you expect binary data, you should set `encoding: null`.) +- `gzip` - if `true`, add an `Accept-Encoding` header to request compressed content encodings from the server (if not already present) and decode supported content encodings in the response. **Note:** Automatic decoding of the response content is performed on the body data returned through `request` (both through the `request` stream and passed to the callback function) but is not performed on the `response` stream (available from the `response` event) which is the unmodified `http.IncomingMessage` object which may contain compressed data. See example below. +- `jar` - if `true`, remember cookies for future use (or define your custom cookie jar; see examples section) + +--- + +- `agent` - `http(s).Agent` instance to use +- `agentClass` - alternatively specify your agent's class name +- `agentOptions` - and pass its options. **Note:** for HTTPS see [tls API doc for TLS/SSL options](http://nodejs.org/api/tls.html#tls_tls_connect_options_callback) and the [documentation above](#using-optionsagentoptions). +- `forever` - set to `true` to use the [forever-agent](https://github.com/request/forever-agent) **Note:** Defaults to `http(s).Agent({keepAlive:true})` in node 0.12+ +- `pool` - an object describing which agents to use for the request. If this option is omitted the request will use the global agent (as long as your options allow for it). Otherwise, request will search the pool for your custom agent. If no custom agent is found, a new agent will be created and added to the pool. **Note:** `pool` is used only when the `agent` option is not specified. + - A `maxSockets` property can also be provided on the `pool` object to set the max number of sockets for all agents created (ex: `pool: {maxSockets: Infinity}`). + - Note that if you are sending multiple requests in a loop and creating + multiple new `pool` objects, `maxSockets` will not work as intended. To + work around this, either use [`request.defaults`](#requestdefaultsoptions) + with your pool options or create the pool object with the `maxSockets` + property outside of the loop. +- `timeout` - integer containing number of milliseconds, controls two timeouts. + - **Read timeout**: Time to wait for a server to send response headers (and start the response body) before aborting the request. + - **Connection timeout**: Sets the socket to timeout after `timeout` milliseconds of inactivity. Note that increasing the timeout beyond the OS-wide TCP connection timeout will not have any effect ([the default in Linux can be anywhere from 20-120 seconds][linux-timeout]) + +[linux-timeout]: http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout + +--- + +- `localAddress` - local interface to bind for network connections. +- `proxy` - an HTTP proxy to be used. Supports proxy Auth with Basic Auth, identical to support for the `url` parameter (by embedding the auth info in the `uri`) +- `strictSSL` - if `true`, requires SSL certificates be valid. **Note:** to use your own certificate authority, you need to specify an agent that was created with that CA as an option. +- `tunnel` - controls the behavior of + [HTTP `CONNECT` tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_tunneling) + as follows: + - `undefined` (default) - `true` if the destination is `https`, `false` otherwise + - `true` - always tunnel to the destination by making a `CONNECT` request to + the proxy + - `false` - request the destination as a `GET` request. +- `proxyHeaderWhiteList` - a whitelist of headers to send to a + tunneling proxy. +- `proxyHeaderExclusiveList` - a whitelist of headers to send + exclusively to a tunneling proxy and not to destination. + +--- + +- `time` - if `true`, the request-response cycle (including all redirects) is timed at millisecond resolution. When set, the following properties are added to the response object: + - `elapsedTime` Duration of the entire request/response in milliseconds (*deprecated*). + - `responseStartTime` Timestamp when the response began (in Unix Epoch milliseconds) (*deprecated*). + - `timingStart` Timestamp of the start of the request (in Unix Epoch milliseconds). + - `timings` Contains event timestamps in millisecond resolution relative to `timingStart`. If there were redirects, the properties reflect the timings of the final request in the redirect chain: + - `socket` Relative timestamp when the [`http`](https://nodejs.org/api/http.html#http_event_socket) module's `socket` event fires. This happens when the socket is assigned to the request. + - `lookup` Relative timestamp when the [`net`](https://nodejs.org/api/net.html#net_event_lookup) module's `lookup` event fires. This happens when the DNS has been resolved. + - `connect`: Relative timestamp when the [`net`](https://nodejs.org/api/net.html#net_event_connect) module's `connect` event fires. This happens when the server acknowledges the TCP connection. + - `response`: Relative timestamp when the [`http`](https://nodejs.org/api/http.html#http_event_response) module's `response` event fires. This happens when the first bytes are received from the server. + - `end`: Relative timestamp when the last bytes of the response are received. + - `timingPhases` Contains the durations of each request phase. If there were redirects, the properties reflect the timings of the final request in the redirect chain: + - `wait`: Duration of socket initialization (`timings.socket`) + - `dns`: Duration of DNS lookup (`timings.lookup` - `timings.socket`) + - `tcp`: Duration of TCP connection (`timings.connect` - `timings.socket`) + - `firstByte`: Duration of HTTP server response (`timings.response` - `timings.connect`) + - `download`: Duration of HTTP download (`timings.end` - `timings.response`) + - `total`: Duration entire HTTP round-trip (`timings.end`) + +- `har` - a [HAR 1.2 Request Object](http://www.softwareishard.com/blog/har-12-spec/#request), will be processed from HAR format into options overwriting matching values *(see the [HAR 1.2 section](#support-for-har-12) for details)* +- `callback` - alternatively pass the request's callback in the options object + +The callback argument gets 3 arguments: + +1. An `error` when applicable (usually from [`http.ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest) object) +2. An [`http.IncomingMessage`](https://nodejs.org/api/http.html#http_class_http_incomingmessage) object (Response object) +3. The third is the `response` body (`String` or `Buffer`, or JSON object if the `json` option is supplied) + +[back to top](#table-of-contents) + + +--- + +## Convenience methods + +There are also shorthand methods for different HTTP METHODs and some other conveniences. + + +### request.defaults(options) + +This method **returns a wrapper** around the normal request API that defaults +to whatever options you pass to it. + +**Note:** `request.defaults()` **does not** modify the global request API; +instead, it **returns a wrapper** that has your default settings applied to it. + +**Note:** You can call `.defaults()` on the wrapper that is returned from +`request.defaults` to add/override defaults that were previously defaulted. + +For example: +```js +//requests using baseRequest() will set the 'x-token' header +const baseRequest = request.defaults({ + headers: {'x-token': 'my-token'} +}) + +//requests using specialRequest() will include the 'x-token' header set in +//baseRequest and will also include the 'special' header +const specialRequest = baseRequest.defaults({ + headers: {special: 'special value'} +}) +``` + +### request.METHOD() + +These HTTP method convenience functions act just like `request()` but with a default method already set for you: + +- *request.get()*: Defaults to `method: "GET"`. +- *request.post()*: Defaults to `method: "POST"`. +- *request.put()*: Defaults to `method: "PUT"`. +- *request.patch()*: Defaults to `method: "PATCH"`. +- *request.del() / request.delete()*: Defaults to `method: "DELETE"`. +- *request.head()*: Defaults to `method: "HEAD"`. +- *request.options()*: Defaults to `method: "OPTIONS"`. + +### request.cookie() + +Function that creates a new cookie. + +```js +request.cookie('key1=value1') +``` +### request.jar() + +Function that creates a new cookie jar. + +```js +request.jar() +``` + +### response.caseless.get('header-name') + +Function that returns the specified response header field using a [case-insensitive match](https://tools.ietf.org/html/rfc7230#section-3.2) + +```js +request('http://www.google.com', function (error, response, body) { + // print the Content-Type header even if the server returned it as 'content-type' (lowercase) + console.log('Content-Type is:', response.caseless.get('Content-Type')); +}); +``` + +[back to top](#table-of-contents) + + +--- + + +## Debugging + +There are at least three ways to debug the operation of `request`: + +1. Launch the node process like `NODE_DEBUG=request node script.js` + (`lib,request,otherlib` works too). + +2. Set `require('request').debug = true` at any time (this does the same thing + as #1). + +3. Use the [request-debug module](https://github.com/request/request-debug) to + view request and response headers and bodies. + +[back to top](#table-of-contents) + + +--- + +## Timeouts + +Most requests to external servers should have a timeout attached, in case the +server is not responding in a timely manner. Without a timeout, your code may +have a socket open/consume resources for minutes or more. + +There are two main types of timeouts: **connection timeouts** and **read +timeouts**. A connect timeout occurs if the timeout is hit while your client is +attempting to establish a connection to a remote machine (corresponding to the +[connect() call][connect] on the socket). A read timeout occurs any time the +server is too slow to send back a part of the response. + +These two situations have widely different implications for what went wrong +with the request, so it's useful to be able to distinguish them. You can detect +timeout errors by checking `err.code` for an 'ETIMEDOUT' value. Further, you +can detect whether the timeout was a connection timeout by checking if the +`err.connect` property is set to `true`. + +```js +request.get('http://10.255.255.1', {timeout: 1500}, function(err) { + console.log(err.code === 'ETIMEDOUT'); + // Set to `true` if the timeout was a connection timeout, `false` or + // `undefined` otherwise. + console.log(err.connect === true); + process.exit(0); +}); +``` + +[connect]: http://linux.die.net/man/2/connect + +## Examples: + +```js + const request = require('request') + , rand = Math.floor(Math.random()*100000000).toString() + ; + request( + { method: 'PUT' + , uri: 'http://mikeal.iriscouch.com/testjs/' + rand + , multipart: + [ { 'content-type': 'application/json' + , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + } + , { body: 'I am an attachment' } + ] + } + , function (error, response, body) { + if(response.statusCode == 201){ + console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) + } else { + console.log('error: '+ response.statusCode) + console.log(body) + } + } + ) +``` + +For backwards-compatibility, response compression is not supported by default. +To accept gzip-compressed responses, set the `gzip` option to `true`. Note +that the body data passed through `request` is automatically decompressed +while the response object is unmodified and will contain compressed data if +the server sent a compressed response. + +```js + const request = require('request') + request( + { method: 'GET' + , uri: 'http://www.google.com' + , gzip: true + } + , function (error, response, body) { + // body is the decompressed response body + console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity')) + console.log('the decoded data is: ' + body) + } + ) + .on('data', function(data) { + // decompressed data as it is received + console.log('decoded chunk: ' + data) + }) + .on('response', function(response) { + // unmodified http.IncomingMessage object + response.on('data', function(data) { + // compressed data as it is received + console.log('received ' + data.length + ' bytes of compressed data') + }) + }) +``` + +Cookies are disabled by default (else, they would be used in subsequent requests). To enable cookies, set `jar` to `true` (either in `defaults` or `options`). + +```js +const request = request.defaults({jar: true}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` + +To use a custom cookie jar (instead of `request`’s global cookie jar), set `jar` to an instance of `request.jar()` (either in `defaults` or `options`) + +```js +const j = request.jar() +const request = request.defaults({jar:j}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` + +OR + +```js +const j = request.jar(); +const cookie = request.cookie('key1=value1'); +const url = 'http://www.google.com'; +j.setCookie(cookie, url); +request({url: url, jar: j}, function () { + request('http://images.google.com') +}) +``` + +To use a custom cookie store (such as a +[`FileCookieStore`](https://github.com/mitsuru/tough-cookie-filestore) +which supports saving to and restoring from JSON files), pass it as a parameter +to `request.jar()`: + +```js +const FileCookieStore = require('tough-cookie-filestore'); +// NOTE - currently the 'cookies.json' file must already exist! +const j = request.jar(new FileCookieStore('cookies.json')); +request = request.defaults({ jar : j }) +request('http://www.google.com', function() { + request('http://images.google.com') +}) +``` + +The cookie store must be a +[`tough-cookie`](https://github.com/SalesforceEng/tough-cookie) +store and it must support synchronous operations; see the +[`CookieStore` API docs](https://github.com/SalesforceEng/tough-cookie#api) +for details. + +To inspect your cookie jar after a request: + +```js +const j = request.jar() +request({url: 'http://www.google.com', jar: j}, function () { + const cookie_string = j.getCookieString(url); // "key1=value1; key2=value2; ..." + const cookies = j.getCookies(url); + // [{key: 'key1', value: 'value1', domain: "www.google.com", ...}, ...] +}) +``` + +[back to top](#table-of-contents) diff --git a/node_modules/request/index.js b/node_modules/request/index.js new file mode 100755 index 00000000..d50f9917 --- /dev/null +++ b/node_modules/request/index.js @@ -0,0 +1,155 @@ +// Copyright 2010-2012 Mikeal Rogers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict' + +var extend = require('extend') +var cookies = require('./lib/cookies') +var helpers = require('./lib/helpers') + +var paramsHaveRequestBody = helpers.paramsHaveRequestBody + +// organize params for patch, post, put, head, del +function initParams (uri, options, callback) { + if (typeof options === 'function') { + callback = options + } + + var params = {} + if (options !== null && typeof options === 'object') { + extend(params, options, {uri: uri}) + } else if (typeof uri === 'string') { + extend(params, {uri: uri}) + } else { + extend(params, uri) + } + + params.callback = callback || params.callback + return params +} + +function request (uri, options, callback) { + if (typeof uri === 'undefined') { + throw new Error('undefined is not a valid uri or options object.') + } + + var params = initParams(uri, options, callback) + + if (params.method === 'HEAD' && paramsHaveRequestBody(params)) { + throw new Error('HTTP HEAD requests MUST NOT include a request body.') + } + + return new request.Request(params) +} + +function verbFunc (verb) { + var method = verb.toUpperCase() + return function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.method = method + return request(params, params.callback) + } +} + +// define like this to please codeintel/intellisense IDEs +request.get = verbFunc('get') +request.head = verbFunc('head') +request.options = verbFunc('options') +request.post = verbFunc('post') +request.put = verbFunc('put') +request.patch = verbFunc('patch') +request.del = verbFunc('delete') +request['delete'] = verbFunc('delete') + +request.jar = function (store) { + return cookies.jar(store) +} + +request.cookie = function (str) { + return cookies.parse(str) +} + +function wrapRequestMethod (method, options, requester, verb) { + return function (uri, opts, callback) { + var params = initParams(uri, opts, callback) + + var target = {} + extend(true, target, options, params) + + target.pool = params.pool || options.pool + + if (verb) { + target.method = verb.toUpperCase() + } + + if (typeof requester === 'function') { + method = requester + } + + return method(target, target.callback) + } +} + +request.defaults = function (options, requester) { + var self = this + + options = options || {} + + if (typeof options === 'function') { + requester = options + options = {} + } + + var defaults = wrapRequestMethod(self, options, requester) + + var verbs = ['get', 'head', 'post', 'put', 'patch', 'del', 'delete'] + verbs.forEach(function (verb) { + defaults[verb] = wrapRequestMethod(self[verb], options, requester, verb) + }) + + defaults.cookie = wrapRequestMethod(self.cookie, options, requester) + defaults.jar = self.jar + defaults.defaults = self.defaults + return defaults +} + +request.forever = function (agentOptions, optionsArg) { + var options = {} + if (optionsArg) { + extend(options, optionsArg) + } + if (agentOptions) { + options.agentOptions = agentOptions + } + + options.forever = true + return request.defaults(options) +} + +// Exports + +module.exports = request +request.Request = require('./request') +request.initParams = initParams + +// Backwards compatibility for request.debug +Object.defineProperty(request, 'debug', { + enumerable: true, + get: function () { + return request.Request.debug + }, + set: function (debug) { + request.Request.debug = debug + } +}) diff --git a/node_modules/request/node_modules/.bin/uuid b/node_modules/request/node_modules/.bin/uuid new file mode 120000 index 00000000..740f800c --- /dev/null +++ b/node_modules/request/node_modules/.bin/uuid @@ -0,0 +1 @@ +../../../uuid/bin/uuid \ No newline at end of file diff --git a/node_modules/request/package.json b/node_modules/request/package.json new file mode 100644 index 00000000..cbb2f2ed --- /dev/null +++ b/node_modules/request/package.json @@ -0,0 +1,86 @@ +{ + "name": "request", + "description": "Simplified HTTP request client.", + "keywords": [ + "http", + "simple", + "util", + "utility" + ], + "version": "2.88.2", + "author": "Mikeal Rogers ", + "repository": { + "type": "git", + "url": "https://github.com/request/request.git" + }, + "bugs": { + "url": "http://github.com/request/request/issues" + }, + "license": "Apache-2.0", + "engines": { + "node": ">= 6" + }, + "main": "index.js", + "files": [ + "lib/", + "index.js", + "request.js" + ], + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "scripts": { + "test": "npm run lint && npm run test-ci && npm run test-browser", + "test-ci": "taper tests/test-*.js", + "test-cov": "nyc --reporter=lcov tape tests/test-*.js", + "test-browser": "node tests/browser/start.js", + "lint": "standard" + }, + "devDependencies": { + "bluebird": "^3.2.1", + "browserify": "^13.0.1", + "browserify-istanbul": "^2.0.0", + "buffer-equal": "^1.0.0", + "codecov": "^3.0.4", + "coveralls": "^3.0.2", + "function-bind": "^1.0.2", + "karma": "^3.0.0", + "karma-browserify": "^5.0.1", + "karma-cli": "^1.0.0", + "karma-coverage": "^1.0.0", + "karma-phantomjs-launcher": "^1.0.0", + "karma-tap": "^3.0.1", + "nyc": "^14.1.1", + "phantomjs-prebuilt": "^2.1.3", + "rimraf": "^2.2.8", + "server-destroy": "^1.0.1", + "standard": "^9.0.0", + "tape": "^4.6.0", + "taper": "^0.5.0" + }, + "greenkeeper": { + "ignore": [ + "hawk", + "har-validator" + ] + } +} diff --git a/node_modules/request/request.js b/node_modules/request/request.js new file mode 100644 index 00000000..198b7609 --- /dev/null +++ b/node_modules/request/request.js @@ -0,0 +1,1553 @@ +'use strict' + +var http = require('http') +var https = require('https') +var url = require('url') +var util = require('util') +var stream = require('stream') +var zlib = require('zlib') +var aws2 = require('aws-sign2') +var aws4 = require('aws4') +var httpSignature = require('http-signature') +var mime = require('mime-types') +var caseless = require('caseless') +var ForeverAgent = require('forever-agent') +var FormData = require('form-data') +var extend = require('extend') +var isstream = require('isstream') +var isTypedArray = require('is-typedarray').strict +var helpers = require('./lib/helpers') +var cookies = require('./lib/cookies') +var getProxyFromURI = require('./lib/getProxyFromURI') +var Querystring = require('./lib/querystring').Querystring +var Har = require('./lib/har').Har +var Auth = require('./lib/auth').Auth +var OAuth = require('./lib/oauth').OAuth +var hawk = require('./lib/hawk') +var Multipart = require('./lib/multipart').Multipart +var Redirect = require('./lib/redirect').Redirect +var Tunnel = require('./lib/tunnel').Tunnel +var now = require('performance-now') +var Buffer = require('safe-buffer').Buffer + +var safeStringify = helpers.safeStringify +var isReadStream = helpers.isReadStream +var toBase64 = helpers.toBase64 +var defer = helpers.defer +var copy = helpers.copy +var version = helpers.version +var globalCookieJar = cookies.jar() + +var globalPool = {} + +function filterForNonReserved (reserved, options) { + // Filter out properties that are not reserved. + // Reserved values are passed in at call site. + + var object = {} + for (var i in options) { + var notReserved = (reserved.indexOf(i) === -1) + if (notReserved) { + object[i] = options[i] + } + } + return object +} + +function filterOutReservedFunctions (reserved, options) { + // Filter out properties that are functions and are reserved. + // Reserved values are passed in at call site. + + var object = {} + for (var i in options) { + var isReserved = !(reserved.indexOf(i) === -1) + var isFunction = (typeof options[i] === 'function') + if (!(isReserved && isFunction)) { + object[i] = options[i] + } + } + return object +} + +// Return a simpler request object to allow serialization +function requestToJSON () { + var self = this + return { + uri: self.uri, + method: self.method, + headers: self.headers + } +} + +// Return a simpler response object to allow serialization +function responseToJSON () { + var self = this + return { + statusCode: self.statusCode, + body: self.body, + headers: self.headers, + request: requestToJSON.call(self.request) + } +} + +function Request (options) { + // if given the method property in options, set property explicitMethod to true + + // extend the Request instance with any non-reserved properties + // remove any reserved functions from the options object + // set Request instance to be readable and writable + // call init + + var self = this + + // start with HAR, then override with additional options + if (options.har) { + self._har = new Har(self) + options = self._har.options(options) + } + + stream.Stream.call(self) + var reserved = Object.keys(Request.prototype) + var nonReserved = filterForNonReserved(reserved, options) + + extend(self, nonReserved) + options = filterOutReservedFunctions(reserved, options) + + self.readable = true + self.writable = true + if (options.method) { + self.explicitMethod = true + } + self._qs = new Querystring(self) + self._auth = new Auth(self) + self._oauth = new OAuth(self) + self._multipart = new Multipart(self) + self._redirect = new Redirect(self) + self._tunnel = new Tunnel(self) + self.init(options) +} + +util.inherits(Request, stream.Stream) + +// Debugging +Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG) +function debug () { + if (Request.debug) { + console.error('REQUEST %s', util.format.apply(util, arguments)) + } +} +Request.prototype.debug = debug + +Request.prototype.init = function (options) { + // init() contains all the code to setup the request object. + // the actual outgoing request is not started until start() is called + // this function is called from both the constructor and on redirect. + var self = this + if (!options) { + options = {} + } + self.headers = self.headers ? copy(self.headers) : {} + + // Delete headers with value undefined since they break + // ClientRequest.OutgoingMessage.setHeader in node 0.12 + for (var headerName in self.headers) { + if (typeof self.headers[headerName] === 'undefined') { + delete self.headers[headerName] + } + } + + caseless.httpify(self, self.headers) + + if (!self.method) { + self.method = options.method || 'GET' + } + if (!self.localAddress) { + self.localAddress = options.localAddress + } + + self._qs.init(options) + + debug(options) + if (!self.pool && self.pool !== false) { + self.pool = globalPool + } + self.dests = self.dests || [] + self.__isRequestRequest = true + + // Protect against double callback + if (!self._callback && self.callback) { + self._callback = self.callback + self.callback = function () { + if (self._callbackCalled) { + return // Print a warning maybe? + } + self._callbackCalled = true + self._callback.apply(self, arguments) + } + self.on('error', self.callback.bind()) + self.on('complete', self.callback.bind(self, null)) + } + + // People use this property instead all the time, so support it + if (!self.uri && self.url) { + self.uri = self.url + delete self.url + } + + // If there's a baseUrl, then use it as the base URL (i.e. uri must be + // specified as a relative path and is appended to baseUrl). + if (self.baseUrl) { + if (typeof self.baseUrl !== 'string') { + return self.emit('error', new Error('options.baseUrl must be a string')) + } + + if (typeof self.uri !== 'string') { + return self.emit('error', new Error('options.uri must be a string when using options.baseUrl')) + } + + if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) { + return self.emit('error', new Error('options.uri must be a path when using options.baseUrl')) + } + + // Handle all cases to make sure that there's only one slash between + // baseUrl and uri. + var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1 + var uriStartsWithSlash = self.uri.indexOf('/') === 0 + + if (baseUrlEndsWithSlash && uriStartsWithSlash) { + self.uri = self.baseUrl + self.uri.slice(1) + } else if (baseUrlEndsWithSlash || uriStartsWithSlash) { + self.uri = self.baseUrl + self.uri + } else if (self.uri === '') { + self.uri = self.baseUrl + } else { + self.uri = self.baseUrl + '/' + self.uri + } + delete self.baseUrl + } + + // A URI is needed by this point, emit error if we haven't been able to get one + if (!self.uri) { + return self.emit('error', new Error('options.uri is a required argument')) + } + + // If a string URI/URL was given, parse it into a URL object + if (typeof self.uri === 'string') { + self.uri = url.parse(self.uri) + } + + // Some URL objects are not from a URL parsed string and need href added + if (!self.uri.href) { + self.uri.href = url.format(self.uri) + } + + // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme + if (self.uri.protocol === 'unix:') { + return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`')) + } + + // Support Unix Sockets + if (self.uri.host === 'unix') { + self.enableUnixSocket() + } + + if (self.strictSSL === false) { + self.rejectUnauthorized = false + } + + if (!self.uri.pathname) { self.uri.pathname = '/' } + + if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) { + // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar + // Detect and reject it as soon as possible + var faultyUri = url.format(self.uri) + var message = 'Invalid URI "' + faultyUri + '"' + if (Object.keys(options).length === 0) { + // No option ? This can be the sign of a redirect + // As this is a case where the user cannot do anything (they didn't call request directly with this URL) + // they should be warned that it can be caused by a redirection (can save some hair) + message += '. This can be caused by a crappy redirection.' + } + // This error was fatal + self.abort() + return self.emit('error', new Error(message)) + } + + if (!self.hasOwnProperty('proxy')) { + self.proxy = getProxyFromURI(self.uri) + } + + self.tunnel = self._tunnel.isEnabled() + if (self.proxy) { + self._tunnel.setup(options) + } + + self._redirect.onRequest(options) + + self.setHost = false + if (!self.hasHeader('host')) { + var hostHeaderName = self.originalHostHeaderName || 'host' + self.setHeader(hostHeaderName, self.uri.host) + // Drop :port suffix from Host header if known protocol. + if (self.uri.port) { + if ((self.uri.port === '80' && self.uri.protocol === 'http:') || + (self.uri.port === '443' && self.uri.protocol === 'https:')) { + self.setHeader(hostHeaderName, self.uri.hostname) + } + } + self.setHost = true + } + + self.jar(self._jar || options.jar) + + if (!self.uri.port) { + if (self.uri.protocol === 'http:') { self.uri.port = 80 } else if (self.uri.protocol === 'https:') { self.uri.port = 443 } + } + + if (self.proxy && !self.tunnel) { + self.port = self.proxy.port + self.host = self.proxy.hostname + } else { + self.port = self.uri.port + self.host = self.uri.hostname + } + + if (options.form) { + self.form(options.form) + } + + if (options.formData) { + var formData = options.formData + var requestForm = self.form() + var appendFormValue = function (key, value) { + if (value && value.hasOwnProperty('value') && value.hasOwnProperty('options')) { + requestForm.append(key, value.value, value.options) + } else { + requestForm.append(key, value) + } + } + for (var formKey in formData) { + if (formData.hasOwnProperty(formKey)) { + var formValue = formData[formKey] + if (formValue instanceof Array) { + for (var j = 0; j < formValue.length; j++) { + appendFormValue(formKey, formValue[j]) + } + } else { + appendFormValue(formKey, formValue) + } + } + } + } + + if (options.qs) { + self.qs(options.qs) + } + + if (self.uri.path) { + self.path = self.uri.path + } else { + self.path = self.uri.pathname + (self.uri.search || '') + } + + if (self.path.length === 0) { + self.path = '/' + } + + // Auth must happen last in case signing is dependent on other headers + if (options.aws) { + self.aws(options.aws) + } + + if (options.hawk) { + self.hawk(options.hawk) + } + + if (options.httpSignature) { + self.httpSignature(options.httpSignature) + } + + if (options.auth) { + if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) { + options.auth.user = options.auth.username + } + if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) { + options.auth.pass = options.auth.password + } + + self.auth( + options.auth.user, + options.auth.pass, + options.auth.sendImmediately, + options.auth.bearer + ) + } + + if (self.gzip && !self.hasHeader('accept-encoding')) { + self.setHeader('accept-encoding', 'gzip, deflate') + } + + if (self.uri.auth && !self.hasHeader('authorization')) { + var uriAuthPieces = self.uri.auth.split(':').map(function (item) { return self._qs.unescape(item) }) + self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true) + } + + if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) { + var proxyAuthPieces = self.proxy.auth.split(':').map(function (item) { return self._qs.unescape(item) }) + var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':')) + self.setHeader('proxy-authorization', authHeader) + } + + if (self.proxy && !self.tunnel) { + self.path = (self.uri.protocol + '//' + self.uri.host + self.path) + } + + if (options.json) { + self.json(options.json) + } + if (options.multipart) { + self.multipart(options.multipart) + } + + if (options.time) { + self.timing = true + + // NOTE: elapsedTime is deprecated in favor of .timings + self.elapsedTime = self.elapsedTime || 0 + } + + function setContentLength () { + if (isTypedArray(self.body)) { + self.body = Buffer.from(self.body) + } + + if (!self.hasHeader('content-length')) { + var length + if (typeof self.body === 'string') { + length = Buffer.byteLength(self.body) + } else if (Array.isArray(self.body)) { + length = self.body.reduce(function (a, b) { return a + b.length }, 0) + } else { + length = self.body.length + } + + if (length) { + self.setHeader('content-length', length) + } else { + self.emit('error', new Error('Argument error, options.body.')) + } + } + } + if (self.body && !isstream(self.body)) { + setContentLength() + } + + if (options.oauth) { + self.oauth(options.oauth) + } else if (self._oauth.params && self.hasHeader('authorization')) { + self.oauth(self._oauth.params) + } + + var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol + var defaultModules = {'http:': http, 'https:': https} + var httpModules = self.httpModules || {} + + self.httpModule = httpModules[protocol] || defaultModules[protocol] + + if (!self.httpModule) { + return self.emit('error', new Error('Invalid protocol: ' + protocol)) + } + + if (options.ca) { + self.ca = options.ca + } + + if (!self.agent) { + if (options.agentOptions) { + self.agentOptions = options.agentOptions + } + + if (options.agentClass) { + self.agentClass = options.agentClass + } else if (options.forever) { + var v = version() + // use ForeverAgent in node 0.10- only + if (v.major === 0 && v.minor <= 10) { + self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL + } else { + self.agentClass = self.httpModule.Agent + self.agentOptions = self.agentOptions || {} + self.agentOptions.keepAlive = true + } + } else { + self.agentClass = self.httpModule.Agent + } + } + + if (self.pool === false) { + self.agent = false + } else { + self.agent = self.agent || self.getNewAgent() + } + + self.on('pipe', function (src) { + if (self.ntick && self._started) { + self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.')) + } + self.src = src + if (isReadStream(src)) { + if (!self.hasHeader('content-type')) { + self.setHeader('content-type', mime.lookup(src.path)) + } + } else { + if (src.headers) { + for (var i in src.headers) { + if (!self.hasHeader(i)) { + self.setHeader(i, src.headers[i]) + } + } + } + if (self._json && !self.hasHeader('content-type')) { + self.setHeader('content-type', 'application/json') + } + if (src.method && !self.explicitMethod) { + self.method = src.method + } + } + + // self.on('pipe', function () { + // console.error('You have already piped to this stream. Pipeing twice is likely to break the request.') + // }) + }) + + defer(function () { + if (self._aborted) { + return + } + + var end = function () { + if (self._form) { + if (!self._auth.hasAuth) { + self._form.pipe(self) + } else if (self._auth.hasAuth && self._auth.sentAuth) { + self._form.pipe(self) + } + } + if (self._multipart && self._multipart.chunked) { + self._multipart.body.pipe(self) + } + if (self.body) { + if (isstream(self.body)) { + self.body.pipe(self) + } else { + setContentLength() + if (Array.isArray(self.body)) { + self.body.forEach(function (part) { + self.write(part) + }) + } else { + self.write(self.body) + } + self.end() + } + } else if (self.requestBodyStream) { + console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.') + self.requestBodyStream.pipe(self) + } else if (!self.src) { + if (self._auth.hasAuth && !self._auth.sentAuth) { + self.end() + return + } + if (self.method !== 'GET' && typeof self.method !== 'undefined') { + self.setHeader('content-length', 0) + } + self.end() + } + } + + if (self._form && !self.hasHeader('content-length')) { + // Before ending the request, we had to compute the length of the whole form, asyncly + self.setHeader(self._form.getHeaders(), true) + self._form.getLength(function (err, length) { + if (!err && !isNaN(length)) { + self.setHeader('content-length', length) + } + end() + }) + } else { + end() + } + + self.ntick = true + }) +} + +Request.prototype.getNewAgent = function () { + var self = this + var Agent = self.agentClass + var options = {} + if (self.agentOptions) { + for (var i in self.agentOptions) { + options[i] = self.agentOptions[i] + } + } + if (self.ca) { + options.ca = self.ca + } + if (self.ciphers) { + options.ciphers = self.ciphers + } + if (self.secureProtocol) { + options.secureProtocol = self.secureProtocol + } + if (self.secureOptions) { + options.secureOptions = self.secureOptions + } + if (typeof self.rejectUnauthorized !== 'undefined') { + options.rejectUnauthorized = self.rejectUnauthorized + } + + if (self.cert && self.key) { + options.key = self.key + options.cert = self.cert + } + + if (self.pfx) { + options.pfx = self.pfx + } + + if (self.passphrase) { + options.passphrase = self.passphrase + } + + var poolKey = '' + + // different types of agents are in different pools + if (Agent !== self.httpModule.Agent) { + poolKey += Agent.name + } + + // ca option is only relevant if proxy or destination are https + var proxy = self.proxy + if (typeof proxy === 'string') { + proxy = url.parse(proxy) + } + var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' + + if (isHttps) { + if (options.ca) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.ca + } + + if (typeof options.rejectUnauthorized !== 'undefined') { + if (poolKey) { + poolKey += ':' + } + poolKey += options.rejectUnauthorized + } + + if (options.cert) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.cert.toString('ascii') + options.key.toString('ascii') + } + + if (options.pfx) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.pfx.toString('ascii') + } + + if (options.ciphers) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.ciphers + } + + if (options.secureProtocol) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.secureProtocol + } + + if (options.secureOptions) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.secureOptions + } + } + + if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) { + // not doing anything special. Use the globalAgent + return self.httpModule.globalAgent + } + + // we're using a stored agent. Make sure it's protocol-specific + poolKey = self.uri.protocol + poolKey + + // generate a new agent for this setting if none yet exists + if (!self.pool[poolKey]) { + self.pool[poolKey] = new Agent(options) + // properly set maxSockets on new agents + if (self.pool.maxSockets) { + self.pool[poolKey].maxSockets = self.pool.maxSockets + } + } + + return self.pool[poolKey] +} + +Request.prototype.start = function () { + // start() is called once we are ready to send the outgoing HTTP request. + // this is usually called on the first write(), end() or on nextTick() + var self = this + + if (self.timing) { + // All timings will be relative to this request's startTime. In order to do this, + // we need to capture the wall-clock start time (via Date), immediately followed + // by the high-resolution timer (via now()). While these two won't be set + // at the _exact_ same time, they should be close enough to be able to calculate + // high-resolution, monotonically non-decreasing timestamps relative to startTime. + var startTime = new Date().getTime() + var startTimeNow = now() + } + + if (self._aborted) { + return + } + + self._started = true + self.method = self.method || 'GET' + self.href = self.uri.href + + if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) { + self.setHeader('content-length', self.src.stat.size) + } + if (self._aws) { + self.aws(self._aws, true) + } + + // We have a method named auth, which is completely different from the http.request + // auth option. If we don't remove it, we're gonna have a bad time. + var reqOptions = copy(self) + delete reqOptions.auth + + debug('make request', self.uri.href) + + // node v6.8.0 now supports a `timeout` value in `http.request()`, but we + // should delete it for now since we handle timeouts manually for better + // consistency with node versions before v6.8.0 + delete reqOptions.timeout + + try { + self.req = self.httpModule.request(reqOptions) + } catch (err) { + self.emit('error', err) + return + } + + if (self.timing) { + self.startTime = startTime + self.startTimeNow = startTimeNow + + // Timing values will all be relative to startTime (by comparing to startTimeNow + // so we have an accurate clock) + self.timings = {} + } + + var timeout + if (self.timeout && !self.timeoutTimer) { + if (self.timeout < 0) { + timeout = 0 + } else if (typeof self.timeout === 'number' && isFinite(self.timeout)) { + timeout = self.timeout + } + } + + self.req.on('response', self.onRequestResponse.bind(self)) + self.req.on('error', self.onRequestError.bind(self)) + self.req.on('drain', function () { + self.emit('drain') + }) + + self.req.on('socket', function (socket) { + // `._connecting` was the old property which was made public in node v6.1.0 + var isConnecting = socket._connecting || socket.connecting + if (self.timing) { + self.timings.socket = now() - self.startTimeNow + + if (isConnecting) { + var onLookupTiming = function () { + self.timings.lookup = now() - self.startTimeNow + } + + var onConnectTiming = function () { + self.timings.connect = now() - self.startTimeNow + } + + socket.once('lookup', onLookupTiming) + socket.once('connect', onConnectTiming) + + // clean up timing event listeners if needed on error + self.req.once('error', function () { + socket.removeListener('lookup', onLookupTiming) + socket.removeListener('connect', onConnectTiming) + }) + } + } + + var setReqTimeout = function () { + // This timeout sets the amount of time to wait *between* bytes sent + // from the server once connected. + // + // In particular, it's useful for erroring if the server fails to send + // data halfway through streaming a response. + self.req.setTimeout(timeout, function () { + if (self.req) { + self.abort() + var e = new Error('ESOCKETTIMEDOUT') + e.code = 'ESOCKETTIMEDOUT' + e.connect = false + self.emit('error', e) + } + }) + } + if (timeout !== undefined) { + // Only start the connection timer if we're actually connecting a new + // socket, otherwise if we're already connected (because this is a + // keep-alive connection) do not bother. This is important since we won't + // get a 'connect' event for an already connected socket. + if (isConnecting) { + var onReqSockConnect = function () { + socket.removeListener('connect', onReqSockConnect) + self.clearTimeout() + setReqTimeout() + } + + socket.on('connect', onReqSockConnect) + + self.req.on('error', function (err) { // eslint-disable-line handle-callback-err + socket.removeListener('connect', onReqSockConnect) + }) + + // Set a timeout in memory - this block will throw if the server takes more + // than `timeout` to write the HTTP status and headers (corresponding to + // the on('response') event on the client). NB: this measures wall-clock + // time, not the time between bytes sent by the server. + self.timeoutTimer = setTimeout(function () { + socket.removeListener('connect', onReqSockConnect) + self.abort() + var e = new Error('ETIMEDOUT') + e.code = 'ETIMEDOUT' + e.connect = true + self.emit('error', e) + }, timeout) + } else { + // We're already connected + setReqTimeout() + } + } + self.emit('socket', socket) + }) + + self.emit('request', self.req) +} + +Request.prototype.onRequestError = function (error) { + var self = this + if (self._aborted) { + return + } + if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' && + self.agent.addRequestNoreuse) { + self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } + self.start() + self.req.end() + return + } + self.clearTimeout() + self.emit('error', error) +} + +Request.prototype.onRequestResponse = function (response) { + var self = this + + if (self.timing) { + self.timings.response = now() - self.startTimeNow + } + + debug('onRequestResponse', self.uri.href, response.statusCode, response.headers) + response.on('end', function () { + if (self.timing) { + self.timings.end = now() - self.startTimeNow + response.timingStart = self.startTime + + // fill in the blanks for any periods that didn't trigger, such as + // no lookup or connect due to keep alive + if (!self.timings.socket) { + self.timings.socket = 0 + } + if (!self.timings.lookup) { + self.timings.lookup = self.timings.socket + } + if (!self.timings.connect) { + self.timings.connect = self.timings.lookup + } + if (!self.timings.response) { + self.timings.response = self.timings.connect + } + + debug('elapsed time', self.timings.end) + + // elapsedTime includes all redirects + self.elapsedTime += Math.round(self.timings.end) + + // NOTE: elapsedTime is deprecated in favor of .timings + response.elapsedTime = self.elapsedTime + + // timings is just for the final fetch + response.timings = self.timings + + // pre-calculate phase timings as well + response.timingPhases = { + wait: self.timings.socket, + dns: self.timings.lookup - self.timings.socket, + tcp: self.timings.connect - self.timings.lookup, + firstByte: self.timings.response - self.timings.connect, + download: self.timings.end - self.timings.response, + total: self.timings.end + } + } + debug('response end', self.uri.href, response.statusCode, response.headers) + }) + + if (self._aborted) { + debug('aborted', self.uri.href) + response.resume() + return + } + + self.response = response + response.request = self + response.toJSON = responseToJSON + + // XXX This is different on 0.10, because SSL is strict by default + if (self.httpModule === https && + self.strictSSL && (!response.hasOwnProperty('socket') || + !response.socket.authorized)) { + debug('strict ssl error', self.uri.href) + var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL' + self.emit('error', new Error('SSL Error: ' + sslErr)) + return + } + + // Save the original host before any redirect (if it changes, we need to + // remove any authorization headers). Also remember the case of the header + // name because lots of broken servers expect Host instead of host and we + // want the caller to be able to specify this. + self.originalHost = self.getHeader('host') + if (!self.originalHostHeaderName) { + self.originalHostHeaderName = self.hasHeader('host') + } + if (self.setHost) { + self.removeHeader('host') + } + self.clearTimeout() + + var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar + var addCookie = function (cookie) { + // set the cookie if it's domain in the href's domain. + try { + targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true}) + } catch (e) { + self.emit('error', e) + } + } + + response.caseless = caseless(response.headers) + + if (response.caseless.has('set-cookie') && (!self._disableCookies)) { + var headerName = response.caseless.has('set-cookie') + if (Array.isArray(response.headers[headerName])) { + response.headers[headerName].forEach(addCookie) + } else { + addCookie(response.headers[headerName]) + } + } + + if (self._redirect.onResponse(response)) { + return // Ignore the rest of the response + } else { + // Be a good stream and emit end when the response is finished. + // Hack to emit end on close because of a core bug that never fires end + response.on('close', function () { + if (!self._ended) { + self.response.emit('end') + } + }) + + response.once('end', function () { + self._ended = true + }) + + var noBody = function (code) { + return ( + self.method === 'HEAD' || + // Informational + (code >= 100 && code < 200) || + // No Content + code === 204 || + // Not Modified + code === 304 + ) + } + + var responseContent + if (self.gzip && !noBody(response.statusCode)) { + var contentEncoding = response.headers['content-encoding'] || 'identity' + contentEncoding = contentEncoding.trim().toLowerCase() + + // Be more lenient with decoding compressed responses, since (very rarely) + // servers send slightly invalid gzip responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + var zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + } + + if (contentEncoding === 'gzip') { + responseContent = zlib.createGunzip(zlibOptions) + response.pipe(responseContent) + } else if (contentEncoding === 'deflate') { + responseContent = zlib.createInflate(zlibOptions) + response.pipe(responseContent) + } else { + // Since previous versions didn't check for Content-Encoding header, + // ignore any invalid values to preserve backwards-compatibility + if (contentEncoding !== 'identity') { + debug('ignoring unrecognized Content-Encoding ' + contentEncoding) + } + responseContent = response + } + } else { + responseContent = response + } + + if (self.encoding) { + if (self.dests.length !== 0) { + console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.') + } else { + responseContent.setEncoding(self.encoding) + } + } + + if (self._paused) { + responseContent.pause() + } + + self.responseContent = responseContent + + self.emit('response', response) + + self.dests.forEach(function (dest) { + self.pipeDest(dest) + }) + + responseContent.on('data', function (chunk) { + if (self.timing && !self.responseStarted) { + self.responseStartTime = (new Date()).getTime() + + // NOTE: responseStartTime is deprecated in favor of .timings + response.responseStartTime = self.responseStartTime + } + self._destdata = true + self.emit('data', chunk) + }) + responseContent.once('end', function (chunk) { + self.emit('end', chunk) + }) + responseContent.on('error', function (error) { + self.emit('error', error) + }) + responseContent.on('close', function () { self.emit('close') }) + + if (self.callback) { + self.readResponseBody(response) + } else { // if no callback + self.on('end', function () { + if (self._aborted) { + debug('aborted', self.uri.href) + return + } + self.emit('complete', response) + }) + } + } + debug('finish init function', self.uri.href) +} + +Request.prototype.readResponseBody = function (response) { + var self = this + debug("reading response's body") + var buffers = [] + var bufferLength = 0 + var strings = [] + + self.on('data', function (chunk) { + if (!Buffer.isBuffer(chunk)) { + strings.push(chunk) + } else if (chunk.length) { + bufferLength += chunk.length + buffers.push(chunk) + } + }) + self.on('end', function () { + debug('end event', self.uri.href) + if (self._aborted) { + debug('aborted', self.uri.href) + // `buffer` is defined in the parent scope and used in a closure it exists for the life of the request. + // This can lead to leaky behavior if the user retains a reference to the request object. + buffers = [] + bufferLength = 0 + return + } + + if (bufferLength) { + debug('has body', self.uri.href, bufferLength) + response.body = Buffer.concat(buffers, bufferLength) + if (self.encoding !== null) { + response.body = response.body.toString(self.encoding) + } + // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request. + // This can lead to leaky behavior if the user retains a reference to the request object. + buffers = [] + bufferLength = 0 + } else if (strings.length) { + // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation. + // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse(). + if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') { + strings[0] = strings[0].substring(1) + } + response.body = strings.join('') + } + + if (self._json) { + try { + response.body = JSON.parse(response.body, self._jsonReviver) + } catch (e) { + debug('invalid JSON received', self.uri.href) + } + } + debug('emitting complete', self.uri.href) + if (typeof response.body === 'undefined' && !self._json) { + response.body = self.encoding === null ? Buffer.alloc(0) : '' + } + self.emit('complete', response, response.body) + }) +} + +Request.prototype.abort = function () { + var self = this + self._aborted = true + + if (self.req) { + self.req.abort() + } else if (self.response) { + self.response.destroy() + } + + self.clearTimeout() + self.emit('abort') +} + +Request.prototype.pipeDest = function (dest) { + var self = this + var response = self.response + // Called after the response is received + if (dest.headers && !dest.headersSent) { + if (response.caseless.has('content-type')) { + var ctname = response.caseless.has('content-type') + if (dest.setHeader) { + dest.setHeader(ctname, response.headers[ctname]) + } else { + dest.headers[ctname] = response.headers[ctname] + } + } + + if (response.caseless.has('content-length')) { + var clname = response.caseless.has('content-length') + if (dest.setHeader) { + dest.setHeader(clname, response.headers[clname]) + } else { + dest.headers[clname] = response.headers[clname] + } + } + } + if (dest.setHeader && !dest.headersSent) { + for (var i in response.headers) { + // If the response content is being decoded, the Content-Encoding header + // of the response doesn't represent the piped content, so don't pass it. + if (!self.gzip || i !== 'content-encoding') { + dest.setHeader(i, response.headers[i]) + } + } + dest.statusCode = response.statusCode + } + if (self.pipefilter) { + self.pipefilter(response, dest) + } +} + +Request.prototype.qs = function (q, clobber) { + var self = this + var base + if (!clobber && self.uri.query) { + base = self._qs.parse(self.uri.query) + } else { + base = {} + } + + for (var i in q) { + base[i] = q[i] + } + + var qs = self._qs.stringify(base) + + if (qs === '') { + return self + } + + self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs) + self.url = self.uri + self.path = self.uri.path + + if (self.uri.host === 'unix') { + self.enableUnixSocket() + } + + return self +} +Request.prototype.form = function (form) { + var self = this + if (form) { + if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { + self.setHeader('content-type', 'application/x-www-form-urlencoded') + } + self.body = (typeof form === 'string') + ? self._qs.rfc3986(form.toString('utf8')) + : self._qs.stringify(form).toString('utf8') + return self + } + // create form-data object + self._form = new FormData() + self._form.on('error', function (err) { + err.message = 'form-data: ' + err.message + self.emit('error', err) + self.abort() + }) + return self._form +} +Request.prototype.multipart = function (multipart) { + var self = this + + self._multipart.onRequest(multipart) + + if (!self._multipart.chunked) { + self.body = self._multipart.body + } + + return self +} +Request.prototype.json = function (val) { + var self = this + + if (!self.hasHeader('accept')) { + self.setHeader('accept', 'application/json') + } + + if (typeof self.jsonReplacer === 'function') { + self._jsonReplacer = self.jsonReplacer + } + + self._json = true + if (typeof val === 'boolean') { + if (self.body !== undefined) { + if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { + self.body = safeStringify(self.body, self._jsonReplacer) + } else { + self.body = self._qs.rfc3986(self.body) + } + if (!self.hasHeader('content-type')) { + self.setHeader('content-type', 'application/json') + } + } + } else { + self.body = safeStringify(val, self._jsonReplacer) + if (!self.hasHeader('content-type')) { + self.setHeader('content-type', 'application/json') + } + } + + if (typeof self.jsonReviver === 'function') { + self._jsonReviver = self.jsonReviver + } + + return self +} +Request.prototype.getHeader = function (name, headers) { + var self = this + var result, re, match + if (!headers) { + headers = self.headers + } + Object.keys(headers).forEach(function (key) { + if (key.length !== name.length) { + return + } + re = new RegExp(name, 'i') + match = key.match(re) + if (match) { + result = headers[key] + } + }) + return result +} +Request.prototype.enableUnixSocket = function () { + // Get the socket & request paths from the URL + var unixParts = this.uri.path.split(':') + var host = unixParts[0] + var path = unixParts[1] + // Apply unix properties to request + this.socketPath = host + this.uri.pathname = path + this.uri.path = path + this.uri.host = host + this.uri.hostname = host + this.uri.isUnix = true +} + +Request.prototype.auth = function (user, pass, sendImmediately, bearer) { + var self = this + + self._auth.onRequest(user, pass, sendImmediately, bearer) + + return self +} +Request.prototype.aws = function (opts, now) { + var self = this + + if (!now) { + self._aws = opts + return self + } + + if (opts.sign_version === 4 || opts.sign_version === '4') { + // use aws4 + var options = { + host: self.uri.host, + path: self.uri.path, + method: self.method, + headers: self.headers, + body: self.body + } + if (opts.service) { + options.service = opts.service + } + var signRes = aws4.sign(options, { + accessKeyId: opts.key, + secretAccessKey: opts.secret, + sessionToken: opts.session + }) + self.setHeader('authorization', signRes.headers.Authorization) + self.setHeader('x-amz-date', signRes.headers['X-Amz-Date']) + if (signRes.headers['X-Amz-Security-Token']) { + self.setHeader('x-amz-security-token', signRes.headers['X-Amz-Security-Token']) + } + } else { + // default: use aws-sign2 + var date = new Date() + self.setHeader('date', date.toUTCString()) + var auth = { + key: opts.key, + secret: opts.secret, + verb: self.method.toUpperCase(), + date: date, + contentType: self.getHeader('content-type') || '', + md5: self.getHeader('content-md5') || '', + amazonHeaders: aws2.canonicalizeHeaders(self.headers) + } + var path = self.uri.path + if (opts.bucket && path) { + auth.resource = '/' + opts.bucket + path + } else if (opts.bucket && !path) { + auth.resource = '/' + opts.bucket + } else if (!opts.bucket && path) { + auth.resource = path + } else if (!opts.bucket && !path) { + auth.resource = '/' + } + auth.resource = aws2.canonicalizeResource(auth.resource) + self.setHeader('authorization', aws2.authorization(auth)) + } + + return self +} +Request.prototype.httpSignature = function (opts) { + var self = this + httpSignature.signRequest({ + getHeader: function (header) { + return self.getHeader(header, self.headers) + }, + setHeader: function (header, value) { + self.setHeader(header, value) + }, + method: self.method, + path: self.path + }, opts) + debug('httpSignature authorization', self.getHeader('authorization')) + + return self +} +Request.prototype.hawk = function (opts) { + var self = this + self.setHeader('Authorization', hawk.header(self.uri, self.method, opts)) +} +Request.prototype.oauth = function (_oauth) { + var self = this + + self._oauth.onRequest(_oauth) + + return self +} + +Request.prototype.jar = function (jar) { + var self = this + var cookies + + if (self._redirect.redirectsFollowed === 0) { + self.originalCookieHeader = self.getHeader('cookie') + } + + if (!jar) { + // disable cookies + cookies = false + self._disableCookies = true + } else { + var targetCookieJar = jar.getCookieString ? jar : globalCookieJar + var urihref = self.uri.href + // fetch cookie in the Specified host + if (targetCookieJar) { + cookies = targetCookieJar.getCookieString(urihref) + } + } + + // if need cookie and cookie is not empty + if (cookies && cookies.length) { + if (self.originalCookieHeader) { + // Don't overwrite existing Cookie header + self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies) + } else { + self.setHeader('cookie', cookies) + } + } + self._jar = jar + return self +} + +// Stream API +Request.prototype.pipe = function (dest, opts) { + var self = this + + if (self.response) { + if (self._destdata) { + self.emit('error', new Error('You cannot pipe after data has been emitted from the response.')) + } else if (self._ended) { + self.emit('error', new Error('You cannot pipe after the response has been ended.')) + } else { + stream.Stream.prototype.pipe.call(self, dest, opts) + self.pipeDest(dest) + return dest + } + } else { + self.dests.push(dest) + stream.Stream.prototype.pipe.call(self, dest, opts) + return dest + } +} +Request.prototype.write = function () { + var self = this + if (self._aborted) { return } + + if (!self._started) { + self.start() + } + if (self.req) { + return self.req.write.apply(self.req, arguments) + } +} +Request.prototype.end = function (chunk) { + var self = this + if (self._aborted) { return } + + if (chunk) { + self.write(chunk) + } + if (!self._started) { + self.start() + } + if (self.req) { + self.req.end() + } +} +Request.prototype.pause = function () { + var self = this + if (!self.responseContent) { + self._paused = true + } else { + self.responseContent.pause.apply(self.responseContent, arguments) + } +} +Request.prototype.resume = function () { + var self = this + if (!self.responseContent) { + self._paused = false + } else { + self.responseContent.resume.apply(self.responseContent, arguments) + } +} +Request.prototype.destroy = function () { + var self = this + this.clearTimeout() + if (!self._ended) { + self.end() + } else if (self.response) { + self.response.destroy() + } +} + +Request.prototype.clearTimeout = function () { + if (this.timeoutTimer) { + clearTimeout(this.timeoutTimer) + this.timeoutTimer = null + } +} + +Request.defaultProxyHeaderWhiteList = + Tunnel.defaultProxyHeaderWhiteList.slice() + +Request.defaultProxyHeaderExclusiveList = + Tunnel.defaultProxyHeaderExclusiveList.slice() + +// Exports + +Request.prototype.toJSON = requestToJSON +module.exports = Request diff --git a/node_modules/require-directory/.jshintrc b/node_modules/require-directory/.jshintrc new file mode 100644 index 00000000..e14e4dcb --- /dev/null +++ b/node_modules/require-directory/.jshintrc @@ -0,0 +1,67 @@ +{ + "maxerr" : 50, + "bitwise" : true, + "camelcase" : true, + "curly" : true, + "eqeqeq" : true, + "forin" : true, + "immed" : true, + "indent" : 2, + "latedef" : true, + "newcap" : true, + "noarg" : true, + "noempty" : true, + "nonew" : true, + "plusplus" : true, + "quotmark" : true, + "undef" : true, + "unused" : true, + "strict" : true, + "trailing" : true, + "maxparams" : false, + "maxdepth" : false, + "maxstatements" : false, + "maxcomplexity" : false, + "maxlen" : false, + "asi" : false, + "boss" : false, + "debug" : false, + "eqnull" : true, + "es5" : false, + "esnext" : false, + "moz" : false, + "evil" : false, + "expr" : true, + "funcscope" : true, + "globalstrict" : true, + "iterator" : true, + "lastsemic" : false, + "laxbreak" : false, + "laxcomma" : false, + "loopfunc" : false, + "multistr" : false, + "proto" : false, + "scripturl" : false, + "smarttabs" : false, + "shadow" : false, + "sub" : false, + "supernew" : false, + "validthis" : false, + "browser" : true, + "couch" : false, + "devel" : true, + "dojo" : false, + "jquery" : false, + "mootools" : false, + "node" : true, + "nonstandard" : false, + "prototypejs" : false, + "rhino" : false, + "worker" : false, + "wsh" : false, + "yui" : false, + "nomen" : true, + "onevar" : true, + "passfail" : false, + "white" : true +} diff --git a/node_modules/require-directory/.npmignore b/node_modules/require-directory/.npmignore new file mode 100644 index 00000000..47cf365a --- /dev/null +++ b/node_modules/require-directory/.npmignore @@ -0,0 +1 @@ +test/** diff --git a/node_modules/require-directory/.travis.yml b/node_modules/require-directory/.travis.yml new file mode 100644 index 00000000..20fd86b6 --- /dev/null +++ b/node_modules/require-directory/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - 0.10 diff --git a/node_modules/require-directory/LICENSE b/node_modules/require-directory/LICENSE new file mode 100644 index 00000000..a70f253a --- /dev/null +++ b/node_modules/require-directory/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2011 Troy Goode + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/require-directory/README.markdown b/node_modules/require-directory/README.markdown new file mode 100644 index 00000000..926a063e --- /dev/null +++ b/node_modules/require-directory/README.markdown @@ -0,0 +1,184 @@ +# require-directory + +Recursively iterates over specified directory, `require()`'ing each file, and returning a nested hash structure containing those modules. + +**[Follow me (@troygoode) on Twitter!](https://twitter.com/intent/user?screen_name=troygoode)** + +[![NPM](https://nodei.co/npm/require-directory.png?downloads=true&stars=true)](https://nodei.co/npm/require-directory/) + +[![build status](https://secure.travis-ci.org/troygoode/node-require-directory.png)](http://travis-ci.org/troygoode/node-require-directory) + +## How To Use + +### Installation (via [npm](https://npmjs.org/package/require-directory)) + +```bash +$ npm install require-directory +``` + +### Usage + +A common pattern in node.js is to include an index file which creates a hash of the files in its current directory. Given a directory structure like so: + +* app.js +* routes/ + * index.js + * home.js + * auth/ + * login.js + * logout.js + * register.js + +`routes/index.js` uses `require-directory` to build the hash (rather than doing so manually) like so: + +```javascript +var requireDirectory = require('require-directory'); +module.exports = requireDirectory(module); +``` + +`app.js` references `routes/index.js` like any other module, but it now has a hash/tree of the exports from the `./routes/` directory: + +```javascript +var routes = require('./routes'); + +// snip + +app.get('/', routes.home); +app.get('/register', routes.auth.register); +app.get('/login', routes.auth.login); +app.get('/logout', routes.auth.logout); +``` + +The `routes` variable above is the equivalent of this: + +```javascript +var routes = { + home: require('routes/home.js'), + auth: { + login: require('routes/auth/login.js'), + logout: require('routes/auth/logout.js'), + register: require('routes/auth/register.js') + } +}; +``` + +*Note that `routes.index` will be `undefined` as you would hope.* + +### Specifying Another Directory + +You can specify which directory you want to build a tree of (if it isn't the current directory for whatever reason) by passing it as the second parameter. Not specifying the path (`requireDirectory(module)`) is the equivelant of `requireDirectory(module, __dirname)`: + +```javascript +var requireDirectory = require('require-directory'); +module.exports = requireDirectory(module, './some/subdirectory'); +``` + +For example, in the [example in the Usage section](#usage) we could have avoided creating `routes/index.js` and instead changed the first lines of `app.js` to: + +```javascript +var requireDirectory = require('require-directory'); +var routes = requireDirectory(module, './routes'); +``` + +## Options + +You can pass an options hash to `require-directory` as the 2nd parameter (or 3rd if you're passing the path to another directory as the 2nd parameter already). Here are the available options: + +### Whitelisting + +Whitelisting (either via RegExp or function) allows you to specify that only certain files be loaded. + +```javascript +var requireDirectory = require('require-directory'), + whitelist = /onlyinclude.js$/, + hash = requireDirectory(module, {include: whitelist}); +``` + +```javascript +var requireDirectory = require('require-directory'), + check = function(path){ + if(/onlyinclude.js$/.test(path)){ + return true; // don't include + }else{ + return false; // go ahead and include + } + }, + hash = requireDirectory(module, {include: check}); +``` + +### Blacklisting + +Blacklisting (either via RegExp or function) allows you to specify that all but certain files should be loaded. + +```javascript +var requireDirectory = require('require-directory'), + blacklist = /dontinclude\.js$/, + hash = requireDirectory(module, {exclude: blacklist}); +``` + +```javascript +var requireDirectory = require('require-directory'), + check = function(path){ + if(/dontinclude\.js$/.test(path)){ + return false; // don't include + }else{ + return true; // go ahead and include + } + }, + hash = requireDirectory(module, {exclude: check}); +``` + +### Visiting Objects As They're Loaded + +`require-directory` takes a function as the `visit` option that will be called for each module that is added to module.exports. + +```javascript +var requireDirectory = require('require-directory'), + visitor = function(obj) { + console.log(obj); // will be called for every module that is loaded + }, + hash = requireDirectory(module, {visit: visitor}); +``` + +The visitor can also transform the objects by returning a value: + +```javascript +var requireDirectory = require('require-directory'), + visitor = function(obj) { + return obj(new Date()); + }, + hash = requireDirectory(module, {visit: visitor}); +``` + +### Renaming Keys + +```javascript +var requireDirectory = require('require-directory'), + renamer = function(name) { + return name.toUpperCase(); + }, + hash = requireDirectory(module, {rename: renamer}); +``` + +### No Recursion + +```javascript +var requireDirectory = require('require-directory'), + hash = requireDirectory(module, {recurse: false}); +``` + +## Run Unit Tests + +```bash +$ npm run lint +$ npm test +``` + +## License + +[MIT License](http://www.opensource.org/licenses/mit-license.php) + +## Author + +[Troy Goode](https://github.com/TroyGoode) ([troygoode@gmail.com](mailto:troygoode@gmail.com)) + diff --git a/node_modules/require-directory/index.js b/node_modules/require-directory/index.js new file mode 100644 index 00000000..cd37da7e --- /dev/null +++ b/node_modules/require-directory/index.js @@ -0,0 +1,86 @@ +'use strict'; + +var fs = require('fs'), + join = require('path').join, + resolve = require('path').resolve, + dirname = require('path').dirname, + defaultOptions = { + extensions: ['js', 'json', 'coffee'], + recurse: true, + rename: function (name) { + return name; + }, + visit: function (obj) { + return obj; + } + }; + +function checkFileInclusion(path, filename, options) { + return ( + // verify file has valid extension + (new RegExp('\\.(' + options.extensions.join('|') + ')$', 'i').test(filename)) && + + // if options.include is a RegExp, evaluate it and make sure the path passes + !(options.include && options.include instanceof RegExp && !options.include.test(path)) && + + // if options.include is a function, evaluate it and make sure the path passes + !(options.include && typeof options.include === 'function' && !options.include(path, filename)) && + + // if options.exclude is a RegExp, evaluate it and make sure the path doesn't pass + !(options.exclude && options.exclude instanceof RegExp && options.exclude.test(path)) && + + // if options.exclude is a function, evaluate it and make sure the path doesn't pass + !(options.exclude && typeof options.exclude === 'function' && options.exclude(path, filename)) + ); +} + +function requireDirectory(m, path, options) { + var retval = {}; + + // path is optional + if (path && !options && typeof path !== 'string') { + options = path; + path = null; + } + + // default options + options = options || {}; + for (var prop in defaultOptions) { + if (typeof options[prop] === 'undefined') { + options[prop] = defaultOptions[prop]; + } + } + + // if no path was passed in, assume the equivelant of __dirname from caller + // otherwise, resolve path relative to the equivalent of __dirname + path = !path ? dirname(m.filename) : resolve(dirname(m.filename), path); + + // get the path of each file in specified directory, append to current tree node, recurse + fs.readdirSync(path).forEach(function (filename) { + var joined = join(path, filename), + files, + key, + obj; + + if (fs.statSync(joined).isDirectory() && options.recurse) { + // this node is a directory; recurse + files = requireDirectory(m, joined, options); + // exclude empty directories + if (Object.keys(files).length) { + retval[options.rename(filename, joined, filename)] = files; + } + } else { + if (joined !== m.filename && checkFileInclusion(joined, filename, options)) { + // hash node key shouldn't include file extension + key = filename.substring(0, filename.lastIndexOf('.')); + obj = m.require(joined); + retval[options.rename(key, joined, filename)] = options.visit(obj, joined, filename) || obj; + } + } + }); + + return retval; +} + +module.exports = requireDirectory; +module.exports.defaults = defaultOptions; diff --git a/node_modules/require-directory/package.json b/node_modules/require-directory/package.json new file mode 100644 index 00000000..25ece4b3 --- /dev/null +++ b/node_modules/require-directory/package.json @@ -0,0 +1,40 @@ +{ + "author": "Troy Goode (http://github.com/troygoode/)", + "name": "require-directory", + "version": "2.1.1", + "description": "Recursively iterates over specified directory, require()'ing each file, and returning a nested hash structure containing those modules.", + "keywords": [ + "require", + "directory", + "library", + "recursive" + ], + "homepage": "https://github.com/troygoode/node-require-directory/", + "main": "index.js", + "repository": { + "type": "git", + "url": "git://github.com/troygoode/node-require-directory.git" + }, + "contributors": [ + { + "name": "Troy Goode", + "email": "troygoode@gmail.com", + "web": "http://github.com/troygoode/" + } + ], + "license": "MIT", + "bugs": { + "url": "http://github.com/troygoode/node-require-directory/issues/" + }, + "engines": { + "node": ">=0.10.0" + }, + "devDependencies": { + "jshint": "^2.6.0", + "mocha": "^2.1.0" + }, + "scripts": { + "test": "mocha", + "lint": "jshint index.js test/test.js" + } +} diff --git a/node_modules/require-main-filename/.npmignore b/node_modules/require-main-filename/.npmignore new file mode 100644 index 00000000..6f9fe6ba --- /dev/null +++ b/node_modules/require-main-filename/.npmignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store +.nyc_output diff --git a/node_modules/require-main-filename/.travis.yml b/node_modules/require-main-filename/.travis.yml new file mode 100644 index 00000000..ab61ce77 --- /dev/null +++ b/node_modules/require-main-filename/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +os: + - linux +node_js: + - "0.10" + - "0.12" + - "4.1" + - "node" diff --git a/node_modules/require-main-filename/LICENSE.txt b/node_modules/require-main-filename/LICENSE.txt new file mode 100644 index 00000000..836440be --- /dev/null +++ b/node_modules/require-main-filename/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (c) 2016, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/require-main-filename/README.md b/node_modules/require-main-filename/README.md new file mode 100644 index 00000000..820d9f58 --- /dev/null +++ b/node_modules/require-main-filename/README.md @@ -0,0 +1,26 @@ +# require-main-filename + +[![Build Status](https://travis-ci.org/yargs/require-main-filename.png)](https://travis-ci.org/yargs/require-main-filename) +[![Coverage Status](https://coveralls.io/repos/yargs/require-main-filename/badge.svg?branch=master)](https://coveralls.io/r/yargs/require-main-filename?branch=master) +[![NPM version](https://img.shields.io/npm/v/require-main-filename.svg)](https://www.npmjs.com/package/require-main-filename) + +`require.main.filename` is great for figuring out the entry +point for the current application. This can be combined with a module like +[pkg-conf](https://www.npmjs.com/package/pkg-conf) to, _as if by magic_, load +top-level configuration. + +Unfortunately, `require.main.filename` sometimes fails when an application is +executed with an alternative process manager, e.g., [iisnode](https://github.com/tjanczuk/iisnode). + +`require-main-filename` is a shim that addresses this problem. + +## Usage + +```js +var main = require('require-main-filename')() +// use main as an alternative to require.main.filename. +``` + +## License + +ISC diff --git a/node_modules/require-main-filename/index.js b/node_modules/require-main-filename/index.js new file mode 100644 index 00000000..dca7f0cc --- /dev/null +++ b/node_modules/require-main-filename/index.js @@ -0,0 +1,18 @@ +module.exports = function (_require) { + _require = _require || require + var main = _require.main + if (main && isIISNode(main)) return handleIISNode(main) + else return main ? main.filename : process.cwd() +} + +function isIISNode (main) { + return /\\iisnode\\/.test(main.filename) +} + +function handleIISNode (main) { + if (!main.children.length) { + return main.filename + } else { + return main.children[0].filename + } +} diff --git a/node_modules/require-main-filename/package.json b/node_modules/require-main-filename/package.json new file mode 100644 index 00000000..558db27b --- /dev/null +++ b/node_modules/require-main-filename/package.json @@ -0,0 +1,30 @@ +{ + "name": "require-main-filename", + "version": "1.0.1", + "description": "shim for require.main.filename() that works in as many environments as possible", + "main": "index.js", + "scripts": { + "pretest": "standard", + "test": "tap --coverage test.js" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/yargs/require-main-filename.git" + }, + "keywords": [ + "require", + "shim", + "iisnode" + ], + "author": "Ben Coe ", + "license": "ISC", + "bugs": { + "url": "https://github.com/yargs/require-main-filename/issues" + }, + "homepage": "https://github.com/yargs/require-main-filename#readme", + "devDependencies": { + "chai": "^3.5.0", + "standard": "^6.0.5", + "tap": "^5.2.0" + } +} diff --git a/node_modules/require-main-filename/test.js b/node_modules/require-main-filename/test.js new file mode 100644 index 00000000..d89e7dcb --- /dev/null +++ b/node_modules/require-main-filename/test.js @@ -0,0 +1,36 @@ +/* global describe, it */ + +var requireMainFilename = require('./') + +require('tap').mochaGlobals() +require('chai').should() + +describe('require-main-filename', function () { + it('returns require.main.filename in normal circumstances', function () { + requireMainFilename().should.match(/test\.js/) + }) + + it('should use children[0].filename when running on iisnode', function () { + var main = { + filename: 'D:\\Program Files (x86)\\iisnode\\interceptor.js', + children: [ {filename: 'D:\\home\\site\\wwwroot\\server.js'} ] + } + requireMainFilename({ + main: main + }).should.match(/server\.js/) + }) + + it('should not use children[0] if no children exist', function () { + var main = { + filename: 'D:\\Program Files (x86)\\iisnode\\interceptor.js', + children: [] + } + requireMainFilename({ + main: main + }).should.match(/interceptor\.js/) + }) + + it('should default to process.cwd() if require.main is undefined', function () { + requireMainFilename({}).should.match(/require-main-filename/) + }) +}) diff --git a/node_modules/resolve-dir/LICENSE b/node_modules/resolve-dir/LICENSE new file mode 100644 index 00000000..65251717 --- /dev/null +++ b/node_modules/resolve-dir/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2016, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/resolve-dir/README.md b/node_modules/resolve-dir/README.md new file mode 100644 index 00000000..36607574 --- /dev/null +++ b/node_modules/resolve-dir/README.md @@ -0,0 +1,88 @@ +# resolve-dir [![NPM version](https://img.shields.io/npm/v/resolve-dir.svg?style=flat)](https://www.npmjs.com/package/resolve-dir) [![NPM downloads](https://img.shields.io/npm/dm/resolve-dir.svg?style=flat)](https://npmjs.org/package/resolve-dir) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/resolve-dir.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/resolve-dir) + +> Resolve a directory that is either local, global or in the user's home directory. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save resolve-dir +``` + +## Usage + +```js +var resolve = require('resolve-dir'); +``` + +Returns a local directory path unchanged + +```js +resolve('a') +//=> 'a' +``` + +Resolves the path to user home + +```js +resolve('~') +//=> '/Users/jonschlinkert' +resolve('~/foo') +//=> '/Users/jonschlinkert/foo' +``` + +Resolves the path to global npm modules + +```js +resolve('@') +//=> '/usr/local/lib/node_modules' +resolve('@/foo') +//=> '/usr/local/lib/node_modules/foo' +``` + +## About + +### Related projects + +* [expand-tilde](https://www.npmjs.com/package/expand-tilde): Bash-like tilde expansion for node.js. Expands a leading tilde in a file path to the… [more](https://github.com/jonschlinkert/expand-tilde) | [homepage](https://github.com/jonschlinkert/expand-tilde "Bash-like tilde expansion for node.js. Expands a leading tilde in a file path to the user home directory, or `~+` to the cwd.") +* [findup-sync](https://www.npmjs.com/package/findup-sync): Find the first file matching a given pattern in the current directory or the nearest… [more](https://github.com/cowboy/node-findup-sync) | [homepage](https://github.com/cowboy/node-findup-sync "Find the first file matching a given pattern in the current directory or the nearest ancestor directory.") +* [resolve-modules](https://www.npmjs.com/package/resolve-modules): Resolves local and global npm modules that match specified patterns, and returns a configuration object… [more](https://github.com/jonschlinkert/resolve-modules) | [homepage](https://github.com/jonschlinkert/resolve-modules "Resolves local and global npm modules that match specified patterns, and returns a configuration object for each resolved module.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/resolve-dir/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.2.0, on October 18, 2016._ \ No newline at end of file diff --git a/node_modules/resolve-dir/index.js b/node_modules/resolve-dir/index.js new file mode 100644 index 00000000..3fe53660 --- /dev/null +++ b/node_modules/resolve-dir/index.js @@ -0,0 +1,22 @@ +/*! + * resolve-dir + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var path = require('path'); +var expand = require('expand-tilde'); +var gm = require('global-modules'); + +module.exports = function resolveDir(dir) { + if (dir.charAt(0) === '~') { + dir = expand(dir); + } + if (dir.charAt(0) === '@') { + dir = path.join(gm, dir.slice(1)); + } + return dir; +}; diff --git a/node_modules/resolve-dir/package.json b/node_modules/resolve-dir/package.json new file mode 100644 index 00000000..1899e6e9 --- /dev/null +++ b/node_modules/resolve-dir/package.json @@ -0,0 +1,73 @@ +{ + "name": "resolve-dir", + "description": "Resolve a directory that is either local, global or in the user's home directory.", + "version": "1.0.1", + "homepage": "https://github.com/jonschlinkert/resolve-dir", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/resolve-dir", + "bugs": { + "url": "https://github.com/jonschlinkert/resolve-dir/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "devDependencies": { + "gulp-format-md": "^1.0.0", + "homedir-polyfill": "^1.0.1", + "mocha": "^3.5.0" + }, + "keywords": [ + "dir", + "directory", + "expansion", + "file", + "filepath", + "fp", + "global", + "home", + "modules", + "npm", + "path", + "resolve", + "tilde", + "user", + "user-home", + "userhome" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "expand-tilde", + "findup-sync", + "resolve-modules" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/resolve-options/LICENSE b/node_modules/resolve-options/LICENSE new file mode 100644 index 00000000..b8fc7433 --- /dev/null +++ b/node_modules/resolve-options/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/resolve-options/README.md b/node_modules/resolve-options/README.md new file mode 100644 index 00000000..60efcb32 --- /dev/null +++ b/node_modules/resolve-options/README.md @@ -0,0 +1,104 @@ +

      + + + +

      + +# resolve-options + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Resolve an options object based on configuration. + +## Usage + +```js +// This example assumes a Vinyl file + +var createResolver = require('resolve-options'); + +var config = { + cwd: { + type: 'string', + default: process.cwd + }, + sourcemaps: { + type: 'boolean', + default: false + }, + since: { + type: ['date', 'number'] + }, + read: { + type: 'boolean' + } +}; + +var options = { + sourcemaps: true, + since: Date.now(), + read: function(file) { + return (file.extname !== '.mp4'); + } +}; + +var resolver = createResolver(config, options); + +var cwd = resolver.resolve('cwd', file); +// cwd === process.cwd() + +var sourcemaps = resolver.resolve('sourcemaps', file); +// sourcemaps === true + +var read = resolver.resolve('read', file); +// Given .mp4, read === false +// Given .txt, read === true +``` + +## API + +### `createResolver([config,] [options])` + +Takes a `config` object that describes the options to accept/resolve and an `options` object (usually passed by a user) to resolve against the `config`. Returns a `resolver` that contains a `resolve` method for realtime resolution of options. + +The `config` object takes the following structure: +```graphql +config { + [optionKey] { + type // string, array or function + default // any value or function + } +} +``` + +Each option is represented by its `optionKey` in the `config` object. It must be an object with a `type` property. + +The `type` property must be a string, array or function which will be passed to the [`value-or-function`][value-or-function] module (functions will be bound to the resolver to allow for dependent options). + +A `default` property may also be specified as a fallback if the option isn't available or is invalid. The `default` value can be any value or a function (functions will be bound to the resolver to allow for dependent defaults). __Note:__ `default` values are not type-validated by the `value-or-function` module. + +### `resolver.resolve(optionKey, [...arguments])` + +Takes an `optionKey` string and any number of `arguments` to apply if an option is a function. Returns the resolved value for the `optionKey`. + +## License + +MIT + +[value-or-function]: https://github.com/gulpjs/value-or-function + +[downloads-image]: http://img.shields.io/npm/dm/resolve-options.svg +[npm-url]: https://npmjs.com/package/resolve-options +[npm-image]: http://img.shields.io/npm/v/resolve-options.svg + +[travis-url]: https://travis-ci.org/gulpjs/resolve-options +[travis-image]: http://img.shields.io/travis/gulpjs/resolve-options.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/resolve-options +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/resolve-options.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/resolve-options +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/resolve-options/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/node_modules/resolve-options/index.js b/node_modules/resolve-options/index.js new file mode 100644 index 00000000..21ef429d --- /dev/null +++ b/node_modules/resolve-options/index.js @@ -0,0 +1,111 @@ +'use strict'; + +var normalize = require('value-or-function'); + +var slice = Array.prototype.slice; + +function createResolver(config, options) { + // TODO: should the config object be validated? + config = config || {}; + options = options || {}; + + var resolver = { + resolve: resolve, + }; + + + // Keep constants separately + var constants = {}; + + function resolveConstant(key) { + if (constants.hasOwnProperty(key)) { + return constants[key]; + } + + var definition = config[key]; + // Ignore options that are not defined + if (!definition) { + return; + } + + var option = options[key]; + + if (option != null) { + if (typeof option === 'function') { + return; + } + option = normalize.call(resolver, definition.type, option); + if (option != null) { + constants[key] = option; + return option; + } + } + + var fallback = definition.default; + if (option == null && typeof fallback !== 'function') { + constants[key] = fallback; + return fallback; + } + } + + + // Keep requested keys to detect (and disallow) recursive resolution + var stack = []; + + function resolve(key) { + var option = resolveConstant(key); + if (option != null) { + return option; + } + + var definition = config[key]; + // Ignore options that are not defined + if (!definition) { + return; + } + + if (stack.indexOf(key) >= 0) { + throw new Error('Recursive resolution denied.'); + } + + option = options[key]; + var fallback = definition.default; + var appliedArgs = slice.call(arguments, 1); + var args = [definition.type, option].concat(appliedArgs); + + function toResolve() { + stack.push(key); + var option = normalize.apply(resolver, args); + + if (option == null) { + option = fallback; + if (typeof option === 'function') { + option = option.apply(resolver, appliedArgs); + } + } + + return option; + } + + function onResolve() { + stack.pop(); + } + + return tryResolve(toResolve, onResolve); + } + + + return resolver; +} + + +function tryResolve(toResolve, onResolve) { + try { + return toResolve(); + } finally { + onResolve(); + } +} + + +module.exports = createResolver; diff --git a/node_modules/resolve-options/package.json b/node_modules/resolve-options/package.json new file mode 100644 index 00000000..b1c89f67 --- /dev/null +++ b/node_modules/resolve-options/package.json @@ -0,0 +1,50 @@ +{ + "name": "resolve-options", + "version": "1.1.0", + "description": "Resolve an options object based on configuration.", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Blaine Bublitz " + ], + "repository": "gulpjs/resolve-options", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint index.js test/ && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "devDependencies": { + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mocha": "^3.2.0" + }, + "keywords": [ + "options", + "functions", + "resolver", + "type", + "configuration", + "config", + "opts", + "opt", + "default" + ] +} diff --git a/node_modules/resolve-url/.jshintrc b/node_modules/resolve-url/.jshintrc new file mode 100644 index 00000000..8703acd7 --- /dev/null +++ b/node_modules/resolve-url/.jshintrc @@ -0,0 +1,44 @@ +{ + "bitwise": true, + "camelcase": true, + "curly": false, + "eqeqeq": true, + "es3": true, + "forin": true, + "immed": false, + "indent": false, + "latedef": "nofunc", + "newcap": false, + "noarg": true, + "noempty": true, + "nonew": false, + "plusplus": false, + "quotmark": false, + "undef": true, + "unused": "vars", + "strict": false, + "trailing": true, + "maxparams": 5, + "maxdepth": false, + "maxstatements": false, + "maxcomplexity": false, + "maxlen": 100, + + "asi": true, + "expr": true, + "globalstrict": true, + "smarttabs": true, + "sub": true, + + "node": true, + "browser": true, + "globals": { + "describe": false, + "it": false, + "before": false, + "beforeEach": false, + "after": false, + "afterEach": false, + "define": false + } +} diff --git a/node_modules/resolve-url/LICENSE b/node_modules/resolve-url/LICENSE new file mode 100644 index 00000000..0595be36 --- /dev/null +++ b/node_modules/resolve-url/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Simon Lydell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/resolve-url/bower.json b/node_modules/resolve-url/bower.json new file mode 100644 index 00000000..31aa6f4e --- /dev/null +++ b/node_modules/resolve-url/bower.json @@ -0,0 +1,15 @@ +{ + "name": "resolve-url", + "version": "0.2.1", + "description": "Like Node.js’ `path.resolve`/`url.resolve` for the browser.", + "authors": ["Simon Lydell"], + "license": "MIT", + "main": "resolve-url.js", + "keywords": [ + "resolve", + "url" + ], + "ignore": [ + ".*" + ] +} diff --git a/node_modules/resolve-url/changelog.md b/node_modules/resolve-url/changelog.md new file mode 100644 index 00000000..2a4a6304 --- /dev/null +++ b/node_modules/resolve-url/changelog.md @@ -0,0 +1,15 @@ +### Version 0.2.1 (2014-02-25) ### + +- Fix edge case when (accidentally) supplying only one argument, and that + argument happens to be a falsy value such as `undefined` or `null`. + + +### Version 0.2.0 (2014-02-24) ### + +- Disallow passing 0 arguments. It’s weird and inconsistent between browsers. + (Backwards incompatible change.) + + +### Version 0.1.0 (2014-02-23) ### + +- Initial release. diff --git a/node_modules/resolve-url/component.json b/node_modules/resolve-url/component.json new file mode 100644 index 00000000..f37cf005 --- /dev/null +++ b/node_modules/resolve-url/component.json @@ -0,0 +1,15 @@ +{ + "name": "resolve-url", + "version": "0.2.1", + "license": "MIT", + "description": "Like Node.js’ `path.resolve`/`url.resolve` for the browser.", + "main": "resolve-url.js", + "repo": "lydell/resolve-url", + "keywords": [ + "resolve", + "url" + ], + "scripts": [ + "resolve-url.js" + ] +} diff --git a/node_modules/resolve-url/package.json b/node_modules/resolve-url/package.json new file mode 100644 index 00000000..94423663 --- /dev/null +++ b/node_modules/resolve-url/package.json @@ -0,0 +1,34 @@ +{ + "name": "resolve-url", + "version": "0.2.1", + "description": "Like Node.js’ `path.resolve`/`url.resolve` for the browser.", + "author": "Simon Lydell", + "license": "MIT", + "main": "resolve-url.js", + "repository": "lydell/resolve-url", + "keywords": [ + "resolve", + "url" + ], + "scripts": { + "test": "jshint resolve-url.js test/ && testling -u" + }, + "devDependencies": { + "testling": "~1.6.0", + "jshint": "~2.4.3", + "tape": "~2.5.0" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "chrome/latest", + "firefox/latest", + "opera/12", + "opera/latest", + "safari/5", + "iphone/6", + "android-browser/4" + ] + } +} diff --git a/node_modules/resolve-url/readme.md b/node_modules/resolve-url/readme.md new file mode 100644 index 00000000..1f864e8d --- /dev/null +++ b/node_modules/resolve-url/readme.md @@ -0,0 +1,83 @@ +Overview +======== + +[![browser support](https://ci.testling.com/lydell/resolve-url.png)](https://ci.testling.com/lydell/resolve-url) + +Like Node.js’ [`path.resolve`]/[`url.resolve`] for the browser. + +```js +var resolveUrl = require("resolve-url") + +window.location +// https://example.com/articles/resolving-urls/edit + +resolveUrl("remove") +// https://example.com/articles/resolving-urls/remove + +resolveUrl("/static/scripts/app.js") +// https://example.com/static/scripts/app.js + +// Imagine /static/scripts/app.js contains `//# sourceMappingURL=../source-maps/app.js.map` +resolveUrl("/static/scripts/app.js", "../source-maps/app.js.map") +// https://example.com/static/source-maps/app.js.map + +resolveUrl("/static/scripts/app.js", "../source-maps/app.js.map", "../coffee/app.coffee") +// https://example.com/static/coffee/app.coffee + +resolveUrl("//cdn.example.com/jquery.js") +// https://cdn.example.com/jquery.js + +resolveUrl("http://foo.org/") +// http://foo.org/ +``` + + +Installation +============ + +- `npm install resolve-url` +- `bower install resolve-url` +- `component install lydell/resolve-url` + +Works with CommonJS, AMD and browser globals, through UMD. + + +Usage +===== + +### `resolveUrl(...urls)` ### + +Pass one or more urls. Resolves the last one to an absolute url, using the +previous ones and `window.location`. + +It’s like starting out on `window.location`, and then clicking links with the +urls as `href` attributes in order, from left to right. + +Unlike Node.js’ [`path.resolve`], this function always goes through all of the +arguments, from left to right. `path.resolve` goes from right to left and only +in the worst case goes through them all. Should that matter. + +Actually, the function is _really_ like clicking a lot of links in series: An +actual `` gets its `href` attribute set for each url! This means that the +url resolution of the browser is used, which makes this module really +light-weight. + +Also note that this functions deals with urls, not paths, so in that respect it +has more in common with Node.js’ [`url.resolve`]. But the arguments are more +like [`path.resolve`]. + +[`path.resolve`]: http://nodejs.org/api/path.html#path_path_resolve_from_to +[`url.resolve`]: http://nodejs.org/api/url.html#url_url_resolve_from_to + + +Tests +===== + +Run `npm test`, which lints the code and then gives you a link to open in a +browser of choice (using `testling`). + + +License +======= + +[The X11 (“MIT”) License](LICENSE). diff --git a/node_modules/resolve-url/resolve-url.js b/node_modules/resolve-url/resolve-url.js new file mode 100644 index 00000000..dc5c5b7b --- /dev/null +++ b/node_modules/resolve-url/resolve-url.js @@ -0,0 +1,47 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +void (function(root, factory) { + if (typeof define === "function" && define.amd) { + define(factory) + } else if (typeof exports === "object") { + module.exports = factory() + } else { + root.resolveUrl = factory() + } +}(this, function() { + + function resolveUrl(/* ...urls */) { + var numUrls = arguments.length + + if (numUrls === 0) { + throw new Error("resolveUrl requires at least one argument; got none.") + } + + var base = document.createElement("base") + base.href = arguments[0] + + if (numUrls === 1) { + return base.href + } + + var head = document.getElementsByTagName("head")[0] + head.insertBefore(base, head.firstChild) + + var a = document.createElement("a") + var resolved + + for (var index = 1; index < numUrls; index++) { + a.href = arguments[index] + resolved = a.href + base.href = resolved + } + + head.removeChild(base) + + return resolved + } + + return resolveUrl + +})); diff --git a/node_modules/resolve-url/test/resolve-url.js b/node_modules/resolve-url/test/resolve-url.js new file mode 100644 index 00000000..7f135a7c --- /dev/null +++ b/node_modules/resolve-url/test/resolve-url.js @@ -0,0 +1,70 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +var test = require("tape") + +var resolveUrl = require("../") + +"use strict" + +test("resolveUrl", function(t) { + + t.plan(7) + + t.equal(typeof resolveUrl, "function", "is a function") + + t.equal( + resolveUrl("https://example.com/"), + "https://example.com/" + ) + + var loc = "https://example.com/articles/resolving-urls/edit" + + t.equal( + resolveUrl(loc, "remove"), + "https://example.com/articles/resolving-urls/remove" + ) + + t.equal( + resolveUrl(loc, "/static/scripts/app.js"), + "https://example.com/static/scripts/app.js" + ) + + t.equal( + resolveUrl(loc, "/static/scripts/app.js", "../source-maps/app.js.map"), + "https://example.com/static/source-maps/app.js.map" + ) + + t.equal( + resolveUrl(loc, "/static/scripts/app.js", "../source-maps/app.js.map", "../coffee/app.coffee"), + "https://example.com/static/coffee/app.coffee" + ) + + t.equal( + resolveUrl(loc, "//cdn.example.com/jquery.js"), + "https://cdn.example.com/jquery.js" + ) + +}) + +test("edge cases", function(t) { + + t.plan(4) + + t["throws"](resolveUrl, /at least one argument/, "throws with no arguments") + + var accidentallyUndefined + var result + t.doesNotThrow( + function() { result = resolveUrl(accidentallyUndefined) }, + "undefined is still an argument" + ) + t.ok(result.match(/\/undefined$/), "undefined is stringified") + + t.equal( + resolveUrl("http://foo.org/test", undefined, {}, ["a/b"], null), + "http://foo.org/a/null", + "arguments are stringified" + ) + +}) diff --git a/node_modules/resolve/.editorconfig b/node_modules/resolve/.editorconfig new file mode 100644 index 00000000..b96fcfbf --- /dev/null +++ b/node_modules/resolve/.editorconfig @@ -0,0 +1,34 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 200 + +[*.js] +block_comment_start = /* +block_comment = * +block_comment_end = */ + +[*.yml] +indent_size = 1 + +[package.json] +indent_style = tab + +[CHANGELOG.md] +indent_style = space +indent_size = 2 + +[{*.json,Makefile}] +max_line_length = off + +[test/{dotdot,resolver,module_dir,multirepo,node_path,pathfilter,precedence}/**/*] +indent_style = off +indent_size = off +max_line_length = off +insert_final_newline = off diff --git a/node_modules/resolve/.eslintignore b/node_modules/resolve/.eslintignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/node_modules/resolve/.eslintignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/resolve/.eslintrc b/node_modules/resolve/.eslintrc new file mode 100644 index 00000000..a22863c8 --- /dev/null +++ b/node_modules/resolve/.eslintrc @@ -0,0 +1,39 @@ +{ + "extends": "@ljharb", + "root": true, + "rules": { + "array-bracket-newline": 0, + "array-element-newline": 0, + "indent": [2, 4], + "strict": 0, + "complexity": 0, + "consistent-return": 0, + "curly": 0, + "dot-notation": [2, { "allowKeywords": true }], + "func-name-matching": 0, + "func-style": 0, + "global-require": 0, + "id-length": [2, { "min": 1, "max": 30 }], + "max-lines-per-function": 0, + "max-nested-callbacks": 0, + "max-params": 0, + "max-statements-per-line": [2, { "max": 2 }], + "max-statements": 0, + "no-magic-numbers": 0, + "no-console": 0, + "no-shadow": 0, + "no-unused-vars": [2, { "vars": "all", "args": "none" }], + "no-use-before-define": 0, + "object-curly-newline": 0, + "operator-linebreak": [2, "before"], + "sort-keys": 0, + }, + "overrides": [ + { + "files": "test/resolver/nested_symlinks/mylib/*.js", + "rules": { + "no-throw-literal": 0, + }, + }, + ], +} diff --git a/node_modules/resolve/.github/workflows/node-4+.yml b/node_modules/resolve/.github/workflows/node-4+.yml new file mode 100644 index 00000000..ba174e1d --- /dev/null +++ b/node_modules/resolve/.github/workflows/node-4+.yml @@ -0,0 +1,54 @@ +name: 'Tests: node.js' + +on: [pull_request, push] + +jobs: + matrix: + runs-on: ubuntu-latest + outputs: + latest: ${{ steps.set-matrix.outputs.requireds }} + minors: ${{ steps.set-matrix.outputs.optionals }} + steps: + - uses: ljharb/actions/node/matrix@main + id: set-matrix + with: + preset: '>=4' + + latest: + needs: [matrix] + name: 'latest minors' + runs-on: ubuntu-latest + + strategy: + matrix: ${{ fromJson(needs.matrix.outputs.latest) }} + + steps: + - uses: actions/checkout@v2 + - uses: ljharb/actions/node/run@main + name: 'npm install && npm run tests-only' + with: + node-version: ${{ matrix.node-version }} + command: 'tests-only' + minors: + needs: [matrix, latest] + name: 'non-latest minors' + continue-on-error: true + if: ${{ !github.head_ref || !startsWith(github.head_ref, 'renovate') }} + runs-on: ubuntu-latest + + strategy: + matrix: ${{ fromJson(needs.matrix.outputs.minors) }} + + steps: + - uses: actions/checkout@v2 + - uses: ljharb/actions/node/run@main + with: + node-version: ${{ matrix.node-version }} + command: 'tests-only' + + node: + name: 'node 4+' + needs: [latest, minors] + runs-on: ubuntu-latest + steps: + - run: 'echo tests completed' diff --git a/node_modules/resolve/.github/workflows/node-iojs.yml b/node_modules/resolve/.github/workflows/node-iojs.yml new file mode 100644 index 00000000..a813bfd2 --- /dev/null +++ b/node_modules/resolve/.github/workflows/node-iojs.yml @@ -0,0 +1,55 @@ +name: 'Tests: node.js (io.js)' + +on: [pull_request, push] + +jobs: + matrix: + runs-on: ubuntu-latest + outputs: + latest: ${{ steps.set-matrix.outputs.requireds }} + minors: ${{ steps.set-matrix.outputs.optionals }} + steps: + - uses: ljharb/actions/node/matrix@main + id: set-matrix + with: + preset: 'iojs' + + latest: + needs: [matrix] + name: 'latest minors' + runs-on: ubuntu-latest + + strategy: + matrix: ${{ fromJson(needs.matrix.outputs.latest) }} + + steps: + - uses: actions/checkout@v2 + - uses: ljharb/actions/node/run@main + name: 'npm install && npm run tests-only' + with: + node-version: ${{ matrix.node-version }} + command: 'tests-only' + minors: + needs: [matrix, latest] + name: 'non-latest minors' + continue-on-error: true + if: ${{ !github.head_ref || !startsWith(github.head_ref, 'renovate') }} + runs-on: ubuntu-latest + + strategy: + matrix: ${{ fromJson(needs.matrix.outputs.minors) }} + + steps: + - uses: actions/checkout@v2 + - uses: ljharb/actions/node/run@main + name: 'npm install && npm run tests-only' + with: + node-version: ${{ matrix.node-version }} + command: 'tests-only' + + node: + name: 'io.js' + needs: [latest, minors] + runs-on: ubuntu-latest + steps: + - run: 'echo tests completed' diff --git a/node_modules/resolve/.github/workflows/node-pretest.yml b/node_modules/resolve/.github/workflows/node-pretest.yml new file mode 100644 index 00000000..9ed76615 --- /dev/null +++ b/node_modules/resolve/.github/workflows/node-pretest.yml @@ -0,0 +1,27 @@ +name: 'Tests: pretest/posttest' + +on: [pull_request, push] + +jobs: + pretest: + runs-on: ubuntu-latest + + + steps: + - uses: actions/checkout@v2 + - uses: ljharb/actions/node/run@main + name: 'npm install && npm run pretest' + with: + node-version: 'lts/*' + command: 'pretest' + + posttest: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: ljharb/actions/node/run@main + name: 'npm install && npm run posttest' + with: + node-version: 'lts/*' + command: 'posttest' diff --git a/node_modules/resolve/.github/workflows/node-zero.yml b/node_modules/resolve/.github/workflows/node-zero.yml new file mode 100644 index 00000000..4b4f7f0f --- /dev/null +++ b/node_modules/resolve/.github/workflows/node-zero.yml @@ -0,0 +1,55 @@ +name: 'Tests: node.js (0.x)' + +on: [pull_request, push] + +jobs: + matrix: + runs-on: ubuntu-latest + outputs: + stable: ${{ steps.set-matrix.outputs.requireds }} + unstable: ${{ steps.set-matrix.outputs.optionals }} + steps: + - uses: ljharb/actions/node/matrix@main + id: set-matrix + with: + preset: '0.x' + + stable: + needs: [matrix] + name: 'stable minors' + runs-on: ubuntu-latest + + strategy: + matrix: ${{ fromJson(needs.matrix.outputs.stable) }} + + steps: + - uses: actions/checkout@v2 + - uses: ljharb/actions/node/run@main + with: + node-version: ${{ matrix.node-version }} + command: 'tests-only' + cache-node-modules-key: node_modules-${{ github.workflow }}-${{ github.action }}-${{ github.run_id }} + unstable: + needs: [matrix, stable] + name: 'unstable minors' + continue-on-error: true + if: ${{ !github.head_ref || !startsWith(github.head_ref, 'renovate') }} + runs-on: ubuntu-latest + + strategy: + matrix: ${{ fromJson(needs.matrix.outputs.unstable) }} + + steps: + - uses: actions/checkout@v2 + - uses: ljharb/actions/node/run@main + with: + node-version: ${{ matrix.node-version }} + command: 'tests-only' + cache-node-modules-key: node_modules-${{ github.workflow }}-${{ github.action }}-${{ github.run_id }} + + node: + name: 'node 0.x' + needs: [stable, unstable] + runs-on: ubuntu-latest + steps: + - run: 'echo tests completed' diff --git a/node_modules/resolve/.github/workflows/rebase.yml b/node_modules/resolve/.github/workflows/rebase.yml new file mode 100644 index 00000000..027aed07 --- /dev/null +++ b/node_modules/resolve/.github/workflows/rebase.yml @@ -0,0 +1,15 @@ +name: Automatic Rebase + +on: [pull_request_target] + +jobs: + _: + name: "Automatic Rebase" + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: ljharb/rebase@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/node_modules/resolve/.github/workflows/require-allow-edits.yml b/node_modules/resolve/.github/workflows/require-allow-edits.yml new file mode 100644 index 00000000..aac42d3e --- /dev/null +++ b/node_modules/resolve/.github/workflows/require-allow-edits.yml @@ -0,0 +1,14 @@ +name: Require “Allow Edits” + +on: [pull_request_target] + +jobs: + _: + name: "Require “Allow Edits”" + + runs-on: ubuntu-latest + + steps: + - uses: ljharb/require-allow-edits@main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/node_modules/resolve/LICENSE b/node_modules/resolve/LICENSE new file mode 100644 index 00000000..ff4fce28 --- /dev/null +++ b/node_modules/resolve/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2012 James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/resolve/appveyor.yml b/node_modules/resolve/appveyor.yml new file mode 100644 index 00000000..747fbdbb --- /dev/null +++ b/node_modules/resolve/appveyor.yml @@ -0,0 +1,74 @@ +version: 1.0.{build} +skip_branch_with_pr: true +build: off + +environment: + matrix: + #- nodejs_version: "15" + - nodejs_version: "14" + - nodejs_version: "13" + - nodejs_version: "12" + - nodejs_version: "11" + - nodejs_version: "10" + - nodejs_version: "9" + - nodejs_version: "8" + - nodejs_version: "7" + - nodejs_version: "6" + - nodejs_version: "5" + - nodejs_version: "4" + - nodejs_version: "3" + - nodejs_version: "2" + - nodejs_version: "1" + - nodejs_version: "0.12" + - nodejs_version: "0.10" + - nodejs_version: "0.8" + - nodejs_version: "0.6" +matrix: + # fast_finish: true + allow_failures: + - nodejs_version: "5" # due to windows npm bug, registry-side + - nodejs_version: "0.8" + # platform: x86 # x64 has started failing on the registry side, around early November 2020 + - nodejs_version: "0.6" + +platform: + - x86 + - x64 + +# Install scripts. (runs after repo cloning) +install: + # Fix symlinks in working copy (see https://github.com/appveyor/ci/issues/650#issuecomment-186592582) / https://github.com/charleskorn/batect/commit/d08986802ec43086902958c4ee7e57ff3e71dbef + - git config core.symlinks true + - git reset --hard + # Get the latest stable version of Node.js or io.js + - ps: if ($env:nodejs_version -ne '0.6') { Install-Product node $env:nodejs_version $env:platform } + - ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version) $env:platform + - IF %nodejs_version% EQU 0.6 npm config set strict-ssl false && npm -g install npm@1.3 + - IF %nodejs_version% EQU 0.8 npm config set strict-ssl false && npm -g install npm@1.4.28 && npm install -g npm@4.5 + - IF %nodejs_version% EQU 1 npm -g install npm@2.9 + - IF %nodejs_version% EQU 2 npm -g install npm@4 + - IF %nodejs_version% EQU 3 npm -g install npm@4 + - IF %nodejs_version% EQU 4 npm -g install npm@5.3 + - IF %nodejs_version% EQU 5 npm -g install npm@5.3 + - IF %nodejs_version% EQU 6 npm -g install npm@6.9 + - IF %nodejs_version% EQU 7 npm -g install npm@6 + - IF %nodejs_version% EQU 8 npm -g install npm@6 + - IF %nodejs_version% EQU 9 npm -g install npm@6.9 + - IF %nodejs_version% EQU 10 npm -g install npm@7 + - IF %nodejs_version% EQU 11 npm -g install npm@7 + - IF %nodejs_version% EQU 12 npm -g install npm@7 + - IF %nodejs_version% EQU 13 npm -g install npm@7 + - IF %nodejs_version% EQU 14 npm -g install npm@7 + - IF %nodejs_version% EQU 15 npm -g install npm@7 + - set PATH=%APPDATA%\npm;%PATH% + #- IF %nodejs_version% NEQ 0.6 AND %nodejs_version% NEQ 0.8 npm -g install npm + # install modules + - npm install + +# Post-install test scripts. +test_script: + # Output useful info for debugging. + - node --version + - npm --version + # run tests + - npm run tests-only diff --git a/node_modules/resolve/example/async.js b/node_modules/resolve/example/async.js new file mode 100644 index 00000000..20e65dc2 --- /dev/null +++ b/node_modules/resolve/example/async.js @@ -0,0 +1,5 @@ +var resolve = require('../'); +resolve('tap', { basedir: __dirname }, function (err, res) { + if (err) console.error(err); + else console.log(res); +}); diff --git a/node_modules/resolve/example/sync.js b/node_modules/resolve/example/sync.js new file mode 100644 index 00000000..54b2cc10 --- /dev/null +++ b/node_modules/resolve/example/sync.js @@ -0,0 +1,3 @@ +var resolve = require('../'); +var res = resolve.sync('tap', { basedir: __dirname }); +console.log(res); diff --git a/node_modules/resolve/index.js b/node_modules/resolve/index.js new file mode 100644 index 00000000..125d8146 --- /dev/null +++ b/node_modules/resolve/index.js @@ -0,0 +1,6 @@ +var async = require('./lib/async'); +async.core = require('./lib/core'); +async.isCore = require('./lib/is-core'); +async.sync = require('./lib/sync'); + +module.exports = async; diff --git a/node_modules/resolve/package.json b/node_modules/resolve/package.json new file mode 100644 index 00000000..dfcfc497 --- /dev/null +++ b/node_modules/resolve/package.json @@ -0,0 +1,51 @@ +{ + "name": "resolve", + "description": "resolve like require.resolve() on behalf of files asynchronously and synchronously", + "version": "1.19.0", + "repository": { + "type": "git", + "url": "git://github.com/browserify/resolve.git" + }, + "main": "index.js", + "keywords": [ + "resolve", + "require", + "node", + "module" + ], + "scripts": { + "prepublish": "safe-publish-latest && cp node_modules/is-core-module/core.json ./lib/", + "prelint": "eclint check '**/*'", + "lint": "eslint --ext=js,mjs .", + "pretests-only": "cd ./test/resolver/nested_symlinks && node mylib/sync && node mylib/async", + "tests-only": "tape test/*.js", + "pretest": "npm run lint", + "test": "npm run --silent tests-only", + "posttest": "npm run test:multirepo && aud --production", + "test:multirepo": "cd ./test/resolver/multirepo && npm install && npm test" + }, + "devDependencies": { + "@ljharb/eslint-config": "^17.2.0", + "array.prototype.map": "^1.0.2", + "aud": "^1.1.3", + "eclint": "^2.8.1", + "eslint": "^7.13.0", + "object-keys": "^1.1.1", + "safe-publish-latest": "^1.1.4", + "tap": "0.4.13", + "tape": "^5.0.1" + }, + "license": "MIT", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } +} diff --git a/node_modules/resolve/readme.markdown b/node_modules/resolve/readme.markdown new file mode 100644 index 00000000..f742c38d --- /dev/null +++ b/node_modules/resolve/readme.markdown @@ -0,0 +1,250 @@ +# resolve + +implements the [node `require.resolve()` +algorithm](https://nodejs.org/api/modules.html#modules_all_together) +such that you can `require.resolve()` on behalf of a file asynchronously and +synchronously + +[![build status](https://secure.travis-ci.org/browserify/resolve.png)](http://travis-ci.org/browserify/resolve) + +# example + +asynchronously resolve: + +```js +var resolve = require('resolve'); +resolve('tap', { basedir: __dirname }, function (err, res) { + if (err) console.error(err); + else console.log(res); +}); +``` + +``` +$ node example/async.js +/home/substack/projects/node-resolve/node_modules/tap/lib/main.js +``` + +synchronously resolve: + +```js +var resolve = require('resolve'); +var res = resolve.sync('tap', { basedir: __dirname }); +console.log(res); +``` + +``` +$ node example/sync.js +/home/substack/projects/node-resolve/node_modules/tap/lib/main.js +``` + +# methods + +```js +var resolve = require('resolve'); +``` + +For both the synchronous and asynchronous methods, errors may have any of the following `err.code` values: + +- `MODULE_NOT_FOUND`: the given path string (`id`) could not be resolved to a module +- `INVALID_BASEDIR`: the specified `opts.basedir` doesn't exist, or is not a directory +- `INVALID_PACKAGE_MAIN`: a `package.json` was encountered with an invalid `main` property (eg. not a string) + +## resolve(id, opts={}, cb) + +Asynchronously resolve the module path string `id` into `cb(err, res [, pkg])`, where `pkg` (if defined) is the data from `package.json`. + +options are: + +* opts.basedir - directory to begin resolving from + +* opts.package - `package.json` data applicable to the module being loaded + +* opts.extensions - array of file extensions to search in order + +* opts.includeCoreModules - set to `false` to exclude node core modules (e.g. `fs`) from the search + +* opts.readFile - how to read files asynchronously + +* opts.isFile - function to asynchronously test whether a file exists + +* opts.isDirectory - function to asynchronously test whether a directory exists + +* opts.realpath - function to asynchronously resolve a potential symlink to its real path + +* `opts.packageFilter(pkg, pkgfile, dir)` - transform the parsed package.json contents before looking at the "main" field + * pkg - package data + * pkgfile - path to package.json + * dir - directory for package.json + +* `opts.pathFilter(pkg, path, relativePath)` - transform a path within a package + * pkg - package data + * path - the path being resolved + * relativePath - the path relative from the package.json location + * returns - a relative path that will be joined from the package.json location + +* opts.paths - require.paths array to use if nothing is found on the normal `node_modules` recursive walk (probably don't use this) + + For advanced users, `paths` can also be a `opts.paths(request, start, opts)` function + * request - the import specifier being resolved + * start - lookup path + * getNodeModulesDirs - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* `opts.packageIterator(request, start, opts)` - return the list of candidate paths where the packages sources may be found (probably don't use this) + * request - the import specifier being resolved + * start - lookup path + * getPackageCandidates - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"` + +* opts.preserveSymlinks - if true, doesn't resolve `basedir` to real path before resolving. +This is the way Node resolves dependencies when executed with the [--preserve-symlinks](https://nodejs.org/api/all.html#cli_preserve_symlinks) flag. +**Note:** this property is currently `true` by default but it will be changed to +`false` in the next major version because *Node's resolution algorithm does not preserve symlinks by default*. + +default `opts` values: + +```js +{ + paths: [], + basedir: __dirname, + extensions: ['.js'], + includeCoreModules: true, + readFile: fs.readFile, + isFile: function isFile(file, cb) { + fs.stat(file, function (err, stat) { + if (!err) { + return cb(null, stat.isFile() || stat.isFIFO()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); + }, + isDirectory: function isDirectory(dir, cb) { + fs.stat(dir, function (err, stat) { + if (!err) { + return cb(null, stat.isDirectory()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); + }, + realpath: function realpath(file, cb) { + var realpath = typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath; + realpath(file, function (realPathErr, realPath) { + if (realPathErr && realPathErr.code !== 'ENOENT') cb(realPathErr); + else cb(null, realPathErr ? file : realPath); + }); + }, + moduleDirectory: 'node_modules', + preserveSymlinks: true +} +``` + +## resolve.sync(id, opts) + +Synchronously resolve the module path string `id`, returning the result and +throwing an error when `id` can't be resolved. + +options are: + +* opts.basedir - directory to begin resolving from + +* opts.extensions - array of file extensions to search in order + +* opts.includeCoreModules - set to `false` to exclude node core modules (e.g. `fs`) from the search + +* opts.readFile - how to read files synchronously + +* opts.isFile - function to synchronously test whether a file exists + +* opts.isDirectory - function to synchronously test whether a directory exists + +* opts.realpathSync - function to synchronously resolve a potential symlink to its real path + +* `opts.packageFilter(pkg, dir)` - transform the parsed package.json contents before looking at the "main" field + * pkg - package data + * dir - directory for package.json (Note: the second argument will change to "pkgfile" in v2) + +* `opts.pathFilter(pkg, path, relativePath)` - transform a path within a package + * pkg - package data + * path - the path being resolved + * relativePath - the path relative from the package.json location + * returns - a relative path that will be joined from the package.json location + +* opts.paths - require.paths array to use if nothing is found on the normal `node_modules` recursive walk (probably don't use this) + + For advanced users, `paths` can also be a `opts.paths(request, start, opts)` function + * request - the import specifier being resolved + * start - lookup path + * getNodeModulesDirs - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* `opts.packageIterator(request, start, opts)` - return the list of candidate paths where the packages sources may be found (probably don't use this) + * request - the import specifier being resolved + * start - lookup path + * getPackageCandidates - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"` + +* opts.preserveSymlinks - if true, doesn't resolve `basedir` to real path before resolving. +This is the way Node resolves dependencies when executed with the [--preserve-symlinks](https://nodejs.org/api/all.html#cli_preserve_symlinks) flag. +**Note:** this property is currently `true` by default but it will be changed to +`false` in the next major version because *Node's resolution algorithm does not preserve symlinks by default*. + +default `opts` values: + +```js +{ + paths: [], + basedir: __dirname, + extensions: ['.js'], + includeCoreModules: true, + readFileSync: fs.readFileSync, + isFile: function isFile(file) { + try { + var stat = fs.statSync(file); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isFile() || stat.isFIFO(); + }, + isDirectory: function isDirectory(dir) { + try { + var stat = fs.statSync(dir); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isDirectory(); + }, + realpathSync: function realpathSync(file) { + try { + var realpath = typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync; + return realpath(file); + } catch (realPathErr) { + if (realPathErr.code !== 'ENOENT') { + throw realPathErr; + } + } + return file; + }, + moduleDirectory: 'node_modules', + preserveSymlinks: true +} +``` + +# install + +With [npm](https://npmjs.org) do: + +```sh +npm install resolve +``` + +# license + +MIT diff --git a/node_modules/resolve/test/.eslintrc b/node_modules/resolve/test/.eslintrc new file mode 100644 index 00000000..ddd262df --- /dev/null +++ b/node_modules/resolve/test/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "max-lines": 0 + } +} diff --git a/node_modules/resolve/test/core.js b/node_modules/resolve/test/core.js new file mode 100644 index 00000000..7a3ccb16 --- /dev/null +++ b/node_modules/resolve/test/core.js @@ -0,0 +1,81 @@ +var test = require('tape'); +var keys = require('object-keys'); +var resolve = require('../'); + +test('core modules', function (t) { + t.test('isCore()', function (st) { + st.ok(resolve.isCore('fs')); + st.ok(resolve.isCore('net')); + st.ok(resolve.isCore('http')); + + st.ok(!resolve.isCore('seq')); + st.ok(!resolve.isCore('../')); + + st.ok(!resolve.isCore('toString')); + + st.end(); + }); + + t.test('core list', function (st) { + var cores = keys(resolve.core); + st.plan(cores.length); + + for (var i = 0; i < cores.length; ++i) { + var mod = cores[i]; + var requireFunc = function () { require(mod); }; // eslint-disable-line no-loop-func + console.log(mod, resolve.core, resolve.core[mod]); + if (resolve.core[mod]) { + st.doesNotThrow(requireFunc, mod + ' supported; requiring does not throw'); + } else { + st.throws(requireFunc, mod + ' not supported; requiring throws'); + } + } + + st.end(); + }); + + t.test('core via repl module', { skip: !resolve.core.repl }, function (st) { + var libs = require('repl')._builtinLibs; // eslint-disable-line no-underscore-dangle + if (!libs) { + st.skip('module.builtinModules does not exist'); + return st.end(); + } + for (var i = 0; i < libs.length; ++i) { + var mod = libs[i]; + st.ok(resolve.core[mod], mod + ' is a core module'); + st.doesNotThrow( + function () { require(mod); }, // eslint-disable-line no-loop-func + 'requiring ' + mod + ' does not throw' + ); + } + st.end(); + }); + + t.test('core via builtinModules list', { skip: !resolve.core.module }, function (st) { + var libs = require('module').builtinModules; + if (!libs) { + st.skip('module.builtinModules does not exist'); + return st.end(); + } + var blacklist = [ + '_debug_agent', + 'v8/tools/tickprocessor-driver', + 'v8/tools/SourceMap', + 'v8/tools/tickprocessor', + 'v8/tools/profile' + ]; + for (var i = 0; i < libs.length; ++i) { + var mod = libs[i]; + if (blacklist.indexOf(mod) === -1) { + st.ok(resolve.core[mod], mod + ' is a core module'); + st.doesNotThrow( + function () { require(mod); }, // eslint-disable-line no-loop-func + 'requiring ' + mod + ' does not throw' + ); + } + } + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/resolve/test/dotdot.js b/node_modules/resolve/test/dotdot.js new file mode 100644 index 00000000..30806659 --- /dev/null +++ b/node_modules/resolve/test/dotdot.js @@ -0,0 +1,29 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('dotdot', function (t) { + t.plan(4); + var dir = path.join(__dirname, '/dotdot/abc'); + + resolve('..', { basedir: dir }, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(__dirname, 'dotdot/index.js')); + }); + + resolve('.', { basedir: dir }, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, 'index.js')); + }); +}); + +test('dotdot sync', function (t) { + t.plan(2); + var dir = path.join(__dirname, '/dotdot/abc'); + + var a = resolve.sync('..', { basedir: dir }); + t.equal(a, path.join(__dirname, 'dotdot/index.js')); + + var b = resolve.sync('.', { basedir: dir }); + t.equal(b, path.join(dir, 'index.js')); +}); diff --git a/node_modules/resolve/test/dotdot/abc/index.js b/node_modules/resolve/test/dotdot/abc/index.js new file mode 100644 index 00000000..67f2534e --- /dev/null +++ b/node_modules/resolve/test/dotdot/abc/index.js @@ -0,0 +1,2 @@ +var x = require('..'); +console.log(x); diff --git a/node_modules/resolve/test/dotdot/index.js b/node_modules/resolve/test/dotdot/index.js new file mode 100644 index 00000000..643f9fcc --- /dev/null +++ b/node_modules/resolve/test/dotdot/index.js @@ -0,0 +1 @@ +module.exports = 'whatever'; diff --git a/node_modules/resolve/test/faulty_basedir.js b/node_modules/resolve/test/faulty_basedir.js new file mode 100644 index 00000000..5f2141a6 --- /dev/null +++ b/node_modules/resolve/test/faulty_basedir.js @@ -0,0 +1,29 @@ +var test = require('tape'); +var path = require('path'); +var resolve = require('../'); + +test('faulty basedir must produce error in windows', { skip: process.platform !== 'win32' }, function (t) { + t.plan(1); + + var resolverDir = 'C:\\a\\b\\c\\d'; + + resolve('tape/lib/test.js', { basedir: resolverDir }, function (err, res, pkg) { + t.equal(!!err, true); + }); +}); + +test('non-existent basedir should not throw when preserveSymlinks is false', function (t) { + t.plan(2); + + var opts = { + basedir: path.join(path.sep, 'unreal', 'path', 'that', 'does', 'not', 'exist'), + preserveSymlinks: false + }; + + var module = './dotdot/abc'; + + resolve(module, opts, function (err, res) { + t.equal(err.code, 'MODULE_NOT_FOUND'); + t.equal(res, undefined); + }); +}); diff --git a/node_modules/resolve/test/filter.js b/node_modules/resolve/test/filter.js new file mode 100644 index 00000000..8f8cccdb --- /dev/null +++ b/node_modules/resolve/test/filter.js @@ -0,0 +1,34 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('filter', function (t) { + t.plan(4); + var dir = path.join(__dirname, 'resolver'); + var packageFilterArgs; + resolve('./baz', { + basedir: dir, + packageFilter: function (pkg, pkgfile) { + pkg.main = 'doom'; // eslint-disable-line no-param-reassign + packageFilterArgs = [pkg, pkgfile]; + return pkg; + } + }, function (err, res, pkg) { + if (err) t.fail(err); + + t.equal(res, path.join(dir, 'baz/doom.js'), 'changing the package "main" works'); + + var packageData = packageFilterArgs[0]; + t.equal(pkg, packageData, 'first packageFilter argument is "pkg"'); + t.equal(packageData.main, 'doom', 'package "main" was altered'); + + var packageFile = packageFilterArgs[1]; + t.equal( + packageFile, + path.join(dir, 'baz/package.json'), + 'second packageFilter argument is "pkgfile"' + ); + + t.end(); + }); +}); diff --git a/node_modules/resolve/test/filter_sync.js b/node_modules/resolve/test/filter_sync.js new file mode 100644 index 00000000..8a43b981 --- /dev/null +++ b/node_modules/resolve/test/filter_sync.js @@ -0,0 +1,33 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('filter', function (t) { + var dir = path.join(__dirname, 'resolver'); + var packageFilterArgs; + var res = resolve.sync('./baz', { + basedir: dir, + // NOTE: in v2.x, this will be `pkg, pkgfile, dir`, but must remain "broken" here in v1.x for compatibility + packageFilter: function (pkg, /*pkgfile,*/ dir) { // eslint-disable-line spaced-comment + pkg.main = 'doom'; // eslint-disable-line no-param-reassign + packageFilterArgs = 'is 1.x' ? [pkg, dir] : [pkg, pkgfile, dir]; // eslint-disable-line no-constant-condition, no-undef + return pkg; + } + }); + + t.equal(res, path.join(dir, 'baz/doom.js'), 'changing the package "main" works'); + + var packageData = packageFilterArgs[0]; + t.equal(packageData.main, 'doom', 'package "main" was altered'); + + if (!'is 1.x') { // eslint-disable-line no-constant-condition + var packageFile = packageFilterArgs[1]; + t.equal(packageFile, path.join(dir, 'baz', 'package.json'), 'package.json path is correct'); + } + + var packageDir = packageFilterArgs['is 1.x' ? 1 : 2]; // eslint-disable-line no-constant-condition + // eslint-disable-next-line no-constant-condition + t.equal(packageDir, path.join(dir, 'baz'), ('is 1.x' ? 'second' : 'third') + ' packageFilter argument is "dir"'); + + t.end(); +}); diff --git a/node_modules/resolve/test/mock.js b/node_modules/resolve/test/mock.js new file mode 100644 index 00000000..b9f17fe2 --- /dev/null +++ b/node_modules/resolve/test/mock.js @@ -0,0 +1,239 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('mock', function (t) { + t.plan(8); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + }, + realpath: function (file, cb) { + cb(null, file); + } + }; + } + + resolve('./baz', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg, undefined); + }); + + resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg, undefined); + }); + + resolve('baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module 'baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + resolve('../baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module '../baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('mock from package', function (t) { + t.plan(8); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, file)); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + 'package': { main: 'bar' }, + readFile: function (file, cb) { + cb(null, files[file]); + }, + realpath: function (file, cb) { + cb(null, file); + } + }; + } + + resolve('./baz', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg && pkg.main, 'bar'); + }); + + resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg && pkg.main, 'bar'); + }); + + resolve('baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module 'baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + resolve('../baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module '../baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('mock package', function (t) { + t.plan(2); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + }, + realpath: function (file, cb) { + cb(null, file); + } + }; + } + + resolve('bar', opts('/foo'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/node_modules/bar/baz.js')); + t.equal(pkg && pkg.main, './baz.js'); + }); +}); + +test('mock package from package', function (t) { + t.plan(2); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + 'package': { main: 'bar' }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + }, + realpath: function (file, cb) { + cb(null, file); + } + }; + } + + resolve('bar', opts('/foo'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/node_modules/bar/baz.js')); + t.equal(pkg && pkg.main, './baz.js'); + }); +}); + +test('symlinked', function (t) { + t.plan(4); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/bar/symlinked/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + dirs[path.resolve('/foo/bar/symlinked')] = true; + + function opts(basedir) { + return { + preserveSymlinks: false, + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + }, + realpath: function (file, cb) { + var resolved = path.resolve(file); + + if (resolved.indexOf('symlinked') >= 0) { + cb(null, resolved); + return; + } + + var ext = path.extname(resolved); + + if (ext) { + var dir = path.dirname(resolved); + var base = path.basename(resolved); + cb(null, path.join(dir, 'symlinked', base)); + } else { + cb(null, path.join(resolved, 'symlinked')); + } + } + }; + } + + resolve('./baz', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/symlinked/baz.js')); + t.equal(pkg, undefined); + }); + + resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/symlinked/baz.js')); + t.equal(pkg, undefined); + }); +}); diff --git a/node_modules/resolve/test/mock_sync.js b/node_modules/resolve/test/mock_sync.js new file mode 100644 index 00000000..fcf81144 --- /dev/null +++ b/node_modules/resolve/test/mock_sync.js @@ -0,0 +1,141 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('mock', function (t) { + t.plan(4); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file) { + return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); + }, + isDirectory: function (dir) { + return !!dirs[path.resolve(dir)]; + }, + readFileSync: function (file) { + return files[path.resolve(file)]; + }, + realpathSync: function (file) { + return file; + } + }; + } + + t.equal( + resolve.sync('./baz', opts('/foo/bar')), + path.resolve('/foo/bar/baz.js') + ); + + t.equal( + resolve.sync('./baz.js', opts('/foo/bar')), + path.resolve('/foo/bar/baz.js') + ); + + t.throws(function () { + resolve.sync('baz', opts('/foo/bar')); + }); + + t.throws(function () { + resolve.sync('../baz', opts('/foo/bar')); + }); +}); + +test('mock package', function (t) { + t.plan(1); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file) { + return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); + }, + isDirectory: function (dir) { + return !!dirs[path.resolve(dir)]; + }, + readFileSync: function (file) { + return files[path.resolve(file)]; + }, + realpathSync: function (file) { + return file; + } + }; + } + + t.equal( + resolve.sync('bar', opts('/foo')), + path.resolve('/foo/node_modules/bar/baz.js') + ); +}); + +test('symlinked', function (t) { + t.plan(2); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/bar/symlinked/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + dirs[path.resolve('/foo/bar/symlinked')] = true; + + function opts(basedir) { + return { + preserveSymlinks: false, + basedir: path.resolve(basedir), + isFile: function (file) { + return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); + }, + isDirectory: function (dir) { + return !!dirs[path.resolve(dir)]; + }, + readFileSync: function (file) { + return files[path.resolve(file)]; + }, + realpathSync: function (file) { + var resolved = path.resolve(file); + + if (resolved.indexOf('symlinked') >= 0) { + return resolved; + } + + var ext = path.extname(resolved); + + if (ext) { + var dir = path.dirname(resolved); + var base = path.basename(resolved); + return path.join(dir, 'symlinked', base); + } else { + return path.join(resolved, 'symlinked'); + } + } + }; + } + + t.equal( + resolve.sync('./baz', opts('/foo/bar')), + path.resolve('/foo/bar/symlinked/baz.js') + ); + + t.equal( + resolve.sync('./baz.js', opts('/foo/bar')), + path.resolve('/foo/bar/symlinked/baz.js') + ); +}); diff --git a/node_modules/resolve/test/module_dir.js b/node_modules/resolve/test/module_dir.js new file mode 100644 index 00000000..b50e5bb1 --- /dev/null +++ b/node_modules/resolve/test/module_dir.js @@ -0,0 +1,56 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('moduleDirectory strings', function (t) { + t.plan(4); + var dir = path.join(__dirname, 'module_dir'); + var xopts = { + basedir: dir, + moduleDirectory: 'xmodules' + }; + resolve('aaa', xopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/xmodules/aaa/index.js')); + }); + + var yopts = { + basedir: dir, + moduleDirectory: 'ymodules' + }; + resolve('aaa', yopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/ymodules/aaa/index.js')); + }); +}); + +test('moduleDirectory array', function (t) { + t.plan(6); + var dir = path.join(__dirname, 'module_dir'); + var aopts = { + basedir: dir, + moduleDirectory: ['xmodules', 'ymodules', 'zmodules'] + }; + resolve('aaa', aopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/xmodules/aaa/index.js')); + }); + + var bopts = { + basedir: dir, + moduleDirectory: ['zmodules', 'ymodules', 'xmodules'] + }; + resolve('aaa', bopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/ymodules/aaa/index.js')); + }); + + var copts = { + basedir: dir, + moduleDirectory: ['xmodules', 'ymodules', 'zmodules'] + }; + resolve('bbb', copts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/zmodules/bbb/main.js')); + }); +}); diff --git a/node_modules/resolve/test/module_dir/xmodules/aaa/index.js b/node_modules/resolve/test/module_dir/xmodules/aaa/index.js new file mode 100644 index 00000000..dd7cf7b2 --- /dev/null +++ b/node_modules/resolve/test/module_dir/xmodules/aaa/index.js @@ -0,0 +1 @@ +module.exports = function (x) { return x * 100; }; diff --git a/node_modules/resolve/test/module_dir/ymodules/aaa/index.js b/node_modules/resolve/test/module_dir/ymodules/aaa/index.js new file mode 100644 index 00000000..ef2d4d4b --- /dev/null +++ b/node_modules/resolve/test/module_dir/ymodules/aaa/index.js @@ -0,0 +1 @@ +module.exports = function (x) { return x + 100; }; diff --git a/node_modules/resolve/test/module_dir/zmodules/bbb/main.js b/node_modules/resolve/test/module_dir/zmodules/bbb/main.js new file mode 100644 index 00000000..e8ba6299 --- /dev/null +++ b/node_modules/resolve/test/module_dir/zmodules/bbb/main.js @@ -0,0 +1 @@ +module.exports = function (n) { return n * 111; }; diff --git a/node_modules/resolve/test/module_dir/zmodules/bbb/package.json b/node_modules/resolve/test/module_dir/zmodules/bbb/package.json new file mode 100644 index 00000000..c13b8cf6 --- /dev/null +++ b/node_modules/resolve/test/module_dir/zmodules/bbb/package.json @@ -0,0 +1,3 @@ +{ + "main": "main.js" +} diff --git a/node_modules/resolve/test/node-modules-paths.js b/node_modules/resolve/test/node-modules-paths.js new file mode 100644 index 00000000..675441db --- /dev/null +++ b/node_modules/resolve/test/node-modules-paths.js @@ -0,0 +1,143 @@ +var test = require('tape'); +var path = require('path'); +var parse = path.parse || require('path-parse'); +var keys = require('object-keys'); + +var nodeModulesPaths = require('../lib/node-modules-paths'); + +var verifyDirs = function verifyDirs(t, start, dirs, moduleDirectories, paths) { + var moduleDirs = [].concat(moduleDirectories || 'node_modules'); + if (paths) { + for (var k = 0; k < paths.length; ++k) { + moduleDirs.push(path.basename(paths[k])); + } + } + + var foundModuleDirs = {}; + var uniqueDirs = {}; + var parsedDirs = {}; + for (var i = 0; i < dirs.length; ++i) { + var parsed = parse(dirs[i]); + if (!foundModuleDirs[parsed.base]) { foundModuleDirs[parsed.base] = 0; } + foundModuleDirs[parsed.base] += 1; + parsedDirs[parsed.dir] = true; + uniqueDirs[dirs[i]] = true; + } + t.equal(keys(parsedDirs).length >= start.split(path.sep).length, true, 'there are >= dirs than "start" has'); + var foundModuleDirNames = keys(foundModuleDirs); + t.deepEqual(foundModuleDirNames, moduleDirs, 'all desired module dirs were found'); + t.equal(keys(uniqueDirs).length, dirs.length, 'all dirs provided were unique'); + + var counts = {}; + for (var j = 0; j < foundModuleDirNames.length; ++j) { + counts[foundModuleDirs[j]] = true; + } + t.equal(keys(counts).length, 1, 'all found module directories had the same count'); +}; + +test('node-modules-paths', function (t) { + t.test('no options', function (t) { + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start); + + verifyDirs(t, start, dirs); + + t.end(); + }); + + t.test('empty options', function (t) { + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start, {}); + + verifyDirs(t, start, dirs); + + t.end(); + }); + + t.test('with paths=array option', function (t) { + var start = path.join(__dirname, 'resolver'); + var paths = ['a', 'b']; + var dirs = nodeModulesPaths(start, { paths: paths }); + + verifyDirs(t, start, dirs, null, paths); + + t.end(); + }); + + t.test('with paths=function option', function (t) { + var paths = function paths(request, absoluteStart, getNodeModulesDirs, opts) { + return getNodeModulesDirs().concat(path.join(absoluteStart, 'not node modules', request)); + }; + + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start, { paths: paths }, 'pkg'); + + verifyDirs(t, start, dirs, null, [path.join(start, 'not node modules', 'pkg')]); + + t.end(); + }); + + t.test('with paths=function skipping node modules resolution', function (t) { + var paths = function paths(request, absoluteStart, getNodeModulesDirs, opts) { + return []; + }; + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start, { paths: paths }); + t.deepEqual(dirs, [], 'no node_modules was computed'); + t.end(); + }); + + t.test('with moduleDirectory option', function (t) { + var start = path.join(__dirname, 'resolver'); + var moduleDirectory = 'not node modules'; + var dirs = nodeModulesPaths(start, { moduleDirectory: moduleDirectory }); + + verifyDirs(t, start, dirs, moduleDirectory); + + t.end(); + }); + + t.test('with 1 moduleDirectory and paths options', function (t) { + var start = path.join(__dirname, 'resolver'); + var paths = ['a', 'b']; + var moduleDirectory = 'not node modules'; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectory }); + + verifyDirs(t, start, dirs, moduleDirectory, paths); + + t.end(); + }); + + t.test('with 1+ moduleDirectory and paths options', function (t) { + var start = path.join(__dirname, 'resolver'); + var paths = ['a', 'b']; + var moduleDirectories = ['not node modules', 'other modules']; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); + + verifyDirs(t, start, dirs, moduleDirectories, paths); + + t.end(); + }); + + t.test('combine paths correctly on Windows', function (t) { + var start = 'C:\\Users\\username\\myProject\\src'; + var paths = []; + var moduleDirectories = ['node_modules', start]; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); + + t.equal(dirs.indexOf(path.resolve(start)) > -1, true, 'should contain start dir'); + + t.end(); + }); + + t.test('combine paths correctly on non-Windows', { skip: process.platform === 'win32' }, function (t) { + var start = '/Users/username/git/myProject/src'; + var paths = []; + var moduleDirectories = ['node_modules', '/Users/username/git/myProject/src']; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); + + t.equal(dirs.indexOf(path.resolve(start)) > -1, true, 'should contain start dir'); + + t.end(); + }); +}); diff --git a/node_modules/resolve/test/node_path.js b/node_modules/resolve/test/node_path.js new file mode 100644 index 00000000..d06aa4ea --- /dev/null +++ b/node_modules/resolve/test/node_path.js @@ -0,0 +1,70 @@ +var fs = require('fs'); +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('$NODE_PATH', function (t) { + t.plan(8); + + var isDir = function (dir, cb) { + if (dir === '/node_path' || dir === 'node_path/x') { + return cb(null, true); + } + fs.stat(dir, function (err, stat) { + if (!err) { + return cb(null, stat.isDirectory()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); + }; + + resolve('aaa', { + paths: [ + path.join(__dirname, '/node_path/x'), + path.join(__dirname, '/node_path/y') + ], + basedir: __dirname, + isDirectory: isDir + }, function (err, res) { + t.error(err); + t.equal(res, path.join(__dirname, '/node_path/x/aaa/index.js'), 'aaa resolves'); + }); + + resolve('bbb', { + paths: [ + path.join(__dirname, '/node_path/x'), + path.join(__dirname, '/node_path/y') + ], + basedir: __dirname, + isDirectory: isDir + }, function (err, res) { + t.error(err); + t.equal(res, path.join(__dirname, '/node_path/y/bbb/index.js'), 'bbb resolves'); + }); + + resolve('ccc', { + paths: [ + path.join(__dirname, '/node_path/x'), + path.join(__dirname, '/node_path/y') + ], + basedir: __dirname, + isDirectory: isDir + }, function (err, res) { + t.error(err); + t.equal(res, path.join(__dirname, '/node_path/x/ccc/index.js'), 'ccc resolves'); + }); + + // ensure that relative paths still resolve against the regular `node_modules` correctly + resolve('tap', { + paths: [ + 'node_path' + ], + basedir: path.join(__dirname, 'node_path/x'), + isDirectory: isDir + }, function (err, res) { + var root = require('tap/package.json').main; + t.error(err); + t.equal(res, path.resolve(__dirname, '..', 'node_modules/tap', root), 'tap resolves'); + }); +}); diff --git a/node_modules/resolve/test/node_path/x/aaa/index.js b/node_modules/resolve/test/node_path/x/aaa/index.js new file mode 100644 index 00000000..ad70d0bb --- /dev/null +++ b/node_modules/resolve/test/node_path/x/aaa/index.js @@ -0,0 +1 @@ +module.exports = 'A'; diff --git a/node_modules/resolve/test/node_path/x/ccc/index.js b/node_modules/resolve/test/node_path/x/ccc/index.js new file mode 100644 index 00000000..a64132e4 --- /dev/null +++ b/node_modules/resolve/test/node_path/x/ccc/index.js @@ -0,0 +1 @@ +module.exports = 'C'; diff --git a/node_modules/resolve/test/node_path/y/bbb/index.js b/node_modules/resolve/test/node_path/y/bbb/index.js new file mode 100644 index 00000000..4d0f32e2 --- /dev/null +++ b/node_modules/resolve/test/node_path/y/bbb/index.js @@ -0,0 +1 @@ +module.exports = 'B'; diff --git a/node_modules/resolve/test/node_path/y/ccc/index.js b/node_modules/resolve/test/node_path/y/ccc/index.js new file mode 100644 index 00000000..793315e8 --- /dev/null +++ b/node_modules/resolve/test/node_path/y/ccc/index.js @@ -0,0 +1 @@ +module.exports = 'CY'; diff --git a/node_modules/resolve/test/nonstring.js b/node_modules/resolve/test/nonstring.js new file mode 100644 index 00000000..ef63c40f --- /dev/null +++ b/node_modules/resolve/test/nonstring.js @@ -0,0 +1,9 @@ +var test = require('tape'); +var resolve = require('../'); + +test('nonstring', function (t) { + t.plan(1); + resolve(555, function (err, res, pkg) { + t.ok(err); + }); +}); diff --git a/node_modules/resolve/test/pathfilter.js b/node_modules/resolve/test/pathfilter.js new file mode 100644 index 00000000..16519aea --- /dev/null +++ b/node_modules/resolve/test/pathfilter.js @@ -0,0 +1,75 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +var resolverDir = path.join(__dirname, '/pathfilter/deep_ref'); + +var pathFilterFactory = function (t) { + return function (pkg, x, remainder) { + t.equal(pkg.version, '1.2.3'); + t.equal(x, path.join(resolverDir, 'node_modules/deep/ref')); + t.equal(remainder, 'ref'); + return 'alt'; + }; +}; + +test('#62: deep module references and the pathFilter', function (t) { + t.test('deep/ref.js', function (st) { + st.plan(3); + + resolve('deep/ref', { basedir: resolverDir }, function (err, res, pkg) { + if (err) st.fail(err); + + st.equal(pkg.version, '1.2.3'); + st.equal(res, path.join(resolverDir, 'node_modules/deep/ref.js')); + }); + + var res = resolve.sync('deep/ref', { basedir: resolverDir }); + st.equal(res, path.join(resolverDir, 'node_modules/deep/ref.js')); + }); + + t.test('deep/deeper/ref', function (st) { + st.plan(4); + + resolve( + 'deep/deeper/ref', + { basedir: resolverDir }, + function (err, res, pkg) { + if (err) t.fail(err); + st.notEqual(pkg, undefined); + st.equal(pkg.version, '1.2.3'); + st.equal(res, path.join(resolverDir, 'node_modules/deep/deeper/ref.js')); + } + ); + + var res = resolve.sync( + 'deep/deeper/ref', + { basedir: resolverDir } + ); + st.equal(res, path.join(resolverDir, 'node_modules/deep/deeper/ref.js')); + }); + + t.test('deep/ref alt', function (st) { + st.plan(8); + + var pathFilter = pathFilterFactory(st); + + var res = resolve.sync( + 'deep/ref', + { basedir: resolverDir, pathFilter: pathFilter } + ); + st.equal(res, path.join(resolverDir, 'node_modules/deep/alt.js')); + + resolve( + 'deep/ref', + { basedir: resolverDir, pathFilter: pathFilter }, + function (err, res, pkg) { + if (err) st.fail(err); + st.equal(res, path.join(resolverDir, 'node_modules/deep/alt.js')); + st.end(); + } + ); + }); + + t.end(); +}); diff --git a/node_modules/resolve/test/pathfilter/deep_ref/main.js b/node_modules/resolve/test/pathfilter/deep_ref/main.js new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/precedence.js b/node_modules/resolve/test/precedence.js new file mode 100644 index 00000000..2febb598 --- /dev/null +++ b/node_modules/resolve/test/precedence.js @@ -0,0 +1,23 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('precedence', function (t) { + t.plan(3); + var dir = path.join(__dirname, 'precedence/aaa'); + + resolve('./', { basedir: dir }, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, 'index.js')); + t.equal(pkg.name, 'resolve'); + }); +}); + +test('./ should not load ${dir}.js', function (t) { // eslint-disable-line no-template-curly-in-string + t.plan(1); + var dir = path.join(__dirname, 'precedence/bbb'); + + resolve('./', { basedir: dir }, function (err, res, pkg) { + t.ok(err); + }); +}); diff --git a/node_modules/resolve/test/precedence/aaa.js b/node_modules/resolve/test/precedence/aaa.js new file mode 100644 index 00000000..b83a3e7a --- /dev/null +++ b/node_modules/resolve/test/precedence/aaa.js @@ -0,0 +1 @@ +module.exports = 'wtf'; diff --git a/node_modules/resolve/test/precedence/aaa/index.js b/node_modules/resolve/test/precedence/aaa/index.js new file mode 100644 index 00000000..e0f8f6ab --- /dev/null +++ b/node_modules/resolve/test/precedence/aaa/index.js @@ -0,0 +1 @@ +module.exports = 'okok'; diff --git a/node_modules/resolve/test/precedence/aaa/main.js b/node_modules/resolve/test/precedence/aaa/main.js new file mode 100644 index 00000000..93542a96 --- /dev/null +++ b/node_modules/resolve/test/precedence/aaa/main.js @@ -0,0 +1 @@ +console.log(require('./')); diff --git a/node_modules/resolve/test/precedence/bbb.js b/node_modules/resolve/test/precedence/bbb.js new file mode 100644 index 00000000..2298f47f --- /dev/null +++ b/node_modules/resolve/test/precedence/bbb.js @@ -0,0 +1 @@ +module.exports = '>_<'; diff --git a/node_modules/resolve/test/precedence/bbb/main.js b/node_modules/resolve/test/precedence/bbb/main.js new file mode 100644 index 00000000..716b81d4 --- /dev/null +++ b/node_modules/resolve/test/precedence/bbb/main.js @@ -0,0 +1 @@ +console.log(require('./')); // should throw diff --git a/node_modules/resolve/test/resolver.js b/node_modules/resolve/test/resolver.js new file mode 100644 index 00000000..aa36ee11 --- /dev/null +++ b/node_modules/resolve/test/resolver.js @@ -0,0 +1,450 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('async foo', function (t) { + t.plan(12); + var dir = path.join(__dirname, 'resolver'); + + resolve('./foo', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg && pkg.name, 'resolve'); + }); + + resolve('./foo.js', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg && pkg.name, 'resolve'); + }); + + resolve('./foo', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg && pkg.main, 'resolver'); + }); + + resolve('./foo.js', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg.main, 'resolver'); + }); + + resolve('./foo', { basedir: dir, filename: path.join(dir, 'baz.js') }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + }); + + resolve('foo', { basedir: dir }, function (err) { + t.equal(err.message, "Cannot find module 'foo' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + // Test that filename is reported as the "from" value when passed. + resolve('foo', { basedir: dir, filename: path.join(dir, 'baz.js') }, function (err) { + t.equal(err.message, "Cannot find module 'foo' from '" + path.join(dir, 'baz.js') + "'"); + }); +}); + +test('bar', function (t) { + t.plan(6); + var dir = path.join(__dirname, 'resolver'); + + resolve('foo', { basedir: dir + '/bar' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js')); + t.equal(pkg, undefined); + }); + + resolve('foo', { basedir: dir + '/bar' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js')); + t.equal(pkg, undefined); + }); + + resolve('foo', { basedir: dir + '/bar', 'package': { main: 'bar' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js')); + t.equal(pkg.main, 'bar'); + }); +}); + +test('baz', function (t) { + t.plan(4); + var dir = path.join(__dirname, 'resolver'); + + resolve('./baz', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'baz/quux.js')); + t.equal(pkg.main, 'quux.js'); + }); + + resolve('./baz', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'baz/quux.js')); + t.equal(pkg.main, 'quux.js'); + }); +}); + +test('biz', function (t) { + t.plan(24); + var dir = path.join(__dirname, 'resolver/biz/node_modules'); + + resolve('./grux', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg, undefined); + }); + + resolve('./grux', { basedir: dir, 'package': { main: 'biz' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg.main, 'biz'); + }); + + resolve('./garply', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('./garply', { basedir: dir, 'package': { main: 'biz' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('tiv', { basedir: dir + '/grux' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg, undefined); + }); + + resolve('tiv', { basedir: dir + '/grux', 'package': { main: 'grux' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg.main, 'grux'); + }); + + resolve('tiv', { basedir: dir + '/garply' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg, undefined); + }); + + resolve('tiv', { basedir: dir + '/garply', 'package': { main: './lib' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('grux', { basedir: dir + '/tiv' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg, undefined); + }); + + resolve('grux', { basedir: dir + '/tiv', 'package': { main: 'tiv' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg.main, 'tiv'); + }); + + resolve('garply', { basedir: dir + '/tiv' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('garply', { basedir: dir + '/tiv', 'package': { main: 'tiv' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); +}); + +test('quux', function (t) { + t.plan(2); + var dir = path.join(__dirname, 'resolver/quux'); + + resolve('./foo', { basedir: dir, 'package': { main: 'quux' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo/index.js')); + t.equal(pkg.main, 'quux'); + }); +}); + +test('normalize', function (t) { + t.plan(2); + var dir = path.join(__dirname, 'resolver/biz/node_modules/grux'); + + resolve('../grux', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'index.js')); + t.equal(pkg, undefined); + }); +}); + +test('cup', function (t) { + t.plan(5); + var dir = path.join(__dirname, 'resolver'); + + resolve('./cup', { basedir: dir, extensions: ['.js', '.coffee'] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'cup.coffee')); + }); + + resolve('./cup.coffee', { basedir: dir }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'cup.coffee')); + }); + + resolve('./cup', { basedir: dir, extensions: ['.js'] }, function (err, res) { + t.equal(err.message, "Cannot find module './cup' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + // Test that filename is reported as the "from" value when passed. + resolve('./cup', { basedir: dir, extensions: ['.js'], filename: path.join(dir, 'cupboard.js') }, function (err, res) { + t.equal(err.message, "Cannot find module './cup' from '" + path.join(dir, 'cupboard.js') + "'"); + }); +}); + +test('mug', function (t) { + t.plan(3); + var dir = path.join(__dirname, 'resolver'); + + resolve('./mug', { basedir: dir }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'mug.js')); + }); + + resolve('./mug', { basedir: dir, extensions: ['.coffee', '.js'] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, '/mug.coffee')); + }); + + resolve('./mug', { basedir: dir, extensions: ['.js', '.coffee'] }, function (err, res) { + t.equal(res, path.join(dir, '/mug.js')); + }); +}); + +test('other path', function (t) { + t.plan(6); + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'bar'); + var otherDir = path.join(resolverDir, 'other_path'); + + resolve('root', { basedir: dir, paths: [otherDir] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(resolverDir, 'other_path/root.js')); + }); + + resolve('lib/other-lib', { basedir: dir, paths: [otherDir] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(resolverDir, 'other_path/lib/other-lib.js')); + }); + + resolve('root', { basedir: dir }, function (err, res) { + t.equal(err.message, "Cannot find module 'root' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + resolve('zzz', { basedir: dir, paths: [otherDir] }, function (err, res) { + t.equal(err.message, "Cannot find module 'zzz' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('path iterator', function (t) { + t.plan(2); + + var resolverDir = path.join(__dirname, 'resolver'); + + var exactIterator = function (x, start, getPackageCandidates, opts) { + return [path.join(resolverDir, x)]; + }; + + resolve('baz', { packageIterator: exactIterator }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(resolverDir, 'baz/quux.js')); + t.equal(pkg && pkg.name, 'baz'); + }); +}); + +test('incorrect main', function (t) { + t.plan(1); + + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'incorrect_main'); + + resolve('./incorrect_main', { basedir: resolverDir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'index.js')); + }); +}); + +test('without basedir', function (t) { + t.plan(1); + + var dir = path.join(__dirname, 'resolver/without_basedir'); + var tester = require(path.join(dir, 'main.js')); + + tester(t, function (err, res, pkg) { + if (err) { + t.fail(err); + } else { + t.equal(res, path.join(dir, 'node_modules/mymodule.js')); + } + }); +}); + +test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) { + t.plan(2); + + var dir = path.join(__dirname, 'resolver'); + + resolve('./foo', { basedir: path.join(dir, 'same_names') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo.js')); + }); + + resolve('./foo/', { basedir: path.join(dir, 'same_names') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo/index.js')); + }); +}); + +test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) { + t.plan(2); + + var dir = path.join(__dirname, 'resolver'); + + resolve('./', { basedir: path.join(dir, 'same_names/foo') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo/index.js')); + }); + + resolve('.', { basedir: path.join(dir, 'same_names/foo') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo/index.js')); + }); +}); + +test('async: #121 - treating an existing file as a dir when no basedir', function (t) { + var testFile = path.basename(__filename); + + t.test('sanity check', function (st) { + st.plan(1); + resolve('./' + testFile, function (err, res, pkg) { + if (err) t.fail(err); + st.equal(res, __filename, 'sanity check'); + }); + }); + + t.test('with a fake directory', function (st) { + st.plan(4); + + resolve('./' + testFile + '/blah', function (err, res, pkg) { + st.ok(err, 'there is an error'); + st.notOk(res, 'no result'); + + st.equal(err && err.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve'); + st.equal( + err && err.message, + 'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'', + 'can not find nonexistent module' + ); + st.end(); + }); + }); + + t.end(); +}); + +test('async dot main', function (t) { + var start = new Date(); + t.plan(3); + resolve('./resolver/dot_main', function (err, ret) { + t.notOk(err); + t.equal(ret, path.join(__dirname, 'resolver/dot_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); + }); +}); + +test('async dot slash main', function (t) { + var start = new Date(); + t.plan(3); + resolve('./resolver/dot_slash_main', function (err, ret) { + t.notOk(err); + t.equal(ret, path.join(__dirname, 'resolver/dot_slash_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); + }); +}); + +test('not a directory', function (t) { + t.plan(6); + var path = './foo'; + resolve(path, { basedir: __filename }, function (err, res, pkg) { + t.ok(err, 'a non-directory errors'); + t.equal(arguments.length, 1); + t.equal(res, undefined); + t.equal(pkg, undefined); + + t.equal(err && err.message, 'Cannot find module \'' + path + '\' from \'' + __filename + '\''); + t.equal(err && err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('non-string "main" field in package.json', function (t) { + t.plan(5); + + var dir = path.join(__dirname, 'resolver'); + resolve('./invalid_main', { basedir: dir }, function (err, res, pkg) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + t.equal(res, undefined, 'res is undefined'); + t.equal(pkg, undefined, 'pkg is undefined'); + }); +}); + +test('non-string "main" field in package.json', function (t) { + t.plan(5); + + var dir = path.join(__dirname, 'resolver'); + resolve('./invalid_main', { basedir: dir }, function (err, res, pkg) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + t.equal(res, undefined, 'res is undefined'); + t.equal(pkg, undefined, 'pkg is undefined'); + }); +}); + +test('browser field in package.json', function (t) { + t.plan(3); + + var dir = path.join(__dirname, 'resolver'); + resolve( + './browser_field', + { + basedir: dir, + packageFilter: function packageFilter(pkg) { + if (pkg.browser) { + pkg.main = pkg.browser; // eslint-disable-line no-param-reassign + delete pkg.browser; // eslint-disable-line no-param-reassign + } + return pkg; + } + }, + function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'browser_field', 'b.js')); + t.equal(pkg && pkg.main, 'b'); + t.equal(pkg && pkg.browser, undefined); + } + ); +}); diff --git a/node_modules/resolve/test/resolver/baz/doom.js b/node_modules/resolve/test/resolver/baz/doom.js new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/resolver/baz/package.json b/node_modules/resolve/test/resolver/baz/package.json new file mode 100644 index 00000000..2f77720b --- /dev/null +++ b/node_modules/resolve/test/resolver/baz/package.json @@ -0,0 +1,4 @@ +{ + "name": "baz", + "main": "quux.js" +} diff --git a/node_modules/resolve/test/resolver/baz/quux.js b/node_modules/resolve/test/resolver/baz/quux.js new file mode 100644 index 00000000..bd816eab --- /dev/null +++ b/node_modules/resolve/test/resolver/baz/quux.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/browser_field/a.js b/node_modules/resolve/test/resolver/browser_field/a.js new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/resolver/browser_field/b.js b/node_modules/resolve/test/resolver/browser_field/b.js new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/resolver/browser_field/package.json b/node_modules/resolve/test/resolver/browser_field/package.json new file mode 100644 index 00000000..bf406f08 --- /dev/null +++ b/node_modules/resolve/test/resolver/browser_field/package.json @@ -0,0 +1,5 @@ +{ + "name": "browser_field", + "main": "a", + "browser": "b" +} diff --git a/node_modules/resolve/test/resolver/cup.coffee b/node_modules/resolve/test/resolver/cup.coffee new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/node_modules/resolve/test/resolver/cup.coffee @@ -0,0 +1 @@ + diff --git a/node_modules/resolve/test/resolver/dot_main/index.js b/node_modules/resolve/test/resolver/dot_main/index.js new file mode 100644 index 00000000..bd816eab --- /dev/null +++ b/node_modules/resolve/test/resolver/dot_main/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/dot_main/package.json b/node_modules/resolve/test/resolver/dot_main/package.json new file mode 100644 index 00000000..d7f4fc80 --- /dev/null +++ b/node_modules/resolve/test/resolver/dot_main/package.json @@ -0,0 +1,3 @@ +{ + "main": "." +} diff --git a/node_modules/resolve/test/resolver/dot_slash_main/index.js b/node_modules/resolve/test/resolver/dot_slash_main/index.js new file mode 100644 index 00000000..bd816eab --- /dev/null +++ b/node_modules/resolve/test/resolver/dot_slash_main/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/dot_slash_main/package.json b/node_modules/resolve/test/resolver/dot_slash_main/package.json new file mode 100644 index 00000000..f51287b9 --- /dev/null +++ b/node_modules/resolve/test/resolver/dot_slash_main/package.json @@ -0,0 +1,3 @@ +{ + "main": "./" +} diff --git a/node_modules/resolve/test/resolver/foo.js b/node_modules/resolve/test/resolver/foo.js new file mode 100644 index 00000000..bd816eab --- /dev/null +++ b/node_modules/resolve/test/resolver/foo.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/incorrect_main/index.js b/node_modules/resolve/test/resolver/incorrect_main/index.js new file mode 100644 index 00000000..bc1fb0a6 --- /dev/null +++ b/node_modules/resolve/test/resolver/incorrect_main/index.js @@ -0,0 +1,2 @@ +// this is the actual main file 'index.js', not 'wrong.js' like the package.json would indicate +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/incorrect_main/package.json b/node_modules/resolve/test/resolver/incorrect_main/package.json new file mode 100644 index 00000000..b7188041 --- /dev/null +++ b/node_modules/resolve/test/resolver/incorrect_main/package.json @@ -0,0 +1,3 @@ +{ + "main": "wrong.js" +} diff --git a/node_modules/resolve/test/resolver/invalid_main/package.json b/node_modules/resolve/test/resolver/invalid_main/package.json new file mode 100644 index 00000000..0cf82799 --- /dev/null +++ b/node_modules/resolve/test/resolver/invalid_main/package.json @@ -0,0 +1,7 @@ +{ + "name": "invalid main", + "main": [ + "why is this a thing", + "srsly omg wtf" + ] +} diff --git a/node_modules/resolve/test/resolver/mug.coffee b/node_modules/resolve/test/resolver/mug.coffee new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/resolver/mug.js b/node_modules/resolve/test/resolver/mug.js new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/resolver/multirepo/lerna.json b/node_modules/resolve/test/resolver/multirepo/lerna.json new file mode 100644 index 00000000..d6707ca0 --- /dev/null +++ b/node_modules/resolve/test/resolver/multirepo/lerna.json @@ -0,0 +1,6 @@ +{ + "packages": [ + "packages/*" + ], + "version": "0.0.0" +} diff --git a/node_modules/resolve/test/resolver/multirepo/package.json b/node_modules/resolve/test/resolver/multirepo/package.json new file mode 100644 index 00000000..8508f9d2 --- /dev/null +++ b/node_modules/resolve/test/resolver/multirepo/package.json @@ -0,0 +1,20 @@ +{ + "name": "monorepo-symlink-test", + "private": true, + "version": "0.0.0", + "description": "", + "main": "index.js", + "scripts": { + "postinstall": "lerna bootstrap", + "test": "node packages/package-a" + }, + "author": "", + "license": "MIT", + "dependencies": { + "jquery": "^3.3.1", + "resolve": "../../../" + }, + "devDependencies": { + "lerna": "^3.4.3" + } +} diff --git a/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js b/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js new file mode 100644 index 00000000..8875a32d --- /dev/null +++ b/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js @@ -0,0 +1,35 @@ +'use strict'; + +var assert = require('assert'); +var path = require('path'); +var resolve = require('resolve'); + +var basedir = __dirname + '/node_modules/@my-scope/package-b'; + +var expected = path.join(__dirname, '../../node_modules/jquery/dist/jquery.js'); + +/* + * preserveSymlinks === false + * will search NPM package from + * - packages/package-b/node_modules + * - packages/node_modules + * - node_modules + */ +assert.equal(resolve.sync('jquery', { basedir: basedir, preserveSymlinks: false }), expected); +assert.equal(resolve.sync('../../node_modules/jquery', { basedir: basedir, preserveSymlinks: false }), expected); + +/* + * preserveSymlinks === true + * will search NPM package from + * - packages/package-a/node_modules/@my-scope/packages/package-b/node_modules + * - packages/package-a/node_modules/@my-scope/packages/node_modules + * - packages/package-a/node_modules/@my-scope/node_modules + * - packages/package-a/node_modules/node_modules + * - packages/package-a/node_modules + * - packages/node_modules + * - node_modules + */ +assert.equal(resolve.sync('jquery', { basedir: basedir, preserveSymlinks: true }), expected); +assert.equal(resolve.sync('../../../../../node_modules/jquery', { basedir: basedir, preserveSymlinks: true }), expected); + +console.log(' * all monorepo paths successfully resolved through symlinks'); diff --git a/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json b/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json new file mode 100644 index 00000000..204de51e --- /dev/null +++ b/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json @@ -0,0 +1,14 @@ +{ + "name": "@my-scope/package-a", + "version": "0.0.0", + "private": true, + "description": "", + "license": "MIT", + "main": "index.js", + "scripts": { + "test": "echo \"Error: run tests from root\" && exit 1" + }, + "dependencies": { + "@my-scope/package-b": "^0.0.0" + } +} diff --git a/node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js b/node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json b/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json new file mode 100644 index 00000000..f57c3b5f --- /dev/null +++ b/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json @@ -0,0 +1,14 @@ +{ + "name": "@my-scope/package-b", + "private": true, + "version": "0.0.0", + "description": "", + "license": "MIT", + "main": "index.js", + "scripts": { + "test": "echo \"Error: run tests from root\" && exit 1" + }, + "dependencies": { + "@my-scope/package-a": "^0.0.0" + } +} diff --git a/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js b/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js new file mode 100644 index 00000000..9b4846a8 --- /dev/null +++ b/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js @@ -0,0 +1,26 @@ +var a = require.resolve('buffer/').replace(process.cwd(), '$CWD'); +var b; +var c; + +var test = function test() { + console.log(a, ': require.resolve, preserveSymlinks ' + (process.execArgv.indexOf('preserve-symlinks') > -1 ? 'true' : 'false')); + console.log(b, ': preserveSymlinks true'); + console.log(c, ': preserveSymlinks false'); + + if (a !== b && a !== c) { + throw 'async: no match'; + } + console.log('async: success! a matched either b or c\n'); +}; + +require('resolve')('buffer/', { preserveSymlinks: true }, function (err, result) { + if (err) { throw err; } + b = result.replace(process.cwd(), '$CWD'); + if (b && c) { test(); } +}); +require('resolve')('buffer/', { preserveSymlinks: false }, function (err, result) { + if (err) { throw err; } + c = result.replace(process.cwd(), '$CWD'); + if (b && c) { test(); } +}); + diff --git a/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json b/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json new file mode 100644 index 00000000..acfe9e95 --- /dev/null +++ b/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json @@ -0,0 +1,15 @@ +{ + "name": "mylib", + "version": "0.0.0", + "description": "", + "private": true, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "buffer": "*" + } +} diff --git a/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js b/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js new file mode 100644 index 00000000..3283efc2 --- /dev/null +++ b/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js @@ -0,0 +1,12 @@ +var a = require.resolve('buffer/').replace(process.cwd(), '$CWD'); +var b = require('resolve').sync('buffer/', { preserveSymlinks: true }).replace(process.cwd(), '$CWD'); +var c = require('resolve').sync('buffer/', { preserveSymlinks: false }).replace(process.cwd(), '$CWD'); + +console.log(a, ': require.resolve, preserveSymlinks ' + (process.execArgv.indexOf('preserve-symlinks') > -1 ? 'true' : 'false')); +console.log(b, ': preserveSymlinks true'); +console.log(c, ': preserveSymlinks false'); + +if (a !== b && a !== c) { + throw 'sync: no match'; +} +console.log('sync: success! a matched either b or c\n'); diff --git a/node_modules/resolve/test/resolver/other_path/root.js b/node_modules/resolve/test/resolver/other_path/root.js new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/resolver/quux/foo/index.js b/node_modules/resolve/test/resolver/quux/foo/index.js new file mode 100644 index 00000000..bd816eab --- /dev/null +++ b/node_modules/resolve/test/resolver/quux/foo/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/same_names/foo.js b/node_modules/resolve/test/resolver/same_names/foo.js new file mode 100644 index 00000000..888cae37 --- /dev/null +++ b/node_modules/resolve/test/resolver/same_names/foo.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/node_modules/resolve/test/resolver/same_names/foo/index.js b/node_modules/resolve/test/resolver/same_names/foo/index.js new file mode 100644 index 00000000..bd816eab --- /dev/null +++ b/node_modules/resolve/test/resolver/same_names/foo/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js b/node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep b/node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/resolver/symlinked/package/bar.js b/node_modules/resolve/test/resolver/symlinked/package/bar.js new file mode 100644 index 00000000..cb1c2c01 --- /dev/null +++ b/node_modules/resolve/test/resolver/symlinked/package/bar.js @@ -0,0 +1 @@ +module.exports = 'bar'; diff --git a/node_modules/resolve/test/resolver/symlinked/package/package.json b/node_modules/resolve/test/resolver/symlinked/package/package.json new file mode 100644 index 00000000..8e1b5859 --- /dev/null +++ b/node_modules/resolve/test/resolver/symlinked/package/package.json @@ -0,0 +1,3 @@ +{ + "main": "bar.js" +} \ No newline at end of file diff --git a/node_modules/resolve/test/resolver/without_basedir/main.js b/node_modules/resolve/test/resolver/without_basedir/main.js new file mode 100644 index 00000000..5b31975b --- /dev/null +++ b/node_modules/resolve/test/resolver/without_basedir/main.js @@ -0,0 +1,5 @@ +var resolve = require('../../../'); + +module.exports = function (t, cb) { + resolve('mymodule', null, cb); +}; diff --git a/node_modules/resolve/test/resolver_sync.js b/node_modules/resolve/test/resolver_sync.js new file mode 100644 index 00000000..3082c96e --- /dev/null +++ b/node_modules/resolve/test/resolver_sync.js @@ -0,0 +1,358 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('foo', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./foo', { basedir: dir }), + path.join(dir, 'foo.js') + ); + + t.equal( + resolve.sync('./foo.js', { basedir: dir }), + path.join(dir, 'foo.js') + ); + + t.equal( + resolve.sync('./foo.js', { basedir: dir, filename: path.join(dir, 'bar.js') }), + path.join(dir, 'foo.js') + ); + + t.throws(function () { + resolve.sync('foo', { basedir: dir }); + }); + + // Test that filename is reported as the "from" value when passed. + t.throws( + function () { + resolve.sync('foo', { basedir: dir, filename: path.join(dir, 'bar.js') }); + }, + { + name: 'Error', + message: "Cannot find module 'foo' from '" + path.join(dir, 'bar.js') + "'" + } + ); + + t.end(); +}); + +test('bar', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('foo', { basedir: path.join(dir, 'bar') }), + path.join(dir, 'bar/node_modules/foo/index.js') + ); + t.end(); +}); + +test('baz', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./baz', { basedir: dir }), + path.join(dir, 'baz/quux.js') + ); + t.end(); +}); + +test('biz', function (t) { + var dir = path.join(__dirname, 'resolver/biz/node_modules'); + t.equal( + resolve.sync('./grux', { basedir: dir }), + path.join(dir, 'grux/index.js') + ); + + t.equal( + resolve.sync('tiv', { basedir: path.join(dir, 'grux') }), + path.join(dir, 'tiv/index.js') + ); + + t.equal( + resolve.sync('grux', { basedir: path.join(dir, 'tiv') }), + path.join(dir, 'grux/index.js') + ); + t.end(); +}); + +test('normalize', function (t) { + var dir = path.join(__dirname, 'resolver/biz/node_modules/grux'); + t.equal( + resolve.sync('../grux', { basedir: dir }), + path.join(dir, 'index.js') + ); + t.end(); +}); + +test('cup', function (t) { + var dir = path.join(__dirname, 'resolver'); + t.equal( + resolve.sync('./cup', { + basedir: dir, + extensions: ['.js', '.coffee'] + }), + path.join(dir, 'cup.coffee') + ); + + t.equal( + resolve.sync('./cup.coffee', { basedir: dir }), + path.join(dir, 'cup.coffee') + ); + + t.throws(function () { + resolve.sync('./cup', { + basedir: dir, + extensions: ['.js'] + }); + }); + + t.end(); +}); + +test('mug', function (t) { + var dir = path.join(__dirname, 'resolver'); + t.equal( + resolve.sync('./mug', { basedir: dir }), + path.join(dir, 'mug.js') + ); + + t.equal( + resolve.sync('./mug', { + basedir: dir, + extensions: ['.coffee', '.js'] + }), + path.join(dir, 'mug.coffee') + ); + + t.equal( + resolve.sync('./mug', { + basedir: dir, + extensions: ['.js', '.coffee'] + }), + path.join(dir, 'mug.js') + ); + + t.end(); +}); + +test('other path', function (t) { + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'bar'); + var otherDir = path.join(resolverDir, 'other_path'); + + t.equal( + resolve.sync('root', { + basedir: dir, + paths: [otherDir] + }), + path.join(resolverDir, 'other_path/root.js') + ); + + t.equal( + resolve.sync('lib/other-lib', { + basedir: dir, + paths: [otherDir] + }), + path.join(resolverDir, 'other_path/lib/other-lib.js') + ); + + t.throws(function () { + resolve.sync('root', { basedir: dir }); + }); + + t.throws(function () { + resolve.sync('zzz', { + basedir: dir, + paths: [otherDir] + }); + }); + + t.end(); +}); + +test('path iterator', function (t) { + var resolverDir = path.join(__dirname, 'resolver'); + + var exactIterator = function (x, start, getPackageCandidates, opts) { + return [path.join(resolverDir, x)]; + }; + + t.equal( + resolve.sync('baz', { packageIterator: exactIterator }), + path.join(resolverDir, 'baz/quux.js') + ); + + t.end(); +}); + +test('incorrect main', function (t) { + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'incorrect_main'); + + t.equal( + resolve.sync('./incorrect_main', { basedir: resolverDir }), + path.join(dir, 'index.js') + ); + + t.end(); +}); + +var stubStatSync = function stubStatSync(fn) { + var fs = require('fs'); + var statSync = fs.statSync; + try { + fs.statSync = function () { + throw new EvalError('Unknown Error'); + }; + return fn(); + } finally { + fs.statSync = statSync; + } +}; + +test('#79 - re-throw non ENOENT errors from stat', function (t) { + var dir = path.join(__dirname, 'resolver'); + + stubStatSync(function () { + t.throws(function () { + resolve.sync('foo', { basedir: dir }); + }, /Unknown Error/); + }); + + t.end(); +}); + +test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./foo', { basedir: path.join(dir, 'same_names') }), + path.join(dir, 'same_names/foo.js') + ); + t.equal( + resolve.sync('./foo/', { basedir: path.join(dir, 'same_names') }), + path.join(dir, 'same_names/foo/index.js') + ); + t.end(); +}); + +test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./', { basedir: path.join(dir, 'same_names/foo') }), + path.join(dir, 'same_names/foo/index.js') + ); + t.equal( + resolve.sync('.', { basedir: path.join(dir, 'same_names/foo') }), + path.join(dir, 'same_names/foo/index.js') + ); + t.end(); +}); + +test('sync: #121 - treating an existing file as a dir when no basedir', function (t) { + var testFile = path.basename(__filename); + + t.test('sanity check', function (st) { + st.equal( + resolve.sync('./' + testFile), + __filename, + 'sanity check' + ); + st.end(); + }); + + t.test('with a fake directory', function (st) { + function run() { return resolve.sync('./' + testFile + '/blah'); } + + st.throws(run, 'throws an error'); + + try { + run(); + } catch (e) { + st.equal(e.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve'); + st.equal( + e.message, + 'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'', + 'can not find nonexistent module' + ); + } + + st.end(); + }); + + t.end(); +}); + +test('sync dot main', function (t) { + var start = new Date(); + t.equal(resolve.sync('./resolver/dot_main'), path.join(__dirname, 'resolver/dot_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); +}); + +test('sync dot slash main', function (t) { + var start = new Date(); + t.equal(resolve.sync('./resolver/dot_slash_main'), path.join(__dirname, 'resolver/dot_slash_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); +}); + +test('not a directory', function (t) { + var path = './foo'; + try { + resolve.sync(path, { basedir: __filename }); + t.fail(); + } catch (err) { + t.ok(err, 'a non-directory errors'); + t.equal(err && err.message, 'Cannot find module \'' + path + "' from '" + __filename + "'"); + t.equal(err && err.code, 'MODULE_NOT_FOUND'); + } + t.end(); +}); + +test('non-string "main" field in package.json', function (t) { + var dir = path.join(__dirname, 'resolver'); + try { + var result = resolve.sync('./invalid_main', { basedir: dir }); + t.equal(result, undefined, 'result should not exist'); + t.fail('should not get here'); + } catch (err) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + } + t.end(); +}); + +test('non-string "main" field in package.json', function (t) { + var dir = path.join(__dirname, 'resolver'); + try { + var result = resolve.sync('./invalid_main', { basedir: dir }); + t.equal(result, undefined, 'result should not exist'); + t.fail('should not get here'); + } catch (err) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + } + t.end(); +}); + +test('browser field in package.json', function (t) { + var dir = path.join(__dirname, 'resolver'); + var res = resolve.sync('./browser_field', { + basedir: dir, + packageFilter: function packageFilter(pkg) { + if (pkg.browser) { + pkg.main = pkg.browser; // eslint-disable-line no-param-reassign + delete pkg.browser; // eslint-disable-line no-param-reassign + } + return pkg; + } + }); + t.equal(res, path.join(dir, 'browser_field', 'b.js')); + t.end(); +}); diff --git a/node_modules/resolve/test/shadowed_core.js b/node_modules/resolve/test/shadowed_core.js new file mode 100644 index 00000000..3a5f4fcf --- /dev/null +++ b/node_modules/resolve/test/shadowed_core.js @@ -0,0 +1,54 @@ +var test = require('tape'); +var resolve = require('../'); +var path = require('path'); + +test('shadowed core modules still return core module', function (t) { + t.plan(2); + + resolve('util', { basedir: path.join(__dirname, 'shadowed_core') }, function (err, res) { + t.ifError(err); + t.equal(res, 'util'); + }); +}); + +test('shadowed core modules still return core module [sync]', function (t) { + t.plan(1); + + var res = resolve.sync('util', { basedir: path.join(__dirname, 'shadowed_core') }); + + t.equal(res, 'util'); +}); + +test('shadowed core modules return shadow when appending `/`', function (t) { + t.plan(2); + + resolve('util/', { basedir: path.join(__dirname, 'shadowed_core') }, function (err, res) { + t.ifError(err); + t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js')); + }); +}); + +test('shadowed core modules return shadow when appending `/` [sync]', function (t) { + t.plan(1); + + var res = resolve.sync('util/', { basedir: path.join(__dirname, 'shadowed_core') }); + + t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js')); +}); + +test('shadowed core modules return shadow with `includeCoreModules: false`', function (t) { + t.plan(2); + + resolve('util', { basedir: path.join(__dirname, 'shadowed_core'), includeCoreModules: false }, function (err, res) { + t.ifError(err); + t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js')); + }); +}); + +test('shadowed core modules return shadow with `includeCoreModules: false` [sync]', function (t) { + t.plan(1); + + var res = resolve.sync('util', { basedir: path.join(__dirname, 'shadowed_core'), includeCoreModules: false }); + + t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js')); +}); diff --git a/node_modules/resolve/test/shadowed_core/node_modules/util/index.js b/node_modules/resolve/test/shadowed_core/node_modules/util/index.js new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/resolve/test/subdirs.js b/node_modules/resolve/test/subdirs.js new file mode 100644 index 00000000..b7b8450a --- /dev/null +++ b/node_modules/resolve/test/subdirs.js @@ -0,0 +1,13 @@ +var test = require('tape'); +var resolve = require('../'); +var path = require('path'); + +test('subdirs', function (t) { + t.plan(2); + + var dir = path.join(__dirname, '/subdirs'); + resolve('a/b/c/x.json', { basedir: dir }, function (err, res) { + t.ifError(err); + t.equal(res, path.join(dir, 'node_modules/a/b/c/x.json')); + }); +}); diff --git a/node_modules/resolve/test/symlinks.js b/node_modules/resolve/test/symlinks.js new file mode 100644 index 00000000..35f881af --- /dev/null +++ b/node_modules/resolve/test/symlinks.js @@ -0,0 +1,176 @@ +var path = require('path'); +var fs = require('fs'); +var test = require('tape'); +var map = require('array.prototype.map'); +var resolve = require('../'); + +var symlinkDir = path.join(__dirname, 'resolver', 'symlinked', 'symlink'); +var packageDir = path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'package'); +var modADir = path.join(__dirname, 'symlinks', 'source', 'node_modules', 'mod-a'); +var symlinkModADir = path.join(__dirname, 'symlinks', 'dest', 'node_modules', 'mod-a'); +try { + fs.unlinkSync(symlinkDir); +} catch (err) {} +try { + fs.unlinkSync(packageDir); +} catch (err) {} +try { + fs.unlinkSync(modADir); +} catch (err) {} +try { + fs.unlinkSync(symlinkModADir); +} catch (err) {} + +try { + fs.symlinkSync('./_/symlink_target', symlinkDir, 'dir'); +} catch (err) { + // if fails then it is probably on Windows and lets try to create a junction + fs.symlinkSync(path.join(__dirname, 'resolver', 'symlinked', '_', 'symlink_target') + '\\', symlinkDir, 'junction'); +} +try { + fs.symlinkSync('../../package', packageDir, 'dir'); +} catch (err) { + // if fails then it is probably on Windows and lets try to create a junction + fs.symlinkSync(path.join(__dirname, '..', '..', 'package') + '\\', packageDir, 'junction'); +} +try { + fs.symlinkSync('../../source/node_modules/mod-a', symlinkModADir, 'dir'); +} catch (err) { + // if fails then it is probably on Windows and lets try to create a junction + fs.symlinkSync(path.join(__dirname, '..', '..', 'source', 'node_modules', 'mod-a') + '\\', symlinkModADir, 'junction'); +} + +test('symlink', function (t) { + t.plan(2); + + resolve('foo', { basedir: symlinkDir, preserveSymlinks: false }, function (err, res, pkg) { + t.error(err); + t.equal(res, path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js')); + }); +}); + +test('sync symlink when preserveSymlinks = true', function (t) { + t.plan(4); + + resolve('foo', { basedir: symlinkDir }, function (err, res, pkg) { + t.ok(err, 'there is an error'); + t.notOk(res, 'no result'); + + t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve'); + t.equal( + err && err.message, + 'Cannot find module \'foo\' from \'' + symlinkDir + '\'', + 'can not find nonexistent module' + ); + }); +}); + +test('sync symlink', function (t) { + var start = new Date(); + t.doesNotThrow(function () { + t.equal( + resolve.sync('foo', { basedir: symlinkDir, preserveSymlinks: false }), + path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js') + ); + }); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); +}); + +test('sync symlink when preserveSymlinks = true', function (t) { + t.throws(function () { + resolve.sync('foo', { basedir: symlinkDir }); + }, /Cannot find module 'foo'/); + t.end(); +}); + +test('sync symlink from node_modules to other dir when preserveSymlinks = false', function (t) { + var basedir = path.join(__dirname, 'resolver', 'symlinked', '_'); + var fn = resolve.sync('package', { basedir: basedir, preserveSymlinks: false }); + + t.equal(fn, path.resolve(__dirname, 'resolver/symlinked/package/bar.js')); + t.end(); +}); + +test('async symlink from node_modules to other dir when preserveSymlinks = false', function (t) { + t.plan(2); + var basedir = path.join(__dirname, 'resolver', 'symlinked', '_'); + resolve('package', { basedir: basedir, preserveSymlinks: false }, function (err, result) { + t.notOk(err, 'no error'); + t.equal(result, path.resolve(__dirname, 'resolver/symlinked/package/bar.js')); + }); +}); + +test('packageFilter', function (t) { + function relative(x) { + return path.relative(__dirname, x); + } + + function testPackageFilter(preserveSymlinks) { + return function (st) { + st.plan('is 1.x' ? 3 : 5); // eslint-disable-line no-constant-condition + + var destMain = 'symlinks/dest/node_modules/mod-a/index.js'; + var destPkg = 'symlinks/dest/node_modules/mod-a/package.json'; + var sourceMain = 'symlinks/source/node_modules/mod-a/index.js'; + var sourcePkg = 'symlinks/source/node_modules/mod-a/package.json'; + var destDir = path.join(__dirname, 'symlinks', 'dest'); + + /* eslint multiline-comment-style: 0 */ + /* v2.x will restore these tests + var packageFilterPath = []; + var actualPath = resolve.sync('mod-a', { + basedir: destDir, + preserveSymlinks: preserveSymlinks, + packageFilter: function (pkg, pkgfile, dir) { + packageFilterPath.push(pkgfile); + } + }); + st.equal( + relative(actualPath), + path.normalize(preserveSymlinks ? destMain : sourceMain), + 'sync: actual path is correct' + ); + st.deepEqual( + map(packageFilterPath, relative), + map(preserveSymlinks ? [destPkg, destPkg] : [sourcePkg, sourcePkg], path.normalize), + 'sync: packageFilter pkgfile arg is correct' + ); + */ + + var asyncPackageFilterPath = []; + resolve( + 'mod-a', + { + basedir: destDir, + preserveSymlinks: preserveSymlinks, + packageFilter: function (pkg, pkgfile) { + asyncPackageFilterPath.push(pkgfile); + } + }, + function (err, actualPath) { + st.error(err, 'no error'); + st.equal( + relative(actualPath), + path.normalize(preserveSymlinks ? destMain : sourceMain), + 'async: actual path is correct' + ); + st.deepEqual( + map(asyncPackageFilterPath, relative), + map( + preserveSymlinks ? [destPkg, destPkg, destPkg] : [sourcePkg, sourcePkg, sourcePkg], + path.normalize + ), + 'async: packageFilter pkgfile arg is correct' + ); + } + ); + }; + } + + t.test('preserveSymlinks: false', testPackageFilter(false)); + + t.test('preserveSymlinks: true', testPackageFilter(true)); + + t.end(); +}); diff --git a/node_modules/ret/LICENSE b/node_modules/ret/LICENSE new file mode 100644 index 00000000..b351ee8e --- /dev/null +++ b/node_modules/ret/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2011 by Roly Fentanes + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/ret/README.md b/node_modules/ret/README.md new file mode 100644 index 00000000..28563e16 --- /dev/null +++ b/node_modules/ret/README.md @@ -0,0 +1,183 @@ +# Regular Expression Tokenizer + +Tokenizes strings that represent a regular expressions. + +[![Build Status](https://secure.travis-ci.org/fent/ret.js.svg)](http://travis-ci.org/fent/ret.js) +[![Dependency Status](https://david-dm.org/fent/ret.js.svg)](https://david-dm.org/fent/ret.js) +[![codecov](https://codecov.io/gh/fent/ret.js/branch/master/graph/badge.svg)](https://codecov.io/gh/fent/ret.js) + +# Usage + +```js +var ret = require('ret'); + +var tokens = ret(/foo|bar/.source); +``` + +`tokens` will contain the following object + +```js +{ + "type": ret.types.ROOT + "options": [ + [ { "type": ret.types.CHAR, "value", 102 }, + { "type": ret.types.CHAR, "value", 111 }, + { "type": ret.types.CHAR, "value", 111 } ], + [ { "type": ret.types.CHAR, "value", 98 }, + { "type": ret.types.CHAR, "value", 97 }, + { "type": ret.types.CHAR, "value", 114 } ] + ] +} +``` + +# Token Types + +`ret.types` is a collection of the various token types exported by ret. + +### ROOT + +Only used in the root of the regexp. This is needed due to the posibility of the root containing a pipe `|` character. In that case, the token will have an `options` key that will be an array of arrays of tokens. If not, it will contain a `stack` key that is an array of tokens. + +```js +{ + "type": ret.types.ROOT, + "stack": [token1, token2...], +} +``` + +```js +{ + "type": ret.types.ROOT, + "options" [ + [token1, token2...], + [othertoken1, othertoken2...] + ... + ], +} +``` + +### GROUP + +Groups contain tokens that are inside of a parenthesis. If the group begins with `?` followed by another character, it's a special type of group. A ':' tells the group not to be remembered when `exec` is used. '=' means the previous token matches only if followed by this group, and '!' means the previous token matches only if NOT followed. + +Like root, it can contain an `options` key instead of `stack` if there is a pipe. + +```js +{ + "type": ret.types.GROUP, + "remember" true, + "followedBy": false, + "notFollowedBy": false, + "stack": [token1, token2...], +} +``` + +```js +{ + "type": ret.types.GROUP, + "remember" true, + "followedBy": false, + "notFollowedBy": false, + "options" [ + [token1, token2...], + [othertoken1, othertoken2...] + ... + ], +} +``` + +### POSITION + +`\b`, `\B`, `^`, and `$` specify positions in the regexp. + +```js +{ + "type": ret.types.POSITION, + "value": "^", +} +``` + +### SET + +Contains a key `set` specifying what tokens are allowed and a key `not` specifying if the set should be negated. A set can contain other sets, ranges, and characters. + +```js +{ + "type": ret.types.SET, + "set": [token1, token2...], + "not": false, +} +``` + +### RANGE + +Used in set tokens to specify a character range. `from` and `to` are character codes. + +```js +{ + "type": ret.types.RANGE, + "from": 97, + "to": 122, +} +``` + +### REPETITION + +```js +{ + "type": ret.types.REPETITION, + "min": 0, + "max": Infinity, + "value": token, +} +``` + +### REFERENCE + +References a group token. `value` is 1-9. + +```js +{ + "type": ret.types.REFERENCE, + "value": 1, +} +``` + +### CHAR + +Represents a single character token. `value` is the character code. This might seem a bit cluttering instead of concatenating characters together. But since repetition tokens only repeat the last token and not the last clause like the pipe, it's simpler to do it this way. + +```js +{ + "type": ret.types.CHAR, + "value": 123, +} +``` + +## Errors + +ret.js will throw errors if given a string with an invalid regular expression. All possible errors are + +* Invalid group. When a group with an immediate `?` character is followed by an invalid character. It can only be followed by `!`, `=`, or `:`. Example: `/(?_abc)/` +* Nothing to repeat. Thrown when a repetitional token is used as the first token in the current clause, as in right in the beginning of the regexp or group, or right after a pipe. Example: `/foo|?bar/`, `/{1,3}foo|bar/`, `/foo(+bar)/` +* Unmatched ). A group was not opened, but was closed. Example: `/hello)2u/` +* Unterminated group. A group was not closed. Example: `/(1(23)4/` +* Unterminated character class. A custom character set was not closed. Example: `/[abc/` + + +# Install + + npm install ret + + +# Tests + +Tests are written with [vows](http://vowsjs.org/) + +```bash +npm test +``` + +# License + +MIT diff --git a/node_modules/ret/package.json b/node_modules/ret/package.json new file mode 100644 index 00000000..2fde9a44 --- /dev/null +++ b/node_modules/ret/package.json @@ -0,0 +1,35 @@ +{ + "name": "ret", + "description": "Tokenizes a string that represents a regular expression.", + "keywords": [ + "regex", + "regexp", + "regular expression", + "parser", + "tokenizer" + ], + "version": "0.1.15", + "repository": { + "type": "git", + "url": "git://github.com/fent/ret.js.git" + }, + "author": "Roly Fentanes (https://github.com/fent)", + "main": "./lib/index.js", + "files": [ + "lib" + ], + "scripts": { + "test": "istanbul cover vows -- --spec test/*-test.js" + }, + "directories": { + "lib": "./lib" + }, + "devDependencies": { + "istanbul": "*", + "vows": "*" + }, + "engines": { + "node": ">=0.12" + }, + "license": "MIT" +} diff --git a/node_modules/rimraf/LICENSE b/node_modules/rimraf/LICENSE new file mode 100644 index 00000000..19129e31 --- /dev/null +++ b/node_modules/rimraf/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/rimraf/README.md b/node_modules/rimraf/README.md new file mode 100644 index 00000000..423b8cf8 --- /dev/null +++ b/node_modules/rimraf/README.md @@ -0,0 +1,101 @@ +[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies) + +The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node. + +Install with `npm install rimraf`, or just drop rimraf.js somewhere. + +## API + +`rimraf(f, [opts], callback)` + +The first parameter will be interpreted as a globbing pattern for files. If you +want to disable globbing you can do so with `opts.disableGlob` (defaults to +`false`). This might be handy, for instance, if you have filenames that contain +globbing wildcard characters. + +The callback will be called with an error if there is one. Certain +errors are handled for you: + +* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of + `opts.maxBusyTries` times before giving up, adding 100ms of wait + between each attempt. The default `maxBusyTries` is 3. +* `ENOENT` - If the file doesn't exist, rimraf will return + successfully, since your desired outcome is already the case. +* `EMFILE` - Since `readdir` requires opening a file descriptor, it's + possible to hit `EMFILE` if too many file descriptors are in use. + In the sync case, there's nothing to be done for this. But in the + async case, rimraf will gradually back off with timeouts up to + `opts.emfileWait` ms, which defaults to 1000. + +## options + +* unlink, chmod, stat, lstat, rmdir, readdir, + unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync + + In order to use a custom file system library, you can override + specific fs functions on the options object. + + If any of these functions are present on the options object, then + the supplied function will be used instead of the default fs + method. + + Sync methods are only relevant for `rimraf.sync()`, of course. + + For example: + + ```javascript + var myCustomFS = require('some-custom-fs') + + rimraf('some-thing', myCustomFS, callback) + ``` + +* maxBusyTries + + If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered + on Windows systems, then rimraf will retry with a linear backoff + wait of 100ms longer on each try. The default maxBusyTries is 3. + + Only relevant for async usage. + +* emfileWait + + If an `EMFILE` error is encountered, then rimraf will retry + repeatedly with a linear backoff of 1ms longer on each try, until + the timeout counter hits this max. The default limit is 1000. + + If you repeatedly encounter `EMFILE` errors, then consider using + [graceful-fs](http://npm.im/graceful-fs) in your program. + + Only relevant for async usage. + +* glob + + Set to `false` to disable [glob](http://npm.im/glob) pattern + matching. + + Set to an object to pass options to the glob module. The default + glob options are `{ nosort: true, silent: true }`. + + Glob version 6 is used in this module. + + Relevant for both sync and async usage. + +* disableGlob + + Set to any non-falsey value to disable globbing entirely. + (Equivalent to setting `glob: false`.) + +## rimraf.sync + +It can remove stuff synchronously, too. But that's not so good. Use +the async API. It's better. + +## CLI + +If installed with `npm install rimraf -g` it can be used as a global +command `rimraf [ ...]` which is useful for cross platform support. + +## mkdirp + +If you need to create a directory recursively, check out +[mkdirp](https://github.com/substack/node-mkdirp). diff --git a/node_modules/rimraf/bin.js b/node_modules/rimraf/bin.js new file mode 100755 index 00000000..0d1e17be --- /dev/null +++ b/node_modules/rimraf/bin.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node + +var rimraf = require('./') + +var help = false +var dashdash = false +var noglob = false +var args = process.argv.slice(2).filter(function(arg) { + if (dashdash) + return !!arg + else if (arg === '--') + dashdash = true + else if (arg === '--no-glob' || arg === '-G') + noglob = true + else if (arg === '--glob' || arg === '-g') + noglob = false + else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/)) + help = true + else + return !!arg +}) + +if (help || args.length === 0) { + // If they didn't ask for help, then this is not a "success" + var log = help ? console.log : console.error + log('Usage: rimraf [ ...]') + log('') + log(' Deletes all files and folders at "path" recursively.') + log('') + log('Options:') + log('') + log(' -h, --help Display this usage info') + log(' -G, --no-glob Do not expand glob patterns in arguments') + log(' -g, --glob Expand glob patterns in arguments (default)') + process.exit(help ? 0 : 1) +} else + go(0) + +function go (n) { + if (n >= args.length) + return + var options = {} + if (noglob) + options = { glob: false } + rimraf(args[n], options, function (er) { + if (er) + throw er + go(n+1) + }) +} diff --git a/node_modules/rimraf/package.json b/node_modules/rimraf/package.json new file mode 100644 index 00000000..26e05d85 --- /dev/null +++ b/node_modules/rimraf/package.json @@ -0,0 +1,29 @@ +{ + "name": "rimraf", + "version": "2.7.1", + "main": "rimraf.js", + "description": "A deep deletion module for node (like `rm -rf`)", + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "ISC", + "repository": "git://github.com/isaacs/rimraf.git", + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags", + "test": "tap test/*.js" + }, + "bin": "./bin.js", + "dependencies": { + "glob": "^7.1.3" + }, + "files": [ + "LICENSE", + "README.md", + "bin.js", + "rimraf.js" + ], + "devDependencies": { + "mkdirp": "^0.5.1", + "tap": "^12.1.1" + } +} diff --git a/node_modules/rimraf/rimraf.js b/node_modules/rimraf/rimraf.js new file mode 100644 index 00000000..a90ad029 --- /dev/null +++ b/node_modules/rimraf/rimraf.js @@ -0,0 +1,372 @@ +module.exports = rimraf +rimraf.sync = rimrafSync + +var assert = require("assert") +var path = require("path") +var fs = require("fs") +var glob = undefined +try { + glob = require("glob") +} catch (_err) { + // treat glob as optional. +} +var _0666 = parseInt('666', 8) + +var defaultGlobOpts = { + nosort: true, + silent: true +} + +// for EMFILE handling +var timeout = 0 + +var isWindows = (process.platform === "win32") + +function defaults (options) { + var methods = [ + 'unlink', + 'chmod', + 'stat', + 'lstat', + 'rmdir', + 'readdir' + ] + methods.forEach(function(m) { + options[m] = options[m] || fs[m] + m = m + 'Sync' + options[m] = options[m] || fs[m] + }) + + options.maxBusyTries = options.maxBusyTries || 3 + options.emfileWait = options.emfileWait || 1000 + if (options.glob === false) { + options.disableGlob = true + } + if (options.disableGlob !== true && glob === undefined) { + throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') + } + options.disableGlob = options.disableGlob || false + options.glob = options.glob || defaultGlobOpts +} + +function rimraf (p, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } + + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert.equal(typeof cb, 'function', 'rimraf: callback function required') + assert(options, 'rimraf: invalid options argument provided') + assert.equal(typeof options, 'object', 'rimraf: options should be object') + + defaults(options) + + var busyTries = 0 + var errState = null + var n = 0 + + if (options.disableGlob || !glob.hasMagic(p)) + return afterGlob(null, [p]) + + options.lstat(p, function (er, stat) { + if (!er) + return afterGlob(null, [p]) + + glob(p, options.glob, afterGlob) + }) + + function next (er) { + errState = errState || er + if (--n === 0) + cb(errState) + } + + function afterGlob (er, results) { + if (er) + return cb(er) + + n = results.length + if (n === 0) + return cb() + + results.forEach(function (p) { + rimraf_(p, options, function CB (er) { + if (er) { + if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && + busyTries < options.maxBusyTries) { + busyTries ++ + var time = busyTries * 100 + // try again, with the same exact callback as this one. + return setTimeout(function () { + rimraf_(p, options, CB) + }, time) + } + + // this one won't happen if graceful-fs is used. + if (er.code === "EMFILE" && timeout < options.emfileWait) { + return setTimeout(function () { + rimraf_(p, options, CB) + }, timeout ++) + } + + // already gone + if (er.code === "ENOENT") er = null + } + + timeout = 0 + next(er) + }) + }) + } +} + +// Two possible strategies. +// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR +// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR +// +// Both result in an extra syscall when you guess wrong. However, there +// are likely far more normal files in the world than directories. This +// is based on the assumption that a the average number of files per +// directory is >= 1. +// +// If anyone ever complains about this, then I guess the strategy could +// be made configurable somehow. But until then, YAGNI. +function rimraf_ (p, options, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + + // sunos lets the root user unlink directories, which is... weird. + // so we have to lstat here and make sure it's not a dir. + options.lstat(p, function (er, st) { + if (er && er.code === "ENOENT") + return cb(null) + + // Windows can EPERM on stat. Life is suffering. + if (er && er.code === "EPERM" && isWindows) + fixWinEPERM(p, options, er, cb) + + if (st && st.isDirectory()) + return rmdir(p, options, er, cb) + + options.unlink(p, function (er) { + if (er) { + if (er.code === "ENOENT") + return cb(null) + if (er.code === "EPERM") + return (isWindows) + ? fixWinEPERM(p, options, er, cb) + : rmdir(p, options, er, cb) + if (er.code === "EISDIR") + return rmdir(p, options, er, cb) + } + return cb(er) + }) + }) +} + +function fixWinEPERM (p, options, er, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + if (er) + assert(er instanceof Error) + + options.chmod(p, _0666, function (er2) { + if (er2) + cb(er2.code === "ENOENT" ? null : er) + else + options.stat(p, function(er3, stats) { + if (er3) + cb(er3.code === "ENOENT" ? null : er) + else if (stats.isDirectory()) + rmdir(p, options, er, cb) + else + options.unlink(p, cb) + }) + }) +} + +function fixWinEPERMSync (p, options, er) { + assert(p) + assert(options) + if (er) + assert(er instanceof Error) + + try { + options.chmodSync(p, _0666) + } catch (er2) { + if (er2.code === "ENOENT") + return + else + throw er + } + + try { + var stats = options.statSync(p) + } catch (er3) { + if (er3.code === "ENOENT") + return + else + throw er + } + + if (stats.isDirectory()) + rmdirSync(p, options, er) + else + options.unlinkSync(p) +} + +function rmdir (p, options, originalEr, cb) { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + assert(typeof cb === 'function') + + // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) + // if we guessed wrong, and it's not a directory, then + // raise the original error. + options.rmdir(p, function (er) { + if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) + rmkids(p, options, cb) + else if (er && er.code === "ENOTDIR") + cb(originalEr) + else + cb(er) + }) +} + +function rmkids(p, options, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + + options.readdir(p, function (er, files) { + if (er) + return cb(er) + var n = files.length + if (n === 0) + return options.rmdir(p, cb) + var errState + files.forEach(function (f) { + rimraf(path.join(p, f), options, function (er) { + if (errState) + return + if (er) + return cb(errState = er) + if (--n === 0) + options.rmdir(p, cb) + }) + }) + }) +} + +// this looks simpler, and is strictly *faster*, but will +// tie up the JavaScript thread and fail on excessively +// deep directory trees. +function rimrafSync (p, options) { + options = options || {} + defaults(options) + + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert(options, 'rimraf: missing options') + assert.equal(typeof options, 'object', 'rimraf: options should be object') + + var results + + if (options.disableGlob || !glob.hasMagic(p)) { + results = [p] + } else { + try { + options.lstatSync(p) + results = [p] + } catch (er) { + results = glob.sync(p, options.glob) + } + } + + if (!results.length) + return + + for (var i = 0; i < results.length; i++) { + var p = results[i] + + try { + var st = options.lstatSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + + // Windows can EPERM on stat. Life is suffering. + if (er.code === "EPERM" && isWindows) + fixWinEPERMSync(p, options, er) + } + + try { + // sunos lets the root user unlink directories, which is... weird. + if (st && st.isDirectory()) + rmdirSync(p, options, null) + else + options.unlinkSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "EPERM") + return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) + if (er.code !== "EISDIR") + throw er + + rmdirSync(p, options, er) + } + } +} + +function rmdirSync (p, options, originalEr) { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + + try { + options.rmdirSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "ENOTDIR") + throw originalEr + if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") + rmkidsSync(p, options) + } +} + +function rmkidsSync (p, options) { + assert(p) + assert(options) + options.readdirSync(p).forEach(function (f) { + rimrafSync(path.join(p, f), options) + }) + + // We only end up here once we got ENOTEMPTY at least once, and + // at this point, we are guaranteed to have removed all the kids. + // So, we know that it won't be ENOENT or ENOTDIR or anything else. + // try really hard to delete stuff on windows, because it has a + // PROFOUNDLY annoying habit of not closing handles promptly when + // files are deleted, resulting in spurious ENOTEMPTY errors. + var retries = isWindows ? 100 : 1 + var i = 0 + do { + var threw = true + try { + var ret = options.rmdirSync(p, options) + threw = false + return ret + } finally { + if (++i < retries && threw) + continue + } + } while (true) +} diff --git a/node_modules/safe-buffer/LICENSE b/node_modules/safe-buffer/LICENSE new file mode 100644 index 00000000..0c068cee --- /dev/null +++ b/node_modules/safe-buffer/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/safe-buffer/README.md b/node_modules/safe-buffer/README.md new file mode 100644 index 00000000..e9a81afd --- /dev/null +++ b/node_modules/safe-buffer/README.md @@ -0,0 +1,584 @@ +# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url] + +[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg +[travis-url]: https://travis-ci.org/feross/safe-buffer +[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg +[npm-url]: https://npmjs.org/package/safe-buffer +[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg +[downloads-url]: https://npmjs.org/package/safe-buffer +[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg +[standard-url]: https://standardjs.com + +#### Safer Node.js Buffer API + +**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`, +`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.** + +**Uses the built-in implementation when available.** + +## install + +``` +npm install safe-buffer +``` + +## usage + +The goal of this package is to provide a safe replacement for the node.js `Buffer`. + +It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to +the top of your node.js modules: + +```js +var Buffer = require('safe-buffer').Buffer + +// Existing buffer code will continue to work without issues: + +new Buffer('hey', 'utf8') +new Buffer([1, 2, 3], 'utf8') +new Buffer(obj) +new Buffer(16) // create an uninitialized buffer (potentially unsafe) + +// But you can use these new explicit APIs to make clear what you want: + +Buffer.from('hey', 'utf8') // convert from many types to a Buffer +Buffer.alloc(16) // create a zero-filled buffer (safe) +Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe) +``` + +## api + +### Class Method: Buffer.from(array) + + +* `array` {Array} + +Allocates a new `Buffer` using an `array` of octets. + +```js +const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]); + // creates a new Buffer containing ASCII bytes + // ['b','u','f','f','e','r'] +``` + +A `TypeError` will be thrown if `array` is not an `Array`. + +### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]]) + + +* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or + a `new ArrayBuffer()` +* `byteOffset` {Number} Default: `0` +* `length` {Number} Default: `arrayBuffer.length - byteOffset` + +When passed a reference to the `.buffer` property of a `TypedArray` instance, +the newly created `Buffer` will share the same allocated memory as the +TypedArray. + +```js +const arr = new Uint16Array(2); +arr[0] = 5000; +arr[1] = 4000; + +const buf = Buffer.from(arr.buffer); // shares the memory with arr; + +console.log(buf); + // Prints: + +// changing the TypedArray changes the Buffer also +arr[1] = 6000; + +console.log(buf); + // Prints: +``` + +The optional `byteOffset` and `length` arguments specify a memory range within +the `arrayBuffer` that will be shared by the `Buffer`. + +```js +const ab = new ArrayBuffer(10); +const buf = Buffer.from(ab, 0, 2); +console.log(buf.length); + // Prints: 2 +``` + +A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`. + +### Class Method: Buffer.from(buffer) + + +* `buffer` {Buffer} + +Copies the passed `buffer` data onto a new `Buffer` instance. + +```js +const buf1 = Buffer.from('buffer'); +const buf2 = Buffer.from(buf1); + +buf1[0] = 0x61; +console.log(buf1.toString()); + // 'auffer' +console.log(buf2.toString()); + // 'buffer' (copy is not changed) +``` + +A `TypeError` will be thrown if `buffer` is not a `Buffer`. + +### Class Method: Buffer.from(str[, encoding]) + + +* `str` {String} String to encode. +* `encoding` {String} Encoding to use, Default: `'utf8'` + +Creates a new `Buffer` containing the given JavaScript string `str`. If +provided, the `encoding` parameter identifies the character encoding. +If not provided, `encoding` defaults to `'utf8'`. + +```js +const buf1 = Buffer.from('this is a tést'); +console.log(buf1.toString()); + // prints: this is a tést +console.log(buf1.toString('ascii')); + // prints: this is a tC)st + +const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex'); +console.log(buf2.toString()); + // prints: this is a tést +``` + +A `TypeError` will be thrown if `str` is not a string. + +### Class Method: Buffer.alloc(size[, fill[, encoding]]) + + +* `size` {Number} +* `fill` {Value} Default: `undefined` +* `encoding` {String} Default: `utf8` + +Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the +`Buffer` will be *zero-filled*. + +```js +const buf = Buffer.alloc(5); +console.log(buf); + // +``` + +The `size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +If `fill` is specified, the allocated `Buffer` will be initialized by calling +`buf.fill(fill)`. See [`buf.fill()`][] for more information. + +```js +const buf = Buffer.alloc(5, 'a'); +console.log(buf); + // +``` + +If both `fill` and `encoding` are specified, the allocated `Buffer` will be +initialized by calling `buf.fill(fill, encoding)`. For example: + +```js +const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64'); +console.log(buf); + // +``` + +Calling `Buffer.alloc(size)` can be significantly slower than the alternative +`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance +contents will *never contain sensitive data*. + +A `TypeError` will be thrown if `size` is not a number. + +### Class Method: Buffer.allocUnsafe(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* `Buffer` of `size` bytes. The `size` must +be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit +architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is +thrown. A zero-length Buffer will be created if a `size` less than or equal to +0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +```js +const buf = Buffer.allocUnsafe(5); +console.log(buf); + // + // (octets will be different, every time) +buf.fill(0); +console.log(buf); + // +``` + +A `TypeError` will be thrown if `size` is not a number. + +Note that the `Buffer` module pre-allocates an internal `Buffer` instance of +size `Buffer.poolSize` that is used as a pool for the fast allocation of new +`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated +`new Buffer(size)` constructor) only when `size` is less than or equal to +`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default +value of `Buffer.poolSize` is `8192` but can be modified. + +Use of this pre-allocated internal memory pool is a key difference between +calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`. +Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer +pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal +Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The +difference is subtle but can be important when an application requires the +additional performance that `Buffer.allocUnsafe(size)` provides. + +### Class Method: Buffer.allocUnsafeSlow(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes. The +`size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances, +allocations under 4KB are, by default, sliced from a single pre-allocated +`Buffer`. This allows applications to avoid the garbage collection overhead of +creating many individually allocated Buffers. This approach improves both +performance and memory usage by eliminating the need to track and cleanup as +many `Persistent` objects. + +However, in the case where a developer may need to retain a small chunk of +memory from a pool for an indeterminate amount of time, it may be appropriate +to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then +copy out the relevant bits. + +```js +// need to keep around a few small chunks of memory +const store = []; + +socket.on('readable', () => { + const data = socket.read(); + // allocate for retained data + const sb = Buffer.allocUnsafeSlow(10); + // copy the data into the new allocation + data.copy(sb, 0, 0, 10); + store.push(sb); +}); +``` + +Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after* +a developer has observed undue memory retention in their applications. + +A `TypeError` will be thrown if `size` is not a number. + +### All the Rest + +The rest of the `Buffer` API is exactly the same as in node.js. +[See the docs](https://nodejs.org/api/buffer.html). + + +## Related links + +- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660) +- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4) + +## Why is `Buffer` unsafe? + +Today, the node.js `Buffer` constructor is overloaded to handle many different argument +types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.), +`ArrayBuffer`, and also `Number`. + +The API is optimized for convenience: you can throw any type at it, and it will try to do +what you want. + +Because the Buffer constructor is so powerful, you often see code like this: + +```js +// Convert UTF-8 strings to hex +function toHex (str) { + return new Buffer(str).toString('hex') +} +``` + +***But what happens if `toHex` is called with a `Number` argument?*** + +### Remote Memory Disclosure + +If an attacker can make your program call the `Buffer` constructor with a `Number` +argument, then they can make it allocate uninitialized memory from the node.js process. +This could potentially disclose TLS private keys, user data, or database passwords. + +When the `Buffer` constructor is passed a `Number` argument, it returns an +**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like +this, you **MUST** overwrite the contents before returning it to the user. + +From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size): + +> `new Buffer(size)` +> +> - `size` Number +> +> The underlying memory for `Buffer` instances created in this way is not initialized. +> **The contents of a newly created `Buffer` are unknown and could contain sensitive +> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes. + +(Emphasis our own.) + +Whenever the programmer intended to create an uninitialized `Buffer` you often see code +like this: + +```js +var buf = new Buffer(16) + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### Would this ever be a problem in real code? + +Yes. It's surprisingly common to forget to check the type of your variables in a +dynamically-typed language like JavaScript. + +Usually the consequences of assuming the wrong type is that your program crashes with an +uncaught exception. But the failure mode for forgetting to check the type of arguments to +the `Buffer` constructor is more catastrophic. + +Here's an example of a vulnerable service that takes a JSON payload and converts it to +hex: + +```js +// Take a JSON payload {str: "some string"} and convert it to hex +var server = http.createServer(function (req, res) { + var data = '' + req.setEncoding('utf8') + req.on('data', function (chunk) { + data += chunk + }) + req.on('end', function () { + var body = JSON.parse(data) + res.end(new Buffer(body.str).toString('hex')) + }) +}) + +server.listen(8080) +``` + +In this example, an http client just has to send: + +```json +{ + "str": 1000 +} +``` + +and it will get back 1,000 bytes of uninitialized memory from the server. + +This is a very serious bug. It's similar in severity to the +[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process +memory by remote attackers. + + +### Which real-world packages were vulnerable? + +#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht) + +[Mathias Buus](https://github.com/mafintosh) and I +([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages, +[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow +anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get +them to reveal 20 bytes at a time of uninitialized memory from the node.js process. + +Here's +[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8) +that fixed it. We released a new fixed version, created a +[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all +vulnerable versions on npm so users will get a warning to upgrade to a newer version. + +#### [`ws`](https://www.npmjs.com/package/ws) + +That got us wondering if there were other vulnerable packages. Sure enough, within a short +period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the +most popular WebSocket implementation in node.js. + +If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as +expected, then uninitialized server memory would be disclosed to the remote peer. + +These were the vulnerable methods: + +```js +socket.send(number) +socket.ping(number) +socket.pong(number) +``` + +Here's a vulnerable socket server with some echo functionality: + +```js +server.on('connection', function (socket) { + socket.on('message', function (message) { + message = JSON.parse(message) + if (message.type === 'echo') { + socket.send(message.data) // send back the user's message + } + }) +}) +``` + +`socket.send(number)` called on the server, will disclose server memory. + +Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue +was fixed, with a more detailed explanation. Props to +[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the +[Node Security Project disclosure](https://nodesecurity.io/advisories/67). + + +### What's the solution? + +It's important that node.js offers a fast way to get memory otherwise performance-critical +applications would needlessly get a lot slower. + +But we need a better way to *signal our intent* as programmers. **When we want +uninitialized memory, we should request it explicitly.** + +Sensitive functionality should not be packed into a developer-friendly API that loosely +accepts many different types. This type of API encourages the lazy practice of passing +variables in without checking the type very carefully. + +#### A new API: `Buffer.allocUnsafe(number)` + +The functionality of creating buffers with uninitialized memory should be part of another +API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that +frequently gets user input of all sorts of different types passed into it. + +```js +var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory! + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### How do we fix node.js core? + +We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as +`semver-major`) which defends against one case: + +```js +var str = 16 +new Buffer(str, 'utf8') +``` + +In this situation, it's implied that the programmer intended the first argument to be a +string, since they passed an encoding as a second argument. Today, node.js will allocate +uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not +what the programmer intended. + +But this is only a partial solution, since if the programmer does `new Buffer(variable)` +(without an `encoding` parameter) there's no way to know what they intended. If `variable` +is sometimes a number, then uninitialized memory will sometimes be returned. + +### What's the real long-term fix? + +We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when +we need uninitialized memory. But that would break 1000s of packages. + +~~We believe the best solution is to:~~ + +~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~ + +~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~ + +#### Update + +We now support adding three new APIs: + +- `Buffer.from(value)` - convert from any type to a buffer +- `Buffer.alloc(size)` - create a zero-filled buffer +- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size + +This solves the core problem that affected `ws` and `bittorrent-dht` which is +`Buffer(variable)` getting tricked into taking a number argument. + +This way, existing code continues working and the impact on the npm ecosystem will be +minimal. Over time, npm maintainers can migrate performance-critical code to use +`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`. + + +### Conclusion + +We think there's a serious design issue with the `Buffer` API as it exists today. It +promotes insecure software by putting high-risk functionality into a convenient API +with friendly "developer ergonomics". + +This wasn't merely a theoretical exercise because we found the issue in some of the +most popular npm packages. + +Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of +`buffer`. + +```js +var Buffer = require('safe-buffer').Buffer +``` + +Eventually, we hope that node.js core can switch to this new, safer behavior. We believe +the impact on the ecosystem would be minimal since it's not a breaking change. +Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while +older, insecure packages would magically become safe from this attack vector. + + +## links + +- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514) +- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67) +- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68) + + +## credit + +The original issues in `bittorrent-dht` +([disclosure](https://nodesecurity.io/advisories/68)) and +`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by +[Mathias Buus](https://github.com/mafintosh) and +[Feross Aboukhadijeh](http://feross.org/). + +Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues +and for his work running the [Node Security Project](https://nodesecurity.io/). + +Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and +auditing the code. + + +## license + +MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org) diff --git a/node_modules/safe-buffer/index.d.ts b/node_modules/safe-buffer/index.d.ts new file mode 100644 index 00000000..e9fed809 --- /dev/null +++ b/node_modules/safe-buffer/index.d.ts @@ -0,0 +1,187 @@ +declare module "safe-buffer" { + export class Buffer { + length: number + write(string: string, offset?: number, length?: number, encoding?: string): number; + toString(encoding?: string, start?: number, end?: number): string; + toJSON(): { type: 'Buffer', data: any[] }; + equals(otherBuffer: Buffer): boolean; + compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; + copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + slice(start?: number, end?: number): Buffer; + writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readUInt8(offset: number, noAssert?: boolean): number; + readUInt16LE(offset: number, noAssert?: boolean): number; + readUInt16BE(offset: number, noAssert?: boolean): number; + readUInt32LE(offset: number, noAssert?: boolean): number; + readUInt32BE(offset: number, noAssert?: boolean): number; + readInt8(offset: number, noAssert?: boolean): number; + readInt16LE(offset: number, noAssert?: boolean): number; + readInt16BE(offset: number, noAssert?: boolean): number; + readInt32LE(offset: number, noAssert?: boolean): number; + readInt32BE(offset: number, noAssert?: boolean): number; + readFloatLE(offset: number, noAssert?: boolean): number; + readFloatBE(offset: number, noAssert?: boolean): number; + readDoubleLE(offset: number, noAssert?: boolean): number; + readDoubleBE(offset: number, noAssert?: boolean): number; + swap16(): Buffer; + swap32(): Buffer; + swap64(): Buffer; + writeUInt8(value: number, offset: number, noAssert?: boolean): number; + writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeInt8(value: number, offset: number, noAssert?: boolean): number; + writeInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeFloatLE(value: number, offset: number, noAssert?: boolean): number; + writeFloatBE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; + fill(value: any, offset?: number, end?: number): this; + indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; + + /** + * Allocates a new buffer containing the given {str}. + * + * @param str String to store in buffer. + * @param encoding encoding to use, optional. Default is 'utf8' + */ + constructor (str: string, encoding?: string); + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + */ + constructor (size: number); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: Uint8Array); + /** + * Produces a Buffer backed by the same allocated memory as + * the given {ArrayBuffer}. + * + * + * @param arrayBuffer The ArrayBuffer with which to share memory. + */ + constructor (arrayBuffer: ArrayBuffer); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: any[]); + /** + * Copies the passed {buffer} data onto a new {Buffer} instance. + * + * @param buffer The buffer to copy. + */ + constructor (buffer: Buffer); + prototype: Buffer; + /** + * Allocates a new Buffer using an {array} of octets. + * + * @param array + */ + static from(array: any[]): Buffer; + /** + * When passed a reference to the .buffer property of a TypedArray instance, + * the newly created Buffer will share the same allocated memory as the TypedArray. + * The optional {byteOffset} and {length} arguments specify a memory range + * within the {arrayBuffer} that will be shared by the Buffer. + * + * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer() + * @param byteOffset + * @param length + */ + static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; + /** + * Copies the passed {buffer} data onto a new Buffer instance. + * + * @param buffer + */ + static from(buffer: Buffer): Buffer; + /** + * Creates a new Buffer containing the given JavaScript string {str}. + * If provided, the {encoding} parameter identifies the character encoding. + * If not provided, {encoding} defaults to 'utf8'. + * + * @param str + */ + static from(str: string, encoding?: string): Buffer; + /** + * Returns true if {obj} is a Buffer + * + * @param obj object to test. + */ + static isBuffer(obj: any): obj is Buffer; + /** + * Returns true if {encoding} is a valid encoding argument. + * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex' + * + * @param encoding string to test. + */ + static isEncoding(encoding: string): boolean; + /** + * Gives the actual byte length of a string. encoding defaults to 'utf8'. + * This is not the same as String.prototype.length since that returns the number of characters in a string. + * + * @param string string to test. + * @param encoding encoding used to evaluate (defaults to 'utf8') + */ + static byteLength(string: string, encoding?: string): number; + /** + * Returns a buffer which is the result of concatenating all the buffers in the list together. + * + * If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer. + * If the list has exactly one item, then the first item of the list is returned. + * If the list has more than one item, then a new Buffer is created. + * + * @param list An array of Buffer objects to concatenate + * @param totalLength Total length of the buffers when concatenated. + * If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly. + */ + static concat(list: Buffer[], totalLength?: number): Buffer; + /** + * The same as buf1.compare(buf2). + */ + static compare(buf1: Buffer, buf2: Buffer): number; + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + * @param fill if specified, buffer will be initialized by calling buf.fill(fill). + * If parameter is omitted, buffer will be filled with zeros. + * @param encoding encoding used for call to buf.fill while initalizing + */ + static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; + /** + * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafe(size: number): Buffer; + /** + * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafeSlow(size: number): Buffer; + } +} \ No newline at end of file diff --git a/node_modules/safe-buffer/index.js b/node_modules/safe-buffer/index.js new file mode 100644 index 00000000..f8d3ec98 --- /dev/null +++ b/node_modules/safe-buffer/index.js @@ -0,0 +1,65 @@ +/*! safe-buffer. MIT License. Feross Aboukhadijeh */ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.prototype = Object.create(Buffer.prototype) + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} diff --git a/node_modules/safe-buffer/package.json b/node_modules/safe-buffer/package.json new file mode 100644 index 00000000..f2869e25 --- /dev/null +++ b/node_modules/safe-buffer/package.json @@ -0,0 +1,51 @@ +{ + "name": "safe-buffer", + "description": "Safer Node.js Buffer API", + "version": "5.2.1", + "author": { + "name": "Feross Aboukhadijeh", + "email": "feross@feross.org", + "url": "https://feross.org" + }, + "bugs": { + "url": "https://github.com/feross/safe-buffer/issues" + }, + "devDependencies": { + "standard": "*", + "tape": "^5.0.0" + }, + "homepage": "https://github.com/feross/safe-buffer", + "keywords": [ + "buffer", + "buffer allocate", + "node security", + "safe", + "safe-buffer", + "security", + "uninitialized" + ], + "license": "MIT", + "main": "index.js", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "git://github.com/feross/safe-buffer.git" + }, + "scripts": { + "test": "standard && tape test/*.js" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] +} diff --git a/node_modules/safe-regex/.travis.yml b/node_modules/safe-regex/.travis.yml new file mode 100644 index 00000000..cc4dba29 --- /dev/null +++ b/node_modules/safe-regex/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/node_modules/safe-regex/LICENSE b/node_modules/safe-regex/LICENSE new file mode 100644 index 00000000..ee27ba4b --- /dev/null +++ b/node_modules/safe-regex/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/safe-regex/example/safe.js b/node_modules/safe-regex/example/safe.js new file mode 100644 index 00000000..f486f592 --- /dev/null +++ b/node_modules/safe-regex/example/safe.js @@ -0,0 +1,3 @@ +var safe = require('../'); +var regex = process.argv.slice(2).join(' '); +console.log(safe(regex)); diff --git a/node_modules/safe-regex/index.js b/node_modules/safe-regex/index.js new file mode 100644 index 00000000..488f5014 --- /dev/null +++ b/node_modules/safe-regex/index.js @@ -0,0 +1,43 @@ +var parse = require('ret'); +var types = parse.types; + +module.exports = function (re, opts) { + if (!opts) opts = {}; + var replimit = opts.limit === undefined ? 25 : opts.limit; + + if (isRegExp(re)) re = re.source; + else if (typeof re !== 'string') re = String(re); + + try { re = parse(re) } + catch (err) { return false } + + var reps = 0; + return (function walk (node, starHeight) { + if (node.type === types.REPETITION) { + starHeight ++; + reps ++; + if (starHeight > 1) return false; + if (reps > replimit) return false; + } + + if (node.options) { + for (var i = 0, len = node.options.length; i < len; i++) { + var ok = walk({ stack: node.options[i] }, starHeight); + if (!ok) return false; + } + } + var stack = node.stack || (node.value && node.value.stack); + if (!stack) return true; + + for (var i = 0; i < stack.length; i++) { + var ok = walk(stack[i], starHeight); + if (!ok) return false; + } + + return true; + })(re, 0); +}; + +function isRegExp (x) { + return {}.toString.call(x) === '[object RegExp]'; +} diff --git a/node_modules/safe-regex/package.json b/node_modules/safe-regex/package.json new file mode 100644 index 00000000..0dd631b5 --- /dev/null +++ b/node_modules/safe-regex/package.json @@ -0,0 +1,43 @@ +{ + "name": "safe-regex", + "version": "1.1.0", + "description": "detect possibly catastrophic, exponential-time regular expressions", + "main": "index.js", + "dependencies": { + "ret": "~0.1.10" + }, + "devDependencies": { + "tape": "^3.5.0" + }, + "scripts": { + "test": "tape test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8", "ie/9", "ie/10", + "firefox/latest", + "chrome/latest", + "opera/latest", + "safari/latest" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/substack/safe-regex.git" + }, + "homepage": "https://github.com/substack/safe-regex", + "keywords": [ + "catastrophic", + "exponential", + "regex", + "safe", + "sandbox" + ], + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "license": "MIT" +} diff --git a/node_modules/safe-regex/readme.markdown b/node_modules/safe-regex/readme.markdown new file mode 100644 index 00000000..83673ac3 --- /dev/null +++ b/node_modules/safe-regex/readme.markdown @@ -0,0 +1,65 @@ +# safe-regex + +detect potentially +[catastrophic](http://regular-expressions.mobi/catastrophic.html) +[exponential-time](http://perlgeek.de/blog-en/perl-tips/in-search-of-an-exponetial-regexp.html) +regular expressions by limiting the +[star height](https://en.wikipedia.org/wiki/Star_height) to 1 + +WARNING: This module merely *seems* to work given all the catastrophic regular +expressions I could find scouring the internet, but I don't have enough of a +background in automata to be absolutely sure that this module will catch all +exponential-time cases. + +[![browser support](https://ci.testling.com/substack/safe-regex.png)](https://ci.testling.com/substack/safe-regex) + +[![build status](https://secure.travis-ci.org/substack/safe-regex.png)](http://travis-ci.org/substack/safe-regex) + +# example + +``` js +var safe = require('safe-regex'); +var regex = process.argv.slice(2).join(' '); +console.log(safe(regex)); +``` + +``` +$ node safe.js '(x+x+)+y' +false +$ node safe.js '(beep|boop)*' +true +$ node safe.js '(a+){10}' +false +$ node safe.js '\blocation\s*:[^:\n]+\b(Oakland|San Francisco)\b' +true +``` + +# methods + +``` js +var safe = require('safe-regex') +``` + +## var ok = safe(re, opts={}) + +Return a boolean `ok` whether or not the regex `re` is safe and not possibly +catastrophic. + +`re` can be a `RegExp` object or just a string. + +If the `re` is a string and is an invalid regex, returns `false`. + +* `opts.limit` - maximum number of allowed repetitions in the entire regex. +Default: `25`. + +# install + +With [npm](https://npmjs.org) do: + +``` +npm install safe-regex +``` + +# license + +MIT diff --git a/node_modules/safe-regex/test/regex.js b/node_modules/safe-regex/test/regex.js new file mode 100644 index 00000000..0bda8504 --- /dev/null +++ b/node_modules/safe-regex/test/regex.js @@ -0,0 +1,50 @@ +var safe = require('../'); +var test = require('tape'); + +var good = [ + /\bOakland\b/, + /\b(Oakland|San Francisco)\b/i, + /^\d+1337\d+$/i, + /^\d+(1337|404)\d+$/i, + /^\d+(1337|404)*\d+$/i, + RegExp(Array(26).join('a?') + Array(26).join('a')), +]; + +test('safe regex', function (t) { + t.plan(good.length); + good.forEach(function (re) { + t.equal(safe(re), true); + }); +}); + + +var bad = [ + /^(a?){25}(a){25}$/, + RegExp(Array(27).join('a?') + Array(27).join('a')), + /(x+x+)+y/, + /foo|(x+x+)+y/, + /(a+){10}y/, + /(a+){2}y/, + /(.*){1,32000}[bc]/ +]; + +test('unsafe regex', function (t) { + t.plan(bad.length); + bad.forEach(function (re) { + t.equal(safe(re), false); + }); +}); + +var invalid = [ + '*Oakland*', + 'hey(yoo))', + 'abcde(?>hellow)', + '[abc' +]; + +test('invalid regex', function (t) { + t.plan(invalid.length); + invalid.forEach(function (re) { + t.equal(safe(re), false); + }); +}); diff --git a/node_modules/safer-buffer/LICENSE b/node_modules/safer-buffer/LICENSE new file mode 100644 index 00000000..4fe9e6f1 --- /dev/null +++ b/node_modules/safer-buffer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Nikita Skovoroda + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/safer-buffer/Porting-Buffer.md b/node_modules/safer-buffer/Porting-Buffer.md new file mode 100644 index 00000000..68d86bab --- /dev/null +++ b/node_modules/safer-buffer/Porting-Buffer.md @@ -0,0 +1,268 @@ +# Porting to the Buffer.from/Buffer.alloc API + + +## Overview + +- [Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x.](#variant-1) (*recommended*) +- [Variant 2: Use a polyfill](#variant-2) +- [Variant 3: manual detection, with safeguards](#variant-3) + +### Finding problematic bits of code using grep + +Just run `grep -nrE '[^a-zA-Z](Slow)?Buffer\s*\(' --exclude-dir node_modules`. + +It will find all the potentially unsafe places in your own code (with some considerably unlikely +exceptions). + +### Finding problematic bits of code using Node.js 8 + +If you’re using Node.js ≥ 8.0.0 (which is recommended), Node.js exposes multiple options that help with finding the relevant pieces of code: + +- `--trace-warnings` will make Node.js show a stack trace for this warning and other warnings that are printed by Node.js. +- `--trace-deprecation` does the same thing, but only for deprecation warnings. +- `--pending-deprecation` will show more types of deprecation warnings. In particular, it will show the `Buffer()` deprecation warning, even on Node.js 8. + +You can set these flags using an environment variable: + +```console +$ export NODE_OPTIONS='--trace-warnings --pending-deprecation' +$ cat example.js +'use strict'; +const foo = new Buffer('foo'); +$ node example.js +(node:7147) [DEP0005] DeprecationWarning: The Buffer() and new Buffer() constructors are not recommended for use due to security and usability concerns. Please use the new Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() construction methods instead. + at showFlaggedDeprecation (buffer.js:127:13) + at new Buffer (buffer.js:148:3) + at Object. (/path/to/example.js:2:13) + [... more stack trace lines ...] +``` + +### Finding problematic bits of code using linters + +Eslint rules [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +also find calls to deprecated `Buffer()` API. Those rules are included in some pre-sets. + +There is a drawback, though, that it doesn't always +[work correctly](https://github.com/chalker/safer-buffer#why-not-safe-buffer) when `Buffer` is +overriden e.g. with a polyfill, so recommended is a combination of this and some other method +described above. + + +## Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x. + +This is the recommended solution nowadays that would imply only minimal overhead. + +The Node.js 5.x release line has been unsupported since July 2016, and the Node.js 4.x release line reaches its End of Life in April 2018 (→ [Schedule](https://github.com/nodejs/Release#release-schedule)). This means that these versions of Node.js will *not* receive any updates, even in case of security issues, so using these release lines should be avoided, if at all possible. + +What you would do in this case is to convert all `new Buffer()` or `Buffer()` calls to use `Buffer.alloc()` or `Buffer.from()`, in the following way: + +- For `new Buffer(number)`, replace it with `Buffer.alloc(number)`. +- For `new Buffer(string)` (or `new Buffer(string, encoding)`), replace it with `Buffer.from(string)` (or `Buffer.from(string, encoding)`). +- For all other combinations of arguments (these are much rarer), also replace `new Buffer(...arguments)` with `Buffer.from(...arguments)`. + +Note that `Buffer.alloc()` is also _faster_ on the current Node.js versions than +`new Buffer(size).fill(0)`, which is what you would otherwise need to ensure zero-filling. + +Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +is recommended to avoid accidential unsafe Buffer API usage. + +There is also a [JSCodeshift codemod](https://github.com/joyeecheung/node-dep-codemod#dep005) +for automatically migrating Buffer constructors to `Buffer.alloc()` or `Buffer.from()`. +Note that it currently only works with cases where the arguments are literals or where the +constructor is invoked with two arguments. + +_If you currently support those older Node.js versions and dropping them would be a semver-major change +for you, or if you support older branches of your packages, consider using [Variant 2](#variant-2) +or [Variant 3](#variant-3) on older branches, so people using those older branches will also receive +the fix. That way, you will eradicate potential issues caused by unguarded Buffer API usage and +your users will not observe a runtime deprecation warning when running your code on Node.js 10._ + + +## Variant 2: Use a polyfill + +Utilize [safer-buffer](https://www.npmjs.com/package/safer-buffer) as a polyfill to support older +Node.js versions. + +You would take exacly the same steps as in [Variant 1](#variant-1), but with a polyfill +`const Buffer = require('safer-buffer').Buffer` in all files where you use the new `Buffer` api. + +Make sure that you do not use old `new Buffer` API — in any files where the line above is added, +using old `new Buffer()` API will _throw_. It will be easy to notice that in CI, though. + +Alternatively, you could use [buffer-from](https://www.npmjs.com/package/buffer-from) and/or +[buffer-alloc](https://www.npmjs.com/package/buffer-alloc) [ponyfills](https://ponyfill.com/) — +those are great, the only downsides being 4 deps in the tree and slightly more code changes to +migrate off them (as you would be using e.g. `Buffer.from` under a different name). If you need only +`Buffer.from` polyfilled — `buffer-from` alone which comes with no extra dependencies. + +_Alternatively, you could use [safe-buffer](https://www.npmjs.com/package/safe-buffer) — it also +provides a polyfill, but takes a different approach which has +[it's drawbacks](https://github.com/chalker/safer-buffer#why-not-safe-buffer). It will allow you +to also use the older `new Buffer()` API in your code, though — but that's arguably a benefit, as +it is problematic, can cause issues in your code, and will start emitting runtime deprecation +warnings starting with Node.js 10._ + +Note that in either case, it is important that you also remove all calls to the old Buffer +API manually — just throwing in `safe-buffer` doesn't fix the problem by itself, it just provides +a polyfill for the new API. I have seen people doing that mistake. + +Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +is recommended. + +_Don't forget to drop the polyfill usage once you drop support for Node.js < 4.5.0._ + + +## Variant 3 — manual detection, with safeguards + +This is useful if you create Buffer instances in only a few places (e.g. one), or you have your own +wrapper around them. + +### Buffer(0) + +This special case for creating empty buffers can be safely replaced with `Buffer.concat([])`, which +returns the same result all the way down to Node.js 0.8.x. + +### Buffer(notNumber) + +Before: + +```js +var buf = new Buffer(notNumber, encoding); +``` + +After: + +```js +var buf; +if (Buffer.from && Buffer.from !== Uint8Array.from) { + buf = Buffer.from(notNumber, encoding); +} else { + if (typeof notNumber === 'number') + throw new Error('The "size" argument must be of type number.'); + buf = new Buffer(notNumber, encoding); +} +``` + +`encoding` is optional. + +Note that the `typeof notNumber` before `new Buffer` is required (for cases when `notNumber` argument is not +hard-coded) and _is not caused by the deprecation of Buffer constructor_ — it's exactly _why_ the +Buffer constructor is deprecated. Ecosystem packages lacking this type-check caused numereous +security issues — situations when unsanitized user input could end up in the `Buffer(arg)` create +problems ranging from DoS to leaking sensitive information to the attacker from the process memory. + +When `notNumber` argument is hardcoded (e.g. literal `"abc"` or `[0,1,2]`), the `typeof` check can +be omitted. + +Also note that using TypeScript does not fix this problem for you — when libs written in +`TypeScript` are used from JS, or when user input ends up there — it behaves exactly as pure JS, as +all type checks are translation-time only and are not present in the actual JS code which TS +compiles to. + +### Buffer(number) + +For Node.js 0.10.x (and below) support: + +```js +var buf; +if (Buffer.alloc) { + buf = Buffer.alloc(number); +} else { + buf = new Buffer(number); + buf.fill(0); +} +``` + +Otherwise (Node.js ≥ 0.12.x): + +```js +const buf = Buffer.alloc ? Buffer.alloc(number) : new Buffer(number).fill(0); +``` + +## Regarding Buffer.allocUnsafe + +Be extra cautious when using `Buffer.allocUnsafe`: + * Don't use it if you don't have a good reason to + * e.g. you probably won't ever see a performance difference for small buffers, in fact, those + might be even faster with `Buffer.alloc()`, + * if your code is not in the hot code path — you also probably won't notice a difference, + * keep in mind that zero-filling minimizes the potential risks. + * If you use it, make sure that you never return the buffer in a partially-filled state, + * if you are writing to it sequentially — always truncate it to the actuall written length + +Errors in handling buffers allocated with `Buffer.allocUnsafe` could result in various issues, +ranged from undefined behaviour of your code to sensitive data (user input, passwords, certs) +leaking to the remote attacker. + +_Note that the same applies to `new Buffer` usage without zero-filling, depending on the Node.js +version (and lacking type checks also adds DoS to the list of potential problems)._ + + +## FAQ + + +### What is wrong with the `Buffer` constructor? + +The `Buffer` constructor could be used to create a buffer in many different ways: + +- `new Buffer(42)` creates a `Buffer` of 42 bytes. Before Node.js 8, this buffer contained + *arbitrary memory* for performance reasons, which could include anything ranging from + program source code to passwords and encryption keys. +- `new Buffer('abc')` creates a `Buffer` that contains the UTF-8-encoded version of + the string `'abc'`. A second argument could specify another encoding: For example, + `new Buffer(string, 'base64')` could be used to convert a Base64 string into the original + sequence of bytes that it represents. +- There are several other combinations of arguments. + +This meant that, in code like `var buffer = new Buffer(foo);`, *it is not possible to tell +what exactly the contents of the generated buffer are* without knowing the type of `foo`. + +Sometimes, the value of `foo` comes from an external source. For example, this function +could be exposed as a service on a web server, converting a UTF-8 string into its Base64 form: + +``` +function stringToBase64(req, res) { + // The request body should have the format of `{ string: 'foobar' }` + const rawBytes = new Buffer(req.body.string) + const encoded = rawBytes.toString('base64') + res.end({ encoded: encoded }) +} +``` + +Note that this code does *not* validate the type of `req.body.string`: + +- `req.body.string` is expected to be a string. If this is the case, all goes well. +- `req.body.string` is controlled by the client that sends the request. +- If `req.body.string` is the *number* `50`, the `rawBytes` would be 50 bytes: + - Before Node.js 8, the content would be uninitialized + - After Node.js 8, the content would be `50` bytes with the value `0` + +Because of the missing type check, an attacker could intentionally send a number +as part of the request. Using this, they can either: + +- Read uninitialized memory. This **will** leak passwords, encryption keys and other + kinds of sensitive information. (Information leak) +- Force the program to allocate a large amount of memory. For example, when specifying + `500000000` as the input value, each request will allocate 500MB of memory. + This can be used to either exhaust the memory available of a program completely + and make it crash, or slow it down significantly. (Denial of Service) + +Both of these scenarios are considered serious security issues in a real-world +web server context. + +when using `Buffer.from(req.body.string)` instead, passing a number will always +throw an exception instead, giving a controlled behaviour that can always be +handled by the program. + + +### The `Buffer()` constructor has been deprecated for a while. Is this really an issue? + +Surveys of code in the `npm` ecosystem have shown that the `Buffer()` constructor is still +widely used. This includes new code, and overall usage of such code has actually been +*increasing*. diff --git a/node_modules/safer-buffer/Readme.md b/node_modules/safer-buffer/Readme.md new file mode 100644 index 00000000..14b08229 --- /dev/null +++ b/node_modules/safer-buffer/Readme.md @@ -0,0 +1,156 @@ +# safer-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![javascript style guide][standard-image]][standard-url] [![Security Responsible Disclosure][secuirty-image]][secuirty-url] + +[travis-image]: https://travis-ci.org/ChALkeR/safer-buffer.svg?branch=master +[travis-url]: https://travis-ci.org/ChALkeR/safer-buffer +[npm-image]: https://img.shields.io/npm/v/safer-buffer.svg +[npm-url]: https://npmjs.org/package/safer-buffer +[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg +[standard-url]: https://standardjs.com +[secuirty-image]: https://img.shields.io/badge/Security-Responsible%20Disclosure-green.svg +[secuirty-url]: https://github.com/nodejs/security-wg/blob/master/processes/responsible_disclosure_template.md + +Modern Buffer API polyfill without footguns, working on Node.js from 0.8 to current. + +## How to use? + +First, port all `Buffer()` and `new Buffer()` calls to `Buffer.alloc()` and `Buffer.from()` API. + +Then, to achieve compatibility with outdated Node.js versions (`<4.5.0` and 5.x `<5.9.0`), use +`const Buffer = require('safer-buffer').Buffer` in all files where you make calls to the new +Buffer API. _Use `var` instead of `const` if you need that for your Node.js version range support._ + +Also, see the +[porting Buffer](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) guide. + +## Do I need it? + +Hopefully, not — dropping support for outdated Node.js versions should be fine nowdays, and that +is the recommended path forward. You _do_ need to port to the `Buffer.alloc()` and `Buffer.from()` +though. + +See the [porting guide](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) +for a better description. + +## Why not [safe-buffer](https://npmjs.com/safe-buffer)? + +_In short: while `safe-buffer` serves as a polyfill for the new API, it allows old API usage and +itself contains footguns._ + +`safe-buffer` could be used safely to get the new API while still keeping support for older +Node.js versions (like this module), but while analyzing ecosystem usage of the old Buffer API +I found out that `safe-buffer` is itself causing problems in some cases. + +For example, consider the following snippet: + +```console +$ cat example.unsafe.js +console.log(Buffer(20)) +$ ./node-v6.13.0-linux-x64/bin/node example.unsafe.js + +$ standard example.unsafe.js +standard: Use JavaScript Standard Style (https://standardjs.com) + /home/chalker/repo/safer-buffer/example.unsafe.js:2:13: 'Buffer()' was deprecated since v6. Use 'Buffer.alloc()' or 'Buffer.from()' (use 'https://www.npmjs.com/package/safe-buffer' for '<4.5.0') instead. +``` + +This is allocates and writes to console an uninitialized chunk of memory. +[standard](https://www.npmjs.com/package/standard) linter (among others) catch that and warn people +to avoid using unsafe API. + +Let's now throw in `safe-buffer`! + +```console +$ cat example.safe-buffer.js +const Buffer = require('safe-buffer').Buffer +console.log(Buffer(20)) +$ standard example.safe-buffer.js +$ ./node-v6.13.0-linux-x64/bin/node example.safe-buffer.js + +``` + +See the problem? Adding in `safe-buffer` _magically removes the lint warning_, but the behavior +remains identiсal to what we had before, and when launched on Node.js 6.x LTS — this dumps out +chunks of uninitialized memory. +_And this code will still emit runtime warnings on Node.js 10.x and above._ + +That was done by design. I first considered changing `safe-buffer`, prohibiting old API usage or +emitting warnings on it, but that significantly diverges from `safe-buffer` design. After some +discussion, it was decided to move my approach into a separate package, and _this is that separate +package_. + +This footgun is not imaginary — I observed top-downloaded packages doing that kind of thing, +«fixing» the lint warning by blindly including `safe-buffer` without any actual changes. + +Also in some cases, even if the API _was_ migrated to use of safe Buffer API — a random pull request +can bring unsafe Buffer API usage back to the codebase by adding new calls — and that could go +unnoticed even if you have a linter prohibiting that (becase of the reason stated above), and even +pass CI. _I also observed that being done in popular packages._ + +Some examples: + * [webdriverio](https://github.com/webdriverio/webdriverio/commit/05cbd3167c12e4930f09ef7cf93b127ba4effae4#diff-124380949022817b90b622871837d56cR31) + (a module with 548 759 downloads/month), + * [websocket-stream](https://github.com/maxogden/websocket-stream/commit/c9312bd24d08271687d76da0fe3c83493871cf61) + (218 288 d/m, fix in [maxogden/websocket-stream#142](https://github.com/maxogden/websocket-stream/pull/142)), + * [node-serialport](https://github.com/node-serialport/node-serialport/commit/e8d9d2b16c664224920ce1c895199b1ce2def48c) + (113 138 d/m, fix in [node-serialport/node-serialport#1510](https://github.com/node-serialport/node-serialport/pull/1510)), + * [karma](https://github.com/karma-runner/karma/commit/3d94b8cf18c695104ca195334dc75ff054c74eec) + (3 973 193 d/m, fix in [karma-runner/karma#2947](https://github.com/karma-runner/karma/pull/2947)), + * [spdy-transport](https://github.com/spdy-http2/spdy-transport/commit/5375ac33f4a62a4f65bcfc2827447d42a5dbe8b1) + (5 970 727 d/m, fix in [spdy-http2/spdy-transport#53](https://github.com/spdy-http2/spdy-transport/pull/53)). + * And there are a lot more over the ecosystem. + +I filed a PR at +[mysticatea/eslint-plugin-node#110](https://github.com/mysticatea/eslint-plugin-node/pull/110) to +partially fix that (for cases when that lint rule is used), but it is a semver-major change for +linter rules and presets, so it would take significant time for that to reach actual setups. +_It also hasn't been released yet (2018-03-20)._ + +Also, `safer-buffer` discourages the usage of `.allocUnsafe()`, which is often done by a mistake. +It still supports it with an explicit concern barier, by placing it under +`require('safer-buffer/dangereous')`. + +## But isn't throwing bad? + +Not really. It's an error that could be noticed and fixed early, instead of causing havoc later like +unguarded `new Buffer()` calls that end up receiving user input can do. + +This package affects only the files where `var Buffer = require('safer-buffer').Buffer` was done, so +it is really simple to keep track of things and make sure that you don't mix old API usage with that. +Also, CI should hint anything that you might have missed. + +New commits, if tested, won't land new usage of unsafe Buffer API this way. +_Node.js 10.x also deals with that by printing a runtime depecation warning._ + +### Would it affect third-party modules? + +No, unless you explicitly do an awful thing like monkey-patching or overriding the built-in `Buffer`. +Don't do that. + +### But I don't want throwing… + +That is also fine! + +Also, it could be better in some cases when you don't comprehensive enough test coverage. + +In that case — just don't override `Buffer` and use +`var SaferBuffer = require('safer-buffer').Buffer` instead. + +That way, everything using `Buffer` natively would still work, but there would be two drawbacks: + +* `Buffer.from`/`Buffer.alloc` won't be polyfilled — use `SaferBuffer.from` and + `SaferBuffer.alloc` instead. +* You are still open to accidentally using the insecure deprecated API — use a linter to catch that. + +Note that using a linter to catch accidential `Buffer` constructor usage in this case is strongly +recommended. `Buffer` is not overriden in this usecase, so linters won't get confused. + +## «Without footguns»? + +Well, it is still possible to do _some_ things with `Buffer` API, e.g. accessing `.buffer` property +on older versions and duping things from there. You shouldn't do that in your code, probabably. + +The intention is to remove the most significant footguns that affect lots of packages in the +ecosystem, and to do it in the proper way. + +Also, this package doesn't protect against security issues affecting some Node.js versions, so for +usage in your own production code, it is still recommended to update to a Node.js version +[supported by upstream](https://github.com/nodejs/release#release-schedule). diff --git a/node_modules/safer-buffer/dangerous.js b/node_modules/safer-buffer/dangerous.js new file mode 100644 index 00000000..ca41fdc5 --- /dev/null +++ b/node_modules/safer-buffer/dangerous.js @@ -0,0 +1,58 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var buffer = require('buffer') +var Buffer = buffer.Buffer +var safer = require('./safer.js') +var Safer = safer.Buffer + +var dangerous = {} + +var key + +for (key in safer) { + if (!safer.hasOwnProperty(key)) continue + dangerous[key] = safer[key] +} + +var Dangereous = dangerous.Buffer = {} + +// Copy Safer API +for (key in Safer) { + if (!Safer.hasOwnProperty(key)) continue + Dangereous[key] = Safer[key] +} + +// Copy those missing unsafe methods, if they are present +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue + if (Dangereous.hasOwnProperty(key)) continue + Dangereous[key] = Buffer[key] +} + +if (!Dangereous.allocUnsafe) { + Dangereous.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + return Buffer(size) + } +} + +if (!Dangereous.allocUnsafeSlow) { + Dangereous.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + return buffer.SlowBuffer(size) + } +} + +module.exports = dangerous diff --git a/node_modules/safer-buffer/package.json b/node_modules/safer-buffer/package.json new file mode 100644 index 00000000..d452b04a --- /dev/null +++ b/node_modules/safer-buffer/package.json @@ -0,0 +1,34 @@ +{ + "name": "safer-buffer", + "version": "2.1.2", + "description": "Modern Buffer API polyfill without footguns", + "main": "safer.js", + "scripts": { + "browserify-test": "browserify --external tape tests.js > browserify-tests.js && tape browserify-tests.js", + "test": "standard && tape tests.js" + }, + "author": { + "name": "Nikita Skovoroda", + "email": "chalkerx@gmail.com", + "url": "https://github.com/ChALkeR" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/ChALkeR/safer-buffer.git" + }, + "bugs": { + "url": "https://github.com/ChALkeR/safer-buffer/issues" + }, + "devDependencies": { + "standard": "^11.0.1", + "tape": "^4.9.0" + }, + "files": [ + "Porting-Buffer.md", + "Readme.md", + "tests.js", + "dangerous.js", + "safer.js" + ] +} diff --git a/node_modules/safer-buffer/safer.js b/node_modules/safer-buffer/safer.js new file mode 100644 index 00000000..37c7e1aa --- /dev/null +++ b/node_modules/safer-buffer/safer.js @@ -0,0 +1,77 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var buffer = require('buffer') +var Buffer = buffer.Buffer + +var safer = {} + +var key + +for (key in buffer) { + if (!buffer.hasOwnProperty(key)) continue + if (key === 'SlowBuffer' || key === 'Buffer') continue + safer[key] = buffer[key] +} + +var Safer = safer.Buffer = {} +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue + if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue + Safer[key] = Buffer[key] +} + +safer.Buffer.prototype = Buffer.prototype + +if (!Safer.from || Safer.from === Uint8Array.from) { + Safer.from = function (value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value) + } + if (value && typeof value.length === 'undefined') { + throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value) + } + return Buffer(value, encodingOrOffset, length) + } +} + +if (!Safer.alloc) { + Safer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + var buf = Buffer(size) + if (!fill || fill.length === 0) { + buf.fill(0) + } else if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + return buf + } +} + +if (!safer.kStringMaxLength) { + try { + safer.kStringMaxLength = process.binding('buffer').kStringMaxLength + } catch (e) { + // we can't determine kStringMaxLength in environments where process.binding + // is unsupported, so let's not set it + } +} + +if (!safer.constants) { + safer.constants = { + MAX_LENGTH: safer.kMaxLength + } + if (safer.kStringMaxLength) { + safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength + } +} + +module.exports = safer diff --git a/node_modules/safer-buffer/tests.js b/node_modules/safer-buffer/tests.js new file mode 100644 index 00000000..7ed2777c --- /dev/null +++ b/node_modules/safer-buffer/tests.js @@ -0,0 +1,406 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var test = require('tape') + +var buffer = require('buffer') + +var index = require('./') +var safer = require('./safer') +var dangerous = require('./dangerous') + +/* Inheritance tests */ + +test('Default is Safer', function (t) { + t.equal(index, safer) + t.notEqual(safer, dangerous) + t.notEqual(index, dangerous) + t.end() +}) + +test('Is not a function', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(typeof impl, 'object') + t.equal(typeof impl.Buffer, 'object') + }); + [buffer].forEach(function (impl) { + t.equal(typeof impl, 'object') + t.equal(typeof impl.Buffer, 'function') + }) + t.end() +}) + +test('Constructor throws', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.throws(function () { impl.Buffer() }) + t.throws(function () { impl.Buffer(0) }) + t.throws(function () { impl.Buffer('a') }) + t.throws(function () { impl.Buffer('a', 'utf-8') }) + t.throws(function () { return new impl.Buffer() }) + t.throws(function () { return new impl.Buffer(0) }) + t.throws(function () { return new impl.Buffer('a') }) + t.throws(function () { return new impl.Buffer('a', 'utf-8') }) + }) + t.end() +}) + +test('Safe methods exist', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(typeof impl.Buffer.alloc, 'function', 'alloc') + t.equal(typeof impl.Buffer.from, 'function', 'from') + }) + t.end() +}) + +test('Unsafe methods exist only in Dangerous', function (t) { + [index, safer].forEach(function (impl) { + t.equal(typeof impl.Buffer.allocUnsafe, 'undefined') + t.equal(typeof impl.Buffer.allocUnsafeSlow, 'undefined') + }); + [dangerous].forEach(function (impl) { + t.equal(typeof impl.Buffer.allocUnsafe, 'function') + t.equal(typeof impl.Buffer.allocUnsafeSlow, 'function') + }) + t.end() +}) + +test('Generic methods/properties are defined and equal', function (t) { + ['poolSize', 'isBuffer', 'concat', 'byteLength'].forEach(function (method) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], buffer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Built-in buffer static methods/properties are inherited', function (t) { + Object.keys(buffer).forEach(function (method) { + if (method === 'SlowBuffer' || method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], buffer[method], method) + t.notEqual(typeof impl[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Built-in Buffer static methods/properties are inherited', function (t) { + Object.keys(buffer.Buffer).forEach(function (method) { + if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], buffer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('.prototype property of Buffer is inherited', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.prototype, buffer.Buffer.prototype, 'prototype') + t.notEqual(typeof impl.Buffer.prototype, 'undefined', 'prototype') + }) + t.end() +}) + +test('All Safer methods are present in Dangerous', function (t) { + Object.keys(safer).forEach(function (method) { + if (method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], safer[method], method) + if (method !== 'kStringMaxLength') { + t.notEqual(typeof impl[method], 'undefined', method) + } + }) + }) + Object.keys(safer.Buffer).forEach(function (method) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], safer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Safe methods from Dangerous methods are present in Safer', function (t) { + Object.keys(dangerous).forEach(function (method) { + if (method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], dangerous[method], method) + if (method !== 'kStringMaxLength') { + t.notEqual(typeof impl[method], 'undefined', method) + } + }) + }) + Object.keys(dangerous.Buffer).forEach(function (method) { + if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], dangerous.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +/* Behaviour tests */ + +test('Methods return Buffers', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 10))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 'a'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10, 'x'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(9, 'ab'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(''))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string', 'utf-8'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([0, 42, 3]))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(new Uint8Array([0, 42, 3])))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([]))) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](0))) + t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](10))) + }) + t.end() +}) + +test('Constructor is buffer.Buffer', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.alloc(0).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(0, 10).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(0, 'a').constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(10).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(10, 'x').constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(9, 'ab').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('string').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('string', 'utf-8').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').constructor, buffer.Buffer) + t.equal(impl.Buffer.from([0, 42, 3]).constructor, buffer.Buffer) + t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).constructor, buffer.Buffer) + t.equal(impl.Buffer.from([]).constructor, buffer.Buffer) + }); + [0, 10, 100].forEach(function (arg) { + t.equal(dangerous.Buffer.allocUnsafe(arg).constructor, buffer.Buffer) + t.equal(dangerous.Buffer.allocUnsafeSlow(arg).constructor, buffer.SlowBuffer(0).constructor) + }) + t.end() +}) + +test('Invalid calls throw', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.throws(function () { impl.Buffer.from(0) }) + t.throws(function () { impl.Buffer.from(10) }) + t.throws(function () { impl.Buffer.from(10, 'utf-8') }) + t.throws(function () { impl.Buffer.from('string', 'invalid encoding') }) + t.throws(function () { impl.Buffer.from(-10) }) + t.throws(function () { impl.Buffer.from(1e90) }) + t.throws(function () { impl.Buffer.from(Infinity) }) + t.throws(function () { impl.Buffer.from(-Infinity) }) + t.throws(function () { impl.Buffer.from(NaN) }) + t.throws(function () { impl.Buffer.from(null) }) + t.throws(function () { impl.Buffer.from(undefined) }) + t.throws(function () { impl.Buffer.from() }) + t.throws(function () { impl.Buffer.from({}) }) + t.throws(function () { impl.Buffer.alloc('') }) + t.throws(function () { impl.Buffer.alloc('string') }) + t.throws(function () { impl.Buffer.alloc('string', 'utf-8') }) + t.throws(function () { impl.Buffer.alloc('b25ldHdvdGhyZWU=', 'base64') }) + t.throws(function () { impl.Buffer.alloc(-10) }) + t.throws(function () { impl.Buffer.alloc(1e90) }) + t.throws(function () { impl.Buffer.alloc(2 * (1 << 30)) }) + t.throws(function () { impl.Buffer.alloc(Infinity) }) + t.throws(function () { impl.Buffer.alloc(-Infinity) }) + t.throws(function () { impl.Buffer.alloc(null) }) + t.throws(function () { impl.Buffer.alloc(undefined) }) + t.throws(function () { impl.Buffer.alloc() }) + t.throws(function () { impl.Buffer.alloc([]) }) + t.throws(function () { impl.Buffer.alloc([0, 42, 3]) }) + t.throws(function () { impl.Buffer.alloc({}) }) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.throws(function () { dangerous.Buffer[method]('') }) + t.throws(function () { dangerous.Buffer[method]('string') }) + t.throws(function () { dangerous.Buffer[method]('string', 'utf-8') }) + t.throws(function () { dangerous.Buffer[method](2 * (1 << 30)) }) + t.throws(function () { dangerous.Buffer[method](Infinity) }) + if (dangerous.Buffer[method] === buffer.Buffer.allocUnsafe) { + t.skip('Skipping, older impl of allocUnsafe coerced negative sizes to 0') + } else { + t.throws(function () { dangerous.Buffer[method](-10) }) + t.throws(function () { dangerous.Buffer[method](-1e90) }) + t.throws(function () { dangerous.Buffer[method](-Infinity) }) + } + t.throws(function () { dangerous.Buffer[method](null) }) + t.throws(function () { dangerous.Buffer[method](undefined) }) + t.throws(function () { dangerous.Buffer[method]() }) + t.throws(function () { dangerous.Buffer[method]([]) }) + t.throws(function () { dangerous.Buffer[method]([0, 42, 3]) }) + t.throws(function () { dangerous.Buffer[method]({}) }) + }) + t.end() +}) + +test('Buffers have appropriate lengths', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.alloc(0).length, 0) + t.equal(impl.Buffer.alloc(10).length, 10) + t.equal(impl.Buffer.from('').length, 0) + t.equal(impl.Buffer.from('string').length, 6) + t.equal(impl.Buffer.from('string', 'utf-8').length, 6) + t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').length, 11) + t.equal(impl.Buffer.from([0, 42, 3]).length, 3) + t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).length, 3) + t.equal(impl.Buffer.from([]).length, 0) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.equal(dangerous.Buffer[method](0).length, 0) + t.equal(dangerous.Buffer[method](10).length, 10) + }) + t.end() +}) + +test('Buffers have appropriate lengths (2)', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true; + [ safer.Buffer.alloc, + dangerous.Buffer.allocUnsafe, + dangerous.Buffer.allocUnsafeSlow + ].forEach(function (method) { + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 1e5) + var buf = method(length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + } + }) + t.ok(ok) + t.end() +}) + +test('.alloc(size) is zero-filled and has correct length', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var buf = index.Buffer.alloc(length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + var j + for (j = 0; j < length; j++) { + if (buf[j] !== 0) ok = false + } + buf.fill(1) + for (j = 0; j < length; j++) { + if (buf[j] !== 1) ok = false + } + } + t.ok(ok) + t.end() +}) + +test('.allocUnsafe / .allocUnsafeSlow are fillable and have correct lengths', function (t) { + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var buf = dangerous.Buffer[method](length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + buf.fill(0, 0, length) + var j + for (j = 0; j < length; j++) { + if (buf[j] !== 0) ok = false + } + buf.fill(1, 0, length) + for (j = 0; j < length; j++) { + if (buf[j] !== 1) ok = false + } + } + t.ok(ok, method) + }) + t.end() +}) + +test('.alloc(size, fill) is `fill`-filled', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var fill = Math.round(Math.random() * 255) + var buf = index.Buffer.alloc(length, fill) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + for (var j = 0; j < length; j++) { + if (buf[j] !== fill) ok = false + } + } + t.ok(ok) + t.end() +}) + +test('.alloc(size, fill) is `fill`-filled', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var fill = Math.round(Math.random() * 255) + var buf = index.Buffer.alloc(length, fill) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + for (var j = 0; j < length; j++) { + if (buf[j] !== fill) ok = false + } + } + t.ok(ok) + t.deepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 97)) + t.notDeepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 98)) + + var tmp = new buffer.Buffer(2) + tmp.fill('ok') + if (tmp[1] === tmp[0]) { + // Outdated Node.js + t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('ooooo')) + } else { + t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('okoko')) + } + t.notDeepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('kokok')) + + t.end() +}) + +test('safer.Buffer.from returns results same as Buffer constructor', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.deepEqual(impl.Buffer.from(''), new buffer.Buffer('')) + t.deepEqual(impl.Buffer.from('string'), new buffer.Buffer('string')) + t.deepEqual(impl.Buffer.from('string', 'utf-8'), new buffer.Buffer('string', 'utf-8')) + t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), new buffer.Buffer('b25ldHdvdGhyZWU=', 'base64')) + t.deepEqual(impl.Buffer.from([0, 42, 3]), new buffer.Buffer([0, 42, 3])) + t.deepEqual(impl.Buffer.from(new Uint8Array([0, 42, 3])), new buffer.Buffer(new Uint8Array([0, 42, 3]))) + t.deepEqual(impl.Buffer.from([]), new buffer.Buffer([])) + }) + t.end() +}) + +test('safer.Buffer.from returns consistent results', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.deepEqual(impl.Buffer.from(''), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from([]), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from(new Uint8Array([])), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from('string', 'utf-8'), impl.Buffer.from('string')) + t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from([115, 116, 114, 105, 110, 103])) + t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from(impl.Buffer.from('string'))) + t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), impl.Buffer.from('onetwothree')) + t.notDeepEqual(impl.Buffer.from('b25ldHdvdGhyZWU='), impl.Buffer.from('onetwothree')) + }) + t.end() +}) diff --git a/node_modules/sass-graph/CHANGELOG.md b/node_modules/sass-graph/CHANGELOG.md new file mode 100644 index 00000000..c21889a5 --- /dev/null +++ b/node_modules/sass-graph/CHANGELOG.md @@ -0,0 +1,127 @@ +# Change Log +All notable changes to this project will be documented in this file. + +## [next] +### Features + +### Fixes + +### Tests + +## [2.2.4] +### Dependencies + +- yargs@^7.0.0 (@alan-agius4, #84) + +## [2.2.3] +### Dependencies + +- scss-tokenizer@^0.2.3 (@xzyfer) + +## [2.2.2] +### Fixes + +- Babel runtime error messages (@xzyfer, #76 #77) + +### Dependencies + +- scss-tokenizer@^0.2.1 (@xzyfer) + +## [2.2.1] +### Fixes + +- Babel runtime error messages (@STRML, #76 #77) + +### Dependencies + +- scss-tokenizer@^0.2.0 + +## [2.2.0] +### Features + +- Replace `@import` regexes with [scss-tokenizer](https://www.npmjs.com/package/scss-tokenizer) (@xzyfer, #68) +- Add support for the old indented (`.sass`) syntax (@xzyfer, #31) +- Add an option to follow symbolic links (@ludwiktrammer, #74) + +### Fixes + +- Replaces deprecated `fs.existsSync` (@martinheidegger, #29) + +### Tests + +- Significantly clean up test suite (@xzyfer, #69) + +### Dependencies + +- yargs@^6.6.0 +- mocha@^3.2.0 + +## [2.1.2] +### Fixes + +- Remove non-essential files from npm package (@jorrit, #48) +- Update yargs to version 4.7.1 (@greenkeeperio-bot, #46) +- Update glob to version 7.0.0 (@greenkeeperio-bot, #36) + +## [2.1.1] +### Fixes + +- Don't add directory `@import`s to graph - [@niksy](https://github.com/niksy) + +## [2.1.0] +### Features + +- Update to lodash 4 - [@nightwolfz](https://github.com/nightwolfz) + +### Fixes + +- Fixed directories with extensions being treated as files - [@niksy](https://github.com/niksy) + +## [2.0.1] +### Fixes +- Fixed tests for Windows - [@pleunv](https://github.com/pleunv) + +## [2.0.0] +### BREAKING CHANGES +- `.sass` files are not included in the graph by default. Use the `-e .sass` flag. + +### Features +- Configurable file extensions - [@dannymidnight](https://github.com/dannymidnight), [@xzyfer](https://github.com/xzyfer) + +### Fixes +- Prioritize cwd when resolving load paths - [@schnerd](https://github.com/schnerd) + +### Tests +- Added test for prioritizing cwd when resolving load paths - [@xzyfer](https://github.com/xzyfer) + +## [1.3.0] +### Features +- Add support for indented syntax - [@vegetableman](https://github.com/vegetableman) + +## [1.2.0] +### Features +- Add support for custom imports - [@kevin-smets](https://github.com/kevin-smets) + +## [1.1.0] - 2015-03-18 +### Fixes +- Only strip extension for css, scss, sass files - [@nervo](https://github.com/nervo) + +## [1.0.4] - 2015-03-03 +### Tests +- Added a test for nested imports - [@kevin-smets](https://github.com/kevin-smets) + +## [1.0.3] - 2015-02-02 +### Fixes +- Replace incorrect usage of `for..in` loops with simple `for` loops + +## [1.0.2] - 2015-02-02 +### Fixes +- Don't iterate over inherited object properties + +## [1.0.1] - 2015-01-05 +### Fixes +- Handle errors in the visitor + +## [1.0.0] - 2015-01-05 + +Initial stable release diff --git a/node_modules/sass-graph/node_modules/ansi-regex/index.js b/node_modules/sass-graph/node_modules/ansi-regex/index.js new file mode 100644 index 00000000..c2544800 --- /dev/null +++ b/node_modules/sass-graph/node_modules/ansi-regex/index.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports = options => { + options = Object.assign({ + onlyFirst: false + }, options); + + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' + ].join('|'); + + return new RegExp(pattern, options.onlyFirst ? undefined : 'g'); +}; diff --git a/node_modules/sass-graph/node_modules/ansi-regex/license b/node_modules/sass-graph/node_modules/ansi-regex/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/sass-graph/node_modules/ansi-regex/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/ansi-regex/package.json b/node_modules/sass-graph/node_modules/ansi-regex/package.json new file mode 100644 index 00000000..a849fdf5 --- /dev/null +++ b/node_modules/sass-graph/node_modules/ansi-regex/package.json @@ -0,0 +1,53 @@ +{ + "name": "ansi-regex", + "version": "4.1.0", + "description": "Regular expression for matching ANSI escape codes", + "license": "MIT", + "repository": "chalk/ansi-regex", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "xo && ava", + "view-supported": "node fixtures/view-codes.js" + }, + "files": [ + "index.js" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "text", + "regex", + "regexp", + "re", + "match", + "test", + "find", + "pattern" + ], + "devDependencies": { + "ava": "^0.25.0", + "xo": "^0.23.0" + } +} diff --git a/node_modules/sass-graph/node_modules/ansi-regex/readme.md b/node_modules/sass-graph/node_modules/ansi-regex/readme.md new file mode 100644 index 00000000..d19c4466 --- /dev/null +++ b/node_modules/sass-graph/node_modules/ansi-regex/readme.md @@ -0,0 +1,87 @@ +# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex) + +> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + +--- + +
      + + Get professional support for this package with a Tidelift subscription + +
      + + Tidelift helps make open source sustainable for maintainers while giving companies
      assurances about security, maintenance, and licensing for their dependencies. +
      +
      + +--- + + +## Install + +``` +$ npm install ansi-regex +``` + + +## Usage + +```js +const ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001B[4mcake\u001B[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001B[4mcake\u001B[0m'.match(ansiRegex()); +//=> ['\u001B[4m', '\u001B[0m'] + +'\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true})); +//=> ['\u001B[4m'] + +'\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex()); +//=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007'] +``` + + +## API + +### ansiRegex([options]) + +Returns a regex for matching ANSI escape codes. + +#### options + +##### onlyFirst + +Type: `boolean`
      +Default: `false` *(Matches any ANSI escape codes in a string)* + +Match only the first ANSI escape. + + +## FAQ + +### Why do you test for codes not in the ECMA 48 standard? + +Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. + +On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. + + +## Security + +To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/sass-graph/node_modules/camelcase/index.d.ts b/node_modules/sass-graph/node_modules/camelcase/index.d.ts new file mode 100644 index 00000000..58f2069a --- /dev/null +++ b/node_modules/sass-graph/node_modules/camelcase/index.d.ts @@ -0,0 +1,63 @@ +declare namespace camelcase { + interface Options { + /** + Uppercase the first character: `foo-bar` → `FooBar`. + + @default false + */ + readonly pascalCase?: boolean; + } +} + +declare const camelcase: { + /** + Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`. + + @param input - String to convert to camel case. + + @example + ``` + import camelCase = require('camelcase'); + + camelCase('foo-bar'); + //=> 'fooBar' + + camelCase('foo_bar'); + //=> 'fooBar' + + camelCase('Foo-Bar'); + //=> 'fooBar' + + camelCase('Foo-Bar', {pascalCase: true}); + //=> 'FooBar' + + camelCase('--foo.bar', {pascalCase: false}); + //=> 'fooBar' + + camelCase('foo bar'); + //=> 'fooBar' + + console.log(process.argv[3]); + //=> '--foo-bar' + camelCase(process.argv[3]); + //=> 'fooBar' + + camelCase(['foo', 'bar']); + //=> 'fooBar' + + camelCase(['__foo__', '--bar'], {pascalCase: true}); + //=> 'FooBar' + ``` + */ + (input: string | ReadonlyArray, options?: camelcase.Options): string; + + // TODO: Remove this for the next major release, refactor the whole definition to: + // declare function camelcase( + // input: string | ReadonlyArray, + // options?: camelcase.Options + // ): string; + // export = camelcase; + default: typeof camelcase; +}; + +export = camelcase; diff --git a/node_modules/sass-graph/node_modules/camelcase/index.js b/node_modules/sass-graph/node_modules/camelcase/index.js new file mode 100644 index 00000000..579f99b4 --- /dev/null +++ b/node_modules/sass-graph/node_modules/camelcase/index.js @@ -0,0 +1,76 @@ +'use strict'; + +const preserveCamelCase = string => { + let isLastCharLower = false; + let isLastCharUpper = false; + let isLastLastCharUpper = false; + + for (let i = 0; i < string.length; i++) { + const character = string[i]; + + if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) { + string = string.slice(0, i) + '-' + string.slice(i); + isLastCharLower = false; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = true; + i++; + } else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) { + string = string.slice(0, i - 1) + '-' + string.slice(i - 1); + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = false; + isLastCharLower = true; + } else { + isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character; + } + } + + return string; +}; + +const camelCase = (input, options) => { + if (!(typeof input === 'string' || Array.isArray(input))) { + throw new TypeError('Expected the input to be `string | string[]`'); + } + + options = Object.assign({ + pascalCase: false + }, options); + + const postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x; + + if (Array.isArray(input)) { + input = input.map(x => x.trim()) + .filter(x => x.length) + .join('-'); + } else { + input = input.trim(); + } + + if (input.length === 0) { + return ''; + } + + if (input.length === 1) { + return options.pascalCase ? input.toUpperCase() : input.toLowerCase(); + } + + const hasUpperCase = input !== input.toLowerCase(); + + if (hasUpperCase) { + input = preserveCamelCase(input); + } + + input = input + .replace(/^[_.\- ]+/, '') + .toLowerCase() + .replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase()) + .replace(/\d+(\w|$)/g, m => m.toUpperCase()); + + return postProcess(input); +}; + +module.exports = camelCase; +// TODO: Remove this for the next major release +module.exports.default = camelCase; diff --git a/node_modules/sass-graph/node_modules/camelcase/license b/node_modules/sass-graph/node_modules/camelcase/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/sass-graph/node_modules/camelcase/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/camelcase/package.json b/node_modules/sass-graph/node_modules/camelcase/package.json new file mode 100644 index 00000000..fbdbaaa7 --- /dev/null +++ b/node_modules/sass-graph/node_modules/camelcase/package.json @@ -0,0 +1,43 @@ +{ + "name": "camelcase", + "version": "5.3.1", + "description": "Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`", + "license": "MIT", + "repository": "sindresorhus/camelcase", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "camelcase", + "camel-case", + "camel", + "case", + "dash", + "hyphen", + "dot", + "underscore", + "separator", + "string", + "text", + "convert", + "pascalcase", + "pascal-case" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.1", + "xo": "^0.24.0" + } +} diff --git a/node_modules/sass-graph/node_modules/camelcase/readme.md b/node_modules/sass-graph/node_modules/camelcase/readme.md new file mode 100644 index 00000000..fde27261 --- /dev/null +++ b/node_modules/sass-graph/node_modules/camelcase/readme.md @@ -0,0 +1,99 @@ +# camelcase [![Build Status](https://travis-ci.org/sindresorhus/camelcase.svg?branch=master)](https://travis-ci.org/sindresorhus/camelcase) + +> Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar` + +--- + +
      + + Get professional support for 'camelcase' with a Tidelift subscription + +
      + + Tidelift helps make open source sustainable for maintainers while giving companies
      assurances about security, maintenance, and licensing for their dependencies. +
      +
      + +--- + +## Install + +``` +$ npm install camelcase +``` + + +## Usage + +```js +const camelCase = require('camelcase'); + +camelCase('foo-bar'); +//=> 'fooBar' + +camelCase('foo_bar'); +//=> 'fooBar' + +camelCase('Foo-Bar'); +//=> 'fooBar' + +camelCase('Foo-Bar', {pascalCase: true}); +//=> 'FooBar' + +camelCase('--foo.bar', {pascalCase: false}); +//=> 'fooBar' + +camelCase('foo bar'); +//=> 'fooBar' + +console.log(process.argv[3]); +//=> '--foo-bar' +camelCase(process.argv[3]); +//=> 'fooBar' + +camelCase(['foo', 'bar']); +//=> 'fooBar' + +camelCase(['__foo__', '--bar'], {pascalCase: true}); +//=> 'FooBar' +``` + + +## API + +### camelCase(input, [options]) + +#### input + +Type: `string` `string[]` + +String to convert to camel case. + +#### options + +Type: `Object` + +##### pascalCase + +Type: `boolean`
      +Default: `false` + +Uppercase the first character: `foo-bar` → `FooBar` + + +## Security + +To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. + + +## Related + +- [decamelize](https://github.com/sindresorhus/decamelize) - The inverse of this module +- [uppercamelcase](https://github.com/SamVerschueren/uppercamelcase) - Like this module, but to PascalCase instead of camelCase +- [titleize](https://github.com/sindresorhus/titleize) - Capitalize every word in string +- [humanize-string](https://github.com/sindresorhus/humanize-string) - Convert a camelized/dasherized/underscored string into a humanized one + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/sass-graph/node_modules/cliui/CHANGELOG.md b/node_modules/sass-graph/node_modules/cliui/CHANGELOG.md new file mode 100644 index 00000000..37f259a5 --- /dev/null +++ b/node_modules/sass-graph/node_modules/cliui/CHANGELOG.md @@ -0,0 +1,65 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +# [5.0.0](https://github.com/yargs/cliui/compare/v4.1.0...v5.0.0) (2019-04-10) + + +### Bug Fixes + +* Update wrap-ansi to fix compatibility with latest versions of chalk. ([#60](https://github.com/yargs/cliui/issues/60)) ([7bf79ae](https://github.com/yargs/cliui/commit/7bf79ae)) + + +### BREAKING CHANGES + +* Drop support for node < 6. + + + + +# [4.1.0](https://github.com/yargs/cliui/compare/v4.0.0...v4.1.0) (2018-04-23) + + +### Features + +* add resetOutput method ([#57](https://github.com/yargs/cliui/issues/57)) ([7246902](https://github.com/yargs/cliui/commit/7246902)) + + + + +# [4.0.0](https://github.com/yargs/cliui/compare/v3.2.0...v4.0.0) (2017-12-18) + + +### Bug Fixes + +* downgrades strip-ansi to version 3.0.1 ([#54](https://github.com/yargs/cliui/issues/54)) ([5764c46](https://github.com/yargs/cliui/commit/5764c46)) +* set env variable FORCE_COLOR. ([#56](https://github.com/yargs/cliui/issues/56)) ([7350e36](https://github.com/yargs/cliui/commit/7350e36)) + + +### Chores + +* drop support for node < 4 ([#53](https://github.com/yargs/cliui/issues/53)) ([b105376](https://github.com/yargs/cliui/commit/b105376)) + + +### Features + +* add fallback for window width ([#45](https://github.com/yargs/cliui/issues/45)) ([d064922](https://github.com/yargs/cliui/commit/d064922)) + + +### BREAKING CHANGES + +* officially drop support for Node < 4 + + + + +# [3.2.0](https://github.com/yargs/cliui/compare/v3.1.2...v3.2.0) (2016-04-11) + + +### Bug Fixes + +* reduces tarball size ([acc6c33](https://github.com/yargs/cliui/commit/acc6c33)) + +### Features + +* adds standard-version for release management ([ff84e32](https://github.com/yargs/cliui/commit/ff84e32)) diff --git a/node_modules/sass-graph/node_modules/cliui/LICENSE.txt b/node_modules/sass-graph/node_modules/cliui/LICENSE.txt new file mode 100644 index 00000000..c7e27478 --- /dev/null +++ b/node_modules/sass-graph/node_modules/cliui/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (c) 2015, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/cliui/README.md b/node_modules/sass-graph/node_modules/cliui/README.md new file mode 100644 index 00000000..deacfa0d --- /dev/null +++ b/node_modules/sass-graph/node_modules/cliui/README.md @@ -0,0 +1,115 @@ +# cliui + +[![Build Status](https://travis-ci.org/yargs/cliui.svg)](https://travis-ci.org/yargs/cliui) +[![Coverage Status](https://coveralls.io/repos/yargs/cliui/badge.svg?branch=)](https://coveralls.io/r/yargs/cliui?branch=) +[![NPM version](https://img.shields.io/npm/v/cliui.svg)](https://www.npmjs.com/package/cliui) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + +easily create complex multi-column command-line-interfaces. + +## Example + +```js +var ui = require('cliui')() + +ui.div('Usage: $0 [command] [options]') + +ui.div({ + text: 'Options:', + padding: [2, 0, 2, 0] +}) + +ui.div( + { + text: "-f, --file", + width: 20, + padding: [0, 4, 0, 4] + }, + { + text: "the file to load." + + chalk.green("(if this description is long it wraps).") + , + width: 20 + }, + { + text: chalk.red("[required]"), + align: 'right' + } +) + +console.log(ui.toString()) +``` + + + +## Layout DSL + +cliui exposes a simple layout DSL: + +If you create a single `ui.div`, passing a string rather than an +object: + +* `\n`: characters will be interpreted as new rows. +* `\t`: characters will be interpreted as new columns. +* `\s`: characters will be interpreted as padding. + +**as an example...** + +```js +var ui = require('./')({ + width: 60 +}) + +ui.div( + 'Usage: node ./bin/foo.js\n' + + ' \t provide a regex\n' + + ' \t provide a glob\t [required]' +) + +console.log(ui.toString()) +``` + +**will output:** + +```shell +Usage: node ./bin/foo.js + provide a regex + provide a glob [required] +``` + +## Methods + +```js +cliui = require('cliui') +``` + +### cliui({width: integer}) + +Specify the maximum width of the UI being generated. +If no width is provided, cliui will try to get the current window's width and use it, and if that doesn't work, width will be set to `80`. + +### cliui({wrap: boolean}) + +Enable or disable the wrapping of text in a column. + +### cliui.div(column, column, column) + +Create a row with any number of columns, a column +can either be a string, or an object with the following +options: + +* **text:** some text to place in the column. +* **width:** the width of a column. +* **align:** alignment, `right` or `center`. +* **padding:** `[top, right, bottom, left]`. +* **border:** should a border be placed around the div? + +### cliui.span(column, column, column) + +Similar to `div`, except the next row will be appended without +a new line being created. + +### cliui.resetOutput() + +Resets the UI elements of the current cliui instance, maintaining the values +set for `width` and `wrap`. diff --git a/node_modules/sass-graph/node_modules/cliui/index.js b/node_modules/sass-graph/node_modules/cliui/index.js new file mode 100644 index 00000000..b42d9824 --- /dev/null +++ b/node_modules/sass-graph/node_modules/cliui/index.js @@ -0,0 +1,324 @@ +var stringWidth = require('string-width') +var stripAnsi = require('strip-ansi') +var wrap = require('wrap-ansi') +var align = { + right: alignRight, + center: alignCenter +} +var top = 0 +var right = 1 +var bottom = 2 +var left = 3 + +function UI (opts) { + this.width = opts.width + this.wrap = opts.wrap + this.rows = [] +} + +UI.prototype.span = function () { + var cols = this.div.apply(this, arguments) + cols.span = true +} + +UI.prototype.resetOutput = function () { + this.rows = [] +} + +UI.prototype.div = function () { + if (arguments.length === 0) this.div('') + if (this.wrap && this._shouldApplyLayoutDSL.apply(this, arguments)) { + return this._applyLayoutDSL(arguments[0]) + } + + var cols = [] + + for (var i = 0, arg; (arg = arguments[i]) !== undefined; i++) { + if (typeof arg === 'string') cols.push(this._colFromString(arg)) + else cols.push(arg) + } + + this.rows.push(cols) + return cols +} + +UI.prototype._shouldApplyLayoutDSL = function () { + return arguments.length === 1 && typeof arguments[0] === 'string' && + /[\t\n]/.test(arguments[0]) +} + +UI.prototype._applyLayoutDSL = function (str) { + var _this = this + var rows = str.split('\n') + var leftColumnWidth = 0 + + // simple heuristic for layout, make sure the + // second column lines up along the left-hand. + // don't allow the first column to take up more + // than 50% of the screen. + rows.forEach(function (row) { + var columns = row.split('\t') + if (columns.length > 1 && stringWidth(columns[0]) > leftColumnWidth) { + leftColumnWidth = Math.min( + Math.floor(_this.width * 0.5), + stringWidth(columns[0]) + ) + } + }) + + // generate a table: + // replacing ' ' with padding calculations. + // using the algorithmically generated width. + rows.forEach(function (row) { + var columns = row.split('\t') + _this.div.apply(_this, columns.map(function (r, i) { + return { + text: r.trim(), + padding: _this._measurePadding(r), + width: (i === 0 && columns.length > 1) ? leftColumnWidth : undefined + } + })) + }) + + return this.rows[this.rows.length - 1] +} + +UI.prototype._colFromString = function (str) { + return { + text: str, + padding: this._measurePadding(str) + } +} + +UI.prototype._measurePadding = function (str) { + // measure padding without ansi escape codes + var noAnsi = stripAnsi(str) + return [0, noAnsi.match(/\s*$/)[0].length, 0, noAnsi.match(/^\s*/)[0].length] +} + +UI.prototype.toString = function () { + var _this = this + var lines = [] + + _this.rows.forEach(function (row, i) { + _this.rowToString(row, lines) + }) + + // don't display any lines with the + // hidden flag set. + lines = lines.filter(function (line) { + return !line.hidden + }) + + return lines.map(function (line) { + return line.text + }).join('\n') +} + +UI.prototype.rowToString = function (row, lines) { + var _this = this + var padding + var rrows = this._rasterize(row) + var str = '' + var ts + var width + var wrapWidth + + rrows.forEach(function (rrow, r) { + str = '' + rrow.forEach(function (col, c) { + ts = '' // temporary string used during alignment/padding. + width = row[c].width // the width with padding. + wrapWidth = _this._negatePadding(row[c]) // the width without padding. + + ts += col + + for (var i = 0; i < wrapWidth - stringWidth(col); i++) { + ts += ' ' + } + + // align the string within its column. + if (row[c].align && row[c].align !== 'left' && _this.wrap) { + ts = align[row[c].align](ts, wrapWidth) + if (stringWidth(ts) < wrapWidth) ts += new Array(width - stringWidth(ts)).join(' ') + } + + // apply border and padding to string. + padding = row[c].padding || [0, 0, 0, 0] + if (padding[left]) str += new Array(padding[left] + 1).join(' ') + str += addBorder(row[c], ts, '| ') + str += ts + str += addBorder(row[c], ts, ' |') + if (padding[right]) str += new Array(padding[right] + 1).join(' ') + + // if prior row is span, try to render the + // current row on the prior line. + if (r === 0 && lines.length > 0) { + str = _this._renderInline(str, lines[lines.length - 1]) + } + }) + + // remove trailing whitespace. + lines.push({ + text: str.replace(/ +$/, ''), + span: row.span + }) + }) + + return lines +} + +function addBorder (col, ts, style) { + if (col.border) { + if (/[.']-+[.']/.test(ts)) return '' + else if (ts.trim().length) return style + else return ' ' + } + return '' +} + +// if the full 'source' can render in +// the target line, do so. +UI.prototype._renderInline = function (source, previousLine) { + var leadingWhitespace = source.match(/^ */)[0].length + var target = previousLine.text + var targetTextWidth = stringWidth(target.trimRight()) + + if (!previousLine.span) return source + + // if we're not applying wrapping logic, + // just always append to the span. + if (!this.wrap) { + previousLine.hidden = true + return target + source + } + + if (leadingWhitespace < targetTextWidth) return source + + previousLine.hidden = true + + return target.trimRight() + new Array(leadingWhitespace - targetTextWidth + 1).join(' ') + source.trimLeft() +} + +UI.prototype._rasterize = function (row) { + var _this = this + var i + var rrow + var rrows = [] + var widths = this._columnWidths(row) + var wrapped + + // word wrap all columns, and create + // a data-structure that is easy to rasterize. + row.forEach(function (col, c) { + // leave room for left and right padding. + col.width = widths[c] + if (_this.wrap) wrapped = wrap(col.text, _this._negatePadding(col), { hard: true }).split('\n') + else wrapped = col.text.split('\n') + + if (col.border) { + wrapped.unshift('.' + new Array(_this._negatePadding(col) + 3).join('-') + '.') + wrapped.push("'" + new Array(_this._negatePadding(col) + 3).join('-') + "'") + } + + // add top and bottom padding. + if (col.padding) { + for (i = 0; i < (col.padding[top] || 0); i++) wrapped.unshift('') + for (i = 0; i < (col.padding[bottom] || 0); i++) wrapped.push('') + } + + wrapped.forEach(function (str, r) { + if (!rrows[r]) rrows.push([]) + + rrow = rrows[r] + + for (var i = 0; i < c; i++) { + if (rrow[i] === undefined) rrow.push('') + } + rrow.push(str) + }) + }) + + return rrows +} + +UI.prototype._negatePadding = function (col) { + var wrapWidth = col.width + if (col.padding) wrapWidth -= (col.padding[left] || 0) + (col.padding[right] || 0) + if (col.border) wrapWidth -= 4 + return wrapWidth +} + +UI.prototype._columnWidths = function (row) { + var _this = this + var widths = [] + var unset = row.length + var unsetWidth + var remainingWidth = this.width + + // column widths can be set in config. + row.forEach(function (col, i) { + if (col.width) { + unset-- + widths[i] = col.width + remainingWidth -= col.width + } else { + widths[i] = undefined + } + }) + + // any unset widths should be calculated. + if (unset) unsetWidth = Math.floor(remainingWidth / unset) + widths.forEach(function (w, i) { + if (!_this.wrap) widths[i] = row[i].width || stringWidth(row[i].text) + else if (w === undefined) widths[i] = Math.max(unsetWidth, _minWidth(row[i])) + }) + + return widths +} + +// calculates the minimum width of +// a column, based on padding preferences. +function _minWidth (col) { + var padding = col.padding || [] + var minWidth = 1 + (padding[left] || 0) + (padding[right] || 0) + if (col.border) minWidth += 4 + return minWidth +} + +function getWindowWidth () { + if (typeof process === 'object' && process.stdout && process.stdout.columns) return process.stdout.columns +} + +function alignRight (str, width) { + str = str.trim() + var padding = '' + var strWidth = stringWidth(str) + + if (strWidth < width) { + padding = new Array(width - strWidth + 1).join(' ') + } + + return padding + str +} + +function alignCenter (str, width) { + str = str.trim() + var padding = '' + var strWidth = stringWidth(str.trim()) + + if (strWidth < width) { + padding = new Array(parseInt((width - strWidth) / 2, 10) + 1).join(' ') + } + + return padding + str +} + +module.exports = function (opts) { + opts = opts || {} + + return new UI({ + width: (opts || {}).width || getWindowWidth() || 80, + wrap: typeof opts.wrap === 'boolean' ? opts.wrap : true + }) +} diff --git a/node_modules/sass-graph/node_modules/cliui/package.json b/node_modules/sass-graph/node_modules/cliui/package.json new file mode 100644 index 00000000..64936f71 --- /dev/null +++ b/node_modules/sass-graph/node_modules/cliui/package.json @@ -0,0 +1,67 @@ +{ + "name": "cliui", + "version": "5.0.0", + "description": "easily create complex multi-column command-line-interfaces", + "main": "index.js", + "scripts": { + "pretest": "standard", + "test": "nyc mocha", + "coverage": "nyc --reporter=text-lcov mocha | coveralls", + "release": "standard-version" + }, + "repository": { + "type": "git", + "url": "http://github.com/yargs/cliui.git" + }, + "config": { + "blanket": { + "pattern": [ + "index.js" + ], + "data-cover-never": [ + "node_modules", + "test" + ], + "output-reporter": "spec" + } + }, + "standard": { + "ignore": [ + "**/example/**" + ], + "globals": [ + "it" + ] + }, + "keywords": [ + "cli", + "command-line", + "layout", + "design", + "console", + "wrap", + "table" + ], + "author": "Ben Coe ", + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "devDependencies": { + "chai": "^4.2.0", + "chalk": "^2.4.2", + "coveralls": "^3.0.3", + "mocha": "^6.0.2", + "nyc": "^13.3.0", + "standard": "^12.0.1", + "standard-version": "^5.0.2" + }, + "files": [ + "index.js" + ], + "engine": { + "node": ">=6" + } +} diff --git a/node_modules/sass-graph/node_modules/find-up/index.js b/node_modules/sass-graph/node_modules/find-up/index.js new file mode 100644 index 00000000..8e83819c --- /dev/null +++ b/node_modules/sass-graph/node_modules/find-up/index.js @@ -0,0 +1,46 @@ +'use strict'; +const path = require('path'); +const locatePath = require('locate-path'); + +module.exports = (filename, opts = {}) => { + const startDir = path.resolve(opts.cwd || ''); + const {root} = path.parse(startDir); + + const filenames = [].concat(filename); + + return new Promise(resolve => { + (function find(dir) { + locatePath(filenames, {cwd: dir}).then(file => { + if (file) { + resolve(path.join(dir, file)); + } else if (dir === root) { + resolve(null); + } else { + find(path.dirname(dir)); + } + }); + })(startDir); + }); +}; + +module.exports.sync = (filename, opts = {}) => { + let dir = path.resolve(opts.cwd || ''); + const {root} = path.parse(dir); + + const filenames = [].concat(filename); + + // eslint-disable-next-line no-constant-condition + while (true) { + const file = locatePath.sync(filenames, {cwd: dir}); + + if (file) { + return path.join(dir, file); + } + + if (dir === root) { + return null; + } + + dir = path.dirname(dir); + } +}; diff --git a/node_modules/sass-graph/node_modules/find-up/license b/node_modules/sass-graph/node_modules/find-up/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/sass-graph/node_modules/find-up/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/find-up/package.json b/node_modules/sass-graph/node_modules/find-up/package.json new file mode 100644 index 00000000..a708f572 --- /dev/null +++ b/node_modules/sass-graph/node_modules/find-up/package.json @@ -0,0 +1,50 @@ +{ + "name": "find-up", + "version": "3.0.0", + "description": "Find a file or directory by walking up parent directories", + "license": "MIT", + "repository": "sindresorhus/find-up", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "find", + "up", + "find-up", + "findup", + "look-up", + "look", + "file", + "search", + "match", + "package", + "resolve", + "parent", + "parents", + "folder", + "directory", + "dir", + "walk", + "walking", + "path" + ], + "dependencies": { + "locate-path": "^3.0.0" + }, + "devDependencies": { + "ava": "*", + "tempy": "^0.2.1", + "xo": "*" + } +} diff --git a/node_modules/sass-graph/node_modules/find-up/readme.md b/node_modules/sass-graph/node_modules/find-up/readme.md new file mode 100644 index 00000000..810ad7ce --- /dev/null +++ b/node_modules/sass-graph/node_modules/find-up/readme.md @@ -0,0 +1,87 @@ +# find-up [![Build Status: Linux and macOS](https://travis-ci.org/sindresorhus/find-up.svg?branch=master)](https://travis-ci.org/sindresorhus/find-up) [![Build Status: Windows](https://ci.appveyor.com/api/projects/status/l0cyjmvh5lq72vq2/branch/master?svg=true)](https://ci.appveyor.com/project/sindresorhus/find-up/branch/master) + +> Find a file or directory by walking up parent directories + + +## Install + +``` +$ npm install find-up +``` + + +## Usage + +``` +/ +└── Users + └── sindresorhus + ├── unicorn.png + └── foo + └── bar + ├── baz + └── example.js +``` + +`example.js` + +```js +const findUp = require('find-up'); + +(async () => { + console.log(await findUp('unicorn.png')); + //=> '/Users/sindresorhus/unicorn.png' + + console.log(await findUp(['rainbow.png', 'unicorn.png'])); + //=> '/Users/sindresorhus/unicorn.png' +})(); +``` + + +## API + +### findUp(filename, [options]) + +Returns a `Promise` for either the filepath or `null` if it couldn't be found. + +### findUp([filenameA, filenameB], [options]) + +Returns a `Promise` for either the first filepath found (by respecting the order) or `null` if none could be found. + +### findUp.sync(filename, [options]) + +Returns a filepath or `null`. + +### findUp.sync([filenameA, filenameB], [options]) + +Returns the first filepath found (by respecting the order) or `null`. + +#### filename + +Type: `string` + +Filename of the file to find. + +#### options + +Type: `Object` + +##### cwd + +Type: `string`
      +Default: `process.cwd()` + +Directory to start from. + + +## Related + +- [find-up-cli](https://github.com/sindresorhus/find-up-cli) - CLI for this module +- [pkg-up](https://github.com/sindresorhus/pkg-up) - Find the closest package.json file +- [pkg-dir](https://github.com/sindresorhus/pkg-dir) - Find the root directory of an npm package +- [resolve-from](https://github.com/sindresorhus/resolve-from) - Resolve the path of a module like `require.resolve()` but from a given path + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/sass-graph/node_modules/get-caller-file/LICENSE.md b/node_modules/sass-graph/node_modules/get-caller-file/LICENSE.md new file mode 100644 index 00000000..bf3e1c07 --- /dev/null +++ b/node_modules/sass-graph/node_modules/get-caller-file/LICENSE.md @@ -0,0 +1,6 @@ +ISC License (ISC) +Copyright 2018 Stefan Penner + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/get-caller-file/README.md b/node_modules/sass-graph/node_modules/get-caller-file/README.md new file mode 100644 index 00000000..a7d8c079 --- /dev/null +++ b/node_modules/sass-graph/node_modules/get-caller-file/README.md @@ -0,0 +1,41 @@ +# get-caller-file + +[![Build Status](https://travis-ci.org/stefanpenner/get-caller-file.svg?branch=master)](https://travis-ci.org/stefanpenner/get-caller-file) +[![Build status](https://ci.appveyor.com/api/projects/status/ol2q94g1932cy14a/branch/master?svg=true)](https://ci.appveyor.com/project/embercli/get-caller-file/branch/master) + +This is a utility, which allows a function to figure out from which file it was invoked. It does so by inspecting v8's stack trace at the time it is invoked. + +Inspired by http://stackoverflow.com/questions/13227489 + +*note: this relies on Node/V8 specific APIs, as such other runtimes may not work* + +## Installation + +```bash +yarn add get-caller-file +``` + +## Usage + +Given: + +```js +// ./foo.js +const getCallerFile = require('get-caller-file'); + +module.exports = function() { + return getCallerFile(); // figures out who called it +}; +``` + +```js +// index.js +const foo = require('./foo'); + +foo() // => /full/path/to/this/file/index.js +``` + + +## Options: + +* `getCallerFile(position = 2)`: where position is stack frame whos fileName we want. diff --git a/node_modules/sass-graph/node_modules/get-caller-file/index.d.ts b/node_modules/sass-graph/node_modules/get-caller-file/index.d.ts new file mode 100644 index 00000000..babed696 --- /dev/null +++ b/node_modules/sass-graph/node_modules/get-caller-file/index.d.ts @@ -0,0 +1,2 @@ +declare const _default: (position?: number) => any; +export = _default; diff --git a/node_modules/sass-graph/node_modules/get-caller-file/index.js b/node_modules/sass-graph/node_modules/get-caller-file/index.js new file mode 100644 index 00000000..57304f80 --- /dev/null +++ b/node_modules/sass-graph/node_modules/get-caller-file/index.js @@ -0,0 +1,22 @@ +"use strict"; +// Call this function in a another function to find out the file from +// which that function was called from. (Inspects the v8 stack trace) +// +// Inspired by http://stackoverflow.com/questions/13227489 +module.exports = function getCallerFile(position) { + if (position === void 0) { position = 2; } + if (position >= Error.stackTraceLimit) { + throw new TypeError('getCallerFile(position) requires position be less then Error.stackTraceLimit but position was: `' + position + '` and Error.stackTraceLimit was: `' + Error.stackTraceLimit + '`'); + } + var oldPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = function (_, stack) { return stack; }; + var stack = new Error().stack; + Error.prepareStackTrace = oldPrepareStackTrace; + if (stack !== null && typeof stack === 'object') { + // stack[0] holds this file + // stack[1] holds where this function was called + // stack[2] holds the file we're interested in + return stack[position] ? stack[position].getFileName() : undefined; + } +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/sass-graph/node_modules/get-caller-file/index.js.map b/node_modules/sass-graph/node_modules/get-caller-file/index.js.map new file mode 100644 index 00000000..89c655c0 --- /dev/null +++ b/node_modules/sass-graph/node_modules/get-caller-file/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,qEAAqE;AACrE,EAAE;AACF,0DAA0D;AAE1D,iBAAS,SAAS,aAAa,CAAC,QAAY;IAAZ,yBAAA,EAAA,YAAY;IAC1C,IAAI,QAAQ,IAAI,KAAK,CAAC,eAAe,EAAE;QACrC,MAAM,IAAI,SAAS,CAAC,kGAAkG,GAAG,QAAQ,GAAG,oCAAoC,GAAG,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;KACzM;IAED,IAAM,oBAAoB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACrD,KAAK,CAAC,iBAAiB,GAAG,UAAC,CAAC,EAAE,KAAK,IAAM,OAAA,KAAK,EAAL,CAAK,CAAC;IAC/C,IAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC;IAChC,KAAK,CAAC,iBAAiB,GAAG,oBAAoB,CAAC;IAG/C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC/C,2BAA2B;QAC3B,gDAAgD;QAChD,8CAA8C;QAC9C,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,QAAQ,CAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KAC7E;AACH,CAAC,CAAC"} \ No newline at end of file diff --git a/node_modules/sass-graph/node_modules/get-caller-file/package.json b/node_modules/sass-graph/node_modules/get-caller-file/package.json new file mode 100644 index 00000000..b0dd5713 --- /dev/null +++ b/node_modules/sass-graph/node_modules/get-caller-file/package.json @@ -0,0 +1,42 @@ +{ + "name": "get-caller-file", + "version": "2.0.5", + "description": "", + "main": "index.js", + "directories": { + "test": "tests" + }, + "files": [ + "index.js", + "index.js.map", + "index.d.ts" + ], + "scripts": { + "prepare": "tsc", + "test": "mocha test", + "test:debug": "mocha test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/stefanpenner/get-caller-file.git" + }, + "author": "Stefan Penner", + "license": "ISC", + "bugs": { + "url": "https://github.com/stefanpenner/get-caller-file/issues" + }, + "homepage": "https://github.com/stefanpenner/get-caller-file#readme", + "devDependencies": { + "@types/chai": "^4.1.7", + "@types/ensure-posix-path": "^1.0.0", + "@types/mocha": "^5.2.6", + "@types/node": "^11.10.5", + "chai": "^4.1.2", + "ensure-posix-path": "^1.0.1", + "mocha": "^5.2.0", + "typescript": "^3.3.3333" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } +} diff --git a/node_modules/sass-graph/node_modules/require-main-filename/CHANGELOG.md b/node_modules/sass-graph/node_modules/require-main-filename/CHANGELOG.md new file mode 100644 index 00000000..717d59e3 --- /dev/null +++ b/node_modules/sass-graph/node_modules/require-main-filename/CHANGELOG.md @@ -0,0 +1,26 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +# [2.0.0](https://github.com/yargs/require-main-filename/compare/v1.0.2...v2.0.0) (2019-01-28) + + +### Chores + +* drop support for Node 0.10 ([#11](https://github.com/yargs/require-main-filename/issues/11)) ([87f4e13](https://github.com/yargs/require-main-filename/commit/87f4e13)) + + +### BREAKING CHANGES + +* drop support for Node 0.10/0.12 + + + + +## [1.0.2](https://github.com/yargs/require-main-filename/compare/v1.0.1...v1.0.2) (2017-06-16) + + +### Bug Fixes + +* add files to package.json ([#4](https://github.com/yargs/require-main-filename/issues/4)) ([fa29988](https://github.com/yargs/require-main-filename/commit/fa29988)) diff --git a/node_modules/sass-graph/node_modules/require-main-filename/LICENSE.txt b/node_modules/sass-graph/node_modules/require-main-filename/LICENSE.txt new file mode 100644 index 00000000..836440be --- /dev/null +++ b/node_modules/sass-graph/node_modules/require-main-filename/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (c) 2016, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/require-main-filename/README.md b/node_modules/sass-graph/node_modules/require-main-filename/README.md new file mode 100644 index 00000000..820d9f58 --- /dev/null +++ b/node_modules/sass-graph/node_modules/require-main-filename/README.md @@ -0,0 +1,26 @@ +# require-main-filename + +[![Build Status](https://travis-ci.org/yargs/require-main-filename.png)](https://travis-ci.org/yargs/require-main-filename) +[![Coverage Status](https://coveralls.io/repos/yargs/require-main-filename/badge.svg?branch=master)](https://coveralls.io/r/yargs/require-main-filename?branch=master) +[![NPM version](https://img.shields.io/npm/v/require-main-filename.svg)](https://www.npmjs.com/package/require-main-filename) + +`require.main.filename` is great for figuring out the entry +point for the current application. This can be combined with a module like +[pkg-conf](https://www.npmjs.com/package/pkg-conf) to, _as if by magic_, load +top-level configuration. + +Unfortunately, `require.main.filename` sometimes fails when an application is +executed with an alternative process manager, e.g., [iisnode](https://github.com/tjanczuk/iisnode). + +`require-main-filename` is a shim that addresses this problem. + +## Usage + +```js +var main = require('require-main-filename')() +// use main as an alternative to require.main.filename. +``` + +## License + +ISC diff --git a/node_modules/sass-graph/node_modules/require-main-filename/index.js b/node_modules/sass-graph/node_modules/require-main-filename/index.js new file mode 100644 index 00000000..dca7f0cc --- /dev/null +++ b/node_modules/sass-graph/node_modules/require-main-filename/index.js @@ -0,0 +1,18 @@ +module.exports = function (_require) { + _require = _require || require + var main = _require.main + if (main && isIISNode(main)) return handleIISNode(main) + else return main ? main.filename : process.cwd() +} + +function isIISNode (main) { + return /\\iisnode\\/.test(main.filename) +} + +function handleIISNode (main) { + if (!main.children.length) { + return main.filename + } else { + return main.children[0].filename + } +} diff --git a/node_modules/sass-graph/node_modules/require-main-filename/package.json b/node_modules/sass-graph/node_modules/require-main-filename/package.json new file mode 100644 index 00000000..a549822d --- /dev/null +++ b/node_modules/sass-graph/node_modules/require-main-filename/package.json @@ -0,0 +1,35 @@ +{ + "name": "require-main-filename", + "version": "2.0.0", + "description": "shim for require.main.filename() that works in as many environments as possible", + "main": "index.js", + "scripts": { + "pretest": "standard", + "test": "tap --coverage test.js", + "release": "standard-version" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/yargs/require-main-filename.git" + }, + "keywords": [ + "require", + "shim", + "iisnode" + ], + "files": [ + "index.js" + ], + "author": "Ben Coe ", + "license": "ISC", + "bugs": { + "url": "https://github.com/yargs/require-main-filename/issues" + }, + "homepage": "https://github.com/yargs/require-main-filename#readme", + "devDependencies": { + "chai": "^4.0.0", + "standard": "^10.0.3", + "standard-version": "^4.0.0", + "tap": "^11.0.0" + } +} diff --git a/node_modules/sass-graph/node_modules/string-width/index.js b/node_modules/sass-graph/node_modules/string-width/index.js new file mode 100644 index 00000000..33c9d6c0 --- /dev/null +++ b/node_modules/sass-graph/node_modules/string-width/index.js @@ -0,0 +1,39 @@ +'use strict'; +const stripAnsi = require('strip-ansi'); +const isFullwidthCodePoint = require('is-fullwidth-code-point'); +const emojiRegex = require('emoji-regex')(); + +module.exports = input => { + input = input.replace(emojiRegex, ' '); + + if (typeof input !== 'string' || input.length === 0) { + return 0; + } + + input = stripAnsi(input); + + let width = 0; + + for (let i = 0; i < input.length; i++) { + const code = input.codePointAt(i); + + // Ignore control characters + if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { + continue; + } + + // Ignore combining characters + if (code >= 0x300 && code <= 0x36F) { + continue; + } + + // Surrogates + if (code > 0xFFFF) { + i++; + } + + width += isFullwidthCodePoint(code) ? 2 : 1; + } + + return width; +}; diff --git a/node_modules/sass-graph/node_modules/string-width/license b/node_modules/sass-graph/node_modules/string-width/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/sass-graph/node_modules/string-width/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/string-width/package.json b/node_modules/sass-graph/node_modules/string-width/package.json new file mode 100644 index 00000000..e040183e --- /dev/null +++ b/node_modules/sass-graph/node_modules/string-width/package.json @@ -0,0 +1,56 @@ +{ + "name": "string-width", + "version": "3.1.0", + "description": "Get the visual width of a string - the number of columns required to display it", + "license": "MIT", + "repository": "sindresorhus/string-width", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "string", + "str", + "character", + "char", + "unicode", + "width", + "visual", + "column", + "columns", + "fullwidth", + "full-width", + "full", + "ansi", + "escape", + "codes", + "cli", + "command-line", + "terminal", + "console", + "cjk", + "chinese", + "japanese", + "korean", + "fixed-width" + ], + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "devDependencies": { + "ava": "^1.0.1", + "xo": "^0.23.0" + } +} diff --git a/node_modules/sass-graph/node_modules/string-width/readme.md b/node_modules/sass-graph/node_modules/string-width/readme.md new file mode 100644 index 00000000..d39d95f5 --- /dev/null +++ b/node_modules/sass-graph/node_modules/string-width/readme.md @@ -0,0 +1,45 @@ +# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width) + +> Get the visual width of a string - the number of columns required to display it + +Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. + +Useful to be able to measure the actual width of command-line output. + + +## Install + +``` +$ npm install string-width +``` + + +## Usage + +```js +const stringWidth = require('string-width'); + +stringWidth('古'); +//=> 2 + +stringWidth('\u001b[1m古\u001b[22m'); +//=> 2 + +stringWidth('a'); +//=> 1 + +stringWidth('\u001B]8;;https://github.com\u0007Click\u001B]8;;\u0007'); +// => 5 +``` + + +## Related + +- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module +- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string +- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/sass-graph/node_modules/strip-ansi/index.d.ts b/node_modules/sass-graph/node_modules/strip-ansi/index.d.ts new file mode 100644 index 00000000..44e954d0 --- /dev/null +++ b/node_modules/sass-graph/node_modules/strip-ansi/index.d.ts @@ -0,0 +1,15 @@ +/** +Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) from a string. + +@example +``` +import stripAnsi from 'strip-ansi'; + +stripAnsi('\u001B[4mUnicorn\u001B[0m'); +//=> 'Unicorn' + +stripAnsi('\u001B]8;;https://github.com\u0007Click\u001B]8;;\u0007'); +//=> 'Click' +``` +*/ +export default function stripAnsi(string: string): string; diff --git a/node_modules/sass-graph/node_modules/strip-ansi/index.js b/node_modules/sass-graph/node_modules/strip-ansi/index.js new file mode 100644 index 00000000..9788c96d --- /dev/null +++ b/node_modules/sass-graph/node_modules/strip-ansi/index.js @@ -0,0 +1,7 @@ +'use strict'; +const ansiRegex = require('ansi-regex'); + +const stripAnsi = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string; + +module.exports = stripAnsi; +module.exports.default = stripAnsi; diff --git a/node_modules/sass-graph/node_modules/strip-ansi/license b/node_modules/sass-graph/node_modules/strip-ansi/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/sass-graph/node_modules/strip-ansi/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/strip-ansi/package.json b/node_modules/sass-graph/node_modules/strip-ansi/package.json new file mode 100644 index 00000000..7494fd7e --- /dev/null +++ b/node_modules/sass-graph/node_modules/strip-ansi/package.json @@ -0,0 +1,54 @@ +{ + "name": "strip-ansi", + "version": "5.2.0", + "description": "Strip ANSI escape codes from a string", + "license": "MIT", + "repository": "chalk/strip-ansi", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "xo && ava && tsd-check" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "devDependencies": { + "ava": "^1.3.1", + "tsd-check": "^0.5.0", + "xo": "^0.24.0" + } +} diff --git a/node_modules/sass-graph/node_modules/strip-ansi/readme.md b/node_modules/sass-graph/node_modules/strip-ansi/readme.md new file mode 100644 index 00000000..8681fe8a --- /dev/null +++ b/node_modules/sass-graph/node_modules/strip-ansi/readme.md @@ -0,0 +1,61 @@ +# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) + +> Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) from a string + +--- + +
      + + Get professional support for 'strip-ansi' with a Tidelift subscription + +
      + + Tidelift helps make open source sustainable for maintainers while giving companies
      assurances about security, maintenance, and licensing for their dependencies. +
      +
      + +--- + +## Install + +``` +$ npm install strip-ansi +``` + + +## Usage + +```js +const stripAnsi = require('strip-ansi'); + +stripAnsi('\u001B[4mUnicorn\u001B[0m'); +//=> 'Unicorn' + +stripAnsi('\u001B]8;;https://github.com\u0007Click\u001B]8;;\u0007'); +//=> 'Click' +``` + + +## Security + +To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. + + +## Related + +- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module +- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Streaming version of this module +- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes +- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/sass-graph/node_modules/which-module/CHANGELOG.md b/node_modules/sass-graph/node_modules/which-module/CHANGELOG.md new file mode 100644 index 00000000..863d4698 --- /dev/null +++ b/node_modules/sass-graph/node_modules/which-module/CHANGELOG.md @@ -0,0 +1,26 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +# [2.0.0](https://github.com/nexdrew/which-module/compare/v1.0.0...v2.0.0) (2017-05-01) + + +### Features + +* remove Node < 4 from official testing/support ([#22](https://github.com/nexdrew/which-module/issues/22)) ([ee7aff4](https://github.com/nexdrew/which-module/commit/ee7aff4)) + + +### BREAKING CHANGES + +* Node 0.10 or 0.12 no longer supported, please update to Node 4+ or use which-module@1.0.0 + + + + +# 1.0.0 (2016-06-06) + + +### Features + +* initial code ([08074cd](https://github.com/nexdrew/which-module/commit/08074cd)) diff --git a/node_modules/sass-graph/node_modules/which-module/LICENSE b/node_modules/sass-graph/node_modules/which-module/LICENSE new file mode 100644 index 00000000..ab601b65 --- /dev/null +++ b/node_modules/sass-graph/node_modules/which-module/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2016, Contributors + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/which-module/README.md b/node_modules/sass-graph/node_modules/which-module/README.md new file mode 100644 index 00000000..a8c4bf8d --- /dev/null +++ b/node_modules/sass-graph/node_modules/which-module/README.md @@ -0,0 +1,55 @@ +# which-module + +> Find the module object for something that was require()d + +[![Build Status](https://travis-ci.org/nexdrew/which-module.svg?branch=master)](https://travis-ci.org/nexdrew/which-module) +[![Coverage Status](https://coveralls.io/repos/github/nexdrew/which-module/badge.svg?branch=master)](https://coveralls.io/github/nexdrew/which-module?branch=master) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + +Find the `module` object in `require.cache` for something that was `require()`d +or `import`ed - essentially a reverse `require()` lookup. + +Useful for libs that want to e.g. lookup a filename for a module or submodule +that it did not `require()` itself. + +## Install and Usage + +``` +npm install --save which-module +``` + +```js +const whichModule = require('which-module') + +console.log(whichModule(require('something'))) +// Module { +// id: '/path/to/project/node_modules/something/index.js', +// exports: [Function], +// parent: ..., +// filename: '/path/to/project/node_modules/something/index.js', +// loaded: true, +// children: [], +// paths: [ '/path/to/project/node_modules/something/node_modules', +// '/path/to/project/node_modules', +// '/path/to/node_modules', +// '/path/node_modules', +// '/node_modules' ] } +``` + +## API + +### `whichModule(exported)` + +Return the [`module` object](https://nodejs.org/api/modules.html#modules_the_module_object), +if any, that represents the given argument in the `require.cache`. + +`exported` can be anything that was previously `require()`d or `import`ed as a +module, submodule, or dependency - which means `exported` is identical to the +`module.exports` returned by this method. + +If `exported` did not come from the `exports` of a `module` in `require.cache`, +then this method returns `null`. + +## License + +ISC © Contributors diff --git a/node_modules/sass-graph/node_modules/which-module/index.js b/node_modules/sass-graph/node_modules/which-module/index.js new file mode 100644 index 00000000..45559b78 --- /dev/null +++ b/node_modules/sass-graph/node_modules/which-module/index.js @@ -0,0 +1,9 @@ +'use strict' + +module.exports = function whichModule (exported) { + for (var i = 0, files = Object.keys(require.cache), mod; i < files.length; i++) { + mod = require.cache[files[i]] + if (mod.exports === exported) return mod + } + return null +} diff --git a/node_modules/sass-graph/node_modules/which-module/package.json b/node_modules/sass-graph/node_modules/which-module/package.json new file mode 100644 index 00000000..3566aff0 --- /dev/null +++ b/node_modules/sass-graph/node_modules/which-module/package.json @@ -0,0 +1,41 @@ +{ + "name": "which-module", + "version": "2.0.0", + "description": "Find the module object for something that was require()d", + "main": "index.js", + "scripts": { + "pretest": "standard", + "test": "nyc ava", + "coverage": "nyc report --reporter=text-lcov | coveralls", + "release": "standard-version" + }, + "files": [ + "index.js" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/nexdrew/which-module.git" + }, + "keywords": [ + "which", + "module", + "exports", + "filename", + "require", + "reverse", + "lookup" + ], + "author": "nexdrew", + "license": "ISC", + "bugs": { + "url": "https://github.com/nexdrew/which-module/issues" + }, + "homepage": "https://github.com/nexdrew/which-module#readme", + "devDependencies": { + "ava": "^0.19.1", + "coveralls": "^2.13.1", + "nyc": "^10.3.0", + "standard": "^10.0.2", + "standard-version": "^4.0.0" + } +} diff --git a/node_modules/sass-graph/node_modules/wrap-ansi/index.js b/node_modules/sass-graph/node_modules/wrap-ansi/index.js new file mode 100755 index 00000000..5038bb0c --- /dev/null +++ b/node_modules/sass-graph/node_modules/wrap-ansi/index.js @@ -0,0 +1,188 @@ +'use strict'; +const stringWidth = require('string-width'); +const stripAnsi = require('strip-ansi'); +const ansiStyles = require('ansi-styles'); + +const ESCAPES = new Set([ + '\u001B', + '\u009B' +]); + +const END_CODE = 39; + +const wrapAnsi = code => `${ESCAPES.values().next().value}[${code}m`; + +// Calculate the length of words split on ' ', ignoring +// the extra characters added by ansi escape codes +const wordLengths = string => string.split(' ').map(character => stringWidth(character)); + +// Wrap a long word across multiple rows +// Ansi escape codes do not count towards length +const wrapWord = (rows, word, columns) => { + const characters = [...word]; + + let insideEscape = false; + let visible = stringWidth(stripAnsi(rows[rows.length - 1])); + + for (const [index, character] of characters.entries()) { + const characterLength = stringWidth(character); + + if (visible + characterLength <= columns) { + rows[rows.length - 1] += character; + } else { + rows.push(character); + visible = 0; + } + + if (ESCAPES.has(character)) { + insideEscape = true; + } else if (insideEscape && character === 'm') { + insideEscape = false; + continue; + } + + if (insideEscape) { + continue; + } + + visible += characterLength; + + if (visible === columns && index < characters.length - 1) { + rows.push(''); + visible = 0; + } + } + + // It's possible that the last row we copy over is only + // ansi escape characters, handle this edge-case + if (!visible && rows[rows.length - 1].length > 0 && rows.length > 1) { + rows[rows.length - 2] += rows.pop(); + } +}; + +// Trims spaces from a string ignoring invisible sequences +const stringVisibleTrimSpacesRight = str => { + const words = str.split(' '); + let last = words.length; + + while (last > 0) { + if (stringWidth(words[last - 1]) > 0) { + break; + } + + last--; + } + + if (last === words.length) { + return str; + } + + return words.slice(0, last).join(' ') + words.slice(last).join(''); +}; + +// The wrap-ansi module can be invoked +// in either 'hard' or 'soft' wrap mode +// +// 'hard' will never allow a string to take up more +// than columns characters +// +// 'soft' allows long words to expand past the column length +const exec = (string, columns, options = {}) => { + if (options.trim !== false && string.trim() === '') { + return ''; + } + + let pre = ''; + let ret = ''; + let escapeCode; + + const lengths = wordLengths(string); + let rows = ['']; + + for (const [index, word] of string.split(' ').entries()) { + if (options.trim !== false) { + rows[rows.length - 1] = rows[rows.length - 1].trimLeft(); + } + + let rowLength = stringWidth(rows[rows.length - 1]); + + if (index !== 0) { + if (rowLength >= columns && (options.wordWrap === false || options.trim === false)) { + // If we start with a new word but the current row length equals the length of the columns, add a new row + rows.push(''); + rowLength = 0; + } + + if (rowLength > 0 || options.trim === false) { + rows[rows.length - 1] += ' '; + rowLength++; + } + } + + // In 'hard' wrap mode, the length of a line is + // never allowed to extend past 'columns' + if (options.hard && lengths[index] > columns) { + const remainingColumns = (columns - rowLength); + const breaksStartingThisLine = 1 + Math.floor((lengths[index] - remainingColumns - 1) / columns); + const breaksStartingNextLine = Math.floor((lengths[index] - 1) / columns); + if (breaksStartingNextLine < breaksStartingThisLine) { + rows.push(''); + } + + wrapWord(rows, word, columns); + continue; + } + + if (rowLength + lengths[index] > columns && rowLength > 0 && lengths[index] > 0) { + if (options.wordWrap === false && rowLength < columns) { + wrapWord(rows, word, columns); + continue; + } + + rows.push(''); + } + + if (rowLength + lengths[index] > columns && options.wordWrap === false) { + wrapWord(rows, word, columns); + continue; + } + + rows[rows.length - 1] += word; + } + + if (options.trim !== false) { + rows = rows.map(stringVisibleTrimSpacesRight); + } + + pre = rows.join('\n'); + + for (const [index, character] of [...pre].entries()) { + ret += character; + + if (ESCAPES.has(character)) { + const code = parseFloat(/\d[^m]*/.exec(pre.slice(index, index + 4))); + escapeCode = code === END_CODE ? null : code; + } + + const code = ansiStyles.codes.get(Number(escapeCode)); + + if (escapeCode && code) { + if (pre[index + 1] === '\n') { + ret += wrapAnsi(code); + } else if (character === '\n') { + ret += wrapAnsi(escapeCode); + } + } + } + + return ret; +}; + +// For each newline, invoke the method separately +module.exports = (string, columns, options) => { + return String(string) + .normalize() + .split('\n') + .map(line => exec(line, columns, options)) + .join('\n'); +}; diff --git a/node_modules/sass-graph/node_modules/wrap-ansi/license b/node_modules/sass-graph/node_modules/wrap-ansi/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/sass-graph/node_modules/wrap-ansi/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/wrap-ansi/package.json b/node_modules/sass-graph/node_modules/wrap-ansi/package.json new file mode 100644 index 00000000..dcbb7f6e --- /dev/null +++ b/node_modules/sass-graph/node_modules/wrap-ansi/package.json @@ -0,0 +1,61 @@ +{ + "name": "wrap-ansi", + "version": "5.1.0", + "description": "Wordwrap a string with ANSI escape codes", + "license": "MIT", + "repository": "chalk/wrap-ansi", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "xo && nyc ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "wrap", + "break", + "wordwrap", + "wordbreak", + "linewrap", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "devDependencies": { + "ava": "^1.2.1", + "chalk": "^2.4.2", + "coveralls": "^3.0.3", + "has-ansi": "^3.0.0", + "nyc": "^13.3.0", + "xo": "^0.24.0" + } +} diff --git a/node_modules/sass-graph/node_modules/wrap-ansi/readme.md b/node_modules/sass-graph/node_modules/wrap-ansi/readme.md new file mode 100644 index 00000000..73b87de2 --- /dev/null +++ b/node_modules/sass-graph/node_modules/wrap-ansi/readme.md @@ -0,0 +1,108 @@ +# wrap-ansi [![Build Status](https://travis-ci.org/chalk/wrap-ansi.svg?branch=master)](https://travis-ci.org/chalk/wrap-ansi) [![Coverage Status](https://coveralls.io/repos/github/chalk/wrap-ansi/badge.svg?branch=master)](https://coveralls.io/github/chalk/wrap-ansi?branch=master) + +> Wordwrap a string with [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) + + +## Install + +``` +$ npm install wrap-ansi +``` + + +## Usage + +```js +const chalk = require('chalk'); +const wrapAnsi = require('wrap-ansi'); + +const input = 'The quick brown ' + chalk.red('fox jumped over ') + + 'the lazy ' + chalk.green('dog and then ran away with the unicorn.'); + +console.log(wrapAnsi(input, 20)); +``` + + + +--- + +
      + + Get professional support for this package with a Tidelift subscription + +
      + + Tidelift helps make open source sustainable for maintainers while giving companies
      assurances about security, maintenance, and licensing for their dependencies. +
      +
      + +--- + + +## API + +### wrapAnsi(input, columns, [options]) + +Wrap words to the specified column width. + +#### input + +Type: `string` + +String with ANSI escape codes. Like one styled by [`chalk`](https://github.com/chalk/chalk). + +#### columns + +Type: `number` + +Number of columns to wrap the text to. + +#### options + +Type: `Object` + +##### hard + +Type: `boolean`
      +Default: `false` + +By default the wrap is soft, meaning long words may extend past the column width. Setting this to `true` will make it hard wrap at the column width. + +##### wordWrap + +Type: `boolean`
      +Default: `true` + +By default, an attempt is made to split words at spaces, ensuring that they don't extend past the configured columns. If wordWrap is `false`, each column will instead be completely filled splitting words as necessary. + +##### trim + +Type: `boolean`
      +Default: `true` + +Whitespace on all lines is removed by default. Set this option to `false` if you don't want to trim. + + +## Related + +- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes +- [cli-truncate](https://github.com/sindresorhus/cli-truncate) - Truncate a string to a specific width in the terminal +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right +- [jsesc](https://github.com/mathiasbynens/jsesc) - Generate ASCII-only output from Unicode strings. Useful for creating test fixtures. + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) +- [Benjamin Coe](https://github.com/bcoe) + + +## Security + +To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. + + +## License + +MIT diff --git a/node_modules/sass-graph/node_modules/y18n/CHANGELOG.md b/node_modules/sass-graph/node_modules/y18n/CHANGELOG.md new file mode 100644 index 00000000..a3d5bcd5 --- /dev/null +++ b/node_modules/sass-graph/node_modules/y18n/CHANGELOG.md @@ -0,0 +1,28 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +### 4.0.1 (2020-11-30) + +### Bug Fixes + +* address prototype pollution issue ([#108](https://www.github.com/yargs/y18n/issues/108)) ([a9ac604](https://www.github.com/yargs/y18n/commit/a9ac604abf756dec9687be3843e2c93bfe581f25)) + + +# [4.0.0](https://github.com/yargs/y18n/compare/v3.2.1...v4.0.0) (2017-10-10) + + +### Bug Fixes + +* allow support for falsy values like 0 in tagged literal ([#45](https://github.com/yargs/y18n/issues/45)) ([c926123](https://github.com/yargs/y18n/commit/c926123)) + + +### Features + +* **__:** added tagged template literal support ([#44](https://github.com/yargs/y18n/issues/44)) ([0598daf](https://github.com/yargs/y18n/commit/0598daf)) + + +### BREAKING CHANGES + +* **__:** dropping Node 0.10/Node 0.12 support diff --git a/node_modules/sass-graph/node_modules/y18n/LICENSE b/node_modules/sass-graph/node_modules/y18n/LICENSE new file mode 100644 index 00000000..3c157f0b --- /dev/null +++ b/node_modules/sass-graph/node_modules/y18n/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2015, Contributors + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/y18n/README.md b/node_modules/sass-graph/node_modules/y18n/README.md new file mode 100644 index 00000000..826474f2 --- /dev/null +++ b/node_modules/sass-graph/node_modules/y18n/README.md @@ -0,0 +1,109 @@ +# y18n + +[![Build Status][travis-image]][travis-url] +[![Coverage Status][coveralls-image]][coveralls-url] +[![NPM version][npm-image]][npm-url] +[![js-standard-style][standard-image]][standard-url] +[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) + +The bare-bones internationalization library used by yargs. + +Inspired by [i18n](https://www.npmjs.com/package/i18n). + +## Examples + +_simple string translation:_ + +```js +var __ = require('y18n').__ + +console.log(__('my awesome string %s', 'foo')) +``` + +output: + +`my awesome string foo` + +_using tagged template literals_ + +```js +var __ = require('y18n').__ +var str = 'foo' + +console.log(__`my awesome string ${str}`) +``` + +output: + +`my awesome string foo` + +_pluralization support:_ + +```js +var __n = require('y18n').__n + +console.log(__n('one fish %s', '%d fishes %s', 2, 'foo')) +``` + +output: + +`2 fishes foo` + +## JSON Language Files + +The JSON language files should be stored in a `./locales` folder. +File names correspond to locales, e.g., `en.json`, `pirate.json`. + +When strings are observed for the first time they will be +added to the JSON file corresponding to the current locale. + +## Methods + +### require('y18n')(config) + +Create an instance of y18n with the config provided, options include: + +* `directory`: the locale directory, default `./locales`. +* `updateFiles`: should newly observed strings be updated in file, default `true`. +* `locale`: what locale should be used. +* `fallbackToLanguage`: should fallback to a language-only file (e.g. `en.json`) + be allowed if a file matching the locale does not exist (e.g. `en_US.json`), + default `true`. + +### y18n.\_\_(str, arg, arg, arg) + +Print a localized string, `%s` will be replaced with `arg`s. + +This function can also be used as a tag for a template literal. You can use it +like this: __`hello ${'world'}`. This will be equivalent to +`__('hello %s', 'world')`. + +### y18n.\_\_n(singularString, pluralString, count, arg, arg, arg) + +Print a localized string with appropriate pluralization. If `%d` is provided +in the string, the `count` will replace this placeholder. + +### y18n.setLocale(str) + +Set the current locale being used. + +### y18n.getLocale() + +What locale is currently being used? + +### y18n.updateLocale(obj) + +Update the current locale with the key value pairs in `obj`. + +## License + +ISC + +[travis-url]: https://travis-ci.org/yargs/y18n +[travis-image]: https://img.shields.io/travis/yargs/y18n.svg +[coveralls-url]: https://coveralls.io/github/yargs/y18n +[coveralls-image]: https://img.shields.io/coveralls/yargs/y18n.svg +[npm-url]: https://npmjs.org/package/y18n +[npm-image]: https://img.shields.io/npm/v/y18n.svg +[standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg +[standard-url]: https://github.com/feross/standard diff --git a/node_modules/sass-graph/node_modules/y18n/index.js b/node_modules/sass-graph/node_modules/y18n/index.js new file mode 100644 index 00000000..727362aa --- /dev/null +++ b/node_modules/sass-graph/node_modules/y18n/index.js @@ -0,0 +1,188 @@ +var fs = require('fs') +var path = require('path') +var util = require('util') + +function Y18N (opts) { + // configurable options. + opts = opts || {} + this.directory = opts.directory || './locales' + this.updateFiles = typeof opts.updateFiles === 'boolean' ? opts.updateFiles : true + this.locale = opts.locale || 'en' + this.fallbackToLanguage = typeof opts.fallbackToLanguage === 'boolean' ? opts.fallbackToLanguage : true + + // internal stuff. + this.cache = Object.create(null) + this.writeQueue = [] +} + +Y18N.prototype.__ = function () { + if (typeof arguments[0] !== 'string') { + return this._taggedLiteral.apply(this, arguments) + } + var args = Array.prototype.slice.call(arguments) + var str = args.shift() + var cb = function () {} // start with noop. + + if (typeof args[args.length - 1] === 'function') cb = args.pop() + cb = cb || function () {} // noop. + + if (!this.cache[this.locale]) this._readLocaleFile() + + // we've observed a new string, update the language file. + if (!this.cache[this.locale][str] && this.updateFiles) { + this.cache[this.locale][str] = str + + // include the current directory and locale, + // since these values could change before the + // write is performed. + this._enqueueWrite([this.directory, this.locale, cb]) + } else { + cb() + } + + return util.format.apply(util, [this.cache[this.locale][str] || str].concat(args)) +} + +Y18N.prototype._taggedLiteral = function (parts) { + var args = arguments + var str = '' + parts.forEach(function (part, i) { + var arg = args[i + 1] + str += part + if (typeof arg !== 'undefined') { + str += '%s' + } + }) + return this.__.apply(null, [str].concat([].slice.call(arguments, 1))) +} + +Y18N.prototype._enqueueWrite = function (work) { + this.writeQueue.push(work) + if (this.writeQueue.length === 1) this._processWriteQueue() +} + +Y18N.prototype._processWriteQueue = function () { + var _this = this + var work = this.writeQueue[0] + + // destructure the enqueued work. + var directory = work[0] + var locale = work[1] + var cb = work[2] + + var languageFile = this._resolveLocaleFile(directory, locale) + var serializedLocale = JSON.stringify(this.cache[locale], null, 2) + + fs.writeFile(languageFile, serializedLocale, 'utf-8', function (err) { + _this.writeQueue.shift() + if (_this.writeQueue.length > 0) _this._processWriteQueue() + cb(err) + }) +} + +Y18N.prototype._readLocaleFile = function () { + var localeLookup = {} + var languageFile = this._resolveLocaleFile(this.directory, this.locale) + + try { + localeLookup = JSON.parse(fs.readFileSync(languageFile, 'utf-8')) + } catch (err) { + if (err instanceof SyntaxError) { + err.message = 'syntax error in ' + languageFile + } + + if (err.code === 'ENOENT') localeLookup = {} + else throw err + } + + this.cache[this.locale] = localeLookup +} + +Y18N.prototype._resolveLocaleFile = function (directory, locale) { + var file = path.resolve(directory, './', locale + '.json') + if (this.fallbackToLanguage && !this._fileExistsSync(file) && ~locale.lastIndexOf('_')) { + // attempt fallback to language only + var languageFile = path.resolve(directory, './', locale.split('_')[0] + '.json') + if (this._fileExistsSync(languageFile)) file = languageFile + } + return file +} + +// this only exists because fs.existsSync() "will be deprecated" +// see https://nodejs.org/api/fs.html#fs_fs_existssync_path +Y18N.prototype._fileExistsSync = function (file) { + try { + return fs.statSync(file).isFile() + } catch (err) { + return false + } +} + +Y18N.prototype.__n = function () { + var args = Array.prototype.slice.call(arguments) + var singular = args.shift() + var plural = args.shift() + var quantity = args.shift() + + var cb = function () {} // start with noop. + if (typeof args[args.length - 1] === 'function') cb = args.pop() + + if (!this.cache[this.locale]) this._readLocaleFile() + + var str = quantity === 1 ? singular : plural + if (this.cache[this.locale][singular]) { + str = this.cache[this.locale][singular][quantity === 1 ? 'one' : 'other'] + } + + // we've observed a new string, update the language file. + if (!this.cache[this.locale][singular] && this.updateFiles) { + this.cache[this.locale][singular] = { + one: singular, + other: plural + } + + // include the current directory and locale, + // since these values could change before the + // write is performed. + this._enqueueWrite([this.directory, this.locale, cb]) + } else { + cb() + } + + // if a %d placeholder is provided, add quantity + // to the arguments expanded by util.format. + var values = [str] + if (~str.indexOf('%d')) values.push(quantity) + + return util.format.apply(util, values.concat(args)) +} + +Y18N.prototype.setLocale = function (locale) { + this.locale = locale +} + +Y18N.prototype.getLocale = function () { + return this.locale +} + +Y18N.prototype.updateLocale = function (obj) { + if (!this.cache[this.locale]) this._readLocaleFile() + + for (var key in obj) { + this.cache[this.locale][key] = obj[key] + } +} + +module.exports = function (opts) { + var y18n = new Y18N(opts) + + // bind all functions to y18n, so that + // they can be used in isolation. + for (var key in y18n) { + if (typeof y18n[key] === 'function') { + y18n[key] = y18n[key].bind(y18n) + } + } + + return y18n +} diff --git a/node_modules/sass-graph/node_modules/y18n/package.json b/node_modules/sass-graph/node_modules/y18n/package.json new file mode 100644 index 00000000..2050c9e6 --- /dev/null +++ b/node_modules/sass-graph/node_modules/y18n/package.json @@ -0,0 +1,39 @@ +{ + "name": "y18n", + "version": "4.0.1", + "description": "the bare-bones internationalization library used by yargs", + "main": "index.js", + "scripts": { + "pretest": "standard", + "test": "nyc mocha", + "coverage": "nyc report --reporter=text-lcov | coveralls", + "release": "standard-version" + }, + "repository": { + "type": "git", + "url": "git@github.com:yargs/y18n.git" + }, + "files": [ + "index.js" + ], + "keywords": [ + "i18n", + "internationalization", + "yargs" + ], + "author": "Ben Coe ", + "license": "ISC", + "bugs": { + "url": "https://github.com/yargs/y18n/issues" + }, + "homepage": "https://github.com/yargs/y18n", + "devDependencies": { + "chai": "^4.0.1", + "coveralls": "^3.0.0", + "mocha": "^4.0.1", + "nyc": "^11.0.1", + "rimraf": "^2.5.0", + "standard": "^10.0.0-beta.0", + "standard-version": "^4.2.0" + } +} diff --git a/node_modules/sass-graph/node_modules/yargs-parser/CHANGELOG.md b/node_modules/sass-graph/node_modules/yargs-parser/CHANGELOG.md new file mode 100644 index 00000000..df11c002 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs-parser/CHANGELOG.md @@ -0,0 +1,467 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +### [13.1.1](https://www.github.com/yargs/yargs-parser/compare/v13.1.0...v13.1.1) (2019-06-10) + + +### Bug Fixes + +* convert values to strings when tokenizing ([#167](https://www.github.com/yargs/yargs-parser/issues/167)) ([57b7883](https://www.github.com/yargs/yargs-parser/commit/57b7883)) +* nargs should allow duplicates when duplicate-arguments-array=false ([#164](https://www.github.com/yargs/yargs-parser/issues/164)) ([47ccb0b](https://www.github.com/yargs/yargs-parser/commit/47ccb0b)) +* should populate "_" when given config with "short-option-groups" false ([#179](https://www.github.com/yargs/yargs-parser/issues/179)) ([6055974](https://www.github.com/yargs/yargs-parser/commit/6055974)) + +## [13.1.0](https://github.com/yargs/yargs-parser/compare/v13.0.0...v13.1.0) (2019-05-05) + + +### Features + +* add `strip-aliased` and `strip-dashed` configuration options. ([#172](https://github.com/yargs/yargs-parser/issues/172)) ([a3936aa](https://github.com/yargs/yargs-parser/commit/a3936aa)) +* support boolean which do not consume next argument. ([#171](https://github.com/yargs/yargs-parser/issues/171)) ([0ae7fcb](https://github.com/yargs/yargs-parser/commit/0ae7fcb)) + + + + +# [13.0.0](https://github.com/yargs/yargs-parser/compare/v12.0.0...v13.0.0) (2019-02-02) + + +### Features + +* don't coerce number from string with leading '0' or '+' ([#158](https://github.com/yargs/yargs-parser/issues/158)) ([18d0fd5](https://github.com/yargs/yargs-parser/commit/18d0fd5)) + + +### BREAKING CHANGES + +* options with leading '+' or '0' now parse as strings + + + + +# [12.0.0](https://github.com/yargs/yargs-parser/compare/v11.1.1...v12.0.0) (2019-01-29) + + +### Bug Fixes + +* better handling of quoted strings ([#153](https://github.com/yargs/yargs-parser/issues/153)) ([2fb71b2](https://github.com/yargs/yargs-parser/commit/2fb71b2)) + + +### Features + +* default value is now used if no right-hand value provided for numbers/strings ([#156](https://github.com/yargs/yargs-parser/issues/156)) ([5a7c46a](https://github.com/yargs/yargs-parser/commit/5a7c46a)) + + +### BREAKING CHANGES + +* a flag with no right-hand value no longer populates defaulted options with `undefined`. +* quotes at beginning and endings of strings are not removed during parsing. + + + + +## [11.1.1](https://github.com/yargs/yargs-parser/compare/v11.1.0...v11.1.1) (2018-11-19) + + +### Bug Fixes + +* ensure empty string is added into argv._ ([#140](https://github.com/yargs/yargs-parser/issues/140)) ([79cda98](https://github.com/yargs/yargs-parser/commit/79cda98)) + + +### Reverts + +* make requiresArg work in conjunction with arrays ([#136](https://github.com/yargs/yargs-parser/issues/136)) ([f4a3063](https://github.com/yargs/yargs-parser/commit/f4a3063)) + + + + +# [11.1.0](https://github.com/yargs/yargs-parser/compare/v11.0.0...v11.1.0) (2018-11-10) + + +### Bug Fixes + +* handling of one char alias ([#139](https://github.com/yargs/yargs-parser/issues/139)) ([ee56e31](https://github.com/yargs/yargs-parser/commit/ee56e31)) + + +### Features + +* add halt-at-non-option configuration option ([#130](https://github.com/yargs/yargs-parser/issues/130)) ([a849fce](https://github.com/yargs/yargs-parser/commit/a849fce)) + + + + +# [11.0.0](https://github.com/yargs/yargs-parser/compare/v10.1.0...v11.0.0) (2018-10-06) + + +### Bug Fixes + +* flatten-duplicate-arrays:false for more than 2 arrays ([#128](https://github.com/yargs/yargs-parser/issues/128)) ([2bc395f](https://github.com/yargs/yargs-parser/commit/2bc395f)) +* hyphenated flags combined with dot notation broke parsing ([#131](https://github.com/yargs/yargs-parser/issues/131)) ([dc788da](https://github.com/yargs/yargs-parser/commit/dc788da)) +* make requiresArg work in conjunction with arrays ([#136](https://github.com/yargs/yargs-parser/issues/136)) ([77ae1d4](https://github.com/yargs/yargs-parser/commit/77ae1d4)) + + +### Chores + +* update dependencies ([6dc42a1](https://github.com/yargs/yargs-parser/commit/6dc42a1)) + + +### Features + +* also add camelCase array options ([#125](https://github.com/yargs/yargs-parser/issues/125)) ([08c0117](https://github.com/yargs/yargs-parser/commit/08c0117)) +* array.type can now be provided, supporting coercion ([#132](https://github.com/yargs/yargs-parser/issues/132)) ([4b8cfce](https://github.com/yargs/yargs-parser/commit/4b8cfce)) + + +### BREAKING CHANGES + +* drops Node 4 support +* the argv object is now populated differently (correctly) when hyphens and dot notation are used in conjunction. + + + + +# [10.1.0](https://github.com/yargs/yargs-parser/compare/v10.0.0...v10.1.0) (2018-06-29) + + +### Features + +* add `set-placeholder-key` configuration ([#123](https://github.com/yargs/yargs-parser/issues/123)) ([19386ee](https://github.com/yargs/yargs-parser/commit/19386ee)) + + + + +# [10.0.0](https://github.com/yargs/yargs-parser/compare/v9.0.2...v10.0.0) (2018-04-04) + + +### Bug Fixes + +* do not set boolean flags if not defined in `argv` ([#119](https://github.com/yargs/yargs-parser/issues/119)) ([f6e6599](https://github.com/yargs/yargs-parser/commit/f6e6599)) + + +### BREAKING CHANGES + +* `boolean` flags defined without a `default` value will now behave like other option type and won't be set in the parsed results when the user doesn't set the corresponding CLI arg. + +Previous behavior: +```js +var parse = require('yargs-parser'); + +parse('--flag', {boolean: ['flag']}); +// => { _: [], flag: true } + +parse('--no-flag', {boolean: ['flag']}); +// => { _: [], flag: false } + +parse('', {boolean: ['flag']}); +// => { _: [], flag: false } +``` + +New behavior: +```js +var parse = require('yargs-parser'); + +parse('--flag', {boolean: ['flag']}); +// => { _: [], flag: true } + +parse('--no-flag', {boolean: ['flag']}); +// => { _: [], flag: false } + +parse('', {boolean: ['flag']}); +// => { _: [] } => flag not set similarly to other option type +``` + + + + +## [9.0.2](https://github.com/yargs/yargs-parser/compare/v9.0.1...v9.0.2) (2018-01-20) + + +### Bug Fixes + +* nargs was still aggressively consuming too many arguments ([9b28aad](https://github.com/yargs/yargs-parser/commit/9b28aad)) + + + + +## [9.0.1](https://github.com/yargs/yargs-parser/compare/v9.0.0...v9.0.1) (2018-01-20) + + +### Bug Fixes + +* nargs was consuming too many arguments ([4fef206](https://github.com/yargs/yargs-parser/commit/4fef206)) + + + + +# [9.0.0](https://github.com/yargs/yargs-parser/compare/v8.1.0...v9.0.0) (2018-01-20) + + +### Features + +* narg arguments no longer consume flag arguments ([#114](https://github.com/yargs/yargs-parser/issues/114)) ([60bb9b3](https://github.com/yargs/yargs-parser/commit/60bb9b3)) + + +### BREAKING CHANGES + +* arguments of form --foo, -abc, will no longer be consumed by nargs + + + + +# [8.1.0](https://github.com/yargs/yargs-parser/compare/v8.0.0...v8.1.0) (2017-12-20) + + +### Bug Fixes + +* allow null config values ([#108](https://github.com/yargs/yargs-parser/issues/108)) ([d8b14f9](https://github.com/yargs/yargs-parser/commit/d8b14f9)) +* ensure consistent parsing of dot-notation arguments ([#102](https://github.com/yargs/yargs-parser/issues/102)) ([c9bd79c](https://github.com/yargs/yargs-parser/commit/c9bd79c)) +* implement [@antoniom](https://github.com/antoniom)'s fix for camel-case expansion ([3087e1d](https://github.com/yargs/yargs-parser/commit/3087e1d)) +* only run coercion functions once, despite aliases. ([#76](https://github.com/yargs/yargs-parser/issues/76)) ([#103](https://github.com/yargs/yargs-parser/issues/103)) ([507aaef](https://github.com/yargs/yargs-parser/commit/507aaef)) +* scientific notation circumvented bounds check ([#110](https://github.com/yargs/yargs-parser/issues/110)) ([3571f57](https://github.com/yargs/yargs-parser/commit/3571f57)) +* tokenizer should ignore spaces at the beginning of the argString ([#106](https://github.com/yargs/yargs-parser/issues/106)) ([f34ead9](https://github.com/yargs/yargs-parser/commit/f34ead9)) + + +### Features + +* make combining arrays a configurable option ([#111](https://github.com/yargs/yargs-parser/issues/111)) ([c8bf536](https://github.com/yargs/yargs-parser/commit/c8bf536)) +* merge array from arguments with array from config ([#83](https://github.com/yargs/yargs-parser/issues/83)) ([806ddd6](https://github.com/yargs/yargs-parser/commit/806ddd6)) + + + + +# [8.0.0](https://github.com/yargs/yargs-parser/compare/v7.0.0...v8.0.0) (2017-10-05) + + +### Bug Fixes + +* Ignore multiple spaces between arguments. ([#100](https://github.com/yargs/yargs-parser/issues/100)) ([d137227](https://github.com/yargs/yargs-parser/commit/d137227)) + + +### Features + +* allow configuration of prefix for boolean negation ([#94](https://github.com/yargs/yargs-parser/issues/94)) ([00bde7d](https://github.com/yargs/yargs-parser/commit/00bde7d)) +* reworking how numbers are parsed ([#104](https://github.com/yargs/yargs-parser/issues/104)) ([fba00eb](https://github.com/yargs/yargs-parser/commit/fba00eb)) + + +### BREAKING CHANGES + +* strings that fail `Number.isSafeInteger()` are no longer coerced into numbers. + + + + +# [7.0.0](https://github.com/yargs/yargs-parser/compare/v6.0.1...v7.0.0) (2017-05-02) + + +### Chores + +* revert populate-- logic ([#91](https://github.com/yargs/yargs-parser/issues/91)) ([6003e6d](https://github.com/yargs/yargs-parser/commit/6003e6d)) + + +### BREAKING CHANGES + +* populate-- now defaults to false. + + + + +## [6.0.1](https://github.com/yargs/yargs-parser/compare/v6.0.0...v6.0.1) (2017-05-01) + + +### Bug Fixes + +* default '--' to undefined when not provided; this is closer to the array API ([#90](https://github.com/yargs/yargs-parser/issues/90)) ([4e739cc](https://github.com/yargs/yargs-parser/commit/4e739cc)) + + + + +# [6.0.0](https://github.com/yargs/yargs-parser/compare/v4.2.1...v6.0.0) (2017-05-01) + + +### Bug Fixes + +* environment variables should take precedence over config file ([#81](https://github.com/yargs/yargs-parser/issues/81)) ([76cee1f](https://github.com/yargs/yargs-parser/commit/76cee1f)) +* parsing hints should apply for dot notation keys ([#86](https://github.com/yargs/yargs-parser/issues/86)) ([3e47d62](https://github.com/yargs/yargs-parser/commit/3e47d62)) + + +### Chores + +* upgrade to newest version of camelcase ([#87](https://github.com/yargs/yargs-parser/issues/87)) ([f1903aa](https://github.com/yargs/yargs-parser/commit/f1903aa)) + + +### Features + +* add -- option which allows arguments after the -- flag to be returned separated from positional arguments ([#84](https://github.com/yargs/yargs-parser/issues/84)) ([2572ca8](https://github.com/yargs/yargs-parser/commit/2572ca8)) +* when parsing stops, we now populate "--" by default ([#88](https://github.com/yargs/yargs-parser/issues/88)) ([cd666db](https://github.com/yargs/yargs-parser/commit/cd666db)) + + +### BREAKING CHANGES + +* rather than placing arguments in "_", when parsing is stopped via "--"; we now populate an array called "--" by default. +* camelcase now requires Node 4+. +* environment variables will now override config files (args, env, config-file, config-object) + + + + +# [5.0.0](https://github.com/yargs/yargs-parser/compare/v4.2.1...v5.0.0) (2017-02-18) + + +### Bug Fixes + +* environment variables should take precedence over config file ([#81](https://github.com/yargs/yargs-parser/issues/81)) ([76cee1f](https://github.com/yargs/yargs-parser/commit/76cee1f)) + + +### BREAKING CHANGES + +* environment variables will now override config files (args, env, config-file, config-object) + + + + +## [4.2.1](https://github.com/yargs/yargs-parser/compare/v4.2.0...v4.2.1) (2017-01-02) + + +### Bug Fixes + +* flatten/duplicate regression ([#75](https://github.com/yargs/yargs-parser/issues/75)) ([68d68a0](https://github.com/yargs/yargs-parser/commit/68d68a0)) + + + + +# [4.2.0](https://github.com/yargs/yargs-parser/compare/v4.1.0...v4.2.0) (2016-12-01) + + +### Bug Fixes + +* inner objects in configs had their keys appended to top-level key when dot-notation was disabled ([#72](https://github.com/yargs/yargs-parser/issues/72)) ([0b1b5f9](https://github.com/yargs/yargs-parser/commit/0b1b5f9)) + + +### Features + +* allow multiple arrays to be provided, rather than always combining ([#71](https://github.com/yargs/yargs-parser/issues/71)) ([0f0fb2d](https://github.com/yargs/yargs-parser/commit/0f0fb2d)) + + + + +# [4.1.0](https://github.com/yargs/yargs-parser/compare/v4.0.2...v4.1.0) (2016-11-07) + + +### Features + +* apply coercions to default options ([#65](https://github.com/yargs/yargs-parser/issues/65)) ([c79052b](https://github.com/yargs/yargs-parser/commit/c79052b)) +* handle dot notation boolean options ([#63](https://github.com/yargs/yargs-parser/issues/63)) ([02c3545](https://github.com/yargs/yargs-parser/commit/02c3545)) + + + + +## [4.0.2](https://github.com/yargs/yargs-parser/compare/v4.0.1...v4.0.2) (2016-09-30) + + +### Bug Fixes + +* whoops, let's make the assign not change the Object key order ([29d069a](https://github.com/yargs/yargs-parser/commit/29d069a)) + + + + +## [4.0.1](https://github.com/yargs/yargs-parser/compare/v4.0.0...v4.0.1) (2016-09-30) + + +### Bug Fixes + +* lodash.assign was deprecated ([#59](https://github.com/yargs/yargs-parser/issues/59)) ([5e7eb11](https://github.com/yargs/yargs-parser/commit/5e7eb11)) + + + + +# [4.0.0](https://github.com/yargs/yargs-parser/compare/v3.2.0...v4.0.0) (2016-09-26) + + +### Bug Fixes + +* coerce should be applied to the final objects and arrays created ([#57](https://github.com/yargs/yargs-parser/issues/57)) ([4ca69da](https://github.com/yargs/yargs-parser/commit/4ca69da)) + + +### BREAKING CHANGES + +* coerce is no longer applied to individual arguments in an implicit array. + + + + +# [3.2.0](https://github.com/yargs/yargs-parser/compare/v3.1.0...v3.2.0) (2016-08-13) + + +### Features + +* coerce full array instead of each element ([#51](https://github.com/yargs/yargs-parser/issues/51)) ([cc4dc56](https://github.com/yargs/yargs-parser/commit/cc4dc56)) + + + + +# [3.1.0](https://github.com/yargs/yargs-parser/compare/v3.0.0...v3.1.0) (2016-08-09) + + +### Bug Fixes + +* address pkgConf parsing bug outlined in [#37](https://github.com/yargs/yargs-parser/issues/37) ([#45](https://github.com/yargs/yargs-parser/issues/45)) ([be76ee6](https://github.com/yargs/yargs-parser/commit/be76ee6)) +* better parsing of negative values ([#44](https://github.com/yargs/yargs-parser/issues/44)) ([2e43692](https://github.com/yargs/yargs-parser/commit/2e43692)) +* check aliases when guessing defaults for arguments fixes [#41](https://github.com/yargs/yargs-parser/issues/41) ([#43](https://github.com/yargs/yargs-parser/issues/43)) ([f3e4616](https://github.com/yargs/yargs-parser/commit/f3e4616)) + + +### Features + +* added coerce option, for providing specialized argument parsing ([#42](https://github.com/yargs/yargs-parser/issues/42)) ([7b49cd2](https://github.com/yargs/yargs-parser/commit/7b49cd2)) + + + + +# [3.0.0](https://github.com/yargs/yargs-parser/compare/v2.4.1...v3.0.0) (2016-08-07) + + +### Bug Fixes + +* parsing issue with numeric character in group of options ([#19](https://github.com/yargs/yargs-parser/issues/19)) ([f743236](https://github.com/yargs/yargs-parser/commit/f743236)) +* upgraded lodash.assign ([5d7fdf4](https://github.com/yargs/yargs-parser/commit/5d7fdf4)) + +### BREAKING CHANGES + +* subtle change to how values are parsed in a group of single-character arguments. +* _first released in 3.1.0, better handling of negative values should be considered a breaking change._ + + + + +## [2.4.1](https://github.com/yargs/yargs-parser/compare/v2.4.0...v2.4.1) (2016-07-16) + + +### Bug Fixes + +* **count:** do not increment a default value ([#39](https://github.com/yargs/yargs-parser/issues/39)) ([b04a189](https://github.com/yargs/yargs-parser/commit/b04a189)) + + + + +# [2.4.0](https://github.com/yargs/yargs-parser/compare/v2.3.0...v2.4.0) (2016-04-11) + + +### Features + +* **environment:** Support nested options in environment variables ([#26](https://github.com/yargs/yargs-parser/issues/26)) thanks [@elas7](https://github.com/elas7) \o/ ([020778b](https://github.com/yargs/yargs-parser/commit/020778b)) + + + + +# [2.3.0](https://github.com/yargs/yargs-parser/compare/v2.2.0...v2.3.0) (2016-04-09) + + +### Bug Fixes + +* **boolean:** fix for boolean options with non boolean defaults (#20) ([2dbe86b](https://github.com/yargs/yargs-parser/commit/2dbe86b)), closes [(#20](https://github.com/(/issues/20) +* **package:** remove tests from tarball ([0353c0d](https://github.com/yargs/yargs-parser/commit/0353c0d)) +* **parsing:** handle calling short option with an empty string as the next value. ([a867165](https://github.com/yargs/yargs-parser/commit/a867165)) +* boolean flag when next value contains the strings 'true' or 'false'. ([69941a6](https://github.com/yargs/yargs-parser/commit/69941a6)) +* update dependencies; add standard-version bin for next release (#24) ([822d9d5](https://github.com/yargs/yargs-parser/commit/822d9d5)) + +### Features + +* **configuration:** Allow to pass configuration objects to yargs-parser ([0780900](https://github.com/yargs/yargs-parser/commit/0780900)) +* **normalize:** allow normalize to work with arrays ([e0eaa1a](https://github.com/yargs/yargs-parser/commit/e0eaa1a)) diff --git a/node_modules/sass-graph/node_modules/yargs-parser/LICENSE.txt b/node_modules/sass-graph/node_modules/yargs-parser/LICENSE.txt new file mode 100644 index 00000000..836440be --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs-parser/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (c) 2016, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/yargs-parser/README.md b/node_modules/sass-graph/node_modules/yargs-parser/README.md new file mode 100644 index 00000000..dde9f84d --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs-parser/README.md @@ -0,0 +1,396 @@ +# yargs-parser + +[![Build Status](https://travis-ci.org/yargs/yargs-parser.svg)](https://travis-ci.org/yargs/yargs-parser) +[![Coverage Status](https://coveralls.io/repos/yargs/yargs-parser/badge.svg?branch=)](https://coveralls.io/r/yargs/yargs-parser?branch=master) +[![NPM version](https://img.shields.io/npm/v/yargs-parser.svg)](https://www.npmjs.com/package/yargs-parser) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + + +The mighty option parser used by [yargs](https://github.com/yargs/yargs). + +visit the [yargs website](http://yargs.js.org/) for more examples, and thorough usage instructions. + + + +## Example + +```sh +npm i yargs-parser --save +``` + +```js +var argv = require('yargs-parser')(process.argv.slice(2)) +console.log(argv) +``` + +```sh +node example.js --foo=33 --bar hello +{ _: [], foo: 33, bar: 'hello' } +``` + +_or parse a string!_ + +```js +var argv = require('./')('--foo=99 --bar=33') +console.log(argv) +``` + +```sh +{ _: [], foo: 99, bar: 33 } +``` + +Convert an array of mixed types before passing to `yargs-parser`: + +```js +var parse = require('yargs-parser') +parse(['-f', 11, '--zoom', 55].join(' ')) // <-- array to string +parse(['-f', 11, '--zoom', 55].map(String)) // <-- array of strings +``` + +## API + +### require('yargs-parser')(args, opts={}) + +Parses command line arguments returning a simple mapping of keys and values. + +**expects:** + +* `args`: a string or array of strings representing the options to parse. +* `opts`: provide a set of hints indicating how `args` should be parsed: + * `opts.alias`: an object representing the set of aliases for a key: `{alias: {foo: ['f']}}`. + * `opts.array`: indicate that keys should be parsed as an array: `{array: ['foo', 'bar']}`.
      + Indicate that keys should be parsed as an array and coerced to booleans / numbers:
      + `{array: [{ key: 'foo', boolean: true }, {key: 'bar', number: true}]}`. + * `opts.boolean`: arguments should be parsed as booleans: `{boolean: ['x', 'y']}`. + * `opts.coerce`: provide a custom synchronous function that returns a coerced value from the argument provided + (or throws an error). For arrays the function is called only once for the entire array:
      + `{coerce: {foo: function (arg) {return modifiedArg}}}`. + * `opts.config`: indicate a key that represents a path to a configuration file (this file will be loaded and parsed). + * `opts.configObjects`: configuration objects to parse, their properties will be set as arguments:
      + `{configObjects: [{'x': 5, 'y': 33}, {'z': 44}]}`. + * `opts.configuration`: provide configuration options to the yargs-parser (see: [configuration](#configuration)). + * `opts.count`: indicate a key that should be used as a counter, e.g., `-vvv` = `{v: 3}`. + * `opts.default`: provide default values for keys: `{default: {x: 33, y: 'hello world!'}}`. + * `opts.envPrefix`: environment variables (`process.env`) with the prefix provided should be parsed. + * `opts.narg`: specify that a key requires `n` arguments: `{narg: {x: 2}}`. + * `opts.normalize`: `path.normalize()` will be applied to values set to this key. + * `opts.number`: keys should be treated as numbers. + * `opts.string`: keys should be treated as strings (even if they resemble a number `-x 33`). + +**returns:** + +* `obj`: an object representing the parsed value of `args` + * `key/value`: key value pairs for each argument and their aliases. + * `_`: an array representing the positional arguments. + * [optional] `--`: an array with arguments after the end-of-options flag `--`. + +### require('yargs-parser').detailed(args, opts={}) + +Parses a command line string, returning detailed information required by the +yargs engine. + +**expects:** + +* `args`: a string or array of strings representing options to parse. +* `opts`: provide a set of hints indicating how `args`, inputs are identical to `require('yargs-parser')(args, opts={})`. + +**returns:** + +* `argv`: an object representing the parsed value of `args` + * `key/value`: key value pairs for each argument and their aliases. + * `_`: an array representing the positional arguments. +* `error`: populated with an error object if an exception occurred during parsing. +* `aliases`: the inferred list of aliases built by combining lists in `opts.alias`. +* `newAliases`: any new aliases added via camel-case expansion. +* `configuration`: the configuration loaded from the `yargs` stanza in package.json. + + + +### Configuration + +The yargs-parser applies several automated transformations on the keys provided +in `args`. These features can be turned on and off using the `configuration` field +of `opts`. + +```js +var parsed = parser(['--no-dice'], { + configuration: { + 'boolean-negation': false + } +}) +``` + +### short option groups + +* default: `true`. +* key: `short-option-groups`. + +Should a group of short-options be treated as boolean flags? + +```sh +node example.js -abc +{ _: [], a: true, b: true, c: true } +``` + +_if disabled:_ + +```sh +node example.js -abc +{ _: [], abc: true } +``` + +### camel-case expansion + +* default: `true`. +* key: `camel-case-expansion`. + +Should hyphenated arguments be expanded into camel-case aliases? + +```sh +node example.js --foo-bar +{ _: [], 'foo-bar': true, fooBar: true } +``` + +_if disabled:_ + +```sh +node example.js --foo-bar +{ _: [], 'foo-bar': true } +``` + +### dot-notation + +* default: `true` +* key: `dot-notation` + +Should keys that contain `.` be treated as objects? + +```sh +node example.js --foo.bar +{ _: [], foo: { bar: true } } +``` + +_if disabled:_ + +```sh +node example.js --foo.bar +{ _: [], "foo.bar": true } +``` + +### parse numbers + +* default: `true` +* key: `parse-numbers` + +Should keys that look like numbers be treated as such? + +```sh +node example.js --foo=99.3 +{ _: [], foo: 99.3 } +``` + +_if disabled:_ + +```sh +node example.js --foo=99.3 +{ _: [], foo: "99.3" } +``` + +### boolean negation + +* default: `true` +* key: `boolean-negation` + +Should variables prefixed with `--no` be treated as negations? + +```sh +node example.js --no-foo +{ _: [], foo: false } +``` + +_if disabled:_ + +```sh +node example.js --no-foo +{ _: [], "no-foo": true } +``` + +### combine arrays + +* default: `false` +* key: `combine-arrays` + +Should arrays be combined when provided by both command line arguments and +a configuration file. + +### duplicate arguments array + +* default: `true` +* key: `duplicate-arguments-array` + +Should arguments be coerced into an array when duplicated: + +```sh +node example.js -x 1 -x 2 +{ _: [], x: [1, 2] } +``` + +_if disabled:_ + +```sh +node example.js -x 1 -x 2 +{ _: [], x: 2 } +``` + +### flatten duplicate arrays + +* default: `true` +* key: `flatten-duplicate-arrays` + +Should array arguments be coerced into a single array when duplicated: + +```sh +node example.js -x 1 2 -x 3 4 +{ _: [], x: [1, 2, 3, 4] } +``` + +_if disabled:_ + +```sh +node example.js -x 1 2 -x 3 4 +{ _: [], x: [[1, 2], [3, 4]] } +``` + +### negation prefix + +* default: `no-` +* key: `negation-prefix` + +The prefix to use for negated boolean variables. + +```sh +node example.js --no-foo +{ _: [], foo: false } +``` + +_if set to `quux`:_ + +```sh +node example.js --quuxfoo +{ _: [], foo: false } +``` + +### populate -- + +* default: `false`. +* key: `populate--` + +Should unparsed flags be stored in `--` or `_`. + +_If disabled:_ + +```sh +node example.js a -b -- x y +{ _: [ 'a', 'x', 'y' ], b: true } +``` + +_If enabled:_ + +```sh +node example.js a -b -- x y +{ _: [ 'a' ], '--': [ 'x', 'y' ], b: true } +``` + +### set placeholder key + +* default: `false`. +* key: `set-placeholder-key`. + +Should a placeholder be added for keys not set via the corresponding CLI argument? + +_If disabled:_ + +```sh +node example.js -a 1 -c 2 +{ _: [], a: 1, c: 2 } +``` + +_If enabled:_ + +```sh +node example.js -a 1 -c 2 +{ _: [], a: 1, b: undefined, c: 2 } +``` + +### halt at non-option + +* default: `false`. +* key: `halt-at-non-option`. + +Should parsing stop at the first positional argument? This is similar to how e.g. `ssh` parses its command line. + +_If disabled:_ + +```sh +node example.js -a run b -x y +{ _: [ 'b' ], a: 'run', x: 'y' } +``` + +_If enabled:_ + +```sh +node example.js -a run b -x y +{ _: [ 'b', '-x', 'y' ], a: 'run' } +``` + +### strip aliased + +* default: `false` +* key: `strip-aliased` + +Should aliases be removed before returning results? + +_If disabled:_ + +```sh +node example.js --test-field 1 +{ _: [], 'test-field': 1, testField: 1, 'test-alias': 1, testAlias: 1 } +``` + +_If enabled:_ + +```sh +node example.js --test-field 1 +{ _: [], 'test-field': 1, testField: 1 } +``` + +### strip dashed + +* default: `false` +* key: `strip-dashed` + +Should dashed keys be removed before returning results? This option has no effect if +`camel-case-exansion` is disabled. + +_If disabled:_ + +```sh +node example.js --test-field 1 +{ _: [], 'test-field': 1, testField: 1 } +``` + +_If enabled:_ + +```sh +node example.js --test-field 1 +{ _: [], testField: 1 } +``` + +## Special Thanks + +The yargs project evolves from optimist and minimist. It owes its +existence to a lot of James Halliday's hard work. Thanks [substack](https://github.com/substack) **beep** **boop** \o/ + +## License + +ISC diff --git a/node_modules/sass-graph/node_modules/yargs-parser/index.js b/node_modules/sass-graph/node_modules/yargs-parser/index.js new file mode 100644 index 00000000..f9ee8241 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs-parser/index.js @@ -0,0 +1,916 @@ +var camelCase = require('camelcase') +var decamelize = require('decamelize') +var path = require('path') +var tokenizeArgString = require('./lib/tokenize-arg-string') +var util = require('util') + +function parse (args, opts) { + if (!opts) opts = {} + // allow a string argument to be passed in rather + // than an argv array. + args = tokenizeArgString(args) + + // aliases might have transitive relationships, normalize this. + var aliases = combineAliases(opts.alias || {}) + var configuration = Object.assign({ + 'short-option-groups': true, + 'camel-case-expansion': true, + 'dot-notation': true, + 'parse-numbers': true, + 'boolean-negation': true, + 'negation-prefix': 'no-', + 'duplicate-arguments-array': true, + 'flatten-duplicate-arrays': true, + 'populate--': false, + 'combine-arrays': false, + 'set-placeholder-key': false, + 'halt-at-non-option': false, + 'strip-aliased': false, + 'strip-dashed': false + }, opts.configuration) + var defaults = opts.default || {} + var configObjects = opts.configObjects || [] + var envPrefix = opts.envPrefix + var notFlagsOption = configuration['populate--'] + var notFlagsArgv = notFlagsOption ? '--' : '_' + var newAliases = {} + // allow a i18n handler to be passed in, default to a fake one (util.format). + var __ = opts.__ || util.format + var error = null + var flags = { + aliases: {}, + arrays: {}, + bools: {}, + strings: {}, + numbers: {}, + counts: {}, + normalize: {}, + configs: {}, + defaulted: {}, + nargs: {}, + coercions: {}, + keys: [] + } + var negative = /^-[0-9]+(\.[0-9]+)?/ + var negatedBoolean = new RegExp('^--' + configuration['negation-prefix'] + '(.+)') + + ;[].concat(opts.array).filter(Boolean).forEach(function (opt) { + var key = opt.key || opt + + // assign to flags[bools|strings|numbers] + const assignment = Object.keys(opt).map(function (key) { + return ({ + boolean: 'bools', + string: 'strings', + number: 'numbers' + })[key] + }).filter(Boolean).pop() + + // assign key to be coerced + if (assignment) { + flags[assignment][key] = true + } + + flags.arrays[key] = true + flags.keys.push(key) + }) + + ;[].concat(opts.boolean).filter(Boolean).forEach(function (key) { + flags.bools[key] = true + flags.keys.push(key) + }) + + ;[].concat(opts.string).filter(Boolean).forEach(function (key) { + flags.strings[key] = true + flags.keys.push(key) + }) + + ;[].concat(opts.number).filter(Boolean).forEach(function (key) { + flags.numbers[key] = true + flags.keys.push(key) + }) + + ;[].concat(opts.count).filter(Boolean).forEach(function (key) { + flags.counts[key] = true + flags.keys.push(key) + }) + + ;[].concat(opts.normalize).filter(Boolean).forEach(function (key) { + flags.normalize[key] = true + flags.keys.push(key) + }) + + Object.keys(opts.narg || {}).forEach(function (k) { + flags.nargs[k] = opts.narg[k] + flags.keys.push(k) + }) + + Object.keys(opts.coerce || {}).forEach(function (k) { + flags.coercions[k] = opts.coerce[k] + flags.keys.push(k) + }) + + if (Array.isArray(opts.config) || typeof opts.config === 'string') { + ;[].concat(opts.config).filter(Boolean).forEach(function (key) { + flags.configs[key] = true + }) + } else { + Object.keys(opts.config || {}).forEach(function (k) { + flags.configs[k] = opts.config[k] + }) + } + + // create a lookup table that takes into account all + // combinations of aliases: {f: ['foo'], foo: ['f']} + extendAliases(opts.key, aliases, opts.default, flags.arrays) + + // apply default values to all aliases. + Object.keys(defaults).forEach(function (key) { + (flags.aliases[key] || []).forEach(function (alias) { + defaults[alias] = defaults[key] + }) + }) + + var argv = { _: [] } + + Object.keys(flags.bools).forEach(function (key) { + if (Object.prototype.hasOwnProperty.call(defaults, key)) { + setArg(key, defaults[key]) + setDefaulted(key) + } + }) + + var notFlags = [] + + for (var i = 0; i < args.length; i++) { + var arg = args[i] + var broken + var key + var letters + var m + var next + var value + + // -- separated by = + if (arg.match(/^--.+=/) || ( + !configuration['short-option-groups'] && arg.match(/^-.+=/) + )) { + // Using [\s\S] instead of . because js doesn't support the + // 'dotall' regex modifier. See: + // http://stackoverflow.com/a/1068308/13216 + m = arg.match(/^--?([^=]+)=([\s\S]*)$/) + + // nargs format = '--f=monkey washing cat' + if (checkAllAliases(m[1], flags.nargs)) { + args.splice(i + 1, 0, m[2]) + i = eatNargs(i, m[1], args) + // arrays format = '--f=a b c' + } else if (checkAllAliases(m[1], flags.arrays) && args.length > i + 1) { + args.splice(i + 1, 0, m[2]) + i = eatArray(i, m[1], args) + } else { + setArg(m[1], m[2]) + } + } else if (arg.match(negatedBoolean) && configuration['boolean-negation']) { + key = arg.match(negatedBoolean)[1] + setArg(key, false) + + // -- seperated by space. + } else if (arg.match(/^--.+/) || ( + !configuration['short-option-groups'] && arg.match(/^-[^-]+/) + )) { + key = arg.match(/^--?(.+)/)[1] + + // nargs format = '--foo a b c' + if (checkAllAliases(key, flags.nargs)) { + i = eatNargs(i, key, args) + // array format = '--foo a b c' + } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) { + i = eatArray(i, key, args) + } else { + next = flags.nargs[key] === 0 ? undefined : args[i + 1] + + if (next !== undefined && (!next.match(/^-/) || + next.match(negative)) && + !checkAllAliases(key, flags.bools) && + !checkAllAliases(key, flags.counts)) { + setArg(key, next) + i++ + } else if (/^(true|false)$/.test(next)) { + setArg(key, next) + i++ + } else { + setArg(key, defaultValue(key)) + } + } + + // dot-notation flag seperated by '='. + } else if (arg.match(/^-.\..+=/)) { + m = arg.match(/^-([^=]+)=([\s\S]*)$/) + setArg(m[1], m[2]) + + // dot-notation flag seperated by space. + } else if (arg.match(/^-.\..+/)) { + next = args[i + 1] + key = arg.match(/^-(.\..+)/)[1] + + if (next !== undefined && !next.match(/^-/) && + !checkAllAliases(key, flags.bools) && + !checkAllAliases(key, flags.counts)) { + setArg(key, next) + i++ + } else { + setArg(key, defaultValue(key)) + } + } else if (arg.match(/^-[^-]+/) && !arg.match(negative)) { + letters = arg.slice(1, -1).split('') + broken = false + + for (var j = 0; j < letters.length; j++) { + next = arg.slice(j + 2) + + if (letters[j + 1] && letters[j + 1] === '=') { + value = arg.slice(j + 3) + key = letters[j] + + // nargs format = '-f=monkey washing cat' + if (checkAllAliases(key, flags.nargs)) { + args.splice(i + 1, 0, value) + i = eatNargs(i, key, args) + // array format = '-f=a b c' + } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) { + args.splice(i + 1, 0, value) + i = eatArray(i, key, args) + } else { + setArg(key, value) + } + + broken = true + break + } + + if (next === '-') { + setArg(letters[j], next) + continue + } + + // current letter is an alphabetic character and next value is a number + if (/[A-Za-z]/.test(letters[j]) && + /^-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { + setArg(letters[j], next) + broken = true + break + } + + if (letters[j + 1] && letters[j + 1].match(/\W/)) { + setArg(letters[j], next) + broken = true + break + } else { + setArg(letters[j], defaultValue(letters[j])) + } + } + + key = arg.slice(-1)[0] + + if (!broken && key !== '-') { + // nargs format = '-f a b c' + if (checkAllAliases(key, flags.nargs)) { + i = eatNargs(i, key, args) + // array format = '-f a b c' + } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) { + i = eatArray(i, key, args) + } else { + next = args[i + 1] + + if (next !== undefined && (!/^(-|--)[^-]/.test(next) || + next.match(negative)) && + !checkAllAliases(key, flags.bools) && + !checkAllAliases(key, flags.counts)) { + setArg(key, next) + i++ + } else if (/^(true|false)$/.test(next)) { + setArg(key, next) + i++ + } else { + setArg(key, defaultValue(key)) + } + } + } + } else if (arg === '--') { + notFlags = args.slice(i + 1) + break + } else if (configuration['halt-at-non-option']) { + notFlags = args.slice(i) + break + } else { + argv._.push(maybeCoerceNumber('_', arg)) + } + } + + // order of precedence: + // 1. command line arg + // 2. value from env var + // 3. value from config file + // 4. value from config objects + // 5. configured default value + applyEnvVars(argv, true) // special case: check env vars that point to config file + applyEnvVars(argv, false) + setConfig(argv) + setConfigObjects() + applyDefaultsAndAliases(argv, flags.aliases, defaults) + applyCoercions(argv) + if (configuration['set-placeholder-key']) setPlaceholderKeys(argv) + + // for any counts either not in args or without an explicit default, set to 0 + Object.keys(flags.counts).forEach(function (key) { + if (!hasKey(argv, key.split('.'))) setArg(key, 0) + }) + + // '--' defaults to undefined. + if (notFlagsOption && notFlags.length) argv[notFlagsArgv] = [] + notFlags.forEach(function (key) { + argv[notFlagsArgv].push(key) + }) + + if (configuration['camel-case-expansion'] && configuration['strip-dashed']) { + Object.keys(argv).filter(key => key !== '--' && key.includes('-')).forEach(key => { + delete argv[key] + }) + } + + if (configuration['strip-aliased']) { + // XXX Switch to [].concat(...Object.values(aliases)) once node.js 6 is dropped + ;[].concat(...Object.keys(aliases).map(k => aliases[k])).forEach(alias => { + if (configuration['camel-case-expansion']) { + delete argv[alias.split('.').map(prop => camelCase(prop)).join('.')] + } + + delete argv[alias] + }) + } + + // how many arguments should we consume, based + // on the nargs option? + function eatNargs (i, key, args) { + var ii + const toEat = checkAllAliases(key, flags.nargs) + + // nargs will not consume flag arguments, e.g., -abc, --foo, + // and terminates when one is observed. + var available = 0 + for (ii = i + 1; ii < args.length; ii++) { + if (!args[ii].match(/^-[^0-9]/)) available++ + else break + } + + if (available < toEat) error = Error(__('Not enough arguments following: %s', key)) + + const consumed = Math.min(available, toEat) + for (ii = i + 1; ii < (consumed + i + 1); ii++) { + setArg(key, args[ii]) + } + + return (i + consumed) + } + + // if an option is an array, eat all non-hyphenated arguments + // following it... YUM! + // e.g., --foo apple banana cat becomes ["apple", "banana", "cat"] + function eatArray (i, key, args) { + var start = i + 1 + var argsToSet = [] + var multipleArrayFlag = i > 0 + for (var ii = i + 1; ii < args.length; ii++) { + if (/^-/.test(args[ii]) && !negative.test(args[ii])) { + if (ii === start) { + setArg(key, defaultForType('array')) + } + multipleArrayFlag = true + break + } + i = ii + argsToSet.push(args[ii]) + } + if (multipleArrayFlag) { + setArg(key, argsToSet.map(function (arg) { + return processValue(key, arg) + })) + } else { + argsToSet.forEach(function (arg) { + setArg(key, arg) + }) + } + + return i + } + + function setArg (key, val) { + unsetDefaulted(key) + + if (/-/.test(key) && configuration['camel-case-expansion']) { + var alias = key.split('.').map(function (prop) { + return camelCase(prop) + }).join('.') + addNewAlias(key, alias) + } + + var value = processValue(key, val) + + var splitKey = key.split('.') + setKey(argv, splitKey, value) + + // handle populating aliases of the full key + if (flags.aliases[key] && flags.aliases[key].forEach) { + flags.aliases[key].forEach(function (x) { + x = x.split('.') + setKey(argv, x, value) + }) + } + + // handle populating aliases of the first element of the dot-notation key + if (splitKey.length > 1 && configuration['dot-notation']) { + ;(flags.aliases[splitKey[0]] || []).forEach(function (x) { + x = x.split('.') + + // expand alias with nested objects in key + var a = [].concat(splitKey) + a.shift() // nuke the old key. + x = x.concat(a) + + setKey(argv, x, value) + }) + } + + // Set normalize getter and setter when key is in 'normalize' but isn't an array + if (checkAllAliases(key, flags.normalize) && !checkAllAliases(key, flags.arrays)) { + var keys = [key].concat(flags.aliases[key] || []) + keys.forEach(function (key) { + argv.__defineSetter__(key, function (v) { + val = path.normalize(v) + }) + + argv.__defineGetter__(key, function () { + return typeof val === 'string' ? path.normalize(val) : val + }) + }) + } + } + + function addNewAlias (key, alias) { + if (!(flags.aliases[key] && flags.aliases[key].length)) { + flags.aliases[key] = [alias] + newAliases[alias] = true + } + if (!(flags.aliases[alias] && flags.aliases[alias].length)) { + addNewAlias(alias, key) + } + } + + function processValue (key, val) { + // strings may be quoted, clean this up as we assign values. + if (typeof val === 'string' && + (val[0] === "'" || val[0] === '"') && + val[val.length - 1] === val[0] + ) { + val = val.substring(1, val.length - 1) + } + + // handle parsing boolean arguments --foo=true --bar false. + if (checkAllAliases(key, flags.bools) || checkAllAliases(key, flags.counts)) { + if (typeof val === 'string') val = val === 'true' + } + + var value = maybeCoerceNumber(key, val) + + // increment a count given as arg (either no value or value parsed as boolean) + if (checkAllAliases(key, flags.counts) && (isUndefined(value) || typeof value === 'boolean')) { + value = increment + } + + // Set normalized value when key is in 'normalize' and in 'arrays' + if (checkAllAliases(key, flags.normalize) && checkAllAliases(key, flags.arrays)) { + if (Array.isArray(val)) value = val.map(path.normalize) + else value = path.normalize(val) + } + return value + } + + function maybeCoerceNumber (key, value) { + if (!checkAllAliases(key, flags.strings) && !checkAllAliases(key, flags.coercions)) { + const shouldCoerceNumber = isNumber(value) && configuration['parse-numbers'] && ( + Number.isSafeInteger(Math.floor(value)) + ) + if (shouldCoerceNumber || (!isUndefined(value) && checkAllAliases(key, flags.numbers))) value = Number(value) + } + return value + } + + // set args from config.json file, this should be + // applied last so that defaults can be applied. + function setConfig (argv) { + var configLookup = {} + + // expand defaults/aliases, in-case any happen to reference + // the config.json file. + applyDefaultsAndAliases(configLookup, flags.aliases, defaults) + + Object.keys(flags.configs).forEach(function (configKey) { + var configPath = argv[configKey] || configLookup[configKey] + if (configPath) { + try { + var config = null + var resolvedConfigPath = path.resolve(process.cwd(), configPath) + + if (typeof flags.configs[configKey] === 'function') { + try { + config = flags.configs[configKey](resolvedConfigPath) + } catch (e) { + config = e + } + if (config instanceof Error) { + error = config + return + } + } else { + config = require(resolvedConfigPath) + } + + setConfigObject(config) + } catch (ex) { + if (argv[configKey]) error = Error(__('Invalid JSON config file: %s', configPath)) + } + } + }) + } + + // set args from config object. + // it recursively checks nested objects. + function setConfigObject (config, prev) { + Object.keys(config).forEach(function (key) { + var value = config[key] + var fullKey = prev ? prev + '.' + key : key + + // if the value is an inner object and we have dot-notation + // enabled, treat inner objects in config the same as + // heavily nested dot notations (foo.bar.apple). + if (typeof value === 'object' && value !== null && !Array.isArray(value) && configuration['dot-notation']) { + // if the value is an object but not an array, check nested object + setConfigObject(value, fullKey) + } else { + // setting arguments via CLI takes precedence over + // values within the config file. + if (!hasKey(argv, fullKey.split('.')) || (flags.defaulted[fullKey]) || (flags.arrays[fullKey] && configuration['combine-arrays'])) { + setArg(fullKey, value) + } + } + }) + } + + // set all config objects passed in opts + function setConfigObjects () { + if (typeof configObjects === 'undefined') return + configObjects.forEach(function (configObject) { + setConfigObject(configObject) + }) + } + + function applyEnvVars (argv, configOnly) { + if (typeof envPrefix === 'undefined') return + + var prefix = typeof envPrefix === 'string' ? envPrefix : '' + Object.keys(process.env).forEach(function (envVar) { + if (prefix === '' || envVar.lastIndexOf(prefix, 0) === 0) { + // get array of nested keys and convert them to camel case + var keys = envVar.split('__').map(function (key, i) { + if (i === 0) { + key = key.substring(prefix.length) + } + return camelCase(key) + }) + + if (((configOnly && flags.configs[keys.join('.')]) || !configOnly) && (!hasKey(argv, keys) || flags.defaulted[keys.join('.')])) { + setArg(keys.join('.'), process.env[envVar]) + } + } + }) + } + + function applyCoercions (argv) { + var coerce + var applied = {} + Object.keys(argv).forEach(function (key) { + if (!applied.hasOwnProperty(key)) { // If we haven't already coerced this option via one of its aliases + coerce = checkAllAliases(key, flags.coercions) + if (typeof coerce === 'function') { + try { + var value = coerce(argv[key]) + ;([].concat(flags.aliases[key] || [], key)).forEach(ali => { + applied[ali] = argv[ali] = value + }) + } catch (err) { + error = err + } + } + } + }) + } + + function setPlaceholderKeys (argv) { + flags.keys.forEach((key) => { + // don't set placeholder keys for dot notation options 'foo.bar'. + if (~key.indexOf('.')) return + if (typeof argv[key] === 'undefined') argv[key] = undefined + }) + return argv + } + + function applyDefaultsAndAliases (obj, aliases, defaults) { + Object.keys(defaults).forEach(function (key) { + if (!hasKey(obj, key.split('.'))) { + setKey(obj, key.split('.'), defaults[key]) + + ;(aliases[key] || []).forEach(function (x) { + if (hasKey(obj, x.split('.'))) return + setKey(obj, x.split('.'), defaults[key]) + }) + } + }) + } + + function hasKey (obj, keys) { + var o = obj + + if (!configuration['dot-notation']) keys = [keys.join('.')] + + keys.slice(0, -1).forEach(function (key) { + o = (o[key] || {}) + }) + + var key = keys[keys.length - 1] + + if (typeof o !== 'object') return false + else return key in o + } + + function setKey (obj, keys, value) { + var o = obj + + if (!configuration['dot-notation']) keys = [keys.join('.')] + + keys.slice(0, -1).forEach(function (key, index) { + // TODO(bcoe): in the next major version of yargs, switch to + // Object.create(null) for dot notation: + key = sanitizeKey(key) + + if (typeof o === 'object' && o[key] === undefined) { + o[key] = {} + } + + if (typeof o[key] !== 'object' || Array.isArray(o[key])) { + // ensure that o[key] is an array, and that the last item is an empty object. + if (Array.isArray(o[key])) { + o[key].push({}) + } else { + o[key] = [o[key], {}] + } + + // we want to update the empty object at the end of the o[key] array, so set o to that object + o = o[key][o[key].length - 1] + } else { + o = o[key] + } + }) + + // TODO(bcoe): in the next major version of yargs, switch to + // Object.create(null) for dot notation: + const key = sanitizeKey(keys[keys.length - 1]) + + const isTypeArray = checkAllAliases(keys.join('.'), flags.arrays) + const isValueArray = Array.isArray(value) + let duplicate = configuration['duplicate-arguments-array'] + + // nargs has higher priority than duplicate + if (!duplicate && checkAllAliases(key, flags.nargs)) { + duplicate = true + if ((!isUndefined(o[key]) && flags.nargs[key] === 1) || (Array.isArray(o[key]) && o[key].length === flags.nargs[key])) { + o[key] = undefined + } + } + + if (value === increment) { + o[key] = increment(o[key]) + } else if (Array.isArray(o[key])) { + if (duplicate && isTypeArray && isValueArray) { + o[key] = configuration['flatten-duplicate-arrays'] ? o[key].concat(value) : (Array.isArray(o[key][0]) ? o[key] : [o[key]]).concat([value]) + } else if (!duplicate && Boolean(isTypeArray) === Boolean(isValueArray)) { + o[key] = value + } else { + o[key] = o[key].concat([value]) + } + } else if (o[key] === undefined && isTypeArray) { + o[key] = isValueArray ? value : [value] + } else if (duplicate && !(o[key] === undefined || checkAllAliases(key, flags.bools) || checkAllAliases(keys.join('.'), flags.bools) || checkAllAliases(key, flags.counts))) { + o[key] = [ o[key], value ] + } else { + o[key] = value + } + } + + // extend the aliases list with inferred aliases. + function extendAliases (...args) { + args.forEach(function (obj) { + Object.keys(obj || {}).forEach(function (key) { + // short-circuit if we've already added a key + // to the aliases array, for example it might + // exist in both 'opts.default' and 'opts.key'. + if (flags.aliases[key]) return + + flags.aliases[key] = [].concat(aliases[key] || []) + // For "--option-name", also set argv.optionName + flags.aliases[key].concat(key).forEach(function (x) { + if (/-/.test(x) && configuration['camel-case-expansion']) { + var c = camelCase(x) + if (c !== key && flags.aliases[key].indexOf(c) === -1) { + flags.aliases[key].push(c) + newAliases[c] = true + } + } + }) + // For "--optionName", also set argv['option-name'] + flags.aliases[key].concat(key).forEach(function (x) { + if (x.length > 1 && /[A-Z]/.test(x) && configuration['camel-case-expansion']) { + var c = decamelize(x, '-') + if (c !== key && flags.aliases[key].indexOf(c) === -1) { + flags.aliases[key].push(c) + newAliases[c] = true + } + } + }) + flags.aliases[key].forEach(function (x) { + flags.aliases[x] = [key].concat(flags.aliases[key].filter(function (y) { + return x !== y + })) + }) + }) + }) + } + + // check if a flag is set for any of a key's aliases. + function checkAllAliases (key, flag) { + var isSet = false + var toCheck = [].concat(flags.aliases[key] || [], key) + + toCheck.forEach(function (key) { + if (flag[key]) isSet = flag[key] + }) + + return isSet + } + + function setDefaulted (key) { + [].concat(flags.aliases[key] || [], key).forEach(function (k) { + flags.defaulted[k] = true + }) + } + + function unsetDefaulted (key) { + [].concat(flags.aliases[key] || [], key).forEach(function (k) { + delete flags.defaulted[k] + }) + } + + // make a best effor to pick a default value + // for an option based on name and type. + function defaultValue (key) { + if (!checkAllAliases(key, flags.bools) && + !checkAllAliases(key, flags.counts) && + `${key}` in defaults) { + return defaults[key] + } else { + return defaultForType(guessType(key)) + } + } + + // return a default value, given the type of a flag., + // e.g., key of type 'string' will default to '', rather than 'true'. + function defaultForType (type) { + var def = { + boolean: true, + string: '', + number: undefined, + array: [] + } + + return def[type] + } + + // given a flag, enforce a default type. + function guessType (key) { + var type = 'boolean' + + if (checkAllAliases(key, flags.strings)) type = 'string' + else if (checkAllAliases(key, flags.numbers)) type = 'number' + else if (checkAllAliases(key, flags.arrays)) type = 'array' + + return type + } + + function isNumber (x) { + if (x === null || x === undefined) return false + // if loaded from config, may already be a number. + if (typeof x === 'number') return true + // hexadecimal. + if (/^0x[0-9a-f]+$/i.test(x)) return true + // don't treat 0123 as a number; as it drops the leading '0'. + if (x.length > 1 && x[0] === '0') return false + return /^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x) + } + + function isUndefined (num) { + return num === undefined + } + + return { + argv: argv, + error: error, + aliases: flags.aliases, + newAliases: newAliases, + configuration: configuration + } +} + +// if any aliases reference each other, we should +// merge them together. +function combineAliases (aliases) { + var aliasArrays = [] + var change = true + var combined = {} + + // turn alias lookup hash {key: ['alias1', 'alias2']} into + // a simple array ['key', 'alias1', 'alias2'] + Object.keys(aliases).forEach(function (key) { + aliasArrays.push( + [].concat(aliases[key], key) + ) + }) + + // combine arrays until zero changes are + // made in an iteration. + while (change) { + change = false + for (var i = 0; i < aliasArrays.length; i++) { + for (var ii = i + 1; ii < aliasArrays.length; ii++) { + var intersect = aliasArrays[i].filter(function (v) { + return aliasArrays[ii].indexOf(v) !== -1 + }) + + if (intersect.length) { + aliasArrays[i] = aliasArrays[i].concat(aliasArrays[ii]) + aliasArrays.splice(ii, 1) + change = true + break + } + } + } + } + + // map arrays back to the hash-lookup (de-dupe while + // we're at it). + aliasArrays.forEach(function (aliasArray) { + aliasArray = aliasArray.filter(function (v, i, self) { + return self.indexOf(v) === i + }) + combined[aliasArray.pop()] = aliasArray + }) + + return combined +} + +// this function should only be called when a count is given as an arg +// it is NOT called to set a default value +// thus we can start the count at 1 instead of 0 +function increment (orig) { + return orig !== undefined ? orig + 1 : 1 +} + +function Parser (args, opts) { + var result = parse(args.slice(), opts) + + return result.argv +} + +// parse arguments and return detailed +// meta information, aliases, etc. +Parser.detailed = function (args, opts) { + return parse(args.slice(), opts) +} + +// TODO(bcoe): in the next major version of yargs, switch to +// Object.create(null) for dot notation: +function sanitizeKey (key) { + if (key === '__proto__') return '___proto___' + return key +} + +module.exports = Parser diff --git a/node_modules/sass-graph/node_modules/yargs-parser/package.json b/node_modules/sass-graph/node_modules/yargs-parser/package.json new file mode 100644 index 00000000..6300abf5 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs-parser/package.json @@ -0,0 +1,47 @@ +{ + "name": "yargs-parser", + "version": "13.1.2", + "description": "the mighty option parser used by yargs", + "main": "index.js", + "scripts": { + "test": "nyc mocha test/*.js", + "posttest": "standard", + "coverage": "nyc report --reporter=text-lcov | coveralls", + "release": "standard-version" + }, + "repository": { + "url": "git@github.com:yargs/yargs-parser.git" + }, + "keywords": [ + "argument", + "parser", + "yargs", + "command", + "cli", + "parsing", + "option", + "args", + "argument" + ], + "author": "Ben Coe ", + "license": "ISC", + "devDependencies": { + "chai": "^4.2.0", + "coveralls": "^3.0.2", + "mocha": "^5.2.0", + "nyc": "^14.1.0", + "standard": "^12.0.1", + "standard-version": "^6.0.0" + }, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "files": [ + "lib", + "index.js" + ], + "engine": { + "node": ">=6" + } +} diff --git a/node_modules/sass-graph/node_modules/yargs/CHANGELOG.md b/node_modules/sass-graph/node_modules/yargs/CHANGELOG.md new file mode 100644 index 00000000..d7898700 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/CHANGELOG.md @@ -0,0 +1,1335 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [13.3.0](https://www.github.com/yargs/yargs/compare/v13.2.4...v13.3.0) (2019-06-10) + + +### Bug Fixes + +* **deps:** yargs-parser update addressing several parsing bugs ([#1357](https://www.github.com/yargs/yargs/issues/1357)) ([e230d5b](https://www.github.com/yargs/yargs/commit/e230d5b)) + + +### Features + +* **i18n:** swap out os-locale dependency for simple inline implementation ([#1356](https://www.github.com/yargs/yargs/issues/1356)) ([4dfa19b](https://www.github.com/yargs/yargs/commit/4dfa19b)) +* support defaultDescription for positional arguments ([812048c](https://www.github.com/yargs/yargs/commit/812048c)) + +### [13.2.4](https://github.com/yargs/yargs/compare/v13.2.3...v13.2.4) (2019-05-13) + + +### Bug Fixes + +* **i18n:** rename unclear 'implication failed' to 'missing dependent arguments' ([#1317](https://github.com/yargs/yargs/issues/1317)) ([bf46813](https://github.com/yargs/yargs/commit/bf46813)) + + + +### [13.2.3](https://github.com/yargs/yargs/compare/v13.2.2...v13.2.3) (2019-05-05) + + +### Bug Fixes + +* **deps:** upgrade cliui for compatibility with latest chalk. ([#1330](https://github.com/yargs/yargs/issues/1330)) ([b20db65](https://github.com/yargs/yargs/commit/b20db65)) +* address issues with dutch translation ([#1316](https://github.com/yargs/yargs/issues/1316)) ([0295132](https://github.com/yargs/yargs/commit/0295132)) + + +### Tests + +* accept differently formatted output ([#1327](https://github.com/yargs/yargs/issues/1327)) ([c294d1b](https://github.com/yargs/yargs/commit/c294d1b)) + + + +## [13.2.2](https://github.com/yargs/yargs/compare/v13.2.1...v13.2.2) (2019-03-06) + + + +## [13.2.1](https://github.com/yargs/yargs/compare/v13.2.0...v13.2.1) (2019-02-18) + + +### Bug Fixes + +* add zsh script to files array ([3180224](https://github.com/yargs/yargs/commit/3180224)) +* support options/sub-commands in zsh completion ([0a96394](https://github.com/yargs/yargs/commit/0a96394)) + + +# [13.2.0](https://github.com/yargs/yargs/compare/v13.1.0...v13.2.0) (2019-02-15) + + +### Features + +* zsh auto completion ([#1292](https://github.com/yargs/yargs/issues/1292)) ([16c5d25](https://github.com/yargs/yargs/commit/16c5d25)), closes [#1156](https://github.com/yargs/yargs/issues/1156) + + + +# [13.1.0](https://github.com/yargs/yargs/compare/v13.0.0...v13.1.0) (2019-02-12) + + +### Features + +* add applyBeforeValidation, for applying sync middleware before validation ([5be206a](https://github.com/yargs/yargs/commit/5be206a)) + + + + +# [13.0.0](https://github.com/yargs/yargs/compare/v12.0.5...v13.0.0) (2019-02-02) + + +### Bug Fixes + +* **deps:** Update os-locale to avoid security vulnerability ([#1270](https://github.com/yargs/yargs/issues/1270)) ([27bf739](https://github.com/yargs/yargs/commit/27bf739)) +* **validation:** Use the error as a message when none exists otherwise ([#1268](https://github.com/yargs/yargs/issues/1268)) ([0510fe6](https://github.com/yargs/yargs/commit/0510fe6)) +* better bash path completion ([#1272](https://github.com/yargs/yargs/issues/1272)) ([da75ea2](https://github.com/yargs/yargs/commit/da75ea2)) +* middleware added multiple times due to reference bug ([#1282](https://github.com/yargs/yargs/issues/1282)) ([64af518](https://github.com/yargs/yargs/commit/64af518)) + + +### Chores + +* ~drop Node 6 from testing matrix ([#1287](https://github.com/yargs/yargs/issues/1287)) ([ef16792](https://github.com/yargs/yargs/commit/ef16792))~ + * _opting to not drop Node 6 support until April, [see](https://github.com/nodejs/Release)._ +* update dependencies ([#1284](https://github.com/yargs/yargs/issues/1284)) ([f25de4f](https://github.com/yargs/yargs/commit/f25de4f)) + + +### Features + +* Add `.parserConfiguration()` method, deprecating package.json config ([#1262](https://github.com/yargs/yargs/issues/1262)) ([3c6869a](https://github.com/yargs/yargs/commit/3c6869a)) +* adds config option for sorting command output ([#1256](https://github.com/yargs/yargs/issues/1256)) ([6916ce9](https://github.com/yargs/yargs/commit/6916ce9)) +* options/positionals with leading '+' and '0' no longer parse as numbers ([#1286](https://github.com/yargs/yargs/issues/1286)) ([e9dc3aa](https://github.com/yargs/yargs/commit/e9dc3aa)) +* support promises in middleware ([f3a4e4f](https://github.com/yargs/yargs/commit/f3a4e4f)) + + +### BREAKING CHANGES + +* options with leading '+' or '0' now parse as strings +* dropping Node 6 which hits end of life in April 2019 +* see [yargs-parser@12.0.0 CHANGELOG](https://github.com/yargs/yargs-parser/blob/master/CHANGELOG.md#breaking-changes) +* we now warn if the yargs stanza package.json is used. + + + + +## [12.0.5](https://github.com/yargs/yargs/compare/v12.0.4...v12.0.5) (2018-11-19) + + +### Bug Fixes + +* allows camel-case, variadic arguments, and strict mode to be combined ([#1247](https://github.com/yargs/yargs/issues/1247)) ([eacc035](https://github.com/yargs/yargs/commit/eacc035)) + + + + +## [12.0.4](https://github.com/yargs/yargs/compare/v12.0.3...v12.0.4) (2018-11-10) + + +### Bug Fixes + +* don't load config when processing positionals ([5d0dc92](https://github.com/yargs/yargs/commit/5d0dc92)) + + + + +## [12.0.3](https://github.com/yargs/yargs/compare/v12.0.2...v12.0.3) (2018-10-06) + + +### Bug Fixes + +* $0 contains first arg in bundled electron apps ([#1206](https://github.com/yargs/yargs/issues/1206)) ([567820b](https://github.com/yargs/yargs/commit/567820b)) +* accept single function for middleware ([66fd6f7](https://github.com/yargs/yargs/commit/66fd6f7)), closes [#1214](https://github.com/yargs/yargs/issues/1214) [#1214](https://github.com/yargs/yargs/issues/1214) +* hide `hidden` options from help output even if they are in a group ([#1221](https://github.com/yargs/yargs/issues/1221)) ([da54028](https://github.com/yargs/yargs/commit/da54028)) +* improve Norwegian Bokmål translations ([#1208](https://github.com/yargs/yargs/issues/1208)) ([a458fa4](https://github.com/yargs/yargs/commit/a458fa4)) +* improve Norwegian Nynorsk translations ([#1207](https://github.com/yargs/yargs/issues/1207)) ([d422eb5](https://github.com/yargs/yargs/commit/d422eb5)) + + + + +## [12.0.2](https://github.com/yargs/yargs/compare/v12.0.1...v12.0.2) (2018-09-04) + + +### Bug Fixes + +* middleware should work regardless of when method is called ([664b265](https://github.com/yargs/yargs/commit/664b265)), closes [#1178](https://github.com/yargs/yargs/issues/1178) +* translation not working when using __ with a single parameter ([#1183](https://github.com/yargs/yargs/issues/1183)) ([f449aea](https://github.com/yargs/yargs/commit/f449aea)) +* upgrade os-locale to version that addresses license issue ([#1195](https://github.com/yargs/yargs/issues/1195)) ([efc0970](https://github.com/yargs/yargs/commit/efc0970)) + + + + +## [12.0.1](https://github.com/yargs/yargs/compare/v12.0.0...v12.0.1) (2018-06-29) + + + + +# [12.0.0](https://github.com/yargs/yargs/compare/v11.1.0...v12.0.0) (2018-06-26) + + +### Bug Fixes + +* .argv and .parse() now invoke identical code path ([#1126](https://github.com/yargs/yargs/issues/1126)) ([f13ebf4](https://github.com/yargs/yargs/commit/f13ebf4)) +* remove the trailing white spaces from the help output ([#1090](https://github.com/yargs/yargs/issues/1090)) ([3f0746c](https://github.com/yargs/yargs/commit/3f0746c)) +* **completion:** Avoid default command and recommendations during completion ([#1123](https://github.com/yargs/yargs/issues/1123)) ([036e7c5](https://github.com/yargs/yargs/commit/036e7c5)) + + +### Chores + +* test Node.js 6, 8 and 10 ([#1160](https://github.com/yargs/yargs/issues/1160)) ([84f9d2b](https://github.com/yargs/yargs/commit/84f9d2b)) +* upgrade to version of yargs-parser that does not populate value for unset boolean ([#1104](https://github.com/yargs/yargs/issues/1104)) ([d4705f4](https://github.com/yargs/yargs/commit/d4705f4)) + + +### Features + +* add support for global middleware, useful for shared tasks like metrics ([#1119](https://github.com/yargs/yargs/issues/1119)) ([9d71ac7](https://github.com/yargs/yargs/commit/9d71ac7)) +* allow setting scriptName $0 ([#1143](https://github.com/yargs/yargs/issues/1143)) ([a2f2eae](https://github.com/yargs/yargs/commit/a2f2eae)) +* remove `setPlaceholderKeys` ([#1105](https://github.com/yargs/yargs/issues/1105)) ([6ee2c82](https://github.com/yargs/yargs/commit/6ee2c82)) + + +### BREAKING CHANGES + +* Options absent from `argv` (not set via CLI argument) are now absent from the parsed result object rather than being set with `undefined` +* drop Node 4 from testing matrix, such that we'll gradually start drifting away from supporting Node 4. +* yargs-parser does not populate 'false' when boolean flag is not passed +* tests that assert against help output will need to be updated + + + + +# [11.1.0](https://github.com/yargs/yargs/compare/v11.0.0...v11.1.0) (2018-03-04) + + +### Bug Fixes + +* choose correct config directory when require.main does not exist ([#1056](https://github.com/yargs/yargs/issues/1056)) ([a04678c](https://github.com/yargs/yargs/commit/a04678c)) + + +### Features + +* allow hidden options to be displayed with --show-hidden ([#1061](https://github.com/yargs/yargs/issues/1061)) ([ea862ae](https://github.com/yargs/yargs/commit/ea862ae)) +* extend *.rc files in addition to json ([#1080](https://github.com/yargs/yargs/issues/1080)) ([11691a6](https://github.com/yargs/yargs/commit/11691a6)) + + + + +# [11.0.0](https://github.com/yargs/yargs/compare/v10.1.2...v11.0.0) (2018-01-22) + + +### Bug Fixes + +* Set implicit nargs=1 when type=number requiresArg=true ([#1050](https://github.com/yargs/yargs/issues/1050)) ([2b56812](https://github.com/yargs/yargs/commit/2b56812)) + + +### Features + +* requiresArg is now simply an alias for nargs(1) ([#1054](https://github.com/yargs/yargs/issues/1054)) ([a3ddacc](https://github.com/yargs/yargs/commit/a3ddacc)) + + +### BREAKING CHANGES + +* requiresArg now has significantly different error output, matching nargs. + + + + +## [10.1.2](https://github.com/yargs/yargs/compare/v10.1.1...v10.1.2) (2018-01-17) + + +### Bug Fixes + +* requiresArg should only be enforced if argument exists ([#1043](https://github.com/yargs/yargs/issues/1043)) ([fbf41ae](https://github.com/yargs/yargs/commit/fbf41ae)) + + + + +## [10.1.1](https://github.com/yargs/yargs/compare/v10.1.0...v10.1.1) (2018-01-09) + + +### Bug Fixes + +* Add `dirname` sanity check on `findUp` ([#1036](https://github.com/yargs/yargs/issues/1036)) ([331d103](https://github.com/yargs/yargs/commit/331d103)) + + + + +# [10.1.0](https://github.com/yargs/yargs/compare/v10.0.3...v10.1.0) (2018-01-01) + + +### Bug Fixes + +* 'undefined' should be taken to mean no argument was provided ([#1015](https://github.com/yargs/yargs/issues/1015)) ([c679e90](https://github.com/yargs/yargs/commit/c679e90)) + + +### Features + +* add missing simple chinese locale strings ([#1004](https://github.com/yargs/yargs/issues/1004)) ([3cc24ec](https://github.com/yargs/yargs/commit/3cc24ec)) +* add Norwegian Nynorsk translations ([#1028](https://github.com/yargs/yargs/issues/1028)) ([a5ac213](https://github.com/yargs/yargs/commit/a5ac213)) +* async command handlers ([#1001](https://github.com/yargs/yargs/issues/1001)) ([241124b](https://github.com/yargs/yargs/commit/241124b)) +* middleware ([#881](https://github.com/yargs/yargs/issues/881)) ([77b8dbc](https://github.com/yargs/yargs/commit/77b8dbc)) + + + + +## [10.0.3](https://github.com/yargs/yargs/compare/v10.0.2...v10.0.3) (2017-10-21) + + +### Bug Fixes + +* parse array rather than string, so that quotes are safe ([#993](https://github.com/yargs/yargs/issues/993)) ([c351685](https://github.com/yargs/yargs/commit/c351685)) + + + + +## [10.0.2](https://github.com/yargs/yargs/compare/v10.0.1...v10.0.2) (2017-10-21) + + +### Bug Fixes + +* fix tiny spacing issue with usage ([#992](https://github.com/yargs/yargs/issues/992)) ([7871327](https://github.com/yargs/yargs/commit/7871327)) + + + + +## [10.0.1](https://github.com/yargs/yargs/compare/v10.0.0...v10.0.1) (2017-10-19) + + +### Bug Fixes + +* help strings for nested commands were missing parent commands ([#990](https://github.com/yargs/yargs/issues/990)) ([cd1ca15](https://github.com/yargs/yargs/commit/cd1ca15)) +* use correct completion command in generated completion script ([#988](https://github.com/yargs/yargs/issues/988)) ([3c8ac1d](https://github.com/yargs/yargs/commit/3c8ac1d)) + + + + +# [10.0.0](https://github.com/yargs/yargs/compare/v9.1.0...v10.0.0) (2017-10-18) + + +### Bug Fixes + +* config and normalize can be disabled with false ([#952](https://github.com/yargs/yargs/issues/952)) ([3bb8771](https://github.com/yargs/yargs/commit/3bb8771)) +* less eager help command execution ([#972](https://github.com/yargs/yargs/issues/972)) ([8c1d7bf](https://github.com/yargs/yargs/commit/8c1d7bf)) +* the positional argument parse was clobbering global flag arguments ([#984](https://github.com/yargs/yargs/issues/984)) ([7e58453](https://github.com/yargs/yargs/commit/7e58453)) + + +### Features + +* .usage() can now be used to configure a default command ([#975](https://github.com/yargs/yargs/issues/975)) ([7269531](https://github.com/yargs/yargs/commit/7269531)) +* hidden options are now explicitly indicated using "hidden" flag ([#962](https://github.com/yargs/yargs/issues/962)) ([280d0d6](https://github.com/yargs/yargs/commit/280d0d6)) +* introduce .positional() for configuring positional arguments ([#967](https://github.com/yargs/yargs/issues/967)) ([cb16460](https://github.com/yargs/yargs/commit/cb16460)) +* replace $0 with file basename ([#983](https://github.com/yargs/yargs/issues/983)) ([20bb99b](https://github.com/yargs/yargs/commit/20bb99b)) + + +### BREAKING CHANGES + +* .usage() no longer accepts an options object as the second argument. It can instead be used as an alias for configuring a default command. +* previously hidden options were simply implied using a falsy description +* help command now only executes if it's the last positional in argv._ + + + + +# [9.1.0](https://github.com/yargs/yargs/compare/v9.0.1...v9.1.0) (2017-09-25) + + +### Bug Fixes + +* **command:** Run default cmd even if the only cmd ([#950](https://github.com/yargs/yargs/issues/950)) ([7b22203](https://github.com/yargs/yargs/commit/7b22203)) + + +### Features + +* multiple usage calls are now collected, not replaced ([#958](https://github.com/yargs/yargs/issues/958)) ([74a38b2](https://github.com/yargs/yargs/commit/74a38b2)) + + + + +## [9.0.1](https://github.com/yargs/yargs/compare/v9.0.0...v9.0.1) (2017-09-17) + + +### Bug Fixes + +* implications fails only displayed once ([#954](https://github.com/yargs/yargs/issues/954)) ([ac8088b](https://github.com/yargs/yargs/commit/ac8088b)) + + + + +# [9.0.0](https://github.com/yargs/yargs/compare/v8.0.2...v9.0.0) (2017-09-03) + + +### Bug Fixes + +* 'undefined' default value for choices resulted in validation failing ([782b896](https://github.com/yargs/yargs/commit/782b896)) +* address bug with handling of arrays of implications ([c240661](https://github.com/yargs/yargs/commit/c240661)) +* defaulting keys to 'undefined' interfered with conflicting key logic ([a8e0cff](https://github.com/yargs/yargs/commit/a8e0cff)) +* don't bother calling JSON.stringify() on string default values ([#891](https://github.com/yargs/yargs/issues/891)) ([628be21](https://github.com/yargs/yargs/commit/628be21)) +* exclude positional arguments from completion output ([#927](https://github.com/yargs/yargs/issues/927)) ([71c7ec7](https://github.com/yargs/yargs/commit/71c7ec7)) +* strict mode should not fail for hidden options ([#949](https://github.com/yargs/yargs/issues/949)) ([0e0c58d](https://github.com/yargs/yargs/commit/0e0c58d)) + + +### Features + +* allow implies and conflicts to accept array values ([#922](https://github.com/yargs/yargs/issues/922)) ([abdc7da](https://github.com/yargs/yargs/commit/abdc7da)) +* allow parse with no arguments as alias for yargs.argv ([#944](https://github.com/yargs/yargs/issues/944)) ([a9f03e7](https://github.com/yargs/yargs/commit/a9f03e7)) +* enable .help() and .version() by default ([#912](https://github.com/yargs/yargs/issues/912)) ([1ef44e0](https://github.com/yargs/yargs/commit/1ef44e0)) +* to allow both undefined and nulls, for benefit of TypeScript ([#945](https://github.com/yargs/yargs/issues/945)) ([792564d](https://github.com/yargs/yargs/commit/792564d)) + + +### BREAKING CHANGES + +* version() and help() are now enabled by default, and show up in help output; the implicit help command can no longer be enabled/disabled independently from the help command itself (which can now be disabled). +* parse() now behaves as an alias for .argv, unless a parseCallback is provided. + + + + +## [8.0.2](https://github.com/yargs/yargs/compare/v8.0.1...v8.0.2) (2017-06-12) + + + + +## [8.0.1](https://github.com/yargs/yargs/compare/v8.0.0...v8.0.1) (2017-05-02) + + + + +# [8.0.0](https://github.com/yargs/yargs/compare/v7.1.0...v8.0.0) (2017-05-01) + + +### Bug Fixes + +* commands are now applied in order, from left to right ([#857](https://github.com/yargs/yargs/issues/857)) ([baba863](https://github.com/yargs/yargs/commit/baba863)) +* help now takes precedence over command recommendation ([#866](https://github.com/yargs/yargs/issues/866)) ([17e3567](https://github.com/yargs/yargs/commit/17e3567)) +* positional arguments now work if no handler is provided to inner command ([#864](https://github.com/yargs/yargs/issues/864)) ([e28ded3](https://github.com/yargs/yargs/commit/e28ded3)) + + +### Chores + +* upgrade yargs-parser ([#867](https://github.com/yargs/yargs/issues/867)) ([8f9c6c6](https://github.com/yargs/yargs/commit/8f9c6c6)) + + +### Features + +* allow extends to inherit from a module ([#865](https://github.com/yargs/yargs/issues/865)) ([89456d9](https://github.com/yargs/yargs/commit/89456d9)) +* allow strict mode to be disabled ([#840](https://github.com/yargs/yargs/issues/840)) ([6f78c05](https://github.com/yargs/yargs/commit/6f78c05)) + + +### BREAKING CHANGES + +* extends functionality now always loads the JSON provided, rather than reading from a specific key +* Node 4+ is now required; this will allow us to start updating our dependencies. +* the first argument to strict() is now used to enable/disable its functionality, rather than controlling whether or not it is global. + + + + +# [7.1.0](https://github.com/yargs/yargs/compare/v7.0.2...v7.1.0) (2017-04-13) + + +### Bug Fixes + +* fix demandOption no longer treats 'false' as truthy ([#829](https://github.com/yargs/yargs/issues/829)) ([c748dd2](https://github.com/yargs/yargs/commit/c748dd2)) +* get terminalWidth in non interactive mode no longer causes a validation exception ([#837](https://github.com/yargs/yargs/issues/837)) ([360e301](https://github.com/yargs/yargs/commit/360e301)) +* we shouldn't output help if we've printed a prior help-like message ([#847](https://github.com/yargs/yargs/issues/847)) ([17e89bd](https://github.com/yargs/yargs/commit/17e89bd)) + + +### Features + +* add support for numeric commands ([#825](https://github.com/yargs/yargs/issues/825)) ([fde0564](https://github.com/yargs/yargs/commit/fde0564)) + + + + +## [7.0.2](https://github.com/yargs/yargs/compare/v7.0.1...v7.0.2) (2017-03-10) + + +### Bug Fixes + +* populating placeholder arguments broke validation ([b3eb2fe](https://github.com/yargs/yargs/commit/b3eb2fe)) + + + + +## [7.0.1](https://github.com/yargs/yargs/compare/v7.0.0...v7.0.1) (2017-03-03) + + +### Bug Fixes + +* --help with default command should print top-level help ([#810](https://github.com/yargs/yargs/issues/810)) ([9c03fa4](https://github.com/yargs/yargs/commit/9c03fa4)) + + + + +# [7.0.0](https://github.com/yargs/yargs/compare/v6.6.0...v7.0.0) (2017-02-26) + + +### Bug Fixes + +* address min/max validation message regression ([#750](https://github.com/yargs/yargs/issues/750)) ([2e5ce0f](https://github.com/yargs/yargs/commit/2e5ce0f)) +* address positional argument strict() bug introduced in [#766](https://github.com/yargs/yargs/issues/766) ([#784](https://github.com/yargs/yargs/issues/784)) ([a8528e6](https://github.com/yargs/yargs/commit/a8528e6)) +* console.warn() rather than throwing errors when api signatures are incorrect ([#804](https://github.com/yargs/yargs/issues/804)) ([a607061](https://github.com/yargs/yargs/commit/a607061)) +* context should override parsed argv ([#786](https://github.com/yargs/yargs/issues/786)) ([0997288](https://github.com/yargs/yargs/commit/0997288)) +* context variables are now recognized in strict() mode ([#796](https://github.com/yargs/yargs/issues/796)) ([48575cd](https://github.com/yargs/yargs/commit/48575cd)) +* errors were not bubbling appropriately from sub-commands to top-level ([#802](https://github.com/yargs/yargs/issues/802)) ([8a992f5](https://github.com/yargs/yargs/commit/8a992f5)) +* positional arguments of sub-commands threw strict() exception ([#805](https://github.com/yargs/yargs/issues/805)) ([f3f074b](https://github.com/yargs/yargs/commit/f3f074b)) +* pull in yargs-parser with modified env precedence ([#787](https://github.com/yargs/yargs/issues/787)) ([e0fbbe5](https://github.com/yargs/yargs/commit/e0fbbe5)) +* running parse() multiple times on the same yargs instance caused exception if help() enabled ([#790](https://github.com/yargs/yargs/issues/790)) ([07e39b7](https://github.com/yargs/yargs/commit/07e39b7)) +* use path.resolve() to support node 0.10 ([#797](https://github.com/yargs/yargs/issues/797)) ([49a93fc](https://github.com/yargs/yargs/commit/49a93fc)) + + +### Features + +* add conflicts and implies shorthands. ([#753](https://github.com/yargs/yargs/issues/753)) ([bd1472b](https://github.com/yargs/yargs/commit/bd1472b)) +* add traditional Chinese translation ([#780](https://github.com/yargs/yargs/issues/780)) ([6ab6a95](https://github.com/yargs/yargs/commit/6ab6a95)) +* allow provided config object to extend other configs ([#779](https://github.com/yargs/yargs/issues/779)) ([3280dd0](https://github.com/yargs/yargs/commit/3280dd0)) +* function argument validation ([#773](https://github.com/yargs/yargs/issues/773)) ([22ed9bb](https://github.com/yargs/yargs/commit/22ed9bb)) +* if only one column is provided for examples, allow it to take up the entire line ([#749](https://github.com/yargs/yargs/issues/749)) ([7931652](https://github.com/yargs/yargs/commit/7931652)) +* introduce custom yargs error object ([#765](https://github.com/yargs/yargs/issues/765)) ([8308efa](https://github.com/yargs/yargs/commit/8308efa)) +* introduces support for default commands, using the '*' identifier ([#785](https://github.com/yargs/yargs/issues/785)) ([d78a0f5](https://github.com/yargs/yargs/commit/d78a0f5)) +* rethink how options are inherited by commands ([#766](https://github.com/yargs/yargs/issues/766)) ([ab1fa4b](https://github.com/yargs/yargs/commit/ab1fa4b)) + + +### BREAKING CHANGES + +* `extends` key in config file is now used for extending other config files +* environment variables now take precedence over config files. +* context now takes precedence over argv and defaults +* the arguments passed to functions are now validated, there's a good chance this will throw exceptions for a few folks who are using the API in an unexpected way. +* by default options, and many of yargs' parsing helpers will now default to being applied globally; such that they are no-longer reset before being passed into commands. +* yargs will no longer aggressively suppress errors, allowing errors that are not generated internally to bubble. + + + + +# [6.6.0](https://github.com/yargs/yargs/compare/v6.5.0...v6.6.0) (2016-12-29) + + +### Bug Fixes + +* [object Object] was accidentally being populated on options object ([#736](https://github.com/yargs/yargs/issues/736)) ([f755e27](https://github.com/yargs/yargs/commit/f755e27)) +* do not use cwd when resolving package.json for yargs parsing config ([#726](https://github.com/yargs/yargs/issues/726)) ([9bdaab7](https://github.com/yargs/yargs/commit/9bdaab7)) + + +### Features + +* implement conflicts() for defining mutually exclusive arguments; thanks [@madcampos](https://github.com/madcampos)! ([#741](https://github.com/yargs/yargs/issues/741)) ([5883779](https://github.com/yargs/yargs/commit/5883779)) +* split demand() into demandCommand()/demandOption() ([#740](https://github.com/yargs/yargs/issues/740)) ([66573c8](https://github.com/yargs/yargs/commit/66573c8)) +* support for positional argument aliases ([#727](https://github.com/yargs/yargs/issues/727)) ([27e1a57](https://github.com/yargs/yargs/commit/27e1a57)) + + + + +# [6.5.0](https://github.com/yargs/yargs/compare/v6.4.0...v6.5.0) (2016-12-01) + + +### Bug Fixes + +* still freeze/unfreeze if parse() is called in isolation ([#717](https://github.com/yargs/yargs/issues/717)) ([30a9492](https://github.com/yargs/yargs/commit/30a9492)) + + +### Features + +* pull in yargs-parser introducing additional settings ([#688](https://github.com/yargs/yargs/issues/688)), and fixing [#716](https://github.com/yargs/yargs/issues/716) ([#722](https://github.com/yargs/yargs/issues/722)) ([702995a](https://github.com/yargs/yargs/commit/702995a)) + + + + +# [6.4.0](https://github.com/yargs/yargs/compare/v6.3.0...v6.4.0) (2016-11-13) + + +### Bug Fixes + +* **locales:** correct some Russian translations ([#691](https://github.com/yargs/yargs/issues/691)) ([a980671](https://github.com/yargs/yargs/commit/a980671)) + + +### Features + +* **locales:** Added Belarusian translation ([#690](https://github.com/yargs/yargs/issues/690)) ([68dac1f](https://github.com/yargs/yargs/commit/68dac1f)) +* **locales:** Create nl.json ([#687](https://github.com/yargs/yargs/issues/687)) ([46ce1bb](https://github.com/yargs/yargs/commit/46ce1bb)) +* update to yargs-parser that addresses [#598](https://github.com/yargs/yargs/issues/598), [#617](https://github.com/yargs/yargs/issues/617) ([#700](https://github.com/yargs/yargs/issues/700)) ([54cb31d](https://github.com/yargs/yargs/commit/54cb31d)) +* yargs is now passed as the third-argument to fail handler ([#613](https://github.com/yargs/yargs/issues/613)) ([21b74f9](https://github.com/yargs/yargs/commit/21b74f9)) + + +### Performance Improvements + +* normalizing package data is an expensive operation ([#705](https://github.com/yargs/yargs/issues/705)) ([49cf533](https://github.com/yargs/yargs/commit/49cf533)) + + + + +# [6.3.0](https://github.com/yargs/yargs/compare/v6.2.0...v6.3.0) (2016-10-19) + + +### Bug Fixes + +* **command:** subcommands via commandDir() now supported for parse(msg, cb) ([#678](https://github.com/yargs/yargs/issues/678)) ([6b85cc6](https://github.com/yargs/yargs/commit/6b85cc6)) + + +### Features + +* **locales:** Add Thai locale file ([#679](https://github.com/yargs/yargs/issues/679)) ([c05e36b](https://github.com/yargs/yargs/commit/c05e36b)) + + + + +# [6.2.0](https://github.com/yargs/yargs/compare/v6.1.1...v6.2.0) (2016-10-16) + + +### Bug Fixes + +* stop applying parser to context object ([#675](https://github.com/yargs/yargs/issues/675)) ([3fe9b8f](https://github.com/yargs/yargs/commit/3fe9b8f)) + + +### Features + +* add new pt_BR translations ([#674](https://github.com/yargs/yargs/issues/674)) ([5615a82](https://github.com/yargs/yargs/commit/5615a82)) +* Italian translations for 'did you mean' and 'aliases' ([#673](https://github.com/yargs/yargs/issues/673)) ([81984e6](https://github.com/yargs/yargs/commit/81984e6)) + + + + +## [6.1.1](https://github.com/yargs/yargs/compare/v6.1.0...v6.1.1) (2016-10-15) + + +### Bug Fixes + +* freeze was not resetting configObjects to initial state; addressed performance issue raised by [@nexdrew](https://github.com/nexdrew). ([#670](https://github.com/yargs/yargs/issues/670)) ([ae4bcd4](https://github.com/yargs/yargs/commit/ae4bcd4)) + + + + +# [6.1.0](https://github.com/yargs/yargs/compare/v6.0.0...v6.1.0) (2016-10-15) + + +### Bug Fixes + +* **locales:** change some translations ([#667](https://github.com/yargs/yargs/issues/667)) ([aa966c5](https://github.com/yargs/yargs/commit/aa966c5)) +* **locales:** conform hi locale to y18n.__n expectations ([#666](https://github.com/yargs/yargs/issues/666)) ([22adb18](https://github.com/yargs/yargs/commit/22adb18)) + + +### Features + +* initial support for command aliases ([#647](https://github.com/yargs/yargs/issues/647)) ([127a040](https://github.com/yargs/yargs/commit/127a040)) +* **command:** add camelcase commands to argv ([#658](https://github.com/yargs/yargs/issues/658)) ([b1cabae](https://github.com/yargs/yargs/commit/b1cabae)) +* **locales:** add Hindi translations ([9290912](https://github.com/yargs/yargs/commit/9290912)) +* **locales:** add Hungarian translations ([be92327](https://github.com/yargs/yargs/commit/be92327)) +* **locales:** Japanese translations for 'did you mean' and 'aliases' ([#651](https://github.com/yargs/yargs/issues/651)) ([5eb78fc](https://github.com/yargs/yargs/commit/5eb78fc)) +* **locales:** Polish translations for 'did you mean' and 'aliases' ([#650](https://github.com/yargs/yargs/issues/650)) ([c951c0e](https://github.com/yargs/yargs/commit/c951c0e)) +* reworking yargs API to make it easier to run in headless environments, e.g., Slack ([#646](https://github.com/yargs/yargs/issues/646)) ([f284c29](https://github.com/yargs/yargs/commit/f284c29)) +* Turkish translations for 'did you mean' and 'aliases' ([#660](https://github.com/yargs/yargs/issues/660)) ([072fd45](https://github.com/yargs/yargs/commit/072fd45)) + + + + +# [6.0.0](https://github.com/yargs/yargs/compare/v5.0.0...v6.0.0) (2016-09-30) + + +### Bug Fixes + +* changed parsing of the command string to ignore extra spaces ([#600](https://github.com/yargs/yargs/issues/600)) ([e8e5a72](https://github.com/yargs/yargs/commit/e8e5a72)) +* drop lodash.assign ([#641](https://github.com/yargs/yargs/issues/641)) ([ad3146f](https://github.com/yargs/yargs/commit/ad3146f)) +* for args that have skipValidation set to `true`, check if the parsed arg is `true` ([#619](https://github.com/yargs/yargs/issues/619)) ([658a34c](https://github.com/yargs/yargs/commit/658a34c)) +* upgrade standard, and fix appveyor config so that it works with newest standard ([#607](https://github.com/yargs/yargs/issues/607)) ([c301f42](https://github.com/yargs/yargs/commit/c301f42)) + + +### Chores + +* upgrade yargs-parser ([#633](https://github.com/yargs/yargs/issues/633)) ([cc1224e](https://github.com/yargs/yargs/commit/cc1224e)) + + +### Features + +* make opts object optional for .option() ([#624](https://github.com/yargs/yargs/issues/624)) ([4f29de6](https://github.com/yargs/yargs/commit/4f29de6)) + + +### Performance Improvements + +* defer windowWidth() to improve perf for non-help usage ([#610](https://github.com/yargs/yargs/issues/610)) ([cbc3636](https://github.com/yargs/yargs/commit/cbc3636)) + + +### BREAKING CHANGES + +* coerce is now applied as a final step after other parsing is complete + + + + +# [5.0.0](https://github.com/yargs/yargs/compare/v4.8.1...v5.0.0) (2016-08-14) + + +### Bug Fixes + +* **default:** Remove undocumented alias of default() ([#469](https://github.com/yargs/yargs/issues/469)) ([b8591b2](https://github.com/yargs/yargs/commit/b8591b2)) +* remove deprecated zh.json ([#578](https://github.com/yargs/yargs/issues/578)) ([317c62c](https://github.com/yargs/yargs/commit/317c62c)) + + +### Features + +* .help() API can now enable implicit help command ([#574](https://github.com/yargs/yargs/issues/574)) ([7645019](https://github.com/yargs/yargs/commit/7645019)) +* **command:** builder function no longer needs to return the yargs instance ([#549](https://github.com/yargs/yargs/issues/549)) ([eaa2873](https://github.com/yargs/yargs/commit/eaa2873)) +* add coerce api ([#586](https://github.com/yargs/yargs/issues/586)) ([1d53ccb](https://github.com/yargs/yargs/commit/1d53ccb)) +* adds recommendCommands() for command suggestions ([#580](https://github.com/yargs/yargs/issues/580)) ([59474dc](https://github.com/yargs/yargs/commit/59474dc)) +* apply .env() globally ([#553](https://github.com/yargs/yargs/issues/553)) ([be65728](https://github.com/yargs/yargs/commit/be65728)) +* apply default builder to command() and apply fail() handlers globally ([#583](https://github.com/yargs/yargs/issues/583)) ([0aaa68b](https://github.com/yargs/yargs/commit/0aaa68b)) +* update yargs-parser to version 3.1.0 ([#581](https://github.com/yargs/yargs/issues/581)) ([882a127](https://github.com/yargs/yargs/commit/882a127)) + + +### Performance Improvements + +* defer requiring most external libs until needed ([#584](https://github.com/yargs/yargs/issues/584)) ([f9b0ed4](https://github.com/yargs/yargs/commit/f9b0ed4)) + + +### BREAKING CHANGES + +* fail is now applied globally. +* we now default to an empty builder function when command is executed with no builder. +* yargs-parser now better handles negative integer values, at the cost of handling numeric option names, e.g., -1 hello +* default: removed undocumented `defaults` alias for `default`. +* introduces a default `help` command which outputs help, as an alternative to a help flag. +* interpret demand() numbers as relative to executing command ([#582](https://github.com/yargs/yargs/issues/582)) ([927810c](https://github.com/yargs/yargs/commit/927810c)) + + + + +## [4.8.1](https://github.com/yargs/yargs/compare/v4.8.0...v4.8.1) (2016-07-16) + + +### Bug Fixes + +* **commandDir:** make dir relative to caller instead of require.main.filename ([#548](https://github.com/yargs/yargs/issues/548)) ([3c2e479](https://github.com/yargs/yargs/commit/3c2e479)) +* add config lookup for .implies() ([#556](https://github.com/yargs/yargs/issues/556)) ([8d7585c](https://github.com/yargs/yargs/commit/8d7585c)) +* cache pkg lookups by path to avoid returning the wrong one ([#552](https://github.com/yargs/yargs/issues/552)) ([fea7e0b](https://github.com/yargs/yargs/commit/fea7e0b)) +* positional arguments were not being handled appropriately by parse() ([#559](https://github.com/yargs/yargs/issues/559)) ([063a866](https://github.com/yargs/yargs/commit/063a866)) +* pull in [@nexdrew](https://github.com/nexdrew)'s fixes to yargs-parser ([#560](https://github.com/yargs/yargs/issues/560)) ([c77c080](https://github.com/yargs/yargs/commit/c77c080)), closes [#560](https://github.com/yargs/yargs/issues/560) + + + + +# [4.8.0](https://github.com/yargs/yargs/compare/v4.7.1...v4.8.0) (2016-07-09) + + +### Bug Fixes + +* drop unused camelcase dependency fixes [#516](https://github.com/yargs/yargs/issues/516) ([#525](https://github.com/yargs/yargs/issues/525)) ([365fb9a](https://github.com/yargs/yargs/commit/365fb9a)), closes [#516](https://github.com/yargs/yargs/issues/516) [#525](https://github.com/yargs/yargs/issues/525) +* fake a tty in tests, so that we can use the new set-blocking ([#512](https://github.com/yargs/yargs/issues/512)) ([a54c742](https://github.com/yargs/yargs/commit/a54c742)) +* ignore invalid package.json during read-pkg-up ([#546](https://github.com/yargs/yargs/issues/546)) ([e058c87](https://github.com/yargs/yargs/commit/e058c87)) +* keep both zh and zh_CN until yargs[@5](https://github.com/5).x ([0f8faa7](https://github.com/yargs/yargs/commit/0f8faa7)) +* lazy-load package.json and cache. get rid of pkg-conf dependency. ([#544](https://github.com/yargs/yargs/issues/544)) ([2609b2e](https://github.com/yargs/yargs/commit/2609b2e)) +* we now respect the order of _ when applying commands ([#537](https://github.com/yargs/yargs/issues/537)) ([ed86b78](https://github.com/yargs/yargs/commit/ed86b78)) + + +### Features + +* add .commandDir(dir) to API to apply all command modules from a relative directory ([#494](https://github.com/yargs/yargs/issues/494)) ([b299dff](https://github.com/yargs/yargs/commit/b299dff)) +* **command:** derive missing command string from module filename ([#527](https://github.com/yargs/yargs/issues/527)) ([20d4b8a](https://github.com/yargs/yargs/commit/20d4b8a)) +* builder is now optional for a command module ([#545](https://github.com/yargs/yargs/issues/545)) ([8d6ad6e](https://github.com/yargs/yargs/commit/8d6ad6e)) + + + + +## [4.7.1](https://github.com/yargs/yargs/compare/v4.7.0...v4.7.1) (2016-05-15) + + +### Bug Fixes + +* switch to using `const` rather than `var` ([#499](https://github.com/yargs/yargs/pull/499)) +* make stdout flush on newer versions of Node.js ([#501](https://github.com/yargs/yargs/issues/501)) ([9f8c6f4](https://github.com/yargs/yargs/commit/9f8c6f4)) + + + + +# [4.7.0](https://github.com/yargs/yargs/compare/v4.6.0...v4.7.0) (2016-05-02) + + +### Bug Fixes + +* **pkgConf:** fix aliases issues in .pkgConf() ([#478](https://github.com/yargs/yargs/issues/478))([b900502](https://github.com/yargs/yargs/commit/b900502)) + + +### Features + +* **completion:** allow to get completions for any string, not just process.argv ([#470](https://github.com/yargs/yargs/issues/470))([74fcfbc](https://github.com/yargs/yargs/commit/74fcfbc)) +* **configuration:** Allow to directly pass a configuration object to .config() ([#480](https://github.com/yargs/yargs/issues/480))([e0a7e05](https://github.com/yargs/yargs/commit/e0a7e05)) +* **validation:** Add .skipValidation() method ([#471](https://github.com/yargs/yargs/issues/471))([d72badb](https://github.com/yargs/yargs/commit/d72badb)) + + + + +# [4.6.0](https://github.com/yargs/yargs/compare/v4.5.0...v4.6.0) (2016-04-11) + + +### Bug Fixes + +* **my brand!:** I agree with [@osher](https://github.com/osher) lightweight isn't a huge selling point of ours any longer, see [#468](https://github.com/yargs/yargs/issues/468) ([c46d7e1](https://github.com/yargs/yargs/commit/c46d7e1)) + +### Features + +* switch to standard-version for release management ([f70f801](https://github.com/yargs/yargs/commit/f70f801)) +* upgrade to version of yargs-parser that introduces some slick new features, great work [@elas7](https://github.com/elas7). update cliui, replace win-spawn, replace badge. ([#475](https://github.com/yargs/yargs/issues/475)) ([f915dd4](https://github.com/yargs/yargs/commit/f915dd4)) + + + + +# [4.5.0](https://github.com/yargs/yargs/compare/v4.4.0...v4.5.0) (2016-04-05) + + +### Bug Fixes + +* **windows:** handle $0 better on Windows platforms ([eb6e03f](https://github.com/yargs/yargs/commit/eb6e03f)) + +### Features + +* **commands:** implemented variadic positional arguments ([51d926e](https://github.com/yargs/yargs/commit/51d926e)) +* **completion:** completion now better handles aliases, and avoids duplicating keys. ([86416c8](https://github.com/yargs/yargs/commit/86416c8)) +* **config:** If invoking .config() without parameters, set a default option ([0413dd1](https://github.com/yargs/yargs/commit/0413dd1)) +* **conventional-changelog:** switching to using conventional-changelog for generating the changelog ([a2b5a2a](https://github.com/yargs/yargs/commit/a2b5a2a)) + + + +### v4.4.0 (2016/04/03 21:10 +07:00) + +- [#454](https://github.com/yargs/yargs/pull/454) fix demand() when second argument is an array (@elas7) +- [#452](https://github.com/yargs/yargs/pull/452) fix code example for `.help()` docs (@maxrimue) +- [#450](https://github.com/yargs/yargs/pull/450) fix for bash completion trailing space edge-case (@elas7) +- [#448](https://github.com/yargs/yargs/pull/448) allow a method to be passed to `showHelp`, rather than a log-level (@osher) +- [#446](https://github.com/yargs/yargs/pull/446) update yargs-parser, y18n, nyc, cliui, pkg-conf (@bcoe) +- [#436](https://github.com/yargs/yargs/pull/436) the rebase method is only used by tests, do not export it in two places (@elas7) +- [#428](https://github.com/yargs/yargs/pull/428) initial support for subcommands (@nexdrew) + +### v4.3.2 (2016/3/20 15:07 +07:00) + +- [#445](https://github.com/yargs/yargs/pull/445) strict mode was failing if no commands were registered (@nexdrew) +- [#443](https://github.com/yargs/yargs/pull/443) adds Italian translation \o/ (@madrisan) +- [#441](https://github.com/yargs/yargs/pull/441) remove duplicate keys from array options configuration (@elas7) +- [#437](https://github.com/yargs/yargs/pull/437) standardize tests for .command() (@lrlna) + +### v4.3.0 (2016/3/12 14:19 +07:00) + +- [#432](https://github.com/yargs/yargs/pull/432) non-singleton version of yargs (@bcoe) +- [#422, #425, #420] translations for number (@zkat, @rilut, @maxrimue, @watilde) +- [#414](https://github.com/yargs/yargs/pull/414) all command options can be defined in module now (@nexdrew) + +### v4.2.0 (2016/2/22 11:02 +07:00) + +- [#395](https://github.com/yargs/yargs/pull/395) do not reset groups if they contain + global keys (@novemberborn) +- [#393](https://github.com/yargs/yargs/pull/393) use sane default for usage strings (@nexdrew) +- [#392](https://github.com/yargs/yargs/pull/392) resetting wrap() was causing layout issues + with commands (@nexdrew) +- [#391](https://github.com/yargs/yargs/pull/391) commands were being added multiple times (@nexdrew) + +### v4.0.0 (2016/2/14 1:27 +07:00) + +- [#384](https://github.com/bcoe/yargs/pull/384) add new number type to yargs (@lrlna, @maxrimue) +- [#382](https://github.com/bcoe/yargs/pull/382) pass error as extra parameter to fail (@gajus) +- [#378](https://github.com/bcoe/yargs/pull/378) introduces the pkgConf feature, which tells + yargs to load default argument values from a key on a project's package.json (@bcoe) +- [#376](https://github.com/bcoe/yargs/pull/376) **breaking change**, make help() method signature + more consistent with other commands (@maxrimue) +- [#368](https://github.com/bcoe/yargs/pull/368) **breaking change**, overhaul to command handling API: + introducing named positional arguments, commands as modules, introduces the concept of global options (options that don't reset). (@nexdrew, @bcoe). +- [#364](https://github.com/bcoe/yargs/pull/364) add the slick new yargs website to the package.json (@iarna). +- [#357](https://github.com/bcoe/yargs/pull/357) .strict() now requires that a valid command is provided (@lrlna) +- [#356](https://github.com/bcoe/yargs/pull/356) pull the parsing bits of yargs into the separate module yargs-parser. Various parsing options can now be turned on and off using configuration (@bcoe). +- [#330](https://github.com/bcoe/yargs/pull/330) **breaking change**, fix inconsistencies with `.version()` API. (@maxrimue). + +### v3.32.0 (2016/1/14 10:13 +07:00) + +- [#344](https://github.com/bcoe/yargs/pull/344) yargs now has a code of conduct and contributor guidelines (@bcoe) +- [#341](https://github.com/bcoe/yargs/issues/341) Fix edge-case with camel-case arguments (@davibe) +- [#331](https://github.com/bcoe/yargs/pull/331) Handle parsing a raw argument string (@kellyselden) +- [#325](https://github.com/bcoe/yargs/pull/325) Tweaks to make tests pass again on Windows (@isaacs) +- [#321](https://github.com/bcoe/yargs/pull/321) Custom config parsing function (@bcoe) + +### v3.31.0 (2015/12/03 10:15 +07:00) + +- [#239](https://github.com/bcoe/yargs/pull/239) Pass argv to commands (@bcoe) +- [#308](https://github.com/bcoe/yargs/pull/308) Yargs now handles environment variables (@nexdrew) +- [#302](https://github.com/bcoe/yargs/pull/302) Add Indonesian translation (@rilut) +- [#300](https://github.com/bcoe/yargs/pull/300) Add Turkish translation (@feyzo) +- [#298](https://github.com/bcoe/yargs/pull/298) Add Norwegian Bokmål translation (@sindresorhus) +- [#297](https://github.com/bcoe/yargs/pull/297) Fix for layout of cjk characters (@disjukr) +- [#296](https://github.com/bcoe/yargs/pull/296) Add Korean translation (@disjukr) + +### v3.30.0 (2015/11/13 16:29 +07:00) + +- [#293](https://github.com/bcoe/yargs/pull/293) Polish language support (@kamilogorek) +- [#291](https://github.com/bcoe/yargs/pull/291) fix edge-cases with `.alias()` (@bcoe) +- [#289](https://github.com/bcoe/yargs/pull/289) group options in custom groups (@bcoe) + +### v3.29.0 (2015/10/16 21:51 +07:00) + +- [#282](https://github.com/bcoe/yargs/pull/282) completions now accept promises (@LinusU) +- [#281](https://github.com/bcoe/yargs/pull/281) fix parsing issues with dot notation (@bcoe) + +### v3.28.0 (2015/10/16 1:55 +07:00) + +- [#277](https://github.com/bcoe/yargs/pull/277) adds support for ansi escape codes (@bcoe) + +### v3.27.0 (2015/10/08 1:55 +00:00) + +- [#271](https://github.com/bcoe/yargs/pull/273) skips validation for help or version flags with exitProcess(false) (@tepez) +- [#273](https://github.com/bcoe/yargs/pull/273) implements single output for errors with exitProcess(false) (@nexdrew) +- [#269](https://github.com/bcoe/yargs/pull/269) verifies single output for errors with exitProcess(false) (@tepez) +- [#268](https://github.com/bcoe/yargs/pull/268) adds Chinese translation (@qiu8310) +- [#266](https://github.com/bcoe/yargs/pull/266) adds case for -- after -- in parser test (@geophree) + +### v3.26.0 (2015/09/25 2:14 +00:00) + +- [#263](https://github.com/bcoe/yargs/pull/263) document count() and option() object keys (@nexdrew) +- [#259](https://github.com/bcoe/yargs/pull/259) remove util in readme (@38elements) +- [#258](https://github.com/bcoe/yargs/pull/258) node v4 builds, update deps (@nexdrew) +- [#257](https://github.com/bcoe/yargs/pull/257) fix spelling errors (@dkoleary88) + +### v3.25.0 (2015/09/13 7:38 -07:00) + +- [#254](https://github.com/bcoe/yargs/pull/254) adds Japanese translation (@oti) +- [#253](https://github.com/bcoe/yargs/pull/253) fixes for tests on Windows (@bcoe) + +### v3.24.0 (2015/09/04 12:02 +00:00) + +- [#248](https://github.com/bcoe/yargs/pull/248) reinstate os-locale, no spawning (@nexdrew) +- [#249](https://github.com/bcoe/yargs/pull/249) use travis container-based infrastructure (@nexdrew) +- [#247](https://github.com/bcoe/yargs/pull/247) upgrade standard (@nexdrew) + +### v3.23.0 (2015/08/30 23:00 +00:00) + +- [#246](https://github.com/bcoe/yargs/pull/246) detect locale based only on environment variables (@bcoe) +- [#244](https://github.com/bcoe/yargs/pull/244) adds Windows CI testing (@bcoe) +- [#245](https://github.com/bcoe/yargs/pull/245) adds OSX CI testing (@bcoe, @nexdrew) + +### v3.22.0 (2015/08/28 22:26 +00:00) +- [#242](https://github.com/bcoe/yargs/pull/242) adds detectLocale config option (@bcoe) + +### v3.21.1 (2015/08/28 20:58 +00:00) +- [#240](https://github.com/bcoe/yargs/pull/240) hot-fix for Atom on Windows (@bcoe) + +### v3.21.0 (2015/08/21 21:20 +00:00) +- [#238](https://github.com/bcoe/yargs/pull/238) upgrade camelcase, window-size, chai, mocha (@nexdrew) +- [#237](https://github.com/bcoe/yargs/pull/237) adds defaultDescription to option() (@nexdrew) + +### v3.20.0 (2015/08/20 01:29 +00:00) +- [#231](https://github.com/bcoe/yargs/pull/231) Merge pull request #231 from bcoe/detect-locale (@sindresorhus) +- [#235](https://github.com/bcoe/yargs/pull/235) adds german translation to yargs (@maxrimue) + +### v3.19.0 (2015/08/14 05:12 +00:00) +- [#224](https://github.com/bcoe/yargs/pull/224) added Portuguese translation (@codemonkey3045) + +### v3.18.1 (2015/08/12 05:53 +00:00) + +- [#228](https://github.com/bcoe/yargs/pull/228) notes about embedding yargs in Electron (@etiktin) +- [#223](https://github.com/bcoe/yargs/pull/223) make booleans work in config files (@sgentle) + +### v3.18.0 (2015/08/06 20:05 +00:00) +- [#222](https://github.com/bcoe/yargs/pull/222) updates fr locale (@nexdrew) +- [#221](https://github.com/bcoe/yargs/pull/221) adds missing locale strings (@nexdrew) +- [#220](https://github.com/bcoe/yargs/pull/220) adds es locale (@zkat) + +### v3.17.1 (2015/08/02 19:35 +00:00) +- [#218](https://github.com/bcoe/yargs/pull/218) upgrades nyc (@bcoe) + +### v3.17.0 (2015/08/02 18:39 +00:00) +- [#217](https://github.com/bcoe/yargs/pull/217) sort methods in README.md (@nexdrew) +- [#215](https://github.com/bcoe/yargs/pull/215) adds fr locale (@LoicMahieu) + +### v3.16.0 (2015/07/30 04:35 +00:00) +- [#210](https://github.com/bcoe/yargs/pull/210) adds i18n support to yargs (@bcoe) +- [#209](https://github.com/bcoe/yargs/pull/209) adds choices type to yargs (@nexdrew) +- [#207](https://github.com/bcoe/yargs/pull/207) pretty new shields from shields.io (@SimenB) +- [#208](https://github.com/bcoe/yargs/pull/208) improvements to README.md (@nexdrew) +- [#205](https://github.com/bcoe/yargs/pull/205) faster build times on Travis (@ChristianMurphy) + +### v3.15.0 (2015/07/06 06:01 +00:00) +- [#197](https://github.com/bcoe/yargs/pull/197) tweaks to how errors bubble up from parser.js (@bcoe) +- [#193](https://github.com/bcoe/yargs/pull/193) upgraded nyc, reporting now happens by default (@bcoe) + +### v3.14.0 (2015/06/28 02:12 +00:00) + +- [#192](https://github.com/bcoe/yargs/pull/192) standard style nits (@bcoe) +- [#190](https://github.com/bcoe/yargs/pull/190) allow for hidden commands, e.g., + .completion('completion', false) (@tschaub) + +### v3.13.0 (2015/06/24 04:12 +00:00) + +- [#187](https://github.com/bcoe/yargs/pull/187) completion now behaves differently + if it is being run in the context of a command (@tschaub) +- [#186](https://github.com/bcoe/yargs/pull/186) if no matches are found for a completion + default to filename completion (@tschaub) + +### v3.12.0 (2015/06/19 03:23 +00:00) +- [#183](https://github.com/bcoe/yargs/pull/183) don't complete commands if they've already been completed (@tschaub) +- [#181](https://github.com/bcoe/yargs/pull/181) various fixes for completion. (@bcoe, @tschaub) +- [#182](https://github.com/bcoe/yargs/pull/182) you can now set a maximum # of of required arguments (@bcoe) + +### v3.11.0 (2015/06/15 05:15 +00:00) + +- [#173](https://github.com/bcoe/yargs/pull/173) update standard, window-size, chai (@bcoe) +- [#171](https://github.com/bcoe/yargs/pull/171) a description can now be set + when providing a config option. (@5c077yP) + +### v3.10.0 (2015/05/29 04:25 +00:00) + +- [#165](https://github.com/bcoe/yargs/pull/165) expose yargs.terminalWidth() thanks @ensonic (@bcoe) +- [#164](https://github.com/bcoe/yargs/pull/164) better array handling thanks @getify (@bcoe) + +### v3.9.1 (2015/05/20 05:14 +00:00) +- [b6662b6](https://github.com/bcoe/yargs/commit/b6662b6774cfeab4876f41ec5e2f67b7698f4e2f) clarify .config() docs (@linclark) +- [0291360](https://github.com/bcoe/yargs/commit/02913606285ce31ce81d7f12c48d8a3029776ec7) fixed tests, switched to nyc for coverage, fixed security issue, added Lin as collaborator (@bcoe) + +### v3.9.0 (2015/05/10 18:32 +00:00) +- [#157](https://github.com/bcoe/yargs/pull/157) Merge pull request #157 from bcoe/command-yargs. allows handling of command specific arguments. Thanks for the suggestion @ohjames (@bcoe) +- [#158](https://github.com/bcoe/yargs/pull/158) Merge pull request #158 from kemitchell/spdx-license. Update license format (@kemitchell) + +### v3.8.0 (2015/04/24 23:10 +00:00) +- [#154](https://github.com/bcoe/yargs/pull/154) showHelp's method signature was misleading fixes #153 (@bcoe) +- [#151](https://github.com/bcoe/yargs/pull/151) refactor yargs' table layout logic to use new helper library (@bcoe) +- [#150](https://github.com/bcoe/yargs/pull/150) Fix README example in argument requirements (@annonymouse) + +### v3.7.2 (2015/04/13 11:52 -07:00) + +* [679fbbf](https://github.com/bcoe/yargs/commit/679fbbf55904030ccee8a2635e8e5f46551ab2f0) updated yargs to use the [standard](https://github.com/feross/standard) style guide (agokjr) +* [22382ee](https://github.com/bcoe/yargs/commit/22382ee9f5b495bc2586c1758cd1091cec3647f9 various bug fixes for $0 (@nylen) + +### v3.7.1 (2015/04/10 11:06 -07:00) + +* [89e1992](https://github.com/bcoe/yargs/commit/89e1992a004ba73609b5f9ee6890c4060857aba4) detect iojs bin along with node bin. (@bcoe) +* [755509e](https://github.com/bcoe/yargs/commit/755509ea90041e5f7833bba3b8c5deffe56f0aab) improvements to example documentation in README.md (@rstacruz) +* [0d2dfc8](https://github.com/bcoe/yargs/commit/0d2dfc822a43418242908ad97ddd5291a1b35dc6) showHelp() no longer requires that .argv has been called (@bcoe) + +### v3.7.0 (2015/04/04 02:29 -07:00) + +* [56cbe2d](https://github.com/bcoe/yargs/commit/56cbe2ddd33dc176dcbf97ba40559864a9f114e4) make .requiresArg() work with type hints. (@bcoe). +* [2f5d562](https://github.com/bcoe/yargs/commit/2f5d5624f736741deeedf6a664d57bc4d857bdd0) serialize arrays and objects in usage strings. (@bcoe). +* [5126304](https://github.com/bcoe/yargs/commit/5126304dd18351fc28f10530616fdd9361e0af98) be more lenient about alias/primary key ordering in chaining API. (@bcoe) + +### v3.6.0 (2015/03/21 01:00 +00:00) +- [4e24e22](https://github.com/bcoe/yargs/commit/4e24e22e6a195e55ab943ede704a0231ac33b99c) support for .js configuration files. (@pirxpilot) + +### v3.5.4 (2015/03/12 05:56 +00:00) +- [c16cc08](https://github.com/bcoe/yargs/commit/c16cc085501155cf7fd853ccdf8584b05ab92b78) message for non-option arguments is now optional, thanks to (@raine) + +### v3.5.3 (2015/03/09 06:14 +00:00) +- [870b428](https://github.com/bcoe/yargs/commit/870b428cf515d560926ca392555b7ad57dba9e3d) completion script was missing in package.json (@bcoe) + +### v3.5.2 (2015/03/09 06:11 +00:00) +- [58a4b24](https://github.com/bcoe/yargs/commit/58a4b2473ebbb326713d522be53e32d3aabb08d2) parse was being called multiple times, resulting in strange behavior (@bcoe) + +### v3.5.1 (2015/03/09 04:55 +00:00) +- [4e588e0](https://github.com/bcoe/yargs/commit/4e588e055afbeb9336533095f051496e3977f515) accidentally left testing logic in (@bcoe) + +### v3.5.0 (2015/03/09 04:49 +00:00) +- [718bacd](https://github.com/bcoe/yargs/commit/718bacd81b9b44f786af76b2afe491fe06274f19) added support for bash completions see #4 (@bcoe) +- [a192882](https://github.com/bcoe/yargs/commit/a19288270fc431396c42af01125eeb4443664528) downgrade to mocha 2.1.0 until https://github.com/mochajs/mocha/issues/1585 can be sorted out (@bcoe) + +### v3.4.7 (2015/03/09 04:09 +00:00) +- [9845e5c](https://github.com/bcoe/yargs/commit/9845e5c1a9c684ba0be3f0bfb40e7b62ab49d9c8) the Argv singleton was not being updated when manually parsing arguments, fixes #114 (@bcoe) + +### v3.4.6 (2015/03/09 04:01 +00:00) +- [45b4c80](https://github.com/bcoe/yargs/commit/45b4c80b890d02770b0a94f326695a8a566e8fe9) set placeholders for all keys fixes #115 (@bcoe) + +### v3.4.5 (2015/03/01 20:31 +00:00) +- [a758e0b](https://github.com/bcoe/yargs/commit/a758e0b2556184f067cf3d9c4ef886d39817ebd2) fix for count consuming too many arguments (@bcoe) + +### v3.4.4 (2015/02/28 04:52 +00:00) +- [0476af7](https://github.com/bcoe/yargs/commit/0476af757966acf980d998b45108221d4888cfcb) added nargs feature, allowing you to specify the number of arguments after an option (@bcoe) +- [092477d](https://github.com/bcoe/yargs/commit/092477d7ab3efbf0ba11cede57f7d8cfc70b024f) updated README with full example of v3.0 API (@bcoe) + +### v3.3.3 (2015/02/28 04:23 +00:00) +- [0c4b769](https://github.com/bcoe/yargs/commit/0c4b769516cd8d93a7c4e5e675628ae0049aa9a8) remove string dependency, which conflicted with other libraries see #106 (@bcoe) + +### v3.3.2 (2015/02/28 04:11 +00:00) +- [2a98906](https://github.com/bcoe/yargs/commit/2a9890675821c0e7a12f146ce008b0562cb8ec9a) add $0 to epilog (@schnittstabil) + +### v3.3.1 (2015/02/24 03:28 +00:00) +- [ad485ce](https://github.com/bcoe/yargs/commit/ad485ce748ebdfce25b88ef9d6e83d97a2f68987) fix for applying defaults to camel-case args (@bcoe) + +### v3.3.0 (2015/02/24 00:49 +00:00) +- [8bfe36d](https://github.com/bcoe/yargs/commit/8bfe36d7fb0f93a799ea3f4c756a7467c320f8c0) fix and document restart() command, as a tool for building nested CLIs (@bcoe) + +### v3.2.1 (2015/02/22 05:45 +00:00) +- [49a6d18](https://github.com/bcoe/yargs/commit/49a6d1822a4ef9b1ea6f90cc366be60912628885) you can now provide a function that generates a default value (@bcoe) + +### v3.2.0 (2015/02/22 05:24 +00:00) +- [7a55886](https://github.com/bcoe/yargs/commit/7a55886c9343cf71a20744ca5cdd56d2ea7412d5) improvements to yargs two-column text layout (@bcoe) +- [b6ab513](https://github.com/bcoe/yargs/commit/b6ab5136a4c3fa6aa496f6b6360382e403183989) Tweak NPM version badge (@nylen) + +### v3.1.0 (2015/02/19 19:37 +00:00) +- [9bd2379](https://github.com/bcoe/yargs/commit/9bd237921cf1b61fd9f32c0e6d23f572fc225861) version now accepts a function, making it easy to load version #s from a package.json (@bcoe) + +### v3.0.4 (2015/02/14 01:40 +00:00) +- [0b7c19b](https://github.com/bcoe/yargs/commit/0b7c19beaecb747267ca4cc10e5cb2a8550bc4b7) various fixes for dot-notation handling (@bcoe) + +### v3.0.3 (2015/02/14 00:59 +00:00) +- [c3f35e9](https://github.com/bcoe/yargs/commit/c3f35e99bd5a0d278073fcadd95e2d778616cc17) make sure dot-notation is applied to aliases (@bcoe) + +### 3.0.2 (2015/02/13 16:50 +00:00) +- [74c8967](https://github.com/bcoe/yargs/commit/74c8967c340c204a0a7edf8a702b6f46c2705435) document epilog shorthand of epilogue. (@bcoe) +- [670110f](https://github.com/bcoe/yargs/commit/670110fc01bedc4831b6fec6afac54517d5a71bc) any non-truthy value now causes check to fail see #76 (@bcoe) +- [0d8f791](https://github.com/bcoe/yargs/commit/0d8f791a33c11ced4cd431ea8d3d3a337d456b56) finished implementing my wish-list of fetures for yargs 3.0. see #88 (@bcoe) +- [5768447](https://github.com/bcoe/yargs/commit/5768447447c4c8e8304f178846206ce86540f063) fix coverage. (@bcoe) +- [82e793f](https://github.com/bcoe/yargs/commit/82e793f3f61c41259eaacb67f0796aea2cf2aaa0) detect console width and perform word-wrapping. (@bcoe) +- [67476b3](https://github.com/bcoe/yargs/commit/67476b37eea07fee55f23f35b9e0c7d76682b86d) refactor two-column table layout so that we can use it for examples and usage (@bcoe) +- [4724cdf](https://github.com/bcoe/yargs/commit/4724cdfcc8e37ae1ca3dcce9d762f476e9ef4bb4) major refactor of index.js, in prep for 3.x release. (@bcoe) + +### v2.3.0 (2015/02/08 20:41 +00:00) +- [d824620](https://github.com/bcoe/yargs/commit/d824620493df4e63664af1fe320764dd1a9244e6) allow for undefined boolean defaults (@ashi009) + +### v2.2.0 (2015/02/08 20:07 +00:00) +- [d6edd98](https://github.com/bcoe/yargs/commit/d6edd9848826e7389ed1393858c45d03961365fd) in-prep for further refactoring, and a 3.x release I've shuffled some things around and gotten test-coverage to 100%. (@bcoe) + +### v2.1.2 (2015/02/08 06:05 +00:00) +- [d640745](https://github.com/bcoe/yargs/commit/d640745a7b9f8d476e0223879d056d18d9c265c4) switch to path.relative (@bcoe) +- [3bfd41f](https://github.com/bcoe/yargs/commit/3bfd41ff262a041f29d828b88936a79c63cad594) remove mocha.opts. (@bcoe) +- [47a2f35](https://github.com/bcoe/yargs/commit/47a2f357091db70903a402d6765501c1d63f15fe) document using .string('_') for string ids. see #56 (@bcoe) +- [#57](https://github.com/bcoe/yargs/pull/57) Merge pull request #57 from eush77/option-readme (@eush77) + +### v2.1.1 (2015/02/06 08:08 +00:00) +- [01c6c61](https://github.com/bcoe/yargs/commit/01c6c61d67b4ebf88f41f0b32a345ec67f0ac17d) fix for #71, 'newAliases' of undefined (@bcoe) + +### v2.1.0 (2015/02/06 07:59 +00:00) +- [6a1a3fa](https://github.com/bcoe/yargs/commit/6a1a3fa731958e26ccd56885f183dd8985cc828f) try to guess argument types, and apply sensible defaults see #73 (@bcoe) + +### v2.0.1 (2015/02/06 07:54 +00:00) +- [96a06b2](https://github.com/bcoe/yargs/commit/96a06b2650ff1d085a52b7328d8bba614c20cc12) Fix for strange behavior with --sort option, see #51 (@bcoe) + +### v2.0.0 (2015/02/06 07:45 +00:00) +- [0250517](https://github.com/bcoe/yargs/commit/0250517c9643e53f431b824e8ccfa54937414011) - [108fb84](https://github.com/bcoe/yargs/commit/108fb8409a3a63dcaf99d917fe4dfcfaa1de236d) fixed bug with boolean parsing, when bools separated by = see #66 (@bcoe) +- [a465a59](https://github.com/bcoe/yargs/commit/a465a5915f912715738de890982e4f8395958b10) Add `files` field to the package.json (@shinnn) +- [31043de](https://github.com/bcoe/yargs/commit/31043de7a38a17c4c97711f1099f5fb164334db3) fix for yargs.argv having the same keys added multiple times see #63 (@bcoe) +- [2d68c5b](https://github.com/bcoe/yargs/commit/2d68c5b91c976431001c4863ce47c9297850f1ad) Disable process.exit calls using .exitProcess(false) (@cianclarke) +- [45da9ec](https://github.com/bcoe/yargs/commit/45da9ec4c55a7bd394721bc6a1db0dabad7bc52a) Mention .option in README (@eush77) + +### v1.3.2 (2014/10/06 21:56 +00:00) +- [b8d3472](https://github.com/bcoe/yargs/commit/b8d34725482e5821a3cc809c0df71378f282f526) 1.3.2 (@chevex) + +### list (2014/08/30 18:41 +00:00) +- [fbc777f](https://github.com/bcoe/yargs/commit/fbc777f416eeefd37c84e44d27d7dfc7c1925721) Now that yargs is the successor to optimist, I'm changing the README language to be more universal. Pirate speak isn't very accessible to non-native speakers. (@chevex) +- [a54d068](https://github.com/bcoe/yargs/commit/a54d0682ae2efc2394d407ab171cc8a8bbd135ea) version output will not print extra newline (@boneskull) +- [1cef5d6](https://github.com/bcoe/yargs/commit/1cef5d62a9d6d61a3948a49574892e01932cc6ae) Added contributors section to package.json (@chrisn) +- [cc295c0](https://github.com/bcoe/yargs/commit/cc295c0a80a2de267e0155b60d315fc4b6f7c709) Added 'require' and 'required' as synonyms for 'demand' (@chrisn) +- [d0bf951](https://github.com/bcoe/yargs/commit/d0bf951d949066b6280101ed606593d079ee15c8) Updating minimist. (@chevex) +- [c15f8e7](https://github.com/bcoe/yargs/commit/c15f8e7f245b261e542cf205ce4f4313630cbdb4) Fix #31 (bad interaction between camelCase options and strict mode) (@nylen) +- [d991b9b](https://github.com/bcoe/yargs/commit/d991b9be687a68812dee1e3b185ba64b7778b82d) Added .help() and .version() methods (@chrisn) +- [e8c8aa4](https://github.com/bcoe/yargs/commit/e8c8aa46268379357cb11e9fc34b8c403037724b) Added .showHelpOnFail() method (@chrisn) +- [e855af4](https://github.com/bcoe/yargs/commit/e855af4a933ea966b5bbdd3c4c6397a4bac1a053) Allow boolean flag with .demand() (@chrisn) +- [14dbec2](https://github.com/bcoe/yargs/commit/14dbec24fb7380683198e2b20c4deb8423e64bea) Fixes issue #22. Arguments are no longer printed to the console when using .config. (@chevex) +- [bef74fc](https://github.com/bcoe/yargs/commit/bef74fcddc1544598a804f80d0a3728459f196bf) Informing users that Yargs is the official optimist successor. (@chevex) +- [#24](https://github.com/bcoe/yargs/pull/24) Merge pull request #24 from chrisn/strict (@chrisn) +- [889a2b2](https://github.com/bcoe/yargs/commit/889a2b28eb9768801b05163360a470d0fd6c8b79) Added requiresArg option, for options that require values (@chrisn) +- [eb16369](https://github.com/bcoe/yargs/commit/eb163692262be1fe80b992fd8803d5923c5a9b18) Added .strict() method, to report error if unknown arguments are given (@chrisn) +- [0471c3f](https://github.com/bcoe/yargs/commit/0471c3fd999e1ad4e6cded88b8aa02013b66d14f) Changed optimist to yargs in usage-options.js example (@chrisn) +- [5c88f74](https://github.com/bcoe/yargs/commit/5c88f74e3cf031b17c54b4b6606c83e485ff520e) Change optimist to yargs in examples (@chrisn) +- [66f12c8](https://github.com/bcoe/yargs/commit/66f12c82ba3c943e4de8ca862980e835da8ecb3a) Fix a couple of bad interactions between aliases and defaults (@nylen) +- [8fa1d80](https://github.com/bcoe/yargs/commit/8fa1d80f14b03eb1f2898863a61f1d1615bceb50) Document second argument of usage(message, opts) (@Gobie) +- [56e6528](https://github.com/bcoe/yargs/commit/56e6528cf674ff70d63083fb044ff240f608448e) For "--some-option", also set argv.someOption (@nylen) +- [ed5f6d3](https://github.com/bcoe/yargs/commit/ed5f6d33f57ad1086b11c91b51100f7c6c7fa8ee) Finished porting unit tests to Mocha. (@chevex) + +### v1.0.15 (2014/02/05 23:18 +00:00) +- [e2b1fc0](https://github.com/bcoe/yargs/commit/e2b1fc0c4a59cf532ae9b01b275e1ef57eeb64d2) 1.0.15 update to badges (@chevex) + +### v1.0.14 (2014/02/05 23:17 +00:00) +- [f33bbb0](https://github.com/bcoe/yargs/commit/f33bbb0f00fe18960f849cc8e15a7428a4cd59b8) Revert "Fixed issue which caused .demand function not to work correctly." (@chevex) + +### v1.0.13 (2014/02/05 22:13 +00:00) +- [6509e5e](https://github.com/bcoe/yargs/commit/6509e5e7dee6ef1a1f60eea104be0faa1a045075) Fixed issue which caused .demand function not to work correctly. (@chevex) + +### v1.0.12 (2013/12/13 00:09 +00:00) +- [05eb267](https://github.com/bcoe/yargs/commit/05eb26741c9ce446b33ff006e5d33221f53eaceb) 1.0.12 (@chevex) + +### v1.0.11 (2013/12/13 00:07 +00:00) +- [c1bde46](https://github.com/bcoe/yargs/commit/c1bde46e37318a68b87d17a50c130c861d6ce4a9) 1.0.11 (@chevex) + +### v1.0.10 (2013/12/12 23:57 +00:00) +- [dfebf81](https://github.com/bcoe/yargs/commit/dfebf8164c25c650701528ee581ca483a99dc21c) Fixed formatting in README (@chevex) + +### v1.0.9 (2013/12/12 23:47 +00:00) +- [0b4e34a](https://github.com/bcoe/yargs/commit/0b4e34af5e6d84a9dbb3bb6d02cd87588031c182) Update README.md (@chevex) + +### v1.0.8 (2013/12/06 16:36 +00:00) +- [#1](https://github.com/bcoe/yargs/pull/1) fix error caused by check() see #1 (@martinheidegger) + +### v1.0.7 (2013/11/24 18:01 +00:00) +- [a247d88](https://github.com/bcoe/yargs/commit/a247d88d6e46644cbb7303c18b1bb678fc132d72) Modified Pirate Joe image. (@chevex) + +### v1.0.6 (2013/11/23 19:21 +00:00) +- [d7f69e1](https://github.com/bcoe/yargs/commit/d7f69e1d34bc929736a8bdccdc724583e21b7eab) Updated Pirate Joe image. (@chevex) + +### v1.0.5 (2013/11/23 19:09 +00:00) +- [ece809c](https://github.com/bcoe/yargs/commit/ece809cf317cc659175e1d66d87f3ca68c2760be) Updated readme notice again. (@chevex) + +### v1.0.4 (2013/11/23 19:05 +00:00) +- [9e81e81](https://github.com/bcoe/yargs/commit/9e81e81654028f83ba86ffc3ac772a0476084e5e) Updated README with a notice about yargs being a fork of optimist and what that implies. (@chevex) + +### v1.0.3 (2013/11/23 17:43 +00:00) +- [65e7a78](https://github.com/bcoe/yargs/commit/65e7a782c86764944d63d084416aba9ee6019c5f) Changed some small wording in README.md. (@chevex) +- [459e20e](https://github.com/bcoe/yargs/commit/459e20e539b366b85128dd281ccd42221e96c7da) Fix a bug in the options function, when string and boolean options weren't applied to aliases. (@shockone) + +### v1.0.2 (2013/11/23 09:46 +00:00) +- [3d80ebe](https://github.com/bcoe/yargs/commit/3d80ebed866d3799224b6f7d596247186a3898a9) 1.0.2 (@chevex) + +### v1.0.1 (2013/11/23 09:39 +00:00) +- [f80ff36](https://github.com/bcoe/yargs/commit/f80ff3642d580d4b68bf9f5a94277481bd027142) Updated image. (@chevex) + +### v1.0.0 (2013/11/23 09:33 +00:00) +- [54e31d5](https://github.com/bcoe/yargs/commit/54e31d505f820b80af13644e460894b320bf25a3) Rebranded from optimist to yargs in the spirit of the fork :D (@chevex) +- [4ebb6c5](https://github.com/bcoe/yargs/commit/4ebb6c59f44787db7c24c5b8fe2680f01a23f498) Added documentation for demandCount(). (@chevex) +- [4561ce6](https://github.com/bcoe/yargs/commit/4561ce66dcffa95f49e8b4449b25b94cd68acb25) Simplified the error messages returned by .check(). (@chevex) +- [661c678](https://github.com/bcoe/yargs/commit/661c67886f479b16254a830b7e1db3be29e6b7a6) Fixed an issue with demand not accepting a zero value. (@chevex) +- [731dd3c](https://github.com/bcoe/yargs/commit/731dd3c37624790490bd6df4d5f1da8f4348279e) Add .fail(fn) so death isn't the only option. Should fix issue #39. (@chevex) +- [fa15417](https://github.com/bcoe/yargs/commit/fa15417ff9e70dace0d726627a5818654824c1d8) Added a few missing 'return self' (@chevex) +- [e655e4d](https://github.com/bcoe/yargs/commit/e655e4d99d1ae1d3695ef755d51c2de08d669761) Fix showing help in certain JS environments. (@chevex) +- [a746a31](https://github.com/bcoe/yargs/commit/a746a31cd47c87327028e6ea33762d6187ec5c87) Better string representation of default values. (@chevex) +- [6134619](https://github.com/bcoe/yargs/commit/6134619a7e90b911d5443230b644c5d447c1a68c) Implies: conditional demands (@chevex) +- [046b93b](https://github.com/bcoe/yargs/commit/046b93b5d40a27367af4cb29726e4d781d934639) Added support for JSON config files. (@chevex) +- [a677ec0](https://github.com/bcoe/yargs/commit/a677ec0a0ecccd99c75e571d03323f950688da03) Add .example(cmd, desc) feature. (@chevex) +- [1bd4375](https://github.com/bcoe/yargs/commit/1bd4375e11327ba1687d4bb6e5e9f3c30c1be2af) Added 'defaults' as alias to 'default' so as to avoid usage of a reserved keyword. (@chevex) +- [6b753c1](https://github.com/bcoe/yargs/commit/6b753c16ca09e723060e70b773b430323b29c45c) add .normalize(args..) support for normalizing paths (@chevex) +- [33d7d59](https://github.com/bcoe/yargs/commit/33d7d59341d364f03d3a25f0a55cb99004dbbe4b) Customize error messages with demand(key, msg) (@chevex) +- [647d37f](https://github.com/bcoe/yargs/commit/647d37f164c20f4bafbf67dd9db6cd6e2cd3b49f) Merge branch 'rewrite-duplicate-test' of github.com:isbadawi/node-optimist (@chevex) +- [9059d1a](https://github.com/bcoe/yargs/commit/9059d1ad5e8aea686c2a01c89a23efdf929fff2e) Pass aliases object to check functions for greater versatility. (@chevex) +- [623dc26](https://github.com/bcoe/yargs/commit/623dc26c7331abff2465ef8532e3418996d42fe6) Added ability to count boolean options and rolled minimist library back into project. (@chevex) +- [49f0dce](https://github.com/bcoe/yargs/commit/49f0dcef35de4db544c3966350d36eb5838703f6) Fixed small typo. (@chevex) +- [79ec980](https://github.com/bcoe/yargs/commit/79ec9806d9ca6eb0014cfa4b6d1849f4f004baf2) Removed dependency on wordwrap module. (@chevex) +- [ea14630](https://github.com/bcoe/yargs/commit/ea14630feddd69d1de99dd8c0e08948f4c91f00a) Merge branch 'master' of github.com:chbrown/node-optimist (@chevex) +- [2b75da2](https://github.com/bcoe/yargs/commit/2b75da2624061e0f4f3107d20303c06ec9054906) Merge branch 'master' of github.com:seanzhou1023/node-optimist (@chevex) +- [d9bda11](https://github.com/bcoe/yargs/commit/d9bda1116e26f3b40e833ca9ca19263afea53565) Merge branch 'patch-1' of github.com:thefourtheye/node-optimist (@chevex) +- [d6cc606](https://github.com/bcoe/yargs/commit/d6cc6064a4f1bea38a16a4430b8a1334832fbeff) Renamed README. (@chevex) +- [9498d3f](https://github.com/bcoe/yargs/commit/9498d3f59acfb5e102826503e681623c3a64b178) Renamed readme and added .gitignore. (@chevex) +- [bbd1fe3](https://github.com/bcoe/yargs/commit/bbd1fe37fefa366dde0fb3dc44d91fe8b28f57f5) Included examples for ```help``` and ```showHelp``` functions and fixed few formatting issues (@thefourtheye) +- [37fea04](https://github.com/bcoe/yargs/commit/37fea0470a5796a0294c1dcfff68d8041650e622) .alias({}) behaves differently based on mapping direction when generating descriptions (@chbrown) +- [855b20d](https://github.com/bcoe/yargs/commit/855b20d0be567ca121d06b30bea64001b74f3d6d) Documented function signatures are useful for dynamically typed languages. (@chbrown) + +### 0.6.0 (2013/06/25 08:48 +00:00) +- [d37bfe0](https://github.com/bcoe/yargs/commit/d37bfe05ae6d295a0ab481efe4881222412791f4) all tests passing using minimist (@substack) +- [76f1352](https://github.com/bcoe/yargs/commit/76f135270399d01f2bbc621e524a5966e5c422fd) all parse tests now passing (@substack) +- [a7b6754](https://github.com/bcoe/yargs/commit/a7b6754276c38d1565479a5685c3781aeb947816) using minimist, some tests passing (@substack) +- [6655688](https://github.com/bcoe/yargs/commit/66556882aa731cbbbe16cc4d42c85740a2e98099) Give credit where its due (@DeadAlready) +- [602a2a9](https://github.com/bcoe/yargs/commit/602a2a92a459f93704794ad51b115bbb08b535ce) v0.5.3 - Remove wordwrap as dependency (@DeadAlready) + +### 0.5.2 (2013/05/31 03:46 +00:00) +- [4497ca5](https://github.com/bcoe/yargs/commit/4497ca55e332760a37b866ec119ded347ca27a87) fixed the whitespace bug without breaking anything else (@substack) +- [5a3dd1a](https://github.com/bcoe/yargs/commit/5a3dd1a4e0211a38613c6e02f61328e1031953fa) failing test for whitespace arg (@substack) + +### 0.5.1 (2013/05/30 07:17 +00:00) +- [a20228f](https://github.com/bcoe/yargs/commit/a20228f62a454755dd07f628a7c5759113918327) fix parse() to work with functions before it (@substack) +- [b13bd4c](https://github.com/bcoe/yargs/commit/b13bd4cac856a9821d42fa173bdb58f089365a7d) failing test for parse() with modifiers (@substack) + +### 0.5.0 (2013/05/18 21:59 +00:00) +- [c474a64](https://github.com/bcoe/yargs/commit/c474a649231527915c222156e3b40806d365a87c) fixes for dash (@substack) + +### 0.4.0 (2013/04/13 19:03 +00:00) +- [dafe3e1](https://github.com/bcoe/yargs/commit/dafe3e18d7c6e7c2d68e06559df0e5cbea3adb14) failing short test (@substack) + +### 0.3.7 (2013/04/04 04:07 +00:00) +- [6c7a0ec](https://github.com/bcoe/yargs/commit/6c7a0ec94ce4199a505f0518b4d6635d4e47cc81) Fix for windows. On windows there is no _ in environment. (@hdf) + +### 0.3.6 (2013/04/04 04:04 +00:00) +- [e72346a](https://github.com/bcoe/yargs/commit/e72346a727b7267af5aa008b418db89970873f05) Add support for newlines in -a="" arguments (@danielbeardsley) +- [71e1fb5](https://github.com/bcoe/yargs/commit/71e1fb55ea9987110a669ac6ec12338cfff3821c) drop 0.4, add 0.8 to travis (@substack) + +### 0.3.5 (2012/10/10 11:09 +00:00) +- [ee692b3](https://github.com/bcoe/yargs/commit/ee692b37554c70a0bb16389a50a26b66745cbbea) Fix parsing booleans (@vojtajina) +- [5045122](https://github.com/bcoe/yargs/commit/5045122664c3f5b4805addf1be2148d5856f7ce8) set $0 properly in the tests (@substack) + +### 0.3.4 (2012/04/30 06:54 +00:00) +- [f28c0e6](https://github.com/bcoe/yargs/commit/f28c0e62ca94f6e0bb2e6d82fc3d91a55e69b903) bump for string "true" params (@substack) +- [8f44aeb](https://github.com/bcoe/yargs/commit/8f44aeb74121ddd689580e2bf74ef86a605e9bf2) Fix failing test for aliased booleans. (@coderarity) +- [b9f7b61](https://github.com/bcoe/yargs/commit/b9f7b613b1e68e11e6c23fbda9e555a517dcc976) Add failing test for short aliased booleans. (@coderarity) + +### 0.3.3 (2012/04/30 06:45 +00:00) +- [541bac8](https://github.com/bcoe/yargs/commit/541bac8dd787a5f1a5d28f6d8deb1627871705e7) Fixes #37. + +### 0.3.2 (2012/04/12 20:28 +00:00) +- [3a0f014](https://github.com/bcoe/yargs/commit/3a0f014c1451280ac1c9caa1f639d31675586eec) travis badge (@substack) +- [4fb60bf](https://github.com/bcoe/yargs/commit/4fb60bf17845f4ce3293f8ca49c9a1a7c736cfce) Fix boolean aliases. (@coderarity) +- [f14dda5](https://github.com/bcoe/yargs/commit/f14dda546efc4fe06ace04d36919bfbb7634f79b) Adjusted package.json to use tap (@jfhbrook) +- [88e5d32](https://github.com/bcoe/yargs/commit/88e5d32295be6e544c8d355ff84e355af38a1c74) test/usage.js no longer hangs (@jfhbrook) +- [e1e740c](https://github.com/bcoe/yargs/commit/e1e740c27082f3ce84deca2093d9db2ef735d0e5) two tests for combined boolean/alias opts parsing (@jfhbrook) + +### 0.3.1 (2011/12/31 08:44 +00:00) +- [d09b719](https://github.com/bcoe/yargs/commit/d09b71980ef711b6cf3918cd19beec8257e40e82) If "default" is set to false it was not passed on, fixed. (@wolframkriesing) + +### 0.3.0 (2011/12/09 06:03 +00:00) +- [6e74aa7](https://github.com/bcoe/yargs/commit/6e74aa7b46a65773e20c0cb68d2d336d4a0d553d) bump and documented dot notation (@substack) + +### 0.2.7 (2011/10/20 02:25 +00:00) +- [94adee2](https://github.com/bcoe/yargs/commit/94adee20e17b58d0836f80e8b9cdbe9813800916) argv._ can be told 'Hey! argv._! Don't be messing with my args.', and it WILL obey (@colinta) +- [c46fdd5](https://github.com/bcoe/yargs/commit/c46fdd56a05410ae4a1e724a4820c82e77ff5469) optimistic critter image (@substack) +- [5c95c73](https://github.com/bcoe/yargs/commit/5c95c73aedf4c7482bd423e10c545e86d7c8a125) alias options() to option() (@substack) +- [f7692ea](https://github.com/bcoe/yargs/commit/f7692ea8da342850af819367833abb685fde41d8) [fix] Fix for parsing boolean edge case (@indexzero) +- [d1f92d1](https://github.com/bcoe/yargs/commit/d1f92d1425bd7f356055e78621b30cdf9741a3c2) +- [b01bda8](https://github.com/bcoe/yargs/commit/b01bda8d86e455bbf74ce497864cb8ab5b9fb847) [fix test] Update to ensure optimist is aware of default booleans. Associated tests included (@indexzero) +- [aa753e7](https://github.com/bcoe/yargs/commit/aa753e7c54fb3a12f513769a0ff6d54aa0f63943) [dist test] Update devDependencies in package.json. Update test pathing to be more npm and require.paths future-proof (@indexzero) +- [7bfce2f](https://github.com/bcoe/yargs/commit/7bfce2f3b3c98e6539e7549d35fbabced7e9341e) s/sys/util/ (@substack) +- [d420a7a](https://github.com/bcoe/yargs/commit/d420a7a9c890d2cdb11acfaf3ea3f43bc3e39f41) update usage output (@substack) +- [cf86eed](https://github.com/bcoe/yargs/commit/cf86eede2e5fc7495b6ec15e6d137d9ac814f075) some sage readme protips about parsing rules (@substack) +- [5da9f7a](https://github.com/bcoe/yargs/commit/5da9f7a5c0e1758ec7c5801fb3e94d3f6e970513) documented all the methods finally (@substack) +- [8ca6879](https://github.com/bcoe/yargs/commit/8ca6879311224b25933642987300f6a29de5c21b) fenced syntax highlighting (@substack) +- [b72bacf](https://github.com/bcoe/yargs/commit/b72bacf1d02594778c1935405bc8137eb61761dc) right-alignment of wrapped extra params (@substack) +- [2b980bf](https://github.com/bcoe/yargs/commit/2b980bf2656b4ee8fc5134dc5f56a48855c35198) now with .wrap() (@substack) +- [d614f63](https://github.com/bcoe/yargs/commit/d614f639654057d1b7e35e3f5a306e88ec2ad1e4) don't show 'Options:' when there aren't any (@substack) +- [691eda3](https://github.com/bcoe/yargs/commit/691eda354df97b5a86168317abcbcaabdc08a0fb) failing test for multi-aliasing (@substack) +- [0826c9f](https://github.com/bcoe/yargs/commit/0826c9f462109feab2bc7a99346d22e72bf774b7) "Options:" > "options:" (@substack) +- [72f7490](https://github.com/bcoe/yargs/commit/72f749025d01b7f295738ed370a669d885fbada0) [minor] Update formatting for `.showHelp()` (@indexzero) +- [75aecce](https://github.com/bcoe/yargs/commit/75aeccea74329094072f95800e02c275e7d999aa) options works again, too lazy to write a proper test right now (@substack) +- [f742e54](https://github.com/bcoe/yargs/commit/f742e5439817c662dc3bd8734ddd6467e6018cfd) line_count_options example, which breaks (@substack) +- [4ca06b8](https://github.com/bcoe/yargs/commit/4ca06b8b4ea99b5d5714b315a2a8576bee6e5537) line count example (@substack) +- [eeb8423](https://github.com/bcoe/yargs/commit/eeb8423e0a5ecc9dc3eb1e6df9f3f8c1c88f920b) remove self.argv setting in boolean (@substack) +- [6903412](https://github.com/bcoe/yargs/commit/69034126804660af9cc20ea7f4457b50338ee3d7) removed camel case for now (@substack) +- [5a0d88b](https://github.com/bcoe/yargs/commit/5a0d88bf23e9fa79635dd034e2a1aa992acc83cd) remove dead longest checking code (@substack) +- [d782170](https://github.com/bcoe/yargs/commit/d782170babf7284b1aa34f5350df0dd49c373fa8) .help() too (@substack) +- [622ec17](https://github.com/bcoe/yargs/commit/622ec17379bb5374fdbb190404c82bc600975791) rm old help generator (@substack) +- [7c8baac](https://github.com/bcoe/yargs/commit/7c8baac4d66195e9f5158503ea9ebfb61153dab7) nub keys (@substack) +- [8197785](https://github.com/bcoe/yargs/commit/8197785ad4762465084485b041abd722f69bf344) generate help message based on the previous calls, todo: nub (@substack) +- [3ffbdc3](https://github.com/bcoe/yargs/commit/3ffbdc33c8f5e83d4ea2ac60575ce119570c7ede) stub out new showHelp, better checks (@substack) +- [d4e21f5](https://github.com/bcoe/yargs/commit/d4e21f56a4830f7de841900d3c79756fb9886184) let .options() take single options too (@substack) +- [3c4cf29](https://github.com/bcoe/yargs/commit/3c4cf2901a29bac119cca8e983028d8669230ec6) .options() is now heaps simpler (@substack) +- [89f0d04](https://github.com/bcoe/yargs/commit/89f0d043cbccd302f10ab30c2069e05d2bf817c9) defaults work again, all tests pass (@substack) +- [dd87333](https://github.com/bcoe/yargs/commit/dd8733365423006a6e4156372ebb55f98323af58) update test error messages, down to 2 failing tests (@substack) +- [53f7bc6](https://github.com/bcoe/yargs/commit/53f7bc626b9875f2abdfc5dd7a80bde7f14143a3) fix for bools doubling up, passes the parse test again, others fail (@substack) +- [2213e2d](https://github.com/bcoe/yargs/commit/2213e2ddc7263226fba717fb041dc3fde9bc2ee4) refactored for an argv getter, failing several tests (@substack) +- [d1e7379](https://github.com/bcoe/yargs/commit/d1e737970f15c6c006bebdd8917706827ff2f0f2) just rescan for now, alias test passes (@substack) +- [b2f8c99](https://github.com/bcoe/yargs/commit/b2f8c99cc477a8eb0fdf4cf178e1785b63185cfd) failing alias test (@substack) +- [d0c0174](https://github.com/bcoe/yargs/commit/d0c0174daa144bfb6dc7290fdc448c393c475e15) .alias() (@substack) +- [d85f431](https://github.com/bcoe/yargs/commit/d85f431ad7d07b058af3f2a57daa51495576c164) [api] Remove `.describe()` in favor of building upon the existing `.usage()` API (@indexzero) +- [edbd527](https://github.com/bcoe/yargs/commit/edbd5272a8e213e71acd802782135c7f9699913a) [doc api] Add `.describe()`, `.options()`, and `.showHelp()` methods along with example. (@indexzero) +- [be4902f](https://github.com/bcoe/yargs/commit/be4902ff0961ae8feb9093f2c0a4066463ded2cf) updates for coffee since it now does argv the node way (@substack) +- [e24cb23](https://github.com/bcoe/yargs/commit/e24cb23798ee64e53b60815e7fda78b87f42390c) more general coffeescript detection (@substack) +- [78ac753](https://github.com/bcoe/yargs/commit/78ac753e5d0ec32a96d39d893272afe989e42a4d) Don't trigger the CoffeeScript hack when running under node_g. (@papandreou) +- [bcfe973](https://github.com/bcoe/yargs/commit/bcfe9731d7f90d4632281b8a52e8d76eb0195ae6) .string() but failing test (@substack) +- [1987aca](https://github.com/bcoe/yargs/commit/1987aca28c7ba4e8796c07bbc547cb984804c826) test hex strings (@substack) +- [ef36db3](https://github.com/bcoe/yargs/commit/ef36db32259b0b0d62448dc907c760e5554fb7e7) more keywords (@substack) +- [cc53c56](https://github.com/bcoe/yargs/commit/cc53c56329960bed6ab077a79798e991711ba01d) Added camelCase function that converts --multi-word-option to camel case (so it becomes argv.multiWordOption). (@papandreou) +- [60b57da](https://github.com/bcoe/yargs/commit/60b57da36797716e5783a633c6d5c79099016d45) fixed boolean bug by rescanning (@substack) +- [dff6d07](https://github.com/bcoe/yargs/commit/dff6d078d97f8ac503c7d18dcc7b7a8c364c2883) boolean examples (@substack) +- [0e380b9](https://github.com/bcoe/yargs/commit/0e380b92c4ef4e3c8dac1da18b5c31d85b1d02c9) boolean() with passing test (@substack) +- [62644d4](https://github.com/bcoe/yargs/commit/62644d4bffbb8d1bbf0c2baf58a1d14a6359ef07) coffee compatibility with node regex for versions too (@substack) +- [430fafc](https://github.com/bcoe/yargs/commit/430fafcf1683d23774772826581acff84b456827) argv._ fixed by fixing the coffee detection (@substack) +- [343b8af](https://github.com/bcoe/yargs/commit/343b8afefd98af274ebe21b5a16b3a949ec5429f) whichNodeArgs test fails too (@substack) +- [63df2f3](https://github.com/bcoe/yargs/commit/63df2f371f31e63d7f1dec2cbf0022a5f08da9d2) replicated mnot's bug in whichNodeEmpty test (@substack) +- [35473a4](https://github.com/bcoe/yargs/commit/35473a4d93a45e5e7e512af8bb54ebb532997ae1) test for ./bin usage (@substack) +- [13df151](https://github.com/bcoe/yargs/commit/13df151e44228eed10e5441c7cd163e086c458a4) don't coerce booleans to numbers (@substack) +- [85f8007](https://github.com/bcoe/yargs/commit/85f8007e93b8be7124feea64b1f1916d8ba1894a) package bump for automatic number conversion (@substack) +- [8f17014](https://github.com/bcoe/yargs/commit/8f170141cded4ccc0c6d67a849c5bf996aa29643) updated readme and examples with new auto-numberification goodness (@substack) +- [73dc901](https://github.com/bcoe/yargs/commit/73dc9011ac968e39b55e19e916084a839391b506) auto number conversion works yay (@substack) +- [bcec56b](https://github.com/bcoe/yargs/commit/bcec56b3d031e018064cbb691539ccc4f28c14ad) failing test for not-implemented auto numification (@substack) +- [ebd2844](https://github.com/bcoe/yargs/commit/ebd2844d683feeac583df79af0e5124a7a7db04e) odd that eql doesn't check types careflly (@substack) +- [fd854b0](https://github.com/bcoe/yargs/commit/fd854b02e512ce854b76386d395672a7969c1bc4) package author + keywords (@substack) +- [656a1d5](https://github.com/bcoe/yargs/commit/656a1d5a1b7c0e49d72e80cb13f20671d56f76c6) updated readme with .default() stuff (@substack) +- [cd7f8c5](https://github.com/bcoe/yargs/commit/cd7f8c55f0b82b79b690d14c5f806851236998a1) passing tests for new .default() behavior (@substack) +- [932725e](https://github.com/bcoe/yargs/commit/932725e39ce65bc91a0385a5fab659a5fa976ac2) new default() thing for setting default key/values (@substack) +- [4e6c7ab](https://github.com/bcoe/yargs/commit/4e6c7aba6374ac9ebc6259ecf91f13af7bce40e3) test for coffee usage (@substack) +- [d54ffcc](https://github.com/bcoe/yargs/commit/d54ffccf2a5a905f51ed5108f7c647f35d64ae23) new --key value style with passing tests. NOTE: changes existing behavior (@substack) +- [ed2a2d5](https://github.com/bcoe/yargs/commit/ed2a2d5d828100ebeef6385c0fb88d146a5cfe9b) package bump for summatix's coffee script fix (@substack) +- [75a975e](https://github.com/bcoe/yargs/commit/75a975eed8430d28e2a79dc9e6d819ad545f4587) Added support for CoffeeScript (@summatix) +- [56b2b1d](https://github.com/bcoe/yargs/commit/56b2b1de8d11f8a2b91979d8ae2d6db02d8fe64d) test coverage for the falsy check() usage (@substack) +- [a4843a9](https://github.com/bcoe/yargs/commit/a4843a9f0e69ffb4afdf6a671d89eb6f218be35d) check bug fixed plus a handy string (@substack) +- [857bd2d](https://github.com/bcoe/yargs/commit/857bd2db933a5aaa9cfecba0ced2dc9b415f8111) tests for demandCount, back up to 100% coverage (@substack) +- [073b776](https://github.com/bcoe/yargs/commit/073b7768ebd781668ef05c13f9003aceca2f5c35) call demandCount from demand (@substack) +- [4bd4b7a](https://github.com/bcoe/yargs/commit/4bd4b7a085c8b6ce1d885a0f486cc9865cee2db1) add demandCount to check for the number of arguments in the _ list (@marshall) +- [b8689ac](https://github.com/bcoe/yargs/commit/b8689ac68dacf248119d242bba39a41cb0adfa07) Rebase checks. That will be its own module eventually. (@substack) +- [e688370](https://github.com/bcoe/yargs/commit/e688370b576f0aa733c3f46183df69e1b561668e) a $0 like in perl (@substack) +- [2e5e196](https://github.com/bcoe/yargs/commit/2e5e1960fc19afb21fb3293752316eaa8bcd3609) usage test hacking around process and console (@substack) +- [fcc3521](https://github.com/bcoe/yargs/commit/fcc352163fbec6a1dfe8caf47a0df39de24fe016) description pun (@substack) +- [87a1fe2](https://github.com/bcoe/yargs/commit/87a1fe29037ca2ca5fefda85141aaeb13e8ce761) mit/x11 license (@substack) +- [8d089d2](https://github.com/bcoe/yargs/commit/8d089d24cd687c0bde3640a96c09b78f884900dd) bool example is more consistent and also shows off short option grouping (@substack) +- [448d747](https://github.com/bcoe/yargs/commit/448d7473ac68e8e03d8befc9457b0d9e21725be0) start of the readme and examples (@substack) +- [da74dea](https://github.com/bcoe/yargs/commit/da74dea799a9b59dbf022cbb8001bfdb0d52eec9) more tests for long and short captures (@substack) +- [ab6387e](https://github.com/bcoe/yargs/commit/ab6387e6769ca4af82ca94c4c67c7319f0d9fcfa) silly bug in the tests with s/not/no/, all tests pass now (@substack) +- [102496a](https://github.com/bcoe/yargs/commit/102496a319e8e06f6550d828fc2f72992c7d9ecc) hack an instance for process.argv onto Argv so the export can be called to create an instance or used for argv, which is the most common case (@substack) +- [a01caeb](https://github.com/bcoe/yargs/commit/a01caeb532546d19f68f2b2b87f7036cfe1aaedd) divide example (@substack) +- [443da55](https://github.com/bcoe/yargs/commit/443da55736acbaf8ff8b04d1b9ce19ab016ddda2) start of the lib with a package.json (@substack) diff --git a/node_modules/sass-graph/node_modules/yargs/LICENSE b/node_modules/sass-graph/node_modules/yargs/LICENSE new file mode 100644 index 00000000..747ab114 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/LICENSE @@ -0,0 +1,22 @@ +Copyright 2010 James Halliday (mail@substack.net) +Modified work Copyright 2014 Contributors (ben@npmjs.com) + +This project is free software released under the MIT/X11 license: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/sass-graph/node_modules/yargs/README.md b/node_modules/sass-graph/node_modules/yargs/README.md new file mode 100644 index 00000000..6b7d0966 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/README.md @@ -0,0 +1,122 @@ +

      + +

      +

      Yargs

      +

      + Yargs be a node.js library fer hearties tryin' ter parse optstrings +

      +
      + +[![Build Status][travis-image]][travis-url] +[![Coverage Status][coveralls-image]][coveralls-url] +[![NPM version][npm-image]][npm-url] +[![js-standard-style][standard-image]][standard-url] +[![Conventional Commits][conventional-commits-image]][conventional-commits-url] +[![Slack][slack-image]][slack-url] + +## Description : +Yargs helps you build interactive command line tools, by parsing arguments and generating an elegant user interface. + +It gives you: + +* commands and (grouped) options (`my-program.js serve --port=5000`). +* a dynamically generated help menu based on your arguments. + +> + +* bash-completion shortcuts for commands and options. +* and [tons more](/docs/api.md). + +## Installation + +Stable version: +```bash +npm i yargs +``` + +Bleeding edge version with the most recent features: +```bash +npm i yargs@next +``` + +## Usage : + +### Simple Example + +````javascript +#!/usr/bin/env node +const argv = require('yargs').argv + +if (argv.ships > 3 && argv.distance < 53.5) { + console.log('Plunder more riffiwobbles!') +} else { + console.log('Retreat from the xupptumblers!') +} +```` + +```bash +$ ./plunder.js --ships=4 --distance=22 +Plunder more riffiwobbles! + +$ ./plunder.js --ships 12 --distance 98.7 +Retreat from the xupptumblers! +``` + +### Complex Example + +```javascript +#!/usr/bin/env node +require('yargs') // eslint-disable-line + .command('serve [port]', 'start the server', (yargs) => { + yargs + .positional('port', { + describe: 'port to bind on', + default: 5000 + }) + }, (argv) => { + if (argv.verbose) console.info(`start server on :${argv.port}`) + serve(argv.port) + }) + .option('verbose', { + alias: 'v', + default: false + }) + .argv +``` + +Run the example above with `--help` to see the help for the application. + +## Community : + +Having problems? want to contribute? join our [community slack](http://devtoolscommunity.herokuapp.com). + +## Documentation : + +### Table of Contents + +* [Yargs' API](/docs/api.md) +* [Examples](/docs/examples.md) +* [Parsing Tricks](/docs/tricks.md) + * [Stop the Parser](/docs/tricks.md#stop) + * [Negating Boolean Arguments](/docs/tricks.md#negate) + * [Numbers](/docs/tricks.md#numbers) + * [Arrays](/docs/tricks.md#arrays) + * [Objects](/docs/tricks.md#objects) +* [Advanced Topics](/docs/advanced.md) + * [Composing Your App Using Commands](/docs/advanced.md#commands) + * [Building Configurable CLI Apps](/docs/advanced.md#configuration) + * [Customizing Yargs' Parser](/docs/advanced.md#customizing) +* [Contributing](/contributing.md) + +[travis-url]: https://travis-ci.org/yargs/yargs +[travis-image]: https://img.shields.io/travis/yargs/yargs/master.svg +[coveralls-url]: https://coveralls.io/github/yargs/yargs +[coveralls-image]: https://img.shields.io/coveralls/yargs/yargs.svg +[npm-url]: https://www.npmjs.com/package/yargs +[npm-image]: https://img.shields.io/npm/v/yargs.svg +[standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg +[standard-url]: http://standardjs.com/ +[conventional-commits-image]: https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg +[conventional-commits-url]: https://conventionalcommits.org/ +[slack-image]: http://devtoolscommunity.herokuapp.com/badge.svg +[slack-url]: http://devtoolscommunity.herokuapp.com diff --git a/node_modules/sass-graph/node_modules/yargs/index.js b/node_modules/sass-graph/node_modules/yargs/index.js new file mode 100644 index 00000000..dfed54bc --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/index.js @@ -0,0 +1,32 @@ +'use strict' +// classic singleton yargs API, to use yargs +// without running as a singleton do: +// require('yargs/yargs')(process.argv.slice(2)) +const yargs = require('./yargs') + +Argv(process.argv.slice(2)) + +module.exports = Argv + +function Argv (processArgs, cwd) { + const argv = yargs(processArgs, cwd, require) + singletonify(argv) + return argv +} + +/* Hack an instance of Argv with process.argv into Argv + so people can do + require('yargs')(['--beeble=1','-z','zizzle']).argv + to parse a list of args and + require('yargs').argv + to get a parsed version of process.argv. +*/ +function singletonify (inst) { + Object.keys(inst).forEach((key) => { + if (key === 'argv') { + Argv.__defineGetter__(key, inst.__lookupGetter__(key)) + } else { + Argv[key] = typeof inst[key] === 'function' ? inst[key].bind(inst) : inst[key] + } + }) +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/be.json b/node_modules/sass-graph/node_modules/yargs/locales/be.json new file mode 100644 index 00000000..141ebe1e --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/be.json @@ -0,0 +1,39 @@ +{ + "Commands:": "Каманды:", + "Options:": "Опцыі:", + "Examples:": "Прыклады:", + "boolean": "булевы тып", + "count": "падлік", + "string": "радковы тып", + "number": "лік", + "array": "масіў", + "required": "неабходна", + "default:": "па змаўчанні:", + "choices:": "магчымасці:", + "aliases:": "аліасы:", + "generated-value": "згенераванае значэнне", + "Not enough non-option arguments: got %s, need at least %s": "Недастаткова неапцыйных аргументаў: ёсць %s, трэба як мінімум %s", + "Too many non-option arguments: got %s, maximum of %s": "Занадта шмат неапцыйных аргументаў: ёсць %s, максімум дапушчальна %s", + "Missing argument value: %s": { + "one": "Не хапае значэння аргументу: %s", + "other": "Не хапае значэнняў аргументаў: %s" + }, + "Missing required argument: %s": { + "one": "Не хапае неабходнага аргументу: %s", + "other": "Не хапае неабходных аргументаў: %s" + }, + "Unknown argument: %s": { + "one": "Невядомы аргумент: %s", + "other": "Невядомыя аргументы: %s" + }, + "Invalid values:": "Несапраўдныя значэння:", + "Argument: %s, Given: %s, Choices: %s": "Аргумент: %s, Дадзенае значэнне: %s, Магчымасці: %s", + "Argument check failed: %s": "Праверка аргументаў не ўдалася: %s", + "Implications failed:": "Дадзены аргумент патрабуе наступны дадатковы аргумент:", + "Not enough arguments following: %s": "Недастаткова наступных аргументаў: %s", + "Invalid JSON config file: %s": "Несапраўдны файл канфігурацыі JSON: %s", + "Path to JSON config file": "Шлях да файла канфігурацыі JSON", + "Show help": "Паказаць дапамогу", + "Show version number": "Паказаць нумар версіі", + "Did you mean %s?": "Вы мелі на ўвазе %s?" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/de.json b/node_modules/sass-graph/node_modules/yargs/locales/de.json new file mode 100644 index 00000000..05d98373 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/de.json @@ -0,0 +1,39 @@ +{ + "Commands:": "Kommandos:", + "Options:": "Optionen:", + "Examples:": "Beispiele:", + "boolean": "boolean", + "count": "Zähler", + "string": "string", + "number": "Zahl", + "array": "array", + "required": "erforderlich", + "default:": "Standard:", + "choices:": "Möglichkeiten:", + "aliases:": "Aliase:", + "generated-value": "Generierter-Wert", + "Not enough non-option arguments: got %s, need at least %s": "Nicht genügend Argumente ohne Optionen: %s vorhanden, mindestens %s benötigt", + "Too many non-option arguments: got %s, maximum of %s": "Zu viele Argumente ohne Optionen: %s vorhanden, maximal %s erlaubt", + "Missing argument value: %s": { + "one": "Fehlender Argumentwert: %s", + "other": "Fehlende Argumentwerte: %s" + }, + "Missing required argument: %s": { + "one": "Fehlendes Argument: %s", + "other": "Fehlende Argumente: %s" + }, + "Unknown argument: %s": { + "one": "Unbekanntes Argument: %s", + "other": "Unbekannte Argumente: %s" + }, + "Invalid values:": "Unzulässige Werte:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gegeben: %s, Möglichkeiten: %s", + "Argument check failed: %s": "Argumente-Check fehlgeschlagen: %s", + "Implications failed:": "Fehlende abhängige Argumente:", + "Not enough arguments following: %s": "Nicht genügend Argumente nach: %s", + "Invalid JSON config file: %s": "Fehlerhafte JSON-Config Datei: %s", + "Path to JSON config file": "Pfad zur JSON-Config Datei", + "Show help": "Hilfe anzeigen", + "Show version number": "Version anzeigen", + "Did you mean %s?": "Meintest du %s?" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/en.json b/node_modules/sass-graph/node_modules/yargs/locales/en.json new file mode 100644 index 00000000..b32a63f2 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/en.json @@ -0,0 +1,42 @@ +{ + "Commands:": "Commands:", + "Options:": "Options:", + "Examples:": "Examples:", + "boolean": "boolean", + "count": "count", + "string": "string", + "number": "number", + "array": "array", + "required": "required", + "default:": "default:", + "choices:": "choices:", + "aliases:": "aliases:", + "generated-value": "generated-value", + "Not enough non-option arguments: got %s, need at least %s": "Not enough non-option arguments: got %s, need at least %s", + "Too many non-option arguments: got %s, maximum of %s": "Too many non-option arguments: got %s, maximum of %s", + "Missing argument value: %s": { + "one": "Missing argument value: %s", + "other": "Missing argument values: %s" + }, + "Missing required argument: %s": { + "one": "Missing required argument: %s", + "other": "Missing required arguments: %s" + }, + "Unknown argument: %s": { + "one": "Unknown argument: %s", + "other": "Unknown arguments: %s" + }, + "Invalid values:": "Invalid values:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Given: %s, Choices: %s", + "Argument check failed: %s": "Argument check failed: %s", + "Implications failed:": "Missing dependent arguments:", + "Not enough arguments following: %s": "Not enough arguments following: %s", + "Invalid JSON config file: %s": "Invalid JSON config file: %s", + "Path to JSON config file": "Path to JSON config file", + "Show help": "Show help", + "Show version number": "Show version number", + "Did you mean %s?": "Did you mean %s?", + "Arguments %s and %s are mutually exclusive" : "Arguments %s and %s are mutually exclusive", + "Positionals:": "Positionals:", + "command": "command" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/es.json b/node_modules/sass-graph/node_modules/yargs/locales/es.json new file mode 100644 index 00000000..d7c8af9f --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/es.json @@ -0,0 +1,39 @@ +{ + "Commands:": "Comandos:", + "Options:": "Opciones:", + "Examples:": "Ejemplos:", + "boolean": "booleano", + "count": "cuenta", + "string": "cadena de caracteres", + "number": "número", + "array": "tabla", + "required": "requerido", + "default:": "defecto:", + "choices:": "selección:", + "aliases:": "alias:", + "generated-value": "valor-generado", + "Not enough non-option arguments: got %s, need at least %s": "Hacen falta argumentos no-opcionales: Número recibido %s, necesita por lo menos %s", + "Too many non-option arguments: got %s, maximum of %s": "Demasiados argumentos no-opcionales: Número recibido %s, máximo es %s", + "Missing argument value: %s": { + "one": "Falta argumento: %s", + "other": "Faltan argumentos: %s" + }, + "Missing required argument: %s": { + "one": "Falta argumento requerido: %s", + "other": "Faltan argumentos requeridos: %s" + }, + "Unknown argument: %s": { + "one": "Argumento desconocido: %s", + "other": "Argumentos desconocidos: %s" + }, + "Invalid values:": "Valores inválidos:", + "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Recibido: %s, Seleccionados: %s", + "Argument check failed: %s": "Verificación de argumento ha fallado: %s", + "Implications failed:": "Implicaciones fallidas:", + "Not enough arguments following: %s": "No hay suficientes argumentos después de: %s", + "Invalid JSON config file: %s": "Archivo de configuración JSON inválido: %s", + "Path to JSON config file": "Ruta al archivo de configuración JSON", + "Show help": "Muestra ayuda", + "Show version number": "Muestra número de versión", + "Did you mean %s?": "Quisiste decir %s?" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/fr.json b/node_modules/sass-graph/node_modules/yargs/locales/fr.json new file mode 100644 index 00000000..cf9c74bf --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/fr.json @@ -0,0 +1,37 @@ +{ + "Commands:": "Commandes:", + "Options:": "Options:", + "Examples:": "Exemples:", + "boolean": "booléen", + "count": "comptage", + "string": "chaine de caractère", + "number": "nombre", + "array": "tableau", + "required": "requis", + "default:": "défaut:", + "choices:": "choix:", + "generated-value": "valeur générée", + "Not enough non-option arguments: got %s, need at least %s": "Pas assez d'arguments non-option: reçu %s, besoin d'au moins %s", + "Too many non-option arguments: got %s, maximum of %s": "Trop d'arguments non-option: reçu %s, maximum %s", + "Missing argument value: %s": { + "one": "Argument manquant: %s", + "other": "Arguments manquants: %s" + }, + "Missing required argument: %s": { + "one": "Argument requis manquant: %s", + "other": "Arguments requis manquants: %s" + }, + "Unknown argument: %s": { + "one": "Argument inconnu: %s", + "other": "Arguments inconnus: %s" + }, + "Invalid values:": "Valeurs invalides:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Donné: %s, Choix: %s", + "Argument check failed: %s": "Echec de la vérification de l'argument: %s", + "Implications failed:": "Arguments dépendants manquants:", + "Not enough arguments following: %s": "Pas assez d'arguments suivant: %s", + "Invalid JSON config file: %s": "Fichier de configuration JSON invalide: %s", + "Path to JSON config file": "Chemin du fichier de configuration JSON", + "Show help": "Affiche de l'aide", + "Show version number": "Affiche le numéro de version" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/hi.json b/node_modules/sass-graph/node_modules/yargs/locales/hi.json new file mode 100644 index 00000000..2cd677ac --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/hi.json @@ -0,0 +1,42 @@ +{ + "Commands:": "आदेश:", + "Options:": "विकल्प:", + "Examples:": "उदाहरण:", + "boolean": "सत्यता", + "count": "संख्या", + "string": "वर्णों का तार ", + "number": "अंक", + "array": "सरणी", + "required": "आवश्यक", + "default:": "डिफॉल्ट:", + "choices:": "विकल्प:", + "aliases:": "उपनाम:", + "generated-value": "उत्पन्न-मूल्य", + "Not enough non-option arguments: got %s, need at least %s": "पर्याप्त गैर-विकल्प तर्क प्राप्त नहीं: %s प्राप्त, कम से कम %s की आवश्यकता है", + "Too many non-option arguments: got %s, maximum of %s": "बहुत सारे गैर-विकल्प तर्क: %s प्राप्त, अधिकतम %s मान्य", + "Missing argument value: %s": { + "one": "कुछ तर्को के मूल्य गुम हैं: %s", + "other": "कुछ तर्को के मूल्य गुम हैं: %s" + }, + "Missing required argument: %s": { + "one": "आवश्यक तर्क गुम हैं: %s", + "other": "आवश्यक तर्क गुम हैं: %s" + }, + "Unknown argument: %s": { + "one": "अज्ञात तर्क प्राप्त: %s", + "other": "अज्ञात तर्क प्राप्त: %s" + }, + "Invalid values:": "अमान्य मूल्य:", + "Argument: %s, Given: %s, Choices: %s": "तर्क: %s, प्राप्त: %s, विकल्प: %s", + "Argument check failed: %s": "तर्क जांच विफल: %s", + "Implications failed:": "दिए गए तर्क के लिए अतिरिक्त तर्क की अपेक्षा है:", + "Not enough arguments following: %s": "निम्नलिखित के बाद पर्याप्त तर्क नहीं प्राप्त: %s", + "Invalid JSON config file: %s": "अमान्य JSON config फाइल: %s", + "Path to JSON config file": "JSON config फाइल का पथ", + "Show help": "सहायता दिखाएँ", + "Show version number": "Version संख्या दिखाएँ", + "Did you mean %s?": "क्या आपका मतलब है %s?", + "Arguments %s and %s are mutually exclusive" : "तर्क %s और %s परस्पर अनन्य हैं", + "Positionals:": "स्थानीय:", + "command": "आदेश" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/hu.json b/node_modules/sass-graph/node_modules/yargs/locales/hu.json new file mode 100644 index 00000000..7b7d1660 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/hu.json @@ -0,0 +1,39 @@ +{ + "Commands:": "Parancsok:", + "Options:": "Opciók:", + "Examples:": "Példák:", + "boolean": "boolean", + "count": "számláló", + "string": "szöveg", + "number": "szám", + "array": "tömb", + "required": "kötelező", + "default:": "alapértelmezett:", + "choices:": "lehetőségek:", + "aliases:": "aliaszok:", + "generated-value": "generált-érték", + "Not enough non-option arguments: got %s, need at least %s": "Nincs elég nem opcionális argumentum: %s van, legalább %s kell", + "Too many non-option arguments: got %s, maximum of %s": "Túl sok nem opciánlis argumentum van: %s van, maximum %s lehet", + "Missing argument value: %s": { + "one": "Hiányzó argumentum érték: %s", + "other": "Hiányzó argumentum értékek: %s" + }, + "Missing required argument: %s": { + "one": "Hiányzó kötelező argumentum: %s", + "other": "Hiányzó kötelező argumentumok: %s" + }, + "Unknown argument: %s": { + "one": "Ismeretlen argumentum: %s", + "other": "Ismeretlen argumentumok: %s" + }, + "Invalid values:": "Érvénytelen érték:", + "Argument: %s, Given: %s, Choices: %s": "Argumentum: %s, Megadott: %s, Lehetőségek: %s", + "Argument check failed: %s": "Argumentum ellenőrzés sikertelen: %s", + "Implications failed:": "Implikációk sikertelenek:", + "Not enough arguments following: %s": "Nem elég argumentum követi: %s", + "Invalid JSON config file: %s": "Érvénytelen JSON konfigurációs file: %s", + "Path to JSON config file": "JSON konfigurációs file helye", + "Show help": "Súgo megjelenítése", + "Show version number": "Verziószám megjelenítése", + "Did you mean %s?": "Erre gondoltál %s?" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/id.json b/node_modules/sass-graph/node_modules/yargs/locales/id.json new file mode 100644 index 00000000..87e441cd --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/id.json @@ -0,0 +1,43 @@ + +{ + "Commands:": "Perintah:", + "Options:": "Pilihan:", + "Examples:": "Contoh:", + "boolean": "boolean", + "count": "jumlah", + "number": "nomor", + "string": "string", + "array": "larik", + "required": "diperlukan", + "default:": "bawaan:", + "aliases:": "istilah lain:", + "choices:": "pilihan:", + "generated-value": "nilai-yang-dihasilkan", + "Not enough non-option arguments: got %s, need at least %s": "Argumen wajib kurang: hanya %s, minimal %s", + "Too many non-option arguments: got %s, maximum of %s": "Terlalu banyak argumen wajib: ada %s, maksimal %s", + "Missing argument value: %s": { + "one": "Kurang argumen: %s", + "other": "Kurang argumen: %s" + }, + "Missing required argument: %s": { + "one": "Kurang argumen wajib: %s", + "other": "Kurang argumen wajib: %s" + }, + "Unknown argument: %s": { + "one": "Argumen tak diketahui: %s", + "other": "Argumen tak diketahui: %s" + }, + "Invalid values:": "Nilai-nilai tidak valid:", + "Argument: %s, Given: %s, Choices: %s": "Argumen: %s, Diberikan: %s, Pilihan: %s", + "Argument check failed: %s": "Pemeriksaan argument gagal: %s", + "Implications failed:": "Implikasi gagal:", + "Not enough arguments following: %s": "Kurang argumen untuk: %s", + "Invalid JSON config file: %s": "Berkas konfigurasi JSON tidak valid: %s", + "Path to JSON config file": "Alamat berkas konfigurasi JSON", + "Show help": "Lihat bantuan", + "Show version number": "Lihat nomor versi", + "Did you mean %s?": "Maksud Anda: %s?", + "Arguments %s and %s are mutually exclusive" : "Argumen %s dan %s saling eksklusif", + "Positionals:": "Posisional-posisional:", + "command": "perintah" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/it.json b/node_modules/sass-graph/node_modules/yargs/locales/it.json new file mode 100644 index 00000000..9ee900d3 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/it.json @@ -0,0 +1,39 @@ +{ + "Commands:": "Comandi:", + "Options:": "Opzioni:", + "Examples:": "Esempi:", + "boolean": "booleano", + "count": "contatore", + "string": "stringa", + "number": "numero", + "array": "vettore", + "required": "richiesto", + "default:": "predefinito:", + "choices:": "scelte:", + "aliases:": "alias:", + "generated-value": "valore generato", + "Not enough non-option arguments: got %s, need at least %s": "Numero insufficiente di argomenti non opzione: inseriti %s, richiesti almeno %s", + "Too many non-option arguments: got %s, maximum of %s": "Troppi argomenti non opzione: inseriti %s, massimo possibile %s", + "Missing argument value: %s": { + "one": "Argomento mancante: %s", + "other": "Argomenti mancanti: %s" + }, + "Missing required argument: %s": { + "one": "Argomento richiesto mancante: %s", + "other": "Argomenti richiesti mancanti: %s" + }, + "Unknown argument: %s": { + "one": "Argomento sconosciuto: %s", + "other": "Argomenti sconosciuti: %s" + }, + "Invalid values:": "Valori non validi:", + "Argument: %s, Given: %s, Choices: %s": "Argomento: %s, Richiesto: %s, Scelte: %s", + "Argument check failed: %s": "Controllo dell'argomento fallito: %s", + "Implications failed:": "Argomenti dipendenti mancanti:", + "Not enough arguments following: %s": "Argomenti insufficienti dopo: %s", + "Invalid JSON config file: %s": "File di configurazione JSON non valido: %s", + "Path to JSON config file": "Percorso del file di configurazione JSON", + "Show help": "Mostra la schermata di aiuto", + "Show version number": "Mostra il numero di versione", + "Did you mean %s?": "Intendi forse %s?" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/ja.json b/node_modules/sass-graph/node_modules/yargs/locales/ja.json new file mode 100644 index 00000000..64ee6d3f --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/ja.json @@ -0,0 +1,42 @@ +{ + "Commands:": "コマンド:", + "Options:": "オプション:", + "Examples:": "例:", + "boolean": "真偽", + "count": "カウント", + "string": "文字列", + "number": "数値", + "array": "配列", + "required": "必須", + "default:": "デフォルト:", + "choices:": "選択してください:", + "aliases:": "エイリアス:", + "generated-value": "生成された値", + "Not enough non-option arguments: got %s, need at least %s": "オプションではない引数が %s 個では不足しています。少なくとも %s 個の引数が必要です:", + "Too many non-option arguments: got %s, maximum of %s": "オプションではない引数が %s 個では多すぎます。最大で %s 個までです:", + "Missing argument value: %s": { + "one": "引数が見つかりません: %s", + "other": "引数が見つかりません: %s" + }, + "Missing required argument: %s": { + "one": "必須の引数が見つかりません: %s", + "other": "必須の引数が見つかりません: %s" + }, + "Unknown argument: %s": { + "one": "未知の引数です: %s", + "other": "未知の引数です: %s" + }, + "Invalid values:": "不正な値です:", + "Argument: %s, Given: %s, Choices: %s": "引数は %s です。指定できるのは %s つです。選択してください: %s", + "Argument check failed: %s": "引数のチェックに失敗しました: %s", + "Implications failed:": "オプションの組み合わせで不正が生じました:", + "Not enough arguments following: %s": "次の引数が不足しています。: %s", + "Invalid JSON config file: %s": "JSONの設定ファイルが不正です: %s", + "Path to JSON config file": "JSONの設定ファイルまでのpath", + "Show help": "ヘルプを表示", + "Show version number": "バージョンを表示", + "Did you mean %s?": "もしかして %s?", + "Arguments %s and %s are mutually exclusive" : "引数 %s と %s は同時に指定できません", + "Positionals:": "位置:", + "command": "コマンド" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/ko.json b/node_modules/sass-graph/node_modules/yargs/locales/ko.json new file mode 100644 index 00000000..0eaeab2f --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/ko.json @@ -0,0 +1,42 @@ +{ + "Commands:": "명령:", + "Options:": "옵션:", + "Examples:": "예시:", + "boolean": "여부", + "count": "개수", + "string": "문자열", + "number": "숫자", + "array": "배열", + "required": "필수", + "default:": "기본:", + "choices:": "선택:", + "aliases:": "별칭:", + "generated-value": "생성된 값", + "Not enough non-option arguments: got %s, need at least %s": "옵션이 아닌 인자가 충분치 않습니다: %s개를 받았지만, 적어도 %s개는 필요합니다", + "Too many non-option arguments: got %s, maximum of %s": "옵션이 아닌 인자가 너무 많습니다: %s개를 받았지만, %s개 이하여야 합니다", + "Missing argument value: %s": { + "one": "인자값을 받지 못했습니다: %s", + "other": "인자값들을 받지 못했습니다: %s" + }, + "Missing required argument: %s": { + "one": "필수 인자를 받지 못했습니다: %s", + "other": "필수 인자들을 받지 못했습니다: %s" + }, + "Unknown argument: %s": { + "one": "알 수 없는 인자입니다: %s", + "other": "알 수 없는 인자들입니다: %s" + }, + "Invalid values:": "잘못된 값입니다:", + "Argument: %s, Given: %s, Choices: %s": "인자: %s, 입력받은 값: %s, 선택지: %s", + "Argument check failed: %s": "유효하지 않은 인자입니다: %s", + "Implications failed:": "옵션의 조합이 잘못되었습니다:", + "Not enough arguments following: %s": "인자가 충분하게 주어지지 않았습니다: %s", + "Invalid JSON config file: %s": "유효하지 않은 JSON 설정파일입니다: %s", + "Path to JSON config file": "JSON 설정파일 경로", + "Show help": "도움말을 보여줍니다", + "Show version number": "버전 넘버를 보여줍니다", + "Did you mean %s?": "찾고계신게 %s입니까?", + "Arguments %s and %s are mutually exclusive" : "%s와 %s 인자는 같이 사용될 수 없습니다", + "Positionals:": "위치:", + "command": "명령" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/nb.json b/node_modules/sass-graph/node_modules/yargs/locales/nb.json new file mode 100644 index 00000000..55be1fbe --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/nb.json @@ -0,0 +1,37 @@ +{ + "Commands:": "Kommandoer:", + "Options:": "Alternativer:", + "Examples:": "Eksempler:", + "boolean": "boolsk", + "count": "antall", + "string": "streng", + "number": "nummer", + "array": "matrise", + "required": "obligatorisk", + "default:": "standard:", + "choices:": "valg:", + "generated-value": "generert-verdi", + "Not enough non-option arguments: got %s, need at least %s": "Ikke nok ikke-alternativ argumenter: fikk %s, trenger minst %s", + "Too many non-option arguments: got %s, maximum of %s": "For mange ikke-alternativ argumenter: fikk %s, maksimum %s", + "Missing argument value: %s": { + "one": "Mangler argument verdi: %s", + "other": "Mangler argument verdier: %s" + }, + "Missing required argument: %s": { + "one": "Mangler obligatorisk argument: %s", + "other": "Mangler obligatoriske argumenter: %s" + }, + "Unknown argument: %s": { + "one": "Ukjent argument: %s", + "other": "Ukjente argumenter: %s" + }, + "Invalid values:": "Ugyldige verdier:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gitt: %s, Valg: %s", + "Argument check failed: %s": "Argumentsjekk mislyktes: %s", + "Implications failed:": "Konsekvensene mislyktes:", + "Not enough arguments following: %s": "Ikke nok følgende argumenter: %s", + "Invalid JSON config file: %s": "Ugyldig JSON konfigurasjonsfil: %s", + "Path to JSON config file": "Bane til JSON konfigurasjonsfil", + "Show help": "Vis hjelp", + "Show version number": "Vis versjonsnummer" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/nl.json b/node_modules/sass-graph/node_modules/yargs/locales/nl.json new file mode 100644 index 00000000..5d62e0fc --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/nl.json @@ -0,0 +1,42 @@ +{ + "Commands:": "Commando's:", + "Options:": "Opties:", + "Examples:": "Voorbeelden:", + "boolean": "booleaans", + "count": "aantal", + "string": "string", + "number": "getal", + "array": "lijst", + "required": "verplicht", + "default:": "standaard:", + "choices:": "keuzes:", + "aliases:": "aliassen:", + "generated-value": "gegenereerde waarde", + "Not enough non-option arguments: got %s, need at least %s": "Niet genoeg niet-optie-argumenten: %s gekregen, minstens %s nodig", + "Too many non-option arguments: got %s, maximum of %s": "Te veel niet-optie-argumenten: %s gekregen, maximum is %s", + "Missing argument value: %s": { + "one": "Missende argumentwaarde: %s", + "other": "Missende argumentwaarden: %s" + }, + "Missing required argument: %s": { + "one": "Missend verplicht argument: %s", + "other": "Missende verplichte argumenten: %s" + }, + "Unknown argument: %s": { + "one": "Onbekend argument: %s", + "other": "Onbekende argumenten: %s" + }, + "Invalid values:": "Ongeldige waarden:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gegeven: %s, Keuzes: %s", + "Argument check failed: %s": "Argumentcontrole mislukt: %s", + "Implications failed:": "Ontbrekende afhankelijke argumenten:", + "Not enough arguments following: %s": "Niet genoeg argumenten na: %s", + "Invalid JSON config file: %s": "Ongeldig JSON-config-bestand: %s", + "Path to JSON config file": "Pad naar JSON-config-bestand", + "Show help": "Toon help", + "Show version number": "Toon versienummer", + "Did you mean %s?": "Bedoelde u misschien %s?", + "Arguments %s and %s are mutually exclusive": "Argumenten %s en %s kunnen niet tegelijk gebruikt worden", + "Positionals:": "Positie-afhankelijke argumenten", + "command": "commando" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/nn.json b/node_modules/sass-graph/node_modules/yargs/locales/nn.json new file mode 100644 index 00000000..5a3c9514 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/nn.json @@ -0,0 +1,39 @@ +{ + "Commands:": "Kommandoar:", + "Options:": "Alternativ:", + "Examples:": "Døme:", + "boolean": "boolsk", + "count": "mengd", + "string": "streng", + "number": "nummer", + "array": "matrise", + "required": "obligatorisk", + "default:": "standard:", + "choices:": "val:", + "generated-value": "generert-verdi", + "Not enough non-option arguments: got %s, need at least %s": + "Ikkje nok ikkje-alternativ argument: fekk %s, treng minst %s", + "Too many non-option arguments: got %s, maximum of %s": + "For mange ikkje-alternativ argument: fekk %s, maksimum %s", + "Missing argument value: %s": { + "one": "Manglar argumentverdi: %s", + "other": "Manglar argumentverdiar: %s" + }, + "Missing required argument: %s": { + "one": "Manglar obligatorisk argument: %s", + "other": "Manglar obligatoriske argument: %s" + }, + "Unknown argument: %s": { + "one": "Ukjent argument: %s", + "other": "Ukjende argument: %s" + }, + "Invalid values:": "Ugyldige verdiar:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gjeve: %s, Val: %s", + "Argument check failed: %s": "Argumentsjekk mislukkast: %s", + "Implications failed:": "Konsekvensane mislukkast:", + "Not enough arguments following: %s": "Ikkje nok fylgjande argument: %s", + "Invalid JSON config file: %s": "Ugyldig JSON konfigurasjonsfil: %s", + "Path to JSON config file": "Bane til JSON konfigurasjonsfil", + "Show help": "Vis hjelp", + "Show version number": "Vis versjonsnummer" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/pirate.json b/node_modules/sass-graph/node_modules/yargs/locales/pirate.json new file mode 100644 index 00000000..dcb5cb75 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/pirate.json @@ -0,0 +1,13 @@ +{ + "Commands:": "Choose yer command:", + "Options:": "Options for me hearties!", + "Examples:": "Ex. marks the spot:", + "required": "requi-yar-ed", + "Missing required argument: %s": { + "one": "Ye be havin' to set the followin' argument land lubber: %s", + "other": "Ye be havin' to set the followin' arguments land lubber: %s" + }, + "Show help": "Parlay this here code of conduct", + "Show version number": "'Tis the version ye be askin' fer", + "Arguments %s and %s are mutually exclusive" : "Yon scurvy dogs %s and %s be as bad as rum and a prudish wench" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/pl.json b/node_modules/sass-graph/node_modules/yargs/locales/pl.json new file mode 100644 index 00000000..6926a454 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/pl.json @@ -0,0 +1,42 @@ +{ + "Commands:": "Polecenia:", + "Options:": "Opcje:", + "Examples:": "Przykłady:", + "boolean": "boolean", + "count": "ilość", + "string": "ciąg znaków", + "number": "liczba", + "array": "tablica", + "required": "wymagany", + "default:": "domyślny:", + "choices:": "dostępne:", + "aliases:": "aliasy:", + "generated-value": "wygenerowana-wartość", + "Not enough non-option arguments: got %s, need at least %s": "Niewystarczająca ilość argumentów: otrzymano %s, wymagane co najmniej %s", + "Too many non-option arguments: got %s, maximum of %s": "Zbyt duża ilość argumentów: otrzymano %s, wymagane co najwyżej %s", + "Missing argument value: %s": { + "one": "Brak wartości dla argumentu: %s", + "other": "Brak wartości dla argumentów: %s" + }, + "Missing required argument: %s": { + "one": "Brak wymaganego argumentu: %s", + "other": "Brak wymaganych argumentów: %s" + }, + "Unknown argument: %s": { + "one": "Nieznany argument: %s", + "other": "Nieznane argumenty: %s" + }, + "Invalid values:": "Nieprawidłowe wartości:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Otrzymano: %s, Dostępne: %s", + "Argument check failed: %s": "Weryfikacja argumentów nie powiodła się: %s", + "Implications failed:": "Założenia nie zostały spełnione:", + "Not enough arguments following: %s": "Niewystarczająca ilość argumentów następujących po: %s", + "Invalid JSON config file: %s": "Nieprawidłowy plik konfiguracyjny JSON: %s", + "Path to JSON config file": "Ścieżka do pliku konfiguracyjnego JSON", + "Show help": "Pokaż pomoc", + "Show version number": "Pokaż numer wersji", + "Did you mean %s?": "Czy chodziło Ci o %s?", + "Arguments %s and %s are mutually exclusive": "Argumenty %s i %s wzajemnie się wykluczają", + "Positionals:": "Pozycyjne:", + "command": "polecenie" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/pt.json b/node_modules/sass-graph/node_modules/yargs/locales/pt.json new file mode 100644 index 00000000..75c3921c --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/pt.json @@ -0,0 +1,38 @@ +{ + "Commands:": "Comandos:", + "Options:": "Opções:", + "Examples:": "Exemplos:", + "boolean": "boolean", + "count": "contagem", + "string": "cadeia de caracteres", + "number": "número", + "array": "arranjo", + "required": "requerido", + "default:": "padrão:", + "choices:": "escolhas:", + "generated-value": "valor-gerado", + "Not enough non-option arguments: got %s, need at least %s": "Argumentos insuficientes não opcionais: Argumento %s, necessário pelo menos %s", + "Too many non-option arguments: got %s, maximum of %s": "Excesso de argumentos não opcionais: recebido %s, máximo de %s", + "Missing argument value: %s": { + "one": "Falta valor de argumento: %s", + "other": "Falta valores de argumento: %s" + }, + "Missing required argument: %s": { + "one": "Falta argumento obrigatório: %s", + "other": "Faltando argumentos obrigatórios: %s" + }, + "Unknown argument: %s": { + "one": "Argumento desconhecido: %s", + "other": "Argumentos desconhecidos: %s" + }, + "Invalid values:": "Valores inválidos:", + "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Dado: %s, Escolhas: %s", + "Argument check failed: %s": "Verificação de argumento falhou: %s", + "Implications failed:": "Implicações falharam:", + "Not enough arguments following: %s": "Insuficientes argumentos a seguir: %s", + "Invalid JSON config file: %s": "Arquivo de configuração em JSON esta inválido: %s", + "Path to JSON config file": "Caminho para o arquivo de configuração em JSON", + "Show help": "Mostra ajuda", + "Show version number": "Mostra número de versão", + "Arguments %s and %s are mutually exclusive" : "Argumentos %s e %s são mutualmente exclusivos" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/pt_BR.json b/node_modules/sass-graph/node_modules/yargs/locales/pt_BR.json new file mode 100644 index 00000000..904cb66e --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/pt_BR.json @@ -0,0 +1,42 @@ +{ + "Commands:": "Comandos:", + "Options:": "Opções:", + "Examples:": "Exemplos:", + "boolean": "booleano", + "count": "contagem", + "string": "string", + "number": "número", + "array": "array", + "required": "obrigatório", + "default:": "padrão:", + "choices:": "opções:", + "aliases:": "sinônimos:", + "generated-value": "valor-gerado", + "Not enough non-option arguments: got %s, need at least %s": "Argumentos insuficientes: Argumento %s, necessário pelo menos %s", + "Too many non-option arguments: got %s, maximum of %s": "Excesso de argumentos: recebido %s, máximo de %s", + "Missing argument value: %s": { + "one": "Falta valor de argumento: %s", + "other": "Falta valores de argumento: %s" + }, + "Missing required argument: %s": { + "one": "Falta argumento obrigatório: %s", + "other": "Faltando argumentos obrigatórios: %s" + }, + "Unknown argument: %s": { + "one": "Argumento desconhecido: %s", + "other": "Argumentos desconhecidos: %s" + }, + "Invalid values:": "Valores inválidos:", + "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Dado: %s, Opções: %s", + "Argument check failed: %s": "Verificação de argumento falhou: %s", + "Implications failed:": "Implicações falharam:", + "Not enough arguments following: %s": "Argumentos insuficientes a seguir: %s", + "Invalid JSON config file: %s": "Arquivo JSON de configuração inválido: %s", + "Path to JSON config file": "Caminho para o arquivo JSON de configuração", + "Show help": "Exibe ajuda", + "Show version number": "Exibe a versão", + "Did you mean %s?": "Você quis dizer %s?", + "Arguments %s and %s are mutually exclusive" : "Argumentos %s e %s são mutualmente exclusivos", + "Positionals:": "Posicionais:", + "command": "comando" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/ru.json b/node_modules/sass-graph/node_modules/yargs/locales/ru.json new file mode 100644 index 00000000..cb7b88b4 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/ru.json @@ -0,0 +1,39 @@ +{ + "Commands:": "Команды:", + "Options:": "Опции:", + "Examples:": "Примеры:", + "boolean": "булевый тип", + "count": "подсчет", + "string": "строковой тип", + "number": "число", + "array": "массив", + "required": "необходимо", + "default:": "по умолчанию:", + "choices:": "возможности:", + "aliases:": "алиасы:", + "generated-value": "генерированное значение", + "Not enough non-option arguments: got %s, need at least %s": "Недостаточно неопционных аргументов: есть %s, нужно как минимум %s", + "Too many non-option arguments: got %s, maximum of %s": "Слишком много неопционных аргументов: есть %s, максимум допустимо %s", + "Missing argument value: %s": { + "one": "Не хватает значения аргумента: %s", + "other": "Не хватает значений аргументов: %s" + }, + "Missing required argument: %s": { + "one": "Не хватает необходимого аргумента: %s", + "other": "Не хватает необходимых аргументов: %s" + }, + "Unknown argument: %s": { + "one": "Неизвестный аргумент: %s", + "other": "Неизвестные аргументы: %s" + }, + "Invalid values:": "Недействительные значения:", + "Argument: %s, Given: %s, Choices: %s": "Аргумент: %s, Данное значение: %s, Возможности: %s", + "Argument check failed: %s": "Проверка аргументов не удалась: %s", + "Implications failed:": "Данный аргумент требует следующий дополнительный аргумент:", + "Not enough arguments following: %s": "Недостаточно следующих аргументов: %s", + "Invalid JSON config file: %s": "Недействительный файл конфигурации JSON: %s", + "Path to JSON config file": "Путь к файлу конфигурации JSON", + "Show help": "Показать помощь", + "Show version number": "Показать номер версии", + "Did you mean %s?": "Вы имели в виду %s?" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/th.json b/node_modules/sass-graph/node_modules/yargs/locales/th.json new file mode 100644 index 00000000..3f08dcd2 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/th.json @@ -0,0 +1,39 @@ +{ + "Commands:": "คอมมาน", + "Options:": "ออฟชั่น", + "Examples:": "ตัวอย่าง", + "boolean": "บูลีน", + "count": "นับ", + "string": "สตริง", + "number": "ตัวเลข", + "array": "อาเรย์", + "required": "จำเป็น", + "default:": "ค่าเริ่มต้น", + "choices:": "ตัวเลือก", + "aliases:": "เอเลียส", + "generated-value": "ค่าที่ถูกสร้างขึ้น", + "Not enough non-option arguments: got %s, need at least %s": "ใส่อาร์กิวเมนต์ไม่ครบตามจำนวนที่กำหนด: ใส่ค่ามาจำนวน %s ค่า, แต่ต้องการอย่างน้อย %s ค่า", + "Too many non-option arguments: got %s, maximum of %s": "ใส่อาร์กิวเมนต์เกินจำนวนที่กำหนด: ใส่ค่ามาจำนวน %s ค่า, แต่ต้องการมากที่สุด %s ค่า", + "Missing argument value: %s": { + "one": "ค่าอาร์กิวเมนต์ที่ขาดไป: %s", + "other": "ค่าอาร์กิวเมนต์ที่ขาดไป: %s" + }, + "Missing required argument: %s": { + "one": "อาร์กิวเมนต์จำเป็นที่ขาดไป: %s", + "other": "อาร์กิวเมนต์จำเป็นที่ขาดไป: %s" + }, + "Unknown argument: %s": { + "one": "อาร์กิวเมนต์ที่ไม่รู้จัก: %s", + "other": "อาร์กิวเมนต์ที่ไม่รู้จัก: %s" + }, + "Invalid values:": "ค่าไม่ถูกต้อง:", + "Argument: %s, Given: %s, Choices: %s": "อาร์กิวเมนต์: %s, ได้รับ: %s, ตัวเลือก: %s", + "Argument check failed: %s": "ตรวจสอบพบอาร์กิวเมนต์ที่ไม่ถูกต้อง: %s", + "Implications failed:": "Implications ไม่สำเร็จ:", + "Not enough arguments following: %s": "ใส่อาร์กิวเมนต์ไม่ครบ: %s", + "Invalid JSON config file: %s": "ไฟล์คอนฟิค JSON ไม่ถูกต้อง: %s", + "Path to JSON config file": "พาทไฟล์คอนฟิค JSON", + "Show help": "ขอความช่วยเหลือ", + "Show version number": "แสดงตัวเลขเวอร์ชั่น", + "Did you mean %s?": "คุณหมายถึง %s?" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/tr.json b/node_modules/sass-graph/node_modules/yargs/locales/tr.json new file mode 100644 index 00000000..9b06c52a --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/tr.json @@ -0,0 +1,41 @@ +{ + "Commands:": "Komutlar:", + "Options:": "Seçenekler:", + "Examples:": "Örnekler:", + "boolean": "boolean", + "count": "sayı", + "string": "string", + "number": "numara", + "array": "array", + "required": "zorunlu", + "default:": "varsayılan:", + "choices:": "seçimler:", + "aliases:": "takma adlar:", + "generated-value": "oluşturulan-değer", + "Not enough non-option arguments: got %s, need at least %s": "Seçenek dışı argümanlar yetersiz: %s bulundu, %s gerekli", + "Too many non-option arguments: got %s, maximum of %s": "Seçenek dışı argümanlar gereğinden fazla: %s bulundu, azami %s", + "Missing argument value: %s": { + "one": "Eksik argüman değeri: %s", + "other": "Eksik argüman değerleri: %s" + }, + "Missing required argument: %s": { + "one": "Eksik zorunlu argüman: %s", + "other": "Eksik zorunlu argümanlar: %s" + }, + "Unknown argument: %s": { + "one": "Bilinmeyen argüman: %s", + "other": "Bilinmeyen argümanlar: %s" + }, + "Invalid values:": "Geçersiz değerler:", + "Argument: %s, Given: %s, Choices: %s": "Argüman: %s, Verilen: %s, Seçimler: %s", + "Argument check failed: %s": "Argüman kontrolü başarısız oldu: %s", + "Implications failed:": "Sonuçlar başarısız oldu:", + "Not enough arguments following: %s": "%s için yeterli argüman bulunamadı", + "Invalid JSON config file: %s": "Geçersiz JSON yapılandırma dosyası: %s", + "Path to JSON config file": "JSON yapılandırma dosya konumu", + "Show help": "Yardım detaylarını göster", + "Show version number": "Versiyon detaylarını göster", + "Did you mean %s?": "Bunu mu demek istediniz: %s?", + "Positionals:": "Sıralılar:", + "command": "komut" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/zh_CN.json b/node_modules/sass-graph/node_modules/yargs/locales/zh_CN.json new file mode 100644 index 00000000..03a3d94f --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/zh_CN.json @@ -0,0 +1,41 @@ +{ + "Commands:": "命令:", + "Options:": "选项:", + "Examples:": "示例:", + "boolean": "布尔", + "count": "计数", + "string": "字符串", + "number": "数字", + "array": "数组", + "required": "必需", + "default:": "默认值:", + "choices:": "可选值:", + "generated-value": "生成的值", + "Not enough non-option arguments: got %s, need at least %s": "缺少 non-option 参数:传入了 %s 个, 至少需要 %s 个", + "Too many non-option arguments: got %s, maximum of %s": "non-option 参数过多:传入了 %s 个, 最大允许 %s 个", + "Missing argument value: %s": { + "one": "没有给此选项指定值:%s", + "other": "没有给这些选项指定值:%s" + }, + "Missing required argument: %s": { + "one": "缺少必须的选项:%s", + "other": "缺少这些必须的选项:%s" + }, + "Unknown argument: %s": { + "one": "无法识别的选项:%s", + "other": "无法识别这些选项:%s" + }, + "Invalid values:": "无效的选项值:", + "Argument: %s, Given: %s, Choices: %s": "选项名称: %s, 传入的值: %s, 可选的值:%s", + "Argument check failed: %s": "选项值验证失败:%s", + "Implications failed:": "缺少依赖的选项:", + "Not enough arguments following: %s": "没有提供足够的值给此选项:%s", + "Invalid JSON config file: %s": "无效的 JSON 配置文件:%s", + "Path to JSON config file": "JSON 配置文件的路径", + "Show help": "显示帮助信息", + "Show version number": "显示版本号", + "Did you mean %s?": "是指 %s?", + "Arguments %s and %s are mutually exclusive" : "选项 %s 和 %s 是互斥的", + "Positionals:": "位置:", + "command": "命令" +} diff --git a/node_modules/sass-graph/node_modules/yargs/locales/zh_TW.json b/node_modules/sass-graph/node_modules/yargs/locales/zh_TW.json new file mode 100644 index 00000000..12498888 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/locales/zh_TW.json @@ -0,0 +1,40 @@ +{ + "Commands:": "命令:", + "Options:": "選項:", + "Examples:": "例:", + "boolean": "布林", + "count": "次數", + "string": "字串", + "number": "數字", + "array": "陣列", + "required": "必須", + "default:": "預設值:", + "choices:": "可選值:", + "aliases:": "別名:", + "generated-value": "生成的值", + "Not enough non-option arguments: got %s, need at least %s": "non-option 引數不足:只傳入了 %s 個, 至少要 %s 個", + "Too many non-option arguments: got %s, maximum of %s": "non-option 引數過多:傳入了 %s 個, 但最多 %s 個", + "Missing argument value: %s": { + "one": "此引數無指定值:%s", + "other": "這些引數無指定值:%s" + }, + "Missing required argument: %s": { + "one": "缺少必須的引數:%s", + "other": "缺少這些必須的引數:%s" + }, + "Unknown argument: %s": { + "one": "未知的引數:%s", + "other": "未知的這些引數:%s" + }, + "Invalid values:": "無效的選項值:", + "Argument: %s, Given: %s, Choices: %s": "引數名稱: %s, 傳入的值: %s, 可選的值:%s", + "Argument check failed: %s": "引數驗證失敗:%s", + "Implications failed:": "缺少依賴的選項:", + "Not enough arguments following: %s": "沒有提供足夠的值給此引數:%s", + "Invalid JSON config file: %s": "無效的 JSON 設置文件:%s", + "Path to JSON config file": "JSON 設置文件的路徑", + "Show help": "顯示說明", + "Show version number": "顯示版本", + "Did you mean %s?": "是指 %s?", + "Arguments %s and %s are mutually exclusive" : "引數 %s 和 %s 是互斥的" +} diff --git a/node_modules/sass-graph/node_modules/yargs/package.json b/node_modules/sass-graph/node_modules/yargs/package.json new file mode 100644 index 00000000..283d1f9b --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/package.json @@ -0,0 +1,78 @@ +{ + "name": "yargs", + "version": "13.3.2", + "description": "yargs the modern, pirate-themed, successor to optimist.", + "main": "./index.js", + "contributors": [ + { + "name": "Yargs Contributors", + "url": "https://github.com/yargs/yargs/graphs/contributors" + } + ], + "files": [ + "index.js", + "yargs.js", + "lib", + "locales", + "completion.sh.hbs", + "completion.zsh.hbs", + "LICENSE" + ], + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "devDependencies": { + "chai": "^4.2.0", + "chalk": "^2.4.2", + "coveralls": "^3.0.3", + "cpr": "^3.0.1", + "cross-spawn": "^6.0.4", + "es6-promise": "^4.2.5", + "hashish": "0.0.4", + "mocha": "^5.2.0", + "nyc": "^14.1.0", + "rimraf": "^2.6.3", + "standard": "^12.0.1", + "standard-version": "^6.0.1", + "which": "^1.3.1", + "yargs-test-extends": "^1.0.1" + }, + "scripts": { + "pretest": "standard", + "test": "nyc --cache mocha --require ./test/before.js --timeout=12000 --check-leaks", + "coverage": "nyc report --reporter=text-lcov | coveralls", + "release": "standard-version" + }, + "repository": { + "type": "git", + "url": "https://github.com/yargs/yargs.git" + }, + "homepage": "https://yargs.js.org/", + "standard": { + "ignore": [ + "**/example/**" + ] + }, + "keywords": [ + "argument", + "args", + "option", + "parser", + "parsing", + "cli", + "command" + ], + "license": "MIT", + "engine": { + "node": ">=6" + } +} diff --git a/node_modules/sass-graph/node_modules/yargs/yargs.js b/node_modules/sass-graph/node_modules/yargs/yargs.js new file mode 100644 index 00000000..81d21936 --- /dev/null +++ b/node_modules/sass-graph/node_modules/yargs/yargs.js @@ -0,0 +1,1215 @@ +'use strict' +const argsert = require('./lib/argsert') +const fs = require('fs') +const Command = require('./lib/command') +const Completion = require('./lib/completion') +const Parser = require('yargs-parser') +const path = require('path') +const Usage = require('./lib/usage') +const Validation = require('./lib/validation') +const Y18n = require('y18n') +const objFilter = require('./lib/obj-filter') +const setBlocking = require('set-blocking') +const applyExtends = require('./lib/apply-extends') +const { globalMiddlewareFactory } = require('./lib/middleware') +const YError = require('./lib/yerror') + +exports = module.exports = Yargs +function Yargs (processArgs, cwd, parentRequire) { + processArgs = processArgs || [] // handle calling yargs(). + + const self = {} + let command = null + let completion = null + let groups = {} + let globalMiddleware = [] + let output = '' + let preservedGroups = {} + let usage = null + let validation = null + + const y18n = Y18n({ + directory: path.resolve(__dirname, './locales'), + updateFiles: false + }) + + self.middleware = globalMiddlewareFactory(globalMiddleware, self) + + if (!cwd) cwd = process.cwd() + + self.scriptName = function scriptName (scriptName) { + self.$0 = scriptName + return self + } + + // ignore the node bin, specify this in your + // bin file with #!/usr/bin/env node + if (/\b(node|iojs|electron)(\.exe)?$/.test(process.argv[0])) { + self.$0 = process.argv.slice(1, 2) + } else { + self.$0 = process.argv.slice(0, 1) + } + + self.$0 = self.$0 + .map((x, i) => { + const b = rebase(cwd, x) + return x.match(/^(\/|([a-zA-Z]:)?\\)/) && b.length < x.length ? b : x + }) + .join(' ').trim() + + if (process.env._ !== undefined && process.argv[1] === process.env._) { + self.$0 = process.env._.replace( + `${path.dirname(process.execPath)}/`, '' + ) + } + + // use context object to keep track of resets, subcommand execution, etc + // submodules should modify and check the state of context as necessary + const context = { resets: -1, commands: [], fullCommands: [], files: [] } + self.getContext = () => context + + // puts yargs back into an initial state. any keys + // that have been set to "global" will not be reset + // by this action. + let options + self.resetOptions = self.reset = function resetOptions (aliases) { + context.resets++ + aliases = aliases || {} + options = options || {} + // put yargs back into an initial state, this + // logic is used to build a nested command + // hierarchy. + const tmpOptions = {} + tmpOptions.local = options.local ? options.local : [] + tmpOptions.configObjects = options.configObjects ? options.configObjects : [] + + // if a key has been explicitly set as local, + // we should reset it before passing options to command. + const localLookup = {} + tmpOptions.local.forEach((l) => { + localLookup[l] = true + ;(aliases[l] || []).forEach((a) => { + localLookup[a] = true + }) + }) + + // preserve all groups not set to local. + preservedGroups = Object.keys(groups).reduce((acc, groupName) => { + const keys = groups[groupName].filter(key => !(key in localLookup)) + if (keys.length > 0) { + acc[groupName] = keys + } + return acc + }, {}) + // groups can now be reset + groups = {} + + const arrayOptions = [ + 'array', 'boolean', 'string', 'skipValidation', + 'count', 'normalize', 'number', + 'hiddenOptions' + ] + + const objectOptions = [ + 'narg', 'key', 'alias', 'default', 'defaultDescription', + 'config', 'choices', 'demandedOptions', 'demandedCommands', 'coerce' + ] + + arrayOptions.forEach((k) => { + tmpOptions[k] = (options[k] || []).filter(k => !localLookup[k]) + }) + + objectOptions.forEach((k) => { + tmpOptions[k] = objFilter(options[k], (k, v) => !localLookup[k]) + }) + + tmpOptions.envPrefix = options.envPrefix + options = tmpOptions + + // if this is the first time being executed, create + // instances of all our helpers -- otherwise just reset. + usage = usage ? usage.reset(localLookup) : Usage(self, y18n) + validation = validation ? validation.reset(localLookup) : Validation(self, usage, y18n) + command = command ? command.reset() : Command(self, usage, validation, globalMiddleware) + if (!completion) completion = Completion(self, usage, command) + + completionCommand = null + output = '' + exitError = null + hasOutput = false + self.parsed = false + + return self + } + self.resetOptions() + + // temporary hack: allow "freezing" of reset-able state for parse(msg, cb) + let frozen + function freeze () { + frozen = {} + frozen.options = options + frozen.configObjects = options.configObjects.slice(0) + frozen.exitProcess = exitProcess + frozen.groups = groups + usage.freeze() + validation.freeze() + command.freeze() + frozen.strict = strict + frozen.completionCommand = completionCommand + frozen.output = output + frozen.exitError = exitError + frozen.hasOutput = hasOutput + frozen.parsed = self.parsed + } + function unfreeze () { + options = frozen.options + options.configObjects = frozen.configObjects + exitProcess = frozen.exitProcess + groups = frozen.groups + output = frozen.output + exitError = frozen.exitError + hasOutput = frozen.hasOutput + self.parsed = frozen.parsed + usage.unfreeze() + validation.unfreeze() + command.unfreeze() + strict = frozen.strict + completionCommand = frozen.completionCommand + parseFn = null + parseContext = null + frozen = undefined + } + + self.boolean = function (keys) { + argsert('', [keys], arguments.length) + populateParserHintArray('boolean', keys) + return self + } + + self.array = function (keys) { + argsert('', [keys], arguments.length) + populateParserHintArray('array', keys) + return self + } + + self.number = function (keys) { + argsert('', [keys], arguments.length) + populateParserHintArray('number', keys) + return self + } + + self.normalize = function (keys) { + argsert('', [keys], arguments.length) + populateParserHintArray('normalize', keys) + return self + } + + self.count = function (keys) { + argsert('', [keys], arguments.length) + populateParserHintArray('count', keys) + return self + } + + self.string = function (keys) { + argsert('', [keys], arguments.length) + populateParserHintArray('string', keys) + return self + } + + self.requiresArg = function (keys) { + argsert('', [keys], arguments.length) + populateParserHintObject(self.nargs, false, 'narg', keys, 1) + return self + } + + self.skipValidation = function (keys) { + argsert('', [keys], arguments.length) + populateParserHintArray('skipValidation', keys) + return self + } + + function populateParserHintArray (type, keys, value) { + keys = [].concat(keys) + keys.forEach((key) => { + key = sanitizeKey(key) + options[type].push(key) + }) + } + + self.nargs = function (key, value) { + argsert(' [number]', [key, value], arguments.length) + populateParserHintObject(self.nargs, false, 'narg', key, value) + return self + } + + self.choices = function (key, value) { + argsert(' [string|array]', [key, value], arguments.length) + populateParserHintObject(self.choices, true, 'choices', key, value) + return self + } + + self.alias = function (key, value) { + argsert(' [string|array]', [key, value], arguments.length) + populateParserHintObject(self.alias, true, 'alias', key, value) + return self + } + + // TODO: actually deprecate self.defaults. + self.default = self.defaults = function (key, value, defaultDescription) { + argsert(' [*] [string]', [key, value, defaultDescription], arguments.length) + if (defaultDescription) options.defaultDescription[key] = defaultDescription + if (typeof value === 'function') { + if (!options.defaultDescription[key]) options.defaultDescription[key] = usage.functionDescription(value) + value = value.call() + } + populateParserHintObject(self.default, false, 'default', key, value) + return self + } + + self.describe = function (key, desc) { + argsert(' [string]', [key, desc], arguments.length) + populateParserHintObject(self.describe, false, 'key', key, true) + usage.describe(key, desc) + return self + } + + self.demandOption = function (keys, msg) { + argsert(' [string]', [keys, msg], arguments.length) + populateParserHintObject(self.demandOption, false, 'demandedOptions', keys, msg) + return self + } + + self.coerce = function (keys, value) { + argsert(' [function]', [keys, value], arguments.length) + populateParserHintObject(self.coerce, false, 'coerce', keys, value) + return self + } + + function populateParserHintObject (builder, isArray, type, key, value) { + if (Array.isArray(key)) { + const temp = Object.create(null) + // an array of keys with one value ['x', 'y', 'z'], function parse () {} + key.forEach((k) => { + temp[k] = value + }) + builder(temp) + } else if (typeof key === 'object') { + // an object of key value pairs: {'x': parse () {}, 'y': parse() {}} + Object.keys(key).forEach((k) => { + builder(k, key[k]) + }) + } else { + key = sanitizeKey(key) + // a single key value pair 'x', parse() {} + if (isArray) { + options[type][key] = (options[type][key] || []).concat(value) + } else { + options[type][key] = value + } + } + } + + // TODO(bcoe): in future major versions move more objects towards + // Object.create(null): + function sanitizeKey (key) { + if (key === '__proto__') return '___proto___' + return key + } + + function deleteFromParserHintObject (optionKey) { + // delete from all parsing hints: + // boolean, array, key, alias, etc. + Object.keys(options).forEach((hintKey) => { + const hint = options[hintKey] + if (Array.isArray(hint)) { + if (~hint.indexOf(optionKey)) hint.splice(hint.indexOf(optionKey), 1) + } else if (typeof hint === 'object') { + delete hint[optionKey] + } + }) + // now delete the description from usage.js. + delete usage.getDescriptions()[optionKey] + } + + self.config = function config (key, msg, parseFn) { + argsert('[object|string] [string|function] [function]', [key, msg, parseFn], arguments.length) + // allow a config object to be provided directly. + if (typeof key === 'object') { + key = applyExtends(key, cwd) + options.configObjects = (options.configObjects || []).concat(key) + return self + } + + // allow for a custom parsing function. + if (typeof msg === 'function') { + parseFn = msg + msg = null + } + + key = key || 'config' + self.describe(key, msg || usage.deferY18nLookup('Path to JSON config file')) + ;(Array.isArray(key) ? key : [key]).forEach((k) => { + options.config[k] = parseFn || true + }) + + return self + } + + self.example = function (cmd, description) { + argsert(' [string]', [cmd, description], arguments.length) + usage.example(cmd, description) + return self + } + + self.command = function (cmd, description, builder, handler, middlewares) { + argsert(' [string|boolean] [function|object] [function] [array]', [cmd, description, builder, handler, middlewares], arguments.length) + command.addHandler(cmd, description, builder, handler, middlewares) + return self + } + + self.commandDir = function (dir, opts) { + argsert(' [object]', [dir, opts], arguments.length) + const req = parentRequire || require + command.addDirectory(dir, self.getContext(), req, require('get-caller-file')(), opts) + return self + } + + // TODO: deprecate self.demand in favor of + // .demandCommand() .demandOption(). + self.demand = self.required = self.require = function demand (keys, max, msg) { + // you can optionally provide a 'max' key, + // which will raise an exception if too many '_' + // options are provided. + if (Array.isArray(max)) { + max.forEach((key) => { + self.demandOption(key, msg) + }) + max = Infinity + } else if (typeof max !== 'number') { + msg = max + max = Infinity + } + + if (typeof keys === 'number') { + self.demandCommand(keys, max, msg, msg) + } else if (Array.isArray(keys)) { + keys.forEach((key) => { + self.demandOption(key, msg) + }) + } else { + if (typeof msg === 'string') { + self.demandOption(keys, msg) + } else if (msg === true || typeof msg === 'undefined') { + self.demandOption(keys) + } + } + + return self + } + + self.demandCommand = function demandCommand (min, max, minMsg, maxMsg) { + argsert('[number] [number|string] [string|null|undefined] [string|null|undefined]', [min, max, minMsg, maxMsg], arguments.length) + + if (typeof min === 'undefined') min = 1 + + if (typeof max !== 'number') { + minMsg = max + max = Infinity + } + + self.global('_', false) + + options.demandedCommands._ = { + min, + max, + minMsg, + maxMsg + } + + return self + } + + self.getDemandedOptions = () => { + argsert([], 0) + return options.demandedOptions + } + + self.getDemandedCommands = () => { + argsert([], 0) + return options.demandedCommands + } + + self.implies = function (key, value) { + argsert(' [number|string|array]', [key, value], arguments.length) + validation.implies(key, value) + return self + } + + self.conflicts = function (key1, key2) { + argsert(' [string|array]', [key1, key2], arguments.length) + validation.conflicts(key1, key2) + return self + } + + self.usage = function (msg, description, builder, handler) { + argsert(' [string|boolean] [function|object] [function]', [msg, description, builder, handler], arguments.length) + + if (description !== undefined) { + // .usage() can be used as an alias for defining + // a default command. + if ((msg || '').match(/^\$0( |$)/)) { + return self.command(msg, description, builder, handler) + } else { + throw new YError('.usage() description must start with $0 if being used as alias for .command()') + } + } else { + usage.usage(msg) + return self + } + } + + self.epilogue = self.epilog = function (msg) { + argsert('', [msg], arguments.length) + usage.epilog(msg) + return self + } + + self.fail = function (f) { + argsert('', [f], arguments.length) + usage.failFn(f) + return self + } + + self.check = function (f, _global) { + argsert(' [boolean]', [f, _global], arguments.length) + validation.check(f, _global !== false) + return self + } + + self.global = function global (globals, global) { + argsert(' [boolean]', [globals, global], arguments.length) + globals = [].concat(globals) + if (global !== false) { + options.local = options.local.filter(l => globals.indexOf(l) === -1) + } else { + globals.forEach((g) => { + if (options.local.indexOf(g) === -1) options.local.push(g) + }) + } + return self + } + + self.pkgConf = function pkgConf (key, rootPath) { + argsert(' [string]', [key, rootPath], arguments.length) + let conf = null + // prefer cwd to require-main-filename in this method + // since we're looking for e.g. "nyc" config in nyc consumer + // rather than "yargs" config in nyc (where nyc is the main filename) + const obj = pkgUp(rootPath || cwd) + + // If an object exists in the key, add it to options.configObjects + if (obj[key] && typeof obj[key] === 'object') { + conf = applyExtends(obj[key], rootPath || cwd) + options.configObjects = (options.configObjects || []).concat(conf) + } + + return self + } + + const pkgs = {} + function pkgUp (rootPath) { + const npath = rootPath || '*' + if (pkgs[npath]) return pkgs[npath] + const findUp = require('find-up') + + let obj = {} + try { + let startDir = rootPath || require('require-main-filename')(parentRequire || require) + + // When called in an environment that lacks require.main.filename, such as a jest test runner, + // startDir is already process.cwd(), and should not be shortened. + // Whether or not it is _actually_ a directory (e.g., extensionless bin) is irrelevant, find-up handles it. + if (!rootPath && path.extname(startDir)) { + startDir = path.dirname(startDir) + } + + const pkgJsonPath = findUp.sync('package.json', { + cwd: startDir + }) + obj = JSON.parse(fs.readFileSync(pkgJsonPath)) + } catch (noop) {} + + pkgs[npath] = obj || {} + return pkgs[npath] + } + + let parseFn = null + let parseContext = null + self.parse = function parse (args, shortCircuit, _parseFn) { + argsert('[string|array] [function|boolean|object] [function]', [args, shortCircuit, _parseFn], arguments.length) + if (typeof args === 'undefined') { + return self._parseArgs(processArgs) + } + + // a context object can optionally be provided, this allows + // additional information to be passed to a command handler. + if (typeof shortCircuit === 'object') { + parseContext = shortCircuit + shortCircuit = _parseFn + } + + // by providing a function as a second argument to + // parse you can capture output that would otherwise + // default to printing to stdout/stderr. + if (typeof shortCircuit === 'function') { + parseFn = shortCircuit + shortCircuit = null + } + // completion short-circuits the parsing process, + // skipping validation, etc. + if (!shortCircuit) processArgs = args + + freeze() + if (parseFn) exitProcess = false + + const parsed = self._parseArgs(args, shortCircuit) + if (parseFn) parseFn(exitError, parsed, output) + unfreeze() + + return parsed + } + + self._getParseContext = () => parseContext || {} + + self._hasParseCallback = () => !!parseFn + + self.option = self.options = function option (key, opt) { + argsert(' [object]', [key, opt], arguments.length) + if (typeof key === 'object') { + Object.keys(key).forEach((k) => { + self.options(k, key[k]) + }) + } else { + if (typeof opt !== 'object') { + opt = {} + } + + options.key[key] = true // track manually set keys. + + if (opt.alias) self.alias(key, opt.alias) + + const demand = opt.demand || opt.required || opt.require + + // deprecated, use 'demandOption' instead + if (demand) { + self.demand(key, demand) + } + + if (opt.demandOption) { + self.demandOption(key, typeof opt.demandOption === 'string' ? opt.demandOption : undefined) + } + + if ('conflicts' in opt) { + self.conflicts(key, opt.conflicts) + } + + if ('default' in opt) { + self.default(key, opt.default) + } + + if ('implies' in opt) { + self.implies(key, opt.implies) + } + + if ('nargs' in opt) { + self.nargs(key, opt.nargs) + } + + if (opt.config) { + self.config(key, opt.configParser) + } + + if (opt.normalize) { + self.normalize(key) + } + + if ('choices' in opt) { + self.choices(key, opt.choices) + } + + if ('coerce' in opt) { + self.coerce(key, opt.coerce) + } + + if ('group' in opt) { + self.group(key, opt.group) + } + + if (opt.boolean || opt.type === 'boolean') { + self.boolean(key) + if (opt.alias) self.boolean(opt.alias) + } + + if (opt.array || opt.type === 'array') { + self.array(key) + if (opt.alias) self.array(opt.alias) + } + + if (opt.number || opt.type === 'number') { + self.number(key) + if (opt.alias) self.number(opt.alias) + } + + if (opt.string || opt.type === 'string') { + self.string(key) + if (opt.alias) self.string(opt.alias) + } + + if (opt.count || opt.type === 'count') { + self.count(key) + } + + if (typeof opt.global === 'boolean') { + self.global(key, opt.global) + } + + if (opt.defaultDescription) { + options.defaultDescription[key] = opt.defaultDescription + } + + if (opt.skipValidation) { + self.skipValidation(key) + } + + const desc = opt.describe || opt.description || opt.desc + self.describe(key, desc) + if (opt.hidden) { + self.hide(key) + } + + if (opt.requiresArg) { + self.requiresArg(key) + } + } + + return self + } + self.getOptions = () => options + + self.positional = function (key, opts) { + argsert(' ', [key, opts], arguments.length) + if (context.resets === 0) { + throw new YError(".positional() can only be called in a command's builder function") + } + + // .positional() only supports a subset of the configuration + // options available to .option(). + const supportedOpts = ['default', 'defaultDescription', 'implies', 'normalize', + 'choices', 'conflicts', 'coerce', 'type', 'describe', + 'desc', 'description', 'alias'] + opts = objFilter(opts, (k, v) => { + let accept = supportedOpts.indexOf(k) !== -1 + // type can be one of string|number|boolean. + if (k === 'type' && ['string', 'number', 'boolean'].indexOf(v) === -1) accept = false + return accept + }) + + // copy over any settings that can be inferred from the command string. + const fullCommand = context.fullCommands[context.fullCommands.length - 1] + const parseOptions = fullCommand ? command.cmdToParseOptions(fullCommand) : { + array: [], + alias: {}, + default: {}, + demand: {} + } + Object.keys(parseOptions).forEach((pk) => { + if (Array.isArray(parseOptions[pk])) { + if (parseOptions[pk].indexOf(key) !== -1) opts[pk] = true + } else { + if (parseOptions[pk][key] && !(pk in opts)) opts[pk] = parseOptions[pk][key] + } + }) + self.group(key, usage.getPositionalGroupName()) + return self.option(key, opts) + } + + self.group = function group (opts, groupName) { + argsert(' ', [opts, groupName], arguments.length) + const existing = preservedGroups[groupName] || groups[groupName] + if (preservedGroups[groupName]) { + // we now only need to track this group name in groups. + delete preservedGroups[groupName] + } + + const seen = {} + groups[groupName] = (existing || []).concat(opts).filter((key) => { + if (seen[key]) return false + return (seen[key] = true) + }) + return self + } + // combine explicit and preserved groups. explicit groups should be first + self.getGroups = () => Object.assign({}, groups, preservedGroups) + + // as long as options.envPrefix is not undefined, + // parser will apply env vars matching prefix to argv + self.env = function (prefix) { + argsert('[string|boolean]', [prefix], arguments.length) + if (prefix === false) options.envPrefix = undefined + else options.envPrefix = prefix || '' + return self + } + + self.wrap = function (cols) { + argsert('', [cols], arguments.length) + usage.wrap(cols) + return self + } + + let strict = false + self.strict = function (enabled) { + argsert('[boolean]', [enabled], arguments.length) + strict = enabled !== false + return self + } + self.getStrict = () => strict + + let parserConfig = {} + self.parserConfiguration = function parserConfiguration (config) { + argsert('', [config], arguments.length) + parserConfig = config + return self + } + self.getParserConfiguration = () => parserConfig + + self.showHelp = function (level) { + argsert('[string|function]', [level], arguments.length) + if (!self.parsed) self._parseArgs(processArgs) // run parser, if it has not already been executed. + if (command.hasDefaultCommand()) { + context.resets++ // override the restriction on top-level positoinals. + command.runDefaultBuilderOn(self, true) + } + usage.showHelp(level) + return self + } + + let versionOpt = null + self.version = function version (opt, msg, ver) { + const defaultVersionOpt = 'version' + argsert('[boolean|string] [string] [string]', [opt, msg, ver], arguments.length) + + // nuke the key previously configured + // to return version #. + if (versionOpt) { + deleteFromParserHintObject(versionOpt) + usage.version(undefined) + versionOpt = null + } + + if (arguments.length === 0) { + ver = guessVersion() + opt = defaultVersionOpt + } else if (arguments.length === 1) { + if (opt === false) { // disable default 'version' key. + return self + } + ver = opt + opt = defaultVersionOpt + } else if (arguments.length === 2) { + ver = msg + msg = null + } + + versionOpt = typeof opt === 'string' ? opt : defaultVersionOpt + msg = msg || usage.deferY18nLookup('Show version number') + + usage.version(ver || undefined) + self.boolean(versionOpt) + self.describe(versionOpt, msg) + return self + } + + function guessVersion () { + const obj = pkgUp() + + return obj.version || 'unknown' + } + + let helpOpt = null + self.addHelpOpt = self.help = function addHelpOpt (opt, msg) { + const defaultHelpOpt = 'help' + argsert('[string|boolean] [string]', [opt, msg], arguments.length) + + // nuke the key previously configured + // to return help. + if (helpOpt) { + deleteFromParserHintObject(helpOpt) + helpOpt = null + } + + if (arguments.length === 1) { + if (opt === false) return self + } + + // use arguments, fallback to defaults for opt and msg + helpOpt = typeof opt === 'string' ? opt : defaultHelpOpt + self.boolean(helpOpt) + self.describe(helpOpt, msg || usage.deferY18nLookup('Show help')) + return self + } + + const defaultShowHiddenOpt = 'show-hidden' + options.showHiddenOpt = defaultShowHiddenOpt + self.addShowHiddenOpt = self.showHidden = function addShowHiddenOpt (opt, msg) { + argsert('[string|boolean] [string]', [opt, msg], arguments.length) + + if (arguments.length === 1) { + if (opt === false) return self + } + + const showHiddenOpt = typeof opt === 'string' ? opt : defaultShowHiddenOpt + self.boolean(showHiddenOpt) + self.describe(showHiddenOpt, msg || usage.deferY18nLookup('Show hidden options')) + options.showHiddenOpt = showHiddenOpt + return self + } + + self.hide = function hide (key) { + argsert('', [key], arguments.length) + options.hiddenOptions.push(key) + return self + } + + self.showHelpOnFail = function showHelpOnFail (enabled, message) { + argsert('[boolean|string] [string]', [enabled, message], arguments.length) + usage.showHelpOnFail(enabled, message) + return self + } + + var exitProcess = true + self.exitProcess = function (enabled) { + argsert('[boolean]', [enabled], arguments.length) + if (typeof enabled !== 'boolean') { + enabled = true + } + exitProcess = enabled + return self + } + self.getExitProcess = () => exitProcess + + var completionCommand = null + self.completion = function (cmd, desc, fn) { + argsert('[string] [string|boolean|function] [function]', [cmd, desc, fn], arguments.length) + + // a function to execute when generating + // completions can be provided as the second + // or third argument to completion. + if (typeof desc === 'function') { + fn = desc + desc = null + } + + // register the completion command. + completionCommand = cmd || 'completion' + if (!desc && desc !== false) { + desc = 'generate completion script' + } + self.command(completionCommand, desc) + + // a function can be provided + if (fn) completion.registerFunction(fn) + + return self + } + + self.showCompletionScript = function ($0) { + argsert('[string]', [$0], arguments.length) + $0 = $0 || self.$0 + _logger.log(completion.generateCompletionScript($0, completionCommand)) + return self + } + + self.getCompletion = function (args, done) { + argsert(' ', [args, done], arguments.length) + completion.getCompletion(args, done) + } + + self.locale = function (locale) { + argsert('[string]', [locale], arguments.length) + if (arguments.length === 0) { + guessLocale() + return y18n.getLocale() + } + detectLocale = false + y18n.setLocale(locale) + return self + } + + self.updateStrings = self.updateLocale = function (obj) { + argsert('', [obj], arguments.length) + detectLocale = false + y18n.updateLocale(obj) + return self + } + + let detectLocale = true + self.detectLocale = function (detect) { + argsert('', [detect], arguments.length) + detectLocale = detect + return self + } + self.getDetectLocale = () => detectLocale + + var hasOutput = false + var exitError = null + // maybe exit, always capture + // context about why we wanted to exit. + self.exit = (code, err) => { + hasOutput = true + exitError = err + if (exitProcess) process.exit(code) + } + + // we use a custom logger that buffers output, + // so that we can print to non-CLIs, e.g., chat-bots. + const _logger = { + log () { + const args = [] + for (let i = 0; i < arguments.length; i++) args.push(arguments[i]) + if (!self._hasParseCallback()) console.log.apply(console, args) + hasOutput = true + if (output.length) output += '\n' + output += args.join(' ') + }, + error () { + const args = [] + for (let i = 0; i < arguments.length; i++) args.push(arguments[i]) + if (!self._hasParseCallback()) console.error.apply(console, args) + hasOutput = true + if (output.length) output += '\n' + output += args.join(' ') + } + } + self._getLoggerInstance = () => _logger + // has yargs output an error our help + // message in the current execution context. + self._hasOutput = () => hasOutput + + self._setHasOutput = () => { + hasOutput = true + } + + let recommendCommands + self.recommendCommands = function (recommend) { + argsert('[boolean]', [recommend], arguments.length) + recommendCommands = typeof recommend === 'boolean' ? recommend : true + return self + } + + self.getUsageInstance = () => usage + + self.getValidationInstance = () => validation + + self.getCommandInstance = () => command + + self.terminalWidth = () => { + argsert([], 0) + return typeof process.stdout.columns !== 'undefined' ? process.stdout.columns : null + } + + Object.defineProperty(self, 'argv', { + get: () => self._parseArgs(processArgs), + enumerable: true + }) + + self._parseArgs = function parseArgs (args, shortCircuit, _skipValidation, commandIndex) { + let skipValidation = !!_skipValidation + args = args || processArgs + + options.__ = y18n.__ + options.configuration = self.getParserConfiguration() + + // Deprecated + let pkgConfig = pkgUp()['yargs'] + if (pkgConfig) { + console.warn('Configuring yargs through package.json is deprecated and will be removed in the next major release, please use the JS API instead.') + options.configuration = Object.assign({}, pkgConfig, options.configuration) + } + + const parsed = Parser.detailed(args, options) + let argv = parsed.argv + if (parseContext) argv = Object.assign({}, argv, parseContext) + const aliases = parsed.aliases + + argv.$0 = self.$0 + self.parsed = parsed + + try { + guessLocale() // guess locale lazily, so that it can be turned off in chain. + + // while building up the argv object, there + // are two passes through the parser. If completion + // is being performed short-circuit on the first pass. + if (shortCircuit) { + return argv + } + + // if there's a handler associated with a + // command defer processing to it. + if (helpOpt) { + // consider any multi-char helpOpt alias as a valid help command + // unless all helpOpt aliases are single-char + // note that parsed.aliases is a normalized bidirectional map :) + const helpCmds = [helpOpt] + .concat(aliases[helpOpt] || []) + .filter(k => k.length > 1) + // check if help should trigger and strip it from _. + if (~helpCmds.indexOf(argv._[argv._.length - 1])) { + argv._.pop() + argv[helpOpt] = true + } + } + + const handlerKeys = command.getCommands() + const requestCompletions = completion.completionKey in argv + const skipRecommendation = argv[helpOpt] || requestCompletions + const skipDefaultCommand = skipRecommendation && (handlerKeys.length > 1 || handlerKeys[0] !== '$0') + + if (argv._.length) { + if (handlerKeys.length) { + let firstUnknownCommand + for (let i = (commandIndex || 0), cmd; argv._[i] !== undefined; i++) { + cmd = String(argv._[i]) + if (~handlerKeys.indexOf(cmd) && cmd !== completionCommand) { + // commands are executed using a recursive algorithm that executes + // the deepest command first; we keep track of the position in the + // argv._ array that is currently being executed. + return command.runCommand(cmd, self, parsed, i + 1) + } else if (!firstUnknownCommand && cmd !== completionCommand) { + firstUnknownCommand = cmd + break + } + } + + // run the default command, if defined + if (command.hasDefaultCommand() && !skipDefaultCommand) { + return command.runCommand(null, self, parsed) + } + + // recommend a command if recommendCommands() has + // been enabled, and no commands were found to execute + if (recommendCommands && firstUnknownCommand && !skipRecommendation) { + validation.recommendCommands(firstUnknownCommand, handlerKeys) + } + } + + // generate a completion script for adding to ~/.bashrc. + if (completionCommand && ~argv._.indexOf(completionCommand) && !requestCompletions) { + if (exitProcess) setBlocking(true) + self.showCompletionScript() + self.exit(0) + } + } else if (command.hasDefaultCommand() && !skipDefaultCommand) { + return command.runCommand(null, self, parsed) + } + + // we must run completions first, a user might + // want to complete the --help or --version option. + if (requestCompletions) { + if (exitProcess) setBlocking(true) + + // we allow for asynchronous completions, + // e.g., loading in a list of commands from an API. + const completionArgs = args.slice(args.indexOf(`--${completion.completionKey}`) + 1) + completion.getCompletion(completionArgs, (completions) => { + ;(completions || []).forEach((completion) => { + _logger.log(completion) + }) + + self.exit(0) + }) + return argv + } + + // Handle 'help' and 'version' options + // if we haven't already output help! + if (!hasOutput) { + Object.keys(argv).forEach((key) => { + if (key === helpOpt && argv[key]) { + if (exitProcess) setBlocking(true) + + skipValidation = true + self.showHelp('log') + self.exit(0) + } else if (key === versionOpt && argv[key]) { + if (exitProcess) setBlocking(true) + + skipValidation = true + usage.showVersion() + self.exit(0) + } + }) + } + + // Check if any of the options to skip validation were provided + if (!skipValidation && options.skipValidation.length > 0) { + skipValidation = Object.keys(argv).some(key => options.skipValidation.indexOf(key) >= 0 && argv[key] === true) + } + + // If the help or version options where used and exitProcess is false, + // or if explicitly skipped, we won't run validations. + if (!skipValidation) { + if (parsed.error) throw new YError(parsed.error.message) + + // if we're executed via bash completion, don't + // bother with validation. + if (!requestCompletions) { + self._runValidation(argv, aliases, {}, parsed.error) + } + } + } catch (err) { + if (err instanceof YError) usage.fail(err.message, err) + else throw err + } + + return argv + } + + self._runValidation = function runValidation (argv, aliases, positionalMap, parseErrors) { + if (parseErrors) throw new YError(parseErrors.message || parseErrors) + validation.nonOptionCount(argv) + validation.requiredArguments(argv) + if (strict) validation.unknownArguments(argv, aliases, positionalMap) + validation.customChecks(argv, aliases) + validation.limitedChoices(argv) + validation.implications(argv) + validation.conflicting(argv) + } + + function guessLocale () { + if (!detectLocale) return + + try { + const { env } = process + const locale = env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE || 'en_US' + self.locale(locale.replace(/[.:].*/, '')) + } catch (err) { + // if we explode looking up locale just noop + // we'll keep using the default language 'en'. + } + } + + // an app should almost always have --version and --help, + // if you *really* want to disable this use .help(false)/.version(false). + self.help() + self.version() + + return self +} + +// rebase an absolute path to a relative one with respect to a base directory +// exported for tests +exports.rebase = rebase +function rebase (base, dir) { + return path.relative(base, dir) +} diff --git a/node_modules/sass-graph/package.json b/node_modules/sass-graph/package.json new file mode 100644 index 00000000..ff542f78 --- /dev/null +++ b/node_modules/sass-graph/package.json @@ -0,0 +1,38 @@ +{ + "name": "sass-graph", + "version": "2.2.5", + "description": "Parse sass files and extract a graph of imports", + "license": "MIT", + "repository": "xzyfer/sass-graph", + "author": "xzyfer", + "main": "sass-graph.js", + "directories": { + "bin": "./bin" + }, + "scripts": { + "test": "nyc mocha", + "coverage": "nyc report --reporter=text-lcov | coveralls" + }, + "keywords": [ + "sass", + "graph" + ], + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "devDependencies": { + "assert": "^1.3.0", + "chai": "^3.5.0", + "coveralls": "^2.13.0", + "mocha": "^3.2.0", + "nyc": "^10.2.0" + }, + "files": [ + "bin", + "parse-imports.js", + "sass-graph.js" + ] +} diff --git a/node_modules/sass-graph/parse-imports.js b/node_modules/sass-graph/parse-imports.js new file mode 100644 index 00000000..634253ec --- /dev/null +++ b/node_modules/sass-graph/parse-imports.js @@ -0,0 +1,64 @@ +var tokenizer = require('scss-tokenizer'); + +function parseImports(content, isIndentedSyntax) { + var tokens = tokenizer.tokenize(content); + var results = []; + var tmp = ''; + var inImport = false; + var inParen = false; + var prevToken = tokens[0]; + + var i, token; + for (i = 1; i < tokens.length; i++) { + token = tokens[i]; + + if (inImport && !inParen && token[0] === 'string') { + results.push(token[1]); + } + else if (token[1] === 'import' && prevToken[1] === '@') { + if (inImport && !isIndentedSyntax) { + throw new Error('Encountered invalid @import syntax.'); + } + + inImport = true; + } + else if (inImport && !inParen && (token[0] === 'ident' || token[0] === '/')) { + tmp += token[1]; + } + else if (inImport && !inParen && (token[0] === 'space' || token[0] === 'newline')) { + if (tmp !== '') { + results.push(tmp); + tmp = ''; + + if (isIndentedSyntax) { + inImport = false; + } + } + } + else if (inImport && token[0] === ';') { + inImport = false; + + if (tmp !== '') { + results.push(tmp); + tmp = ''; + } + } + else if (inImport && token[0] === '(') { + inParen = true; + tmp = ''; + } + else if (inParen && token[0] === ')') { + inParen = false; + } + + prevToken = token; + } + + if (tmp !== '') { + results.push(tmp); + } + + return results; +} + +module.exports = parseImports; diff --git a/node_modules/sass-graph/readme.md b/node_modules/sass-graph/readme.md new file mode 100644 index 00000000..1cb67fbe --- /dev/null +++ b/node_modules/sass-graph/readme.md @@ -0,0 +1,123 @@ +# Sass Graph + +Parses Sass files in a directory and exposes a graph of dependencies + +[![Build Status](https://travis-ci.org/xzyfer/sass-graph.svg?branch=master)](https://travis-ci.org/xzyfer/sass-graph) +[![Coverage Status](https://coveralls.io/repos/github/xzyfer/sass-graph/badge.svg?branch=master)](https://coveralls.io/github/xzyfer/sass-graph?branch=master) +[![npm version](https://badge.fury.io/js/sass-graph.svg)](http://badge.fury.io/js/sass-graph) +[![Dependency Status](https://david-dm.org/xzyfer/sass-graph.svg?theme=shields.io)](https://david-dm.org/xzyfer/sass-graph) +[![devDependency Status](https://david-dm.org/xzyfer/sass-graph/dev-status.svg?theme=shields.io)](https://david-dm.org/xzyfer/sass-graph#info=devDependencies) + +## Install + +Install with [npm](https://npmjs.org/package/sass-graph) + +``` +npm install --save-dev sass-graph +``` + +## Usage + +Usage as a Node library: + +```js +var sassGraph = require('./sass-graph'); +``` + +Usage as a command line tool: + +The command line tool will parse a graph and then either display ancestors, descendents or both. + +``` +$ ./bin/sassgraph --help +Usage: bin/sassgraph [options] [file] + +Commands: + ancestors Output the ancestors + descendents Output the descendents + +Options: + -I, --load-path Add directories to the sass load path + -e, --extensions File extensions to include in the graph + -j, --json Output the index in json + -h, --help Show help + -v, --version Show version number + +Examples: + ./bin/sassgraph descendents test/fixtures test/fixtures/a.scss + /path/to/test/fixtures/b.scss + /path/to/test/fixtures/_c.scss +``` + +## API + +#### parseDir + +Parses a directory and builds a dependency graph of all requested file extensions. + +#### parseFile + +Parses a file and builds its dependency graph. + +## Options + +#### loadPaths + +Type: `Array` +Default: `[process.cwd]` + +Directories to use when resolved `@import` directives. + +#### extensions + +Type: `Array` +Default: `['scss', 'css', 'sass']` + +File types to be parsed. + +#### follow + +Type: `Boolean` +Default: `false` + +Follow symbolic links. + +## Example + +```js +var sassGraph = require('./sass-graph'); +console.log(sassGraph.parseDir('test/fixtures')); + +//{ index: {, +// '/path/to/test/fixtures/a.scss': { +// imports: ['b.scss'], +// importedBy: [], +// }, +// '/path/to/test/fixtures/b.scss': { +// imports: ['_c.scss'], +// importedBy: ['a.scss'], +// }, +// '/path/to/test/fixtures/_c.scss': { +// imports: [], +// importedBy: ['b/scss'], +// }, +//}} +``` + +## Running Mocha tests + +You can run the tests by executing the following commands: + +``` +npm install +npm test +``` + +## Authors + +Sass graph was originally written by [Lachlan Donald](http://lachlan.me). +It is now maintained by [Michael Mifsud](http://twitter.com/xzyfer). + +## License + +MIT diff --git a/node_modules/sass-graph/sass-graph.js b/node_modules/sass-graph/sass-graph.js new file mode 100644 index 00000000..5d5aba0e --- /dev/null +++ b/node_modules/sass-graph/sass-graph.js @@ -0,0 +1,160 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); +var _ = require('lodash'); +var glob = require('glob'); +var parseImports = require('./parse-imports'); + +// resolve a sass module to a path +function resolveSassPath(sassPath, loadPaths, extensions) { + // trim sass file extensions + var re = new RegExp('(\.('+extensions.join('|')+'))$', 'i'); + var sassPathName = sassPath.replace(re, ''); + // check all load paths + var i, j, length = loadPaths.length, scssPath, partialPath; + for (i = 0; i < length; i++) { + for (j = 0; j < extensions.length; j++) { + scssPath = path.normalize(loadPaths[i] + '/' + sassPathName + '.' + extensions[j]); + try { + if (fs.lstatSync(scssPath).isFile()) { + return scssPath; + } + } catch (e) {} + } + + // special case for _partials + for (j = 0; j < extensions.length; j++) { + scssPath = path.normalize(loadPaths[i] + '/' + sassPathName + '.' + extensions[j]); + partialPath = path.join(path.dirname(scssPath), '_' + path.basename(scssPath)); + try { + if (fs.lstatSync(partialPath).isFile()) { + return partialPath; + } + } catch (e) {} + } + } + + // File to import not found or unreadable so we assume this is a custom import + return false; +} + +function Graph(options, dir) { + this.dir = dir; + this.extensions = options.extensions || []; + this.index = {}; + this.follow = options.follow || false; + this.loadPaths = _(options.loadPaths).map(function(p) { + return path.resolve(p); + }).value(); + + if (dir) { + var graph = this; + _.each(glob.sync(dir+'/**/*.@('+this.extensions.join('|')+')', { dot: true, nodir: true, follow: this.follow }), function(file) { + graph.addFile(path.resolve(file)); + }); + } +} + +// add a sass file to the graph +Graph.prototype.addFile = function(filepath, parent) { + var entry = this.index[filepath] = this.index[filepath] || { + imports: [], + importedBy: [], + modified: fs.statSync(filepath).mtime + }; + + var resolvedParent; + var isIndentedSyntax = path.extname(filepath) === '.sass'; + var imports = parseImports(fs.readFileSync(filepath, 'utf-8'), isIndentedSyntax); + var cwd = path.dirname(filepath); + + var i, length = imports.length, loadPaths, resolved; + for (i = 0; i < length; i++) { + loadPaths = _([cwd, this.dir]).concat(this.loadPaths).filter().uniq().value(); + resolved = resolveSassPath(imports[i], loadPaths, this.extensions); + if (!resolved) continue; + + // recurse into dependencies if not already enumerated + if (!_.includes(entry.imports, resolved)) { + entry.imports.push(resolved); + this.addFile(fs.realpathSync(resolved), filepath); + } + } + + // add link back to parent + if (parent) { + resolvedParent = _(parent).intersection(this.loadPaths).value(); + + if (resolvedParent) { + resolvedParent = parent.substr(parent.indexOf(resolvedParent)); + } else { + resolvedParent = parent; + } + + entry.importedBy.push(resolvedParent); + } +}; + +// visits all files that are ancestors of the provided file +Graph.prototype.visitAncestors = function(filepath, callback) { + this.visit(filepath, callback, function(err, node) { + if (err || !node) return []; + return node.importedBy; + }); +}; + +// visits all files that are descendents of the provided file +Graph.prototype.visitDescendents = function(filepath, callback) { + this.visit(filepath, callback, function(err, node) { + if (err || !node) return []; + return node.imports; + }); +}; + +// a generic visitor that uses an edgeCallback to find the edges to traverse for a node +Graph.prototype.visit = function(filepath, callback, edgeCallback, visited) { + filepath = fs.realpathSync(filepath); + var visited = visited || []; + if (!this.index.hasOwnProperty(filepath)) { + edgeCallback('Graph doesn\'t contain ' + filepath, null); + } + var edges = edgeCallback(null, this.index[filepath]); + + var i, length = edges.length; + for (i = 0; i < length; i++) { + if (!_.includes(visited, edges[i])) { + visited.push(edges[i]); + callback(edges[i], this.index[edges[i]]); + this.visit(edges[i], callback, edgeCallback, visited); + } + } +}; + +function processOptions(options) { + return _.assign({ + loadPaths: [process.cwd()], + extensions: ['scss', 'css', 'sass'], + }, options); +} + +module.exports.parseFile = function(filepath, options) { + if (fs.lstatSync(filepath).isFile()) { + filepath = path.resolve(filepath); + options = processOptions(options); + var graph = new Graph(options); + graph.addFile(filepath); + return graph; + } + // throws +}; + +module.exports.parseDir = function(dirpath, options) { + if (fs.lstatSync(dirpath).isDirectory()) { + dirpath = path.resolve(dirpath); + options = processOptions(options); + var graph = new Graph(options, dirpath); + return graph; + } + // throws +}; diff --git a/node_modules/scss-tokenizer/LICENSE b/node_modules/scss-tokenizer/LICENSE new file mode 100644 index 00000000..eb44a437 --- /dev/null +++ b/node_modules/scss-tokenizer/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 sasstools + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/node_modules/scss-tokenizer/README.md b/node_modules/scss-tokenizer/README.md new file mode 100644 index 00000000..cfcb2c01 --- /dev/null +++ b/node_modules/scss-tokenizer/README.md @@ -0,0 +1,50 @@ +# scss-tokenizer +A tokenzier for Sass' SCSS syntax + +![https://travis-ci.org/sasstools/scss-tokenizer.svg?branch=master](https://img.shields.io/travis/sasstools/scss-tokenizer.svg) +![https://www.npmjs.com/package/scss-tokenizer](https://img.shields.io/npm/v/scss-tokenizer.svg) +![https://github.com/sasstools/scss-tokenizer/issues](https://img.shields.io/github/issues/sasstools/scss-tokenizer.svg) +![](https://img.shields.io/github/license/sasstools/scss-tokenizer.svg) + +# Install + +``` +npm install scss-tokenizer +``` + +# Usage + +```js +var scss = require('scss-tokenizer'); +scss.tokenize(css); +``` + +# API + +### `tokenize` + +Tokenizes source `css` and returns an ordered array of tokens with positional +data. + +```js +var tokenizer = require('scss-tokenizer'); +var tokens = tokenize.tokenize(css); +``` + +Arguments: + +* `css (string|#toString)`: String with input CSS or any object + with `toString()` method, like file stream. +* `opts (object) optional`: options: + * `from`: the path to the source CSS file. You should always set `from`, + because it is used in map generation and in syntax error messages. + +# Test + +``` +npm test +``` + +## Attribution + +This project started as a fork of the [PostCSS](https://github.com/postcss/postcss) tokenizer. diff --git a/node_modules/scss-tokenizer/index.js b/node_modules/scss-tokenizer/index.js new file mode 100644 index 00000000..51d496ce --- /dev/null +++ b/node_modules/scss-tokenizer/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/entry').default; diff --git a/node_modules/scss-tokenizer/node_modules/source-map/README.md b/node_modules/scss-tokenizer/node_modules/source-map/README.md new file mode 100644 index 00000000..b7c6786c --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/README.md @@ -0,0 +1,510 @@ +# Source Map + +This is a library to generate and consume the source map format +[described here][format]. + +This library is written in the Asynchronous Module Definition format, and works +in the following environments: + +* Modern Browsers supporting ECMAScript 5 (either after the build, or with an + AMD loader such as RequireJS) + +* Inside Firefox (as a JSM file, after the build) + +* With NodeJS versions 0.8.X and higher + +## Node + + $ npm install source-map + +## Building from Source (for everywhere else) + +Install Node and then run + + $ git clone https://fitzgen@github.com/mozilla/source-map.git + $ cd source-map + $ npm link . + +Next, run + + $ node Makefile.dryice.js + +This should spew a bunch of stuff to stdout, and create the following files: + +* `dist/source-map.js` - The unminified browser version. + +* `dist/source-map.min.js` - The minified browser version. + +* `dist/SourceMap.jsm` - The JavaScript Module for inclusion in Firefox source. + +## Examples + +### Consuming a source map + +```js +var rawSourceMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: 'http://example.com/www/js/', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' +}; + +var smc = new SourceMapConsumer(rawSourceMap); + +console.log(smc.sources); +// [ 'http://example.com/www/js/one.js', +// 'http://example.com/www/js/two.js' ] + +console.log(smc.originalPositionFor({ + line: 2, + column: 28 +})); +// { source: 'http://example.com/www/js/two.js', +// line: 2, +// column: 10, +// name: 'n' } + +console.log(smc.generatedPositionFor({ + source: 'http://example.com/www/js/two.js', + line: 2, + column: 10 +})); +// { line: 2, column: 28 } + +smc.eachMapping(function (m) { + // ... +}); +``` + +### Generating a source map + +In depth guide: +[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) + +#### With SourceNode (high level API) + +```js +function compile(ast) { + switch (ast.type) { + case 'BinaryExpression': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + [compile(ast.left), " + ", compile(ast.right)] + ); + case 'Literal': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + String(ast.value) + ); + // ... + default: + throw new Error("Bad AST"); + } +} + +var ast = parse("40 + 2", "add.js"); +console.log(compile(ast).toStringWithSourceMap({ + file: 'add.js' +})); +// { code: '40 + 2', +// map: [object SourceMapGenerator] } +``` + +#### With SourceMapGenerator (low level API) + +```js +var map = new SourceMapGenerator({ + file: "source-mapped.js" +}); + +map.addMapping({ + generated: { + line: 10, + column: 35 + }, + source: "foo.js", + original: { + line: 33, + column: 2 + }, + name: "christopher" +}); + +console.log(map.toString()); +// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' +``` + +## API + +Get a reference to the module: + +```js +// NodeJS +var sourceMap = require('source-map'); + +// Browser builds +var sourceMap = window.sourceMap; + +// Inside Firefox +let sourceMap = {}; +Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap); +``` + +### SourceMapConsumer + +A SourceMapConsumer instance represents a parsed source map which we can query +for information about the original file positions by giving it a file position +in the generated source. + +#### new SourceMapConsumer(rawSourceMap) + +The only parameter is the raw source map (either as a string which can be +`JSON.parse`'d, or an object). According to the spec, source maps have the +following attributes: + +* `version`: Which version of the source map spec this map is following. + +* `sources`: An array of URLs to the original source files. + +* `names`: An array of identifiers which can be referrenced by individual + mappings. + +* `sourceRoot`: Optional. The URL root from which all sources are relative. + +* `sourcesContent`: Optional. An array of contents of the original source files. + +* `mappings`: A string of base64 VLQs which contain the actual mappings. + +* `file`: Optional. The generated filename this source map is associated with. + +#### SourceMapConsumer.prototype.computeColumnSpans() + +Compute the last column for each generated mapping. The last column is +inclusive. + +#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) + +Returns the original source, line, and column information for the generated +source's line and column positions provided. The only argument is an object with +the following properties: + +* `line`: The line number in the generated source. + +* `column`: The column number in the generated source. + +* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or + `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest + element that is smaller than or greater than the one we are searching for, + respectively, if the exact element cannot be found. Defaults to + `SourceMapConsumer.GREATEST_LOWER_BOUND`. + +and an object is returned with the following properties: + +* `source`: The original source file, or null if this information is not + available. + +* `line`: The line number in the original source, or null if this information is + not available. + +* `column`: The column number in the original source, or null or null if this + information is not available. + +* `name`: The original identifier, or null if this information is not available. + +#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) + +Returns the generated line and column information for the original source, +line, and column positions provided. The only argument is an object with +the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: The column number in the original source. + +and an object is returned with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) + +Returns all generated line and column information for the original source, line, +and column provided. If no column is provided, returns all mappings +corresponding to a either the line we are searching for or the next closest line +that has any mappings. Otherwise, returns all mappings corresponding to the +given line and either the column we are searching for or the next closest column +that has any offsets. + +The only argument is an object with the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: Optional. The column number in the original source. + +and an array of objects is returned, each with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +#### SourceMapConsumer.prototype.hasContentsOfAllSources() + +Return true if we have the embedded source content for every source listed in +the source map, false otherwise. + +In other words, if this method returns `true`, then `smc.sourceContentFor(s)` +will succeed for every source `s` in `smc.sources`. + +#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing]) + +Returns the original source content for the source provided. The only +argument is the URL of the original source file. + +If the source content for the given source is not found, then an error is +thrown. Optionally, pass `true` as the second param to have `null` returned +instead. + +#### SourceMapConsumer.prototype.eachMapping(callback, context, order) + +Iterate over each mapping between an original source/line/column and a +generated line/column in this source map. + +* `callback`: The function that is called with each mapping. Mappings have the + form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, + name }` + +* `context`: Optional. If specified, this object will be the value of `this` + every time that `callback` is called. + +* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or + `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over + the mappings sorted by the generated file's line/column order or the + original's source/line/column order, respectively. Defaults to + `SourceMapConsumer.GENERATED_ORDER`. + +### SourceMapGenerator + +An instance of the SourceMapGenerator represents a source map which is being +built incrementally. + +#### new SourceMapGenerator([startOfSourceMap]) + +You may pass an object with the following properties: + +* `file`: The filename of the generated source that this source map is + associated with. + +* `sourceRoot`: A root for all relative URLs in this source map. + +* `skipValidation`: Optional. When `true`, disables validation of mappings as + they are added. This can improve performance but should be used with + discretion, as a last resort. Even then, one should avoid using this flag when + running tests, if possible. + +#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) + +Creates a new SourceMapGenerator based on a SourceMapConsumer + +* `sourceMapConsumer` The SourceMap. + +#### SourceMapGenerator.prototype.addMapping(mapping) + +Add a single mapping from original source line and column to the generated +source's line and column for this source map being created. The mapping object +should have the following properties: + +* `generated`: An object with the generated line and column positions. + +* `original`: An object with the original line and column positions. + +* `source`: The original source file (relative to the sourceRoot). + +* `name`: An optional original token name for this mapping. + +#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for an original source file. + +* `sourceFile` the URL of the original source file. + +* `sourceContent` the content of the source file. + +#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) + +Applies a SourceMap for a source file to the SourceMap. +Each mapping to the supplied source file is rewritten using the +supplied SourceMap. Note: The resolution for the resulting mappings +is the minimium of this map and the supplied map. + +* `sourceMapConsumer`: The SourceMap to be applied. + +* `sourceFile`: Optional. The filename of the source file. + If omitted, sourceMapConsumer.file will be used, if it exists. + Otherwise an error will be thrown. + +* `sourceMapPath`: Optional. The dirname of the path to the SourceMap + to be applied. If relative, it is relative to the SourceMap. + + This parameter is needed when the two SourceMaps aren't in the same + directory, and the SourceMap to be applied contains relative source + paths. If so, those relative source paths need to be rewritten + relative to the SourceMap. + + If omitted, it is assumed that both SourceMaps are in the same directory, + thus not needing any rewriting. (Supplying `'.'` has the same effect.) + +#### SourceMapGenerator.prototype.toString() + +Renders the source map being generated to a string. + +### SourceNode + +SourceNodes provide a way to abstract over interpolating and/or concatenating +snippets of generated JavaScript source code, while maintaining the line and +column information associated between those snippets and the original source +code. This is useful as the final intermediate representation a compiler might +use before outputting the generated JS and source map. + +#### new SourceNode([line, column, source[, chunk[, name]]]) + +* `line`: The original line number associated with this source node, or null if + it isn't associated with an original line. + +* `column`: The original column number associated with this source node, or null + if it isn't associated with an original column. + +* `source`: The original source's filename; null if no filename is provided. + +* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see + below. + +* `name`: Optional. The original identifier. + +#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) + +Creates a SourceNode from generated code and a SourceMapConsumer. + +* `code`: The generated code + +* `sourceMapConsumer` The SourceMap for the generated code + +* `relativePath` The optional path that relative sources in `sourceMapConsumer` + should be relative to. + +#### SourceNode.prototype.add(chunk) + +Add a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +#### SourceNode.prototype.prepend(chunk) + +Prepend a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for a source file. This will be added to the +`SourceMap` in the `sourcesContent` field. + +* `sourceFile`: The filename of the source file + +* `sourceContent`: The content of the source file + +#### SourceNode.prototype.walk(fn) + +Walk over the tree of JS snippets in this node and its children. The walking +function is called once for each snippet of JS and is passed that snippet and +the its original associated source's line/column location. + +* `fn`: The traversal function. + +#### SourceNode.prototype.walkSourceContents(fn) + +Walk over the tree of SourceNodes. The walking function is called for each +source file content and is passed the filename and source content. + +* `fn`: The traversal function. + +#### SourceNode.prototype.join(sep) + +Like `Array.prototype.join` except for SourceNodes. Inserts the separator +between each of this source node's children. + +* `sep`: The separator. + +#### SourceNode.prototype.replaceRight(pattern, replacement) + +Call `String.prototype.replace` on the very right-most source snippet. Useful +for trimming whitespace from the end of a source node, etc. + +* `pattern`: The pattern to replace. + +* `replacement`: The thing to replace the pattern with. + +#### SourceNode.prototype.toString() + +Return the string representation of this source node. Walks over the tree and +concatenates all the various snippets together to one string. + +#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) + +Returns the string representation of this tree of source nodes, plus a +SourceMapGenerator which contains all the mappings between the generated and +original sources. + +The arguments are the same as those to `new SourceMapGenerator`. + +## Tests + +[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map) + +Install NodeJS version 0.8.0 or greater, then run `node test/run-tests.js`. + +To add new tests, create a new file named `test/test-.js` +and export your test functions with names that start with "test", for example + +```js +exports["test doing the foo bar"] = function (assert, util) { + ... +}; +``` + +The new test will be located automatically when you run the suite. + +The `util` argument is the test utility module located at `test/source-map/util`. + +The `assert` argument is a cut down version of node's assert module. You have +access to the following assertion functions: + +* `doesNotThrow` + +* `equal` + +* `ok` + +* `strictEqual` + +* `throws` + +(The reason for the restricted set of test functions is because we need the +tests to run inside Firefox's test suite as well and so the assert module is +shimmed in that environment. See `build/assert-shim.js`.) + +[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit +[feature]: https://wiki.mozilla.org/DevTools/Features/SourceMap +[Dryice]: https://github.com/mozilla/dryice diff --git a/node_modules/scss-tokenizer/node_modules/source-map/build/assert-shim.js b/node_modules/scss-tokenizer/node_modules/source-map/build/assert-shim.js new file mode 100644 index 00000000..daa1a623 --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/build/assert-shim.js @@ -0,0 +1,56 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +define('test/source-map/assert', ['exports'], function (exports) { + + let do_throw = function (msg) { + throw new Error(msg); + }; + + exports.init = function (throw_fn) { + do_throw = throw_fn; + }; + + exports.doesNotThrow = function (fn) { + try { + fn(); + } + catch (e) { + do_throw(e.message); + } + }; + + exports.equal = function (actual, expected, msg) { + msg = msg || String(actual) + ' != ' + String(expected); + if (actual != expected) { + do_throw(msg); + } + }; + + exports.ok = function (val, msg) { + msg = msg || String(val) + ' is falsey'; + if (!Boolean(val)) { + do_throw(msg); + } + }; + + exports.strictEqual = function (actual, expected, msg) { + msg = msg || String(actual) + ' !== ' + String(expected); + if (actual !== expected) { + do_throw(msg); + } + }; + + exports.throws = function (fn) { + try { + fn(); + do_throw('Expected an error to be thrown, but it wasn\'t.'); + } + catch (e) { + } + }; + +}); diff --git a/node_modules/scss-tokenizer/node_modules/source-map/build/mini-require.js b/node_modules/scss-tokenizer/node_modules/source-map/build/mini-require.js new file mode 100644 index 00000000..0daf4537 --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/build/mini-require.js @@ -0,0 +1,152 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/** + * Define a module along with a payload. + * @param {string} moduleName Name for the payload + * @param {ignored} deps Ignored. For compatibility with CommonJS AMD Spec + * @param {function} payload Function with (require, exports, module) params + */ +function define(moduleName, deps, payload) { + if (typeof moduleName != "string") { + throw new TypeError('Expected string, got: ' + moduleName); + } + + if (arguments.length == 2) { + payload = deps; + } + + if (moduleName in define.modules) { + throw new Error("Module already defined: " + moduleName); + } + define.modules[moduleName] = payload; +}; + +/** + * The global store of un-instantiated modules + */ +define.modules = {}; + + +/** + * We invoke require() in the context of a Domain so we can have multiple + * sets of modules running separate from each other. + * This contrasts with JSMs which are singletons, Domains allows us to + * optionally load a CommonJS module twice with separate data each time. + * Perhaps you want 2 command lines with a different set of commands in each, + * for example. + */ +function Domain() { + this.modules = {}; + this._currentModule = null; +} + +(function () { + + /** + * Lookup module names and resolve them by calling the definition function if + * needed. + * There are 2 ways to call this, either with an array of dependencies and a + * callback to call when the dependencies are found (which can happen + * asynchronously in an in-page context) or with a single string an no callback + * where the dependency is resolved synchronously and returned. + * The API is designed to be compatible with the CommonJS AMD spec and + * RequireJS. + * @param {string[]|string} deps A name, or names for the payload + * @param {function|undefined} callback Function to call when the dependencies + * are resolved + * @return {undefined|object} The module required or undefined for + * array/callback method + */ + Domain.prototype.require = function(deps, callback) { + if (Array.isArray(deps)) { + var params = deps.map(function(dep) { + return this.lookup(dep); + }, this); + if (callback) { + callback.apply(null, params); + } + return undefined; + } + else { + return this.lookup(deps); + } + }; + + function normalize(path) { + var bits = path.split('/'); + var i = 1; + while (i < bits.length) { + if (bits[i] === '..') { + bits.splice(i-1, 1); + } else if (bits[i] === '.') { + bits.splice(i, 1); + } else { + i++; + } + } + return bits.join('/'); + } + + function join(a, b) { + a = a.trim(); + b = b.trim(); + if (/^\//.test(b)) { + return b; + } else { + return a.replace(/\/*$/, '/') + b; + } + } + + function dirname(path) { + var bits = path.split('/'); + bits.pop(); + return bits.join('/'); + } + + /** + * Lookup module names and resolve them by calling the definition function if + * needed. + * @param {string} moduleName A name for the payload to lookup + * @return {object} The module specified by aModuleName or null if not found. + */ + Domain.prototype.lookup = function(moduleName) { + if (/^\./.test(moduleName)) { + moduleName = normalize(join(dirname(this._currentModule), moduleName)); + } + + if (moduleName in this.modules) { + var module = this.modules[moduleName]; + return module; + } + + if (!(moduleName in define.modules)) { + throw new Error("Module not defined: " + moduleName); + } + + var module = define.modules[moduleName]; + + if (typeof module == "function") { + var exports = {}; + var previousModule = this._currentModule; + this._currentModule = moduleName; + module(this.require.bind(this), exports, { id: moduleName, uri: "" }); + this._currentModule = previousModule; + module = exports; + } + + // cache the resulting module object for next time + this.modules[moduleName] = module; + + return module; + }; + +}()); + +define.Domain = Domain; +define.globalDomain = new Domain(); +var require = define.globalDomain.require.bind(define.globalDomain); diff --git a/node_modules/scss-tokenizer/node_modules/source-map/build/prefix-source-map.jsm b/node_modules/scss-tokenizer/node_modules/source-map/build/prefix-source-map.jsm new file mode 100644 index 00000000..209dbd7d --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/build/prefix-source-map.jsm @@ -0,0 +1,21 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/* + * WARNING! + * + * Do not edit this file directly, it is built from the sources at + * https://github.com/mozilla/source-map/ + */ + +/////////////////////////////////////////////////////////////////////////////// + + +this.EXPORTED_SYMBOLS = [ "SourceMapConsumer", "SourceMapGenerator", "SourceNode" ]; + +Components.utils.import("resource://gre/modules/devtools/Console.jsm"); +Components.utils.import('resource://gre/modules/devtools/Require.jsm'); diff --git a/node_modules/scss-tokenizer/node_modules/source-map/build/prefix-utils.jsm b/node_modules/scss-tokenizer/node_modules/source-map/build/prefix-utils.jsm new file mode 100644 index 00000000..80341d45 --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/build/prefix-utils.jsm @@ -0,0 +1,18 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/* + * WARNING! + * + * Do not edit this file directly, it is built from the sources at + * https://github.com/mozilla/source-map/ + */ + +Components.utils.import('resource://gre/modules/devtools/Require.jsm'); +Components.utils.import('resource://gre/modules/devtools/SourceMap.jsm'); + +this.EXPORTED_SYMBOLS = [ "define", "runSourceMapTests" ]; diff --git a/node_modules/scss-tokenizer/node_modules/source-map/build/suffix-browser.js b/node_modules/scss-tokenizer/node_modules/source-map/build/suffix-browser.js new file mode 100644 index 00000000..fb29ff5f --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/build/suffix-browser.js @@ -0,0 +1,8 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/////////////////////////////////////////////////////////////////////////////// + +this.sourceMap = { + SourceMapConsumer: require('source-map/source-map-consumer').SourceMapConsumer, + SourceMapGenerator: require('source-map/source-map-generator').SourceMapGenerator, + SourceNode: require('source-map/source-node').SourceNode +}; diff --git a/node_modules/scss-tokenizer/node_modules/source-map/build/suffix-source-map.jsm b/node_modules/scss-tokenizer/node_modules/source-map/build/suffix-source-map.jsm new file mode 100644 index 00000000..cf3c2d8d --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/build/suffix-source-map.jsm @@ -0,0 +1,6 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/////////////////////////////////////////////////////////////////////////////// + +this.SourceMapConsumer = require('source-map/source-map-consumer').SourceMapConsumer; +this.SourceMapGenerator = require('source-map/source-map-generator').SourceMapGenerator; +this.SourceNode = require('source-map/source-node').SourceNode; diff --git a/node_modules/scss-tokenizer/node_modules/source-map/build/suffix-utils.jsm b/node_modules/scss-tokenizer/node_modules/source-map/build/suffix-utils.jsm new file mode 100644 index 00000000..b31b84cb --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/build/suffix-utils.jsm @@ -0,0 +1,21 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +function runSourceMapTests(modName, do_throw) { + let mod = require(modName); + let assert = require('test/source-map/assert'); + let util = require('test/source-map/util'); + + assert.init(do_throw); + + for (let k in mod) { + if (/^test/.test(k)) { + mod[k](assert, util); + } + } + +} +this.runSourceMapTests = runSourceMapTests; diff --git a/node_modules/scss-tokenizer/node_modules/source-map/build/test-prefix.js b/node_modules/scss-tokenizer/node_modules/source-map/build/test-prefix.js new file mode 100644 index 00000000..1b13f300 --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/build/test-prefix.js @@ -0,0 +1,8 @@ +/* + * WARNING! + * + * Do not edit this file directly, it is built from the sources at + * https://github.com/mozilla/source-map/ + */ + +Components.utils.import('resource://test/Utils.jsm'); diff --git a/node_modules/scss-tokenizer/node_modules/source-map/build/test-suffix.js b/node_modules/scss-tokenizer/node_modules/source-map/build/test-suffix.js new file mode 100644 index 00000000..bec2de3f --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/build/test-suffix.js @@ -0,0 +1,3 @@ +function run_test() { + runSourceMapTests('{THIS_MODULE}', do_throw); +} diff --git a/node_modules/scss-tokenizer/node_modules/source-map/package.json b/node_modules/scss-tokenizer/node_modules/source-map/package.json new file mode 100644 index 00000000..4962ab02 --- /dev/null +++ b/node_modules/scss-tokenizer/node_modules/source-map/package.json @@ -0,0 +1,68 @@ +{ + "name": "source-map", + "description": "Generates and consumes source maps", + "version": "0.4.4", + "homepage": "https://github.com/mozilla/source-map", + "author": "Nick Fitzgerald ", + "contributors": [ + "Tobias Koppers ", + "Duncan Beevers ", + "Stephen Crane ", + "Ryan Seddon ", + "Miles Elam ", + "Mihai Bazon ", + "Michael Ficarra ", + "Todd Wolfson ", + "Alexander Solovyov ", + "Felix Gnass ", + "Conrad Irwin ", + "usrbincc ", + "David Glasser ", + "Chase Douglas ", + "Evan Wallace ", + "Heather Arthur ", + "Hugh Kennedy ", + "David Glasser ", + "Simon Lydell ", + "Jmeas Smith ", + "Michael Z Goddard ", + "azu ", + "John Gozde ", + "Adam Kirkton ", + "Chris Montgomery ", + "J. Ryan Stinnett ", + "Jack Herrington ", + "Chris Truter ", + "Daniel Espeset ", + "Jamie Wong ", + "Eddy Bruël ", + "Hawken Rives ", + "Gilad Peleg " + ], + "repository": { + "type": "git", + "url": "http://github.com/mozilla/source-map.git" + }, + "directories": { + "lib": "./lib" + }, + "main": "./lib/source-map.js", + "files": [ + "lib/", + "build/" + ], + "engines": { + "node": ">=0.8.0" + }, + "license": "BSD-3-Clause", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "devDependencies": { + "dryice": ">=0.4.8" + }, + "scripts": { + "test": "node test/run-tests.js", + "build": "node Makefile.dryice.js" + } +} diff --git a/node_modules/scss-tokenizer/package.json b/node_modules/scss-tokenizer/package.json new file mode 100644 index 00000000..083aad56 --- /dev/null +++ b/node_modules/scss-tokenizer/package.json @@ -0,0 +1,44 @@ +{ + "name": "scss-tokenizer", + "version": "0.2.3", + "description": "A tokenzier for Sass' SCSS syntax", + "main": "index.js", + "scripts": { + "test": "mocha", + "clean": "rm lib/*", + "build": "npm run clean; babel src/ --out-dir lib" + }, + "files": [ + "index.js", + "lib" + ], + "repository": { + "type": "git", + "url": "https://github.com/sasstools/scss-tokenizer.git" + }, + "keywords": [ + "parser", + "tokenizer", + "sass", + "scss", + "libsass" + ], + "author": "xzyfer", + "license": "MIT", + "bugs": { + "url": "https://github.com/sasstools/scss-tokenizer/issues" + }, + "homepage": "https://github.com/sasstools/scss-tokenizer", + "dependencies": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "devDependencies": { + "babel-cli": "^6.24.1", + "babel-preset-es2015": "^6.24.1", + "chai": "^3.5.0", + "glob": "^5.0.10", + "mocha": "^3.2.0", + "sass-spec": "^3.5.0-1" + } +} diff --git a/node_modules/semver-greatest-satisfied-range/LICENSE b/node_modules/semver-greatest-satisfied-range/LICENSE new file mode 100644 index 00000000..d7e309bc --- /dev/null +++ b/node_modules/semver-greatest-satisfied-range/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, 2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/semver-greatest-satisfied-range/README.md b/node_modules/semver-greatest-satisfied-range/README.md new file mode 100644 index 00000000..c30f8585 --- /dev/null +++ b/node_modules/semver-greatest-satisfied-range/README.md @@ -0,0 +1,48 @@ +

      + + + +

      + +# semver-greatest-satisfied-range + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Find the greatest satisfied semver range from an array of ranges. + +## Usage + +```js +var findRange = require('semver-greatest-satisfied-range'); + +var range = findRange('1.1.0', ['^1.0.0', '^1.1.0', '^1.2.0']); +// range === '^1.1.0' +``` + +## API + +### `findRange(version, rangeArray)` + +Takes a version and array of ranges, returns the greatest satisfied range. Range support is defined by [sver-compat][range-support]. + +## License + +MIT + +[range-support]: https://github.com/phated/sver-compat#range-support + +[downloads-image]: http://img.shields.io/npm/dm/semver-greatest-satisfied-range.svg +[npm-url]: https://www.npmjs.com/package/semver-greatest-satisfied-range +[npm-image]: http://img.shields.io/npm/v/semver-greatest-satisfied-range.svg + +[travis-url]: https://travis-ci.org/gulpjs/semver-greatest-satisfied-range +[travis-image]: http://img.shields.io/travis/gulpjs/semver-greatest-satisfied-range.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/semver-greatest-satisfied-range +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/semver-greatest-satisfied-range.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/semver-greatest-satisfied-range +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/semver-greatest-satisfied-range/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/semver-greatest-satisfied-range/index.js b/node_modules/semver-greatest-satisfied-range/index.js new file mode 100644 index 00000000..08b54c1e --- /dev/null +++ b/node_modules/semver-greatest-satisfied-range/index.js @@ -0,0 +1,19 @@ +'use strict'; + +var SemverRange = require('sver-compat').SemverRange; + +function findRange(version, ranges) { + ranges = ranges || []; + + function matches(range) { + return SemverRange.match(range, version, true); + } + + var validRanges = ranges.filter(matches); + + var sortedRanges = validRanges.sort(SemverRange.compare); + + return sortedRanges.pop() || null; +} + +module.exports = findRange; diff --git a/node_modules/semver-greatest-satisfied-range/package.json b/node_modules/semver-greatest-satisfied-range/package.json new file mode 100644 index 00000000..e7a32c77 --- /dev/null +++ b/node_modules/semver-greatest-satisfied-range/package.json @@ -0,0 +1,48 @@ +{ + "name": "semver-greatest-satisfied-range", + "version": "1.1.0", + "description": "Find the greatest satisfied semver range from an array of ranges.", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Blaine Bublitz " + ], + "repository": "gulpjs/semver-greatest-satisfied-range", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "index.js", + "LICENSE" + ], + "scripts": { + "lint": "eslint . && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "sver-compat": "^1.5.0" + }, + "devDependencies": { + "eslint": "^1.7.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.19.0", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "mocha": "^2.4.5" + }, + "keywords": [ + "semver", + "range", + "max", + "satisfied", + "range", + "array", + "greatest" + ] +} diff --git a/node_modules/semver/LICENSE b/node_modules/semver/LICENSE new file mode 100644 index 00000000..19129e31 --- /dev/null +++ b/node_modules/semver/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/semver/README.md b/node_modules/semver/README.md new file mode 100644 index 00000000..cbd95654 --- /dev/null +++ b/node_modules/semver/README.md @@ -0,0 +1,350 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Usage + + $ npm install semver + $ node + var semver = require('semver') + + semver.valid('1.2.3') // '1.2.3' + semver.valid('a.b.c') // null + semver.clean(' =v1.2.3 ') // '1.2.3' + semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true + semver.gt('1.2.3', '9.8.7') // false + semver.lt('1.2.3', '9.8.7') // true + +As a command-line utility: + + $ semver -h + + SemVer 5.1.0 + + A JavaScript implementation of the http://semver.org/ specification + Copyright Isaac Z. Schlueter + + Usage: semver [options] [ [...]] + Prints valid versions sorted by SemVer precedence + + Options: + -r --range + Print versions that match the specified range. + + -i --increment [] + Increment a version by the specified level. Level can + be one of: major, minor, patch, premajor, preminor, + prepatch, or prerelease. Default level is 'patch'. + Only one version may be specified. + + --preid + Identifier to be used to prefix premajor, preminor, + prepatch or prerelease version increments. + + -l --loose + Interpret versions and ranges loosely + + Program exits successfully if any valid version satisfies + all supplied ranges, and prints all satisfying versions. + + If no satisfying versions are found, then exits failure. + + Versions are printed in ascending order, so supplying + multiple versions to the utility will just sort them. + +## Versions + +A "version" is described by the `v2.0.0` specification found at +. + +A leading `"="` or `"v"` character is stripped off and ignored. + +## Ranges + +A `version range` is a set of `comparators` which specify versions +that satisfy the range. + +A `comparator` is composed of an `operator` and a `version`. The set +of primitive `operators` is: + +* `<` Less than +* `<=` Less than or equal to +* `>` Greater than +* `>=` Greater than or equal to +* `=` Equal. If no operator is specified, then equality is assumed, + so this operator is optional, but MAY be included. + +For example, the comparator `>=1.2.7` would match the versions +`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` +or `1.1.0`. + +Comparators can be joined by whitespace to form a `comparator set`, +which is satisfied by the **intersection** of all of the comparators +it includes. + +A range is composed of one or more comparator sets, joined by `||`. A +version matches a range if and only if every comparator in at least +one of the `||`-separated comparator sets is satisfied by the version. + +For example, the range `>=1.2.7 <1.3.0` would match the versions +`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, +or `1.1.0`. + +The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, +`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. + +### Prerelease Tags + +If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same `[major, minor, patch]` tuple also has a +prerelease tag. + +For example, the range `>1.2.3-alpha.3` would be allowed to match the +version `1.2.3-alpha.7`, but it would *not* be satisfied by +`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater +than" `1.2.3-alpha.3` according to the SemVer sort rules. The version +range only accepts prerelease tags on the `1.2.3` version. The +version `3.4.5` *would* satisfy the range, because it does not have a +prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. + +The purpose for this behavior is twofold. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range matching +semantics. + +Second, a user who has opted into using a prerelease version has +clearly indicated the intent to use *that specific* set of +alpha/beta/rc versions. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the *next* set of prerelease versions. + +#### Prerelease Identifiers + +The method `.inc` takes an additional `identifier` string argument that +will append the value of the string as a prerelease identifier: + +```javascript +> semver.inc('1.2.3', 'prerelease', 'beta') +'1.2.4-beta.0' +``` + +command-line example: + +```shell +$ semver 1.2.3 -i prerelease --preid beta +1.2.4-beta.0 +``` + +Which then can be used to increment further: + +```shell +$ semver 1.2.4-beta.0 -i prerelease +1.2.4-beta.1 +``` + +### Advanced Range Syntax + +Advanced range syntax desugars to primitive comparators in +deterministic ways. + +Advanced ranges may be combined in the same way as primitive +comparators using white space or `||`. + +#### Hyphen Ranges `X.Y.Z - A.B.C` + +Specifies an inclusive set. + +* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` + +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes. + +* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` + +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts. + +* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` +* `1.2.3 - 2` := `>=1.2.3 <3.0.0` + +#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` + +Any of `X`, `x`, or `*` may be used to "stand in" for one of the +numeric values in the `[major, minor, patch]` tuple. + +* `*` := `>=0.0.0` (Any version satisfies) +* `1.x` := `>=1.0.0 <2.0.0` (Matching major version) +* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) + +A partial version range is treated as an X-Range, so the special +character is in fact optional. + +* `""` (empty string) := `*` := `>=0.0.0` +* `1` := `1.x.x` := `>=1.0.0 <2.0.0` +* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` + +#### Tilde Ranges `~1.2.3` `~1.2` `~1` + +Allows patch-level changes if a minor version is specified on the +comparator. Allows minor-level changes if not. + +* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` +* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) +* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) +* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` +* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) +* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) +* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. + +#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` + +Allows changes that do not modify the left-most non-zero digit in the +`[major, minor, patch]` tuple. In other words, this allows patch and +minor updates for versions `1.0.0` and above, patch updates for +versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. + +Many authors treat a `0.x` version as if the `x` were the major +"breaking-change" indicator. + +Caret ranges are ideal when an author may make breaking changes +between `0.2.4` and `0.3.0` releases, which is a common practice. +However, it presumes that there will *not* be breaking changes between +`0.2.4` and `0.2.5`. It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices. + +* `^1.2.3` := `>=1.2.3 <2.0.0` +* `^0.2.3` := `>=0.2.3 <0.3.0` +* `^0.0.3` := `>=0.0.3 <0.0.4` +* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. +* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the + `0.0.3` version *only* will be allowed, if they are greater than or + equal to `beta`. So, `0.0.3-pr.2` would be allowed. + +When parsing caret ranges, a missing `patch` value desugars to the +number `0`, but will allow flexibility within that value, even if the +major and minor versions are both `0`. + +* `^1.2.x` := `>=1.2.0 <2.0.0` +* `^0.0.x` := `>=0.0.0 <0.1.0` +* `^0.0` := `>=0.0.0 <0.1.0` + +A missing `minor` and `patch` values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero. + +* `^1.x` := `>=1.0.0 <2.0.0` +* `^0.x` := `>=0.0.0 <1.0.0` + +### Range Grammar + +Putting all this together, here is a Backus-Naur grammar for ranges, +for the benefit of parser authors: + +```bnf +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' | ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ +``` + +## Functions + +All methods and classes take a final `loose` boolean argument that, if +true, will be more forgiving about not-quite-valid semver strings. +The resulting output will always be 100% strict, of course. + +Strict-mode Comparators and Ranges will be strict about the SemVer +strings that they parse. + +* `valid(v)`: Return the parsed version, or null if it's not valid. +* `inc(v, release)`: Return the version incremented by the release + type (`major`, `premajor`, `minor`, `preminor`, `patch`, + `prepatch`, or `prerelease`), or null if it's not valid + * `premajor` in one call will bump the version up to the next major + version and down to a prerelease of that major version. + `preminor`, and `prepatch` work the same way. + * If called from a non-prerelease version, the `prerelease` will work the + same as `prepatch`. It increments the patch version, then makes a + prerelease. If the input version is already a prerelease it simply + increments it. +* `prerelease(v)`: Returns an array of prerelease components, or null + if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` +* `major(v)`: Return the major version number. +* `minor(v)`: Return the minor version number. +* `patch(v)`: Return the patch version number. + +### Comparison + +* `gt(v1, v2)`: `v1 > v2` +* `gte(v1, v2)`: `v1 >= v2` +* `lt(v1, v2)`: `v1 < v2` +* `lte(v1, v2)`: `v1 <= v2` +* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, + even if they're not the exact same string. You already know how to + compare strings. +* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. +* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call + the corresponding function above. `"==="` and `"!=="` do simple + string comparison, but are included for completeness. Throws if an + invalid comparison string is provided. +* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if + `v2` is greater. Sorts in ascending order if passed to `Array.sort()`. +* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions + in descending order when passed to `Array.sort()`. +* `diff(v1, v2)`: Returns difference between two versions by the release type + (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), + or null if the versions are the same. + + +### Ranges + +* `validRange(range)`: Return the valid range or null if it's not valid +* `satisfies(version, range)`: Return true if the version satisfies the + range. +* `maxSatisfying(versions, range)`: Return the highest version in the list + that satisfies the range, or `null` if none of them do. +* `minSatisfying(versions, range)`: Return the lowest version in the list + that satisfies the range, or `null` if none of them do. +* `gtr(version, range)`: Return `true` if version is greater than all the + versions possible in the range. +* `ltr(version, range)`: Return `true` if version is less than all the + versions possible in the range. +* `outside(version, range, hilo)`: Return true if the version is outside + the bounds of the range in either the high or low direction. The + `hilo` argument must be either the string `'>'` or `'<'`. (This is + the function called by `gtr` and `ltr`.) + +Note that, since ranges may be non-contiguous, a version might not be +greater than a range, less than a range, *or* satisfy a range! For +example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` +until `2.0.0`, so the version `1.2.10` would not be greater than the +range (because `2.0.1` satisfies, which is higher), nor less than the +range (since `1.2.8` satisfies, which is lower), and it also does not +satisfy the range. + +If you want to know if a version satisfies or does not satisfy a +range, use the `satisfies(version, range)` function. diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json new file mode 100644 index 00000000..ec9b0164 --- /dev/null +++ b/node_modules/semver/package.json @@ -0,0 +1,22 @@ +{ + "name": "semver", + "version": "5.3.0", + "description": "The semantic version parser used by npm.", + "main": "semver.js", + "scripts": { + "test": "tap test/*.js" + }, + "devDependencies": { + "tap": "^2.0.0" + }, + "license": "ISC", + "repository": "https://github.com/npm/node-semver", + "bin": { + "semver": "./bin/semver" + }, + "files": [ + "bin", + "range.bnf", + "semver.js" + ] +} diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf new file mode 100644 index 00000000..25ebd5c8 --- /dev/null +++ b/node_modules/semver/range.bnf @@ -0,0 +1,16 @@ +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' | ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ diff --git a/node_modules/semver/semver.js b/node_modules/semver/semver.js new file mode 100644 index 00000000..5f1a3c5c --- /dev/null +++ b/node_modules/semver/semver.js @@ -0,0 +1,1203 @@ +exports = module.exports = SemVer; + +// The debug function is excluded entirely from the minified version. +/* nomin */ var debug; +/* nomin */ if (typeof process === 'object' && + /* nomin */ process.env && + /* nomin */ process.env.NODE_DEBUG && + /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG)) + /* nomin */ debug = function() { + /* nomin */ var args = Array.prototype.slice.call(arguments, 0); + /* nomin */ args.unshift('SEMVER'); + /* nomin */ console.log.apply(console, args); + /* nomin */ }; +/* nomin */ else + /* nomin */ debug = function() {}; + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0'; + +var MAX_LENGTH = 256; +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +// The actual regexps go on exports.re +var re = exports.re = []; +var src = exports.src = []; +var R = 0; + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++; +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; +var NUMERICIDENTIFIERLOOSE = R++; +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; + + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++; +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; + + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++; +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')'; + +var MAINVERSIONLOOSE = R++; +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++; +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + +var PRERELEASEIDENTIFIERLOOSE = R++; +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++; +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; + +var PRERELEASELOOSE = R++; +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++; +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++; +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; + + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++; +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?'; + +src[FULL] = '^' + FULLPLAIN + '$'; + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?'; + +var LOOSE = R++; +src[LOOSE] = '^' + LOOSEPLAIN + '$'; + +var GTLT = R++; +src[GTLT] = '((?:<|>)?=?)'; + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++; +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; +var XRANGEIDENTIFIER = R++; +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; + +var XRANGEPLAIN = R++; +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?'; + +var XRANGEPLAINLOOSE = R++; +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?'; + +var XRANGE = R++; +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; +var XRANGELOOSE = R++; +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++; +src[LONETILDE] = '(?:~>?)'; + +var TILDETRIM = R++; +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); +var tildeTrimReplace = '$1~'; + +var TILDE = R++; +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; +var TILDELOOSE = R++; +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++; +src[LONECARET] = '(?:\\^)'; + +var CARETTRIM = R++; +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); +var caretTrimReplace = '$1^'; + +var CARET = R++; +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; +var CARETLOOSE = R++; +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++; +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; +var COMPARATOR = R++; +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; + + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++; +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); +var comparatorTrimReplace = '$1$2$3'; + + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++; +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$'; + +var HYPHENRANGELOOSE = R++; +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$'; + +// Star ranges basically just allow anything at all. +var STAR = R++; +src[STAR] = '(<|>)?=?\\s*\\*'; + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]); + if (!re[i]) + re[i] = new RegExp(src[i]); +} + +exports.parse = parse; +function parse(version, loose) { + if (version instanceof SemVer) + return version; + + if (typeof version !== 'string') + return null; + + if (version.length > MAX_LENGTH) + return null; + + var r = loose ? re[LOOSE] : re[FULL]; + if (!r.test(version)) + return null; + + try { + return new SemVer(version, loose); + } catch (er) { + return null; + } +} + +exports.valid = valid; +function valid(version, loose) { + var v = parse(version, loose); + return v ? v.version : null; +} + + +exports.clean = clean; +function clean(version, loose) { + var s = parse(version.trim().replace(/^[=v]+/, ''), loose); + return s ? s.version : null; +} + +exports.SemVer = SemVer; + +function SemVer(version, loose) { + if (version instanceof SemVer) { + if (version.loose === loose) + return version; + else + version = version.version; + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version); + } + + if (version.length > MAX_LENGTH) + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + + if (!(this instanceof SemVer)) + return new SemVer(version, loose); + + debug('SemVer', version, loose); + this.loose = loose; + var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); + + if (!m) + throw new TypeError('Invalid Version: ' + version); + + this.raw = version; + + // these are actually numbers + this.major = +m[1]; + this.minor = +m[2]; + this.patch = +m[3]; + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) + throw new TypeError('Invalid major version') + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) + throw new TypeError('Invalid minor version') + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) + throw new TypeError('Invalid patch version') + + // numberify any prerelease numeric ids + if (!m[4]) + this.prerelease = []; + else + this.prerelease = m[4].split('.').map(function(id) { + if (/^[0-9]+$/.test(id)) { + var num = +id; + if (num >= 0 && num < MAX_SAFE_INTEGER) + return num; + } + return id; + }); + + this.build = m[5] ? m[5].split('.') : []; + this.format(); +} + +SemVer.prototype.format = function() { + this.version = this.major + '.' + this.minor + '.' + this.patch; + if (this.prerelease.length) + this.version += '-' + this.prerelease.join('.'); + return this.version; +}; + +SemVer.prototype.toString = function() { + return this.version; +}; + +SemVer.prototype.compare = function(other) { + debug('SemVer.compare', this.version, this.loose, other); + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return this.compareMain(other) || this.comparePre(other); +}; + +SemVer.prototype.compareMain = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch); +}; + +SemVer.prototype.comparePre = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) + return -1; + else if (!this.prerelease.length && other.prerelease.length) + return 1; + else if (!this.prerelease.length && !other.prerelease.length) + return 0; + + var i = 0; + do { + var a = this.prerelease[i]; + var b = other.prerelease[i]; + debug('prerelease compare', i, a, b); + if (a === undefined && b === undefined) + return 0; + else if (b === undefined) + return 1; + else if (a === undefined) + return -1; + else if (a === b) + continue; + else + return compareIdentifiers(a, b); + } while (++i); +}; + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function(release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0; + this.patch = 0; + this.minor = 0; + this.major++; + this.inc('pre', identifier); + break; + case 'preminor': + this.prerelease.length = 0; + this.patch = 0; + this.minor++; + this.inc('pre', identifier); + break; + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0; + this.inc('patch', identifier); + this.inc('pre', identifier); + break; + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) + this.inc('patch', identifier); + this.inc('pre', identifier); + break; + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) + this.major++; + this.minor = 0; + this.patch = 0; + this.prerelease = []; + break; + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) + this.minor++; + this.patch = 0; + this.prerelease = []; + break; + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) + this.patch++; + this.prerelease = []; + break; + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) + this.prerelease = [0]; + else { + var i = this.prerelease.length; + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++; + i = -2; + } + } + if (i === -1) // didn't increment anything + this.prerelease.push(0); + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) + this.prerelease = [identifier, 0]; + } else + this.prerelease = [identifier, 0]; + } + break; + + default: + throw new Error('invalid increment argument: ' + release); + } + this.format(); + this.raw = this.version; + return this; +}; + +exports.inc = inc; +function inc(version, release, loose, identifier) { + if (typeof(loose) === 'string') { + identifier = loose; + loose = undefined; + } + + try { + return new SemVer(version, loose).inc(release, identifier).version; + } catch (er) { + return null; + } +} + +exports.diff = diff; +function diff(version1, version2) { + if (eq(version1, version2)) { + return null; + } else { + var v1 = parse(version1); + var v2 = parse(version2); + if (v1.prerelease.length || v2.prerelease.length) { + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return 'pre'+key; + } + } + } + return 'prerelease'; + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return key; + } + } + } + } +} + +exports.compareIdentifiers = compareIdentifiers; + +var numeric = /^[0-9]+$/; +function compareIdentifiers(a, b) { + var anum = numeric.test(a); + var bnum = numeric.test(b); + + if (anum && bnum) { + a = +a; + b = +b; + } + + return (anum && !bnum) ? -1 : + (bnum && !anum) ? 1 : + a < b ? -1 : + a > b ? 1 : + 0; +} + +exports.rcompareIdentifiers = rcompareIdentifiers; +function rcompareIdentifiers(a, b) { + return compareIdentifiers(b, a); +} + +exports.major = major; +function major(a, loose) { + return new SemVer(a, loose).major; +} + +exports.minor = minor; +function minor(a, loose) { + return new SemVer(a, loose).minor; +} + +exports.patch = patch; +function patch(a, loose) { + return new SemVer(a, loose).patch; +} + +exports.compare = compare; +function compare(a, b, loose) { + return new SemVer(a, loose).compare(b); +} + +exports.compareLoose = compareLoose; +function compareLoose(a, b) { + return compare(a, b, true); +} + +exports.rcompare = rcompare; +function rcompare(a, b, loose) { + return compare(b, a, loose); +} + +exports.sort = sort; +function sort(list, loose) { + return list.sort(function(a, b) { + return exports.compare(a, b, loose); + }); +} + +exports.rsort = rsort; +function rsort(list, loose) { + return list.sort(function(a, b) { + return exports.rcompare(a, b, loose); + }); +} + +exports.gt = gt; +function gt(a, b, loose) { + return compare(a, b, loose) > 0; +} + +exports.lt = lt; +function lt(a, b, loose) { + return compare(a, b, loose) < 0; +} + +exports.eq = eq; +function eq(a, b, loose) { + return compare(a, b, loose) === 0; +} + +exports.neq = neq; +function neq(a, b, loose) { + return compare(a, b, loose) !== 0; +} + +exports.gte = gte; +function gte(a, b, loose) { + return compare(a, b, loose) >= 0; +} + +exports.lte = lte; +function lte(a, b, loose) { + return compare(a, b, loose) <= 0; +} + +exports.cmp = cmp; +function cmp(a, op, b, loose) { + var ret; + switch (op) { + case '===': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a === b; + break; + case '!==': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a !== b; + break; + case '': case '=': case '==': ret = eq(a, b, loose); break; + case '!=': ret = neq(a, b, loose); break; + case '>': ret = gt(a, b, loose); break; + case '>=': ret = gte(a, b, loose); break; + case '<': ret = lt(a, b, loose); break; + case '<=': ret = lte(a, b, loose); break; + default: throw new TypeError('Invalid operator: ' + op); + } + return ret; +} + +exports.Comparator = Comparator; +function Comparator(comp, loose) { + if (comp instanceof Comparator) { + if (comp.loose === loose) + return comp; + else + comp = comp.value; + } + + if (!(this instanceof Comparator)) + return new Comparator(comp, loose); + + debug('comparator', comp, loose); + this.loose = loose; + this.parse(comp); + + if (this.semver === ANY) + this.value = ''; + else + this.value = this.operator + this.semver.version; + + debug('comp', this); +} + +var ANY = {}; +Comparator.prototype.parse = function(comp) { + var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var m = comp.match(r); + + if (!m) + throw new TypeError('Invalid comparator: ' + comp); + + this.operator = m[1]; + if (this.operator === '=') + this.operator = ''; + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) + this.semver = ANY; + else + this.semver = new SemVer(m[2], this.loose); +}; + +Comparator.prototype.toString = function() { + return this.value; +}; + +Comparator.prototype.test = function(version) { + debug('Comparator.test', version, this.loose); + + if (this.semver === ANY) + return true; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + return cmp(version, this.operator, this.semver, this.loose); +}; + + +exports.Range = Range; +function Range(range, loose) { + if ((range instanceof Range) && range.loose === loose) + return range; + + if (!(this instanceof Range)) + return new Range(range, loose); + + this.loose = loose; + + // First, split based on boolean or || + this.raw = range; + this.set = range.split(/\s*\|\|\s*/).map(function(range) { + return this.parseRange(range.trim()); + }, this).filter(function(c) { + // throw out any that are not relevant for whatever reason + return c.length; + }); + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range); + } + + this.format(); +} + +Range.prototype.format = function() { + this.range = this.set.map(function(comps) { + return comps.join(' ').trim(); + }).join('||').trim(); + return this.range; +}; + +Range.prototype.toString = function() { + return this.range; +}; + +Range.prototype.parseRange = function(range) { + var loose = this.loose; + range = range.trim(); + debug('range', range, loose); + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; + range = range.replace(hr, hyphenReplace); + debug('hyphen replace', range); + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); + debug('comparator trim', range, re[COMPARATORTRIM]); + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace); + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace); + + // normalize spaces + range = range.split(/\s+/).join(' '); + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var set = range.split(' ').map(function(comp) { + return parseComparator(comp, loose); + }).join(' ').split(/\s+/); + if (this.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function(comp) { + return !!comp.match(compRe); + }); + } + set = set.map(function(comp) { + return new Comparator(comp, loose); + }); + + return set; +}; + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators; +function toComparators(range, loose) { + return new Range(range, loose).set.map(function(comp) { + return comp.map(function(c) { + return c.value; + }).join(' ').trim().split(' '); + }); +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator(comp, loose) { + debug('comp', comp); + comp = replaceCarets(comp, loose); + debug('caret', comp); + comp = replaceTildes(comp, loose); + debug('tildes', comp); + comp = replaceXRanges(comp, loose); + debug('xrange', comp); + comp = replaceStars(comp, loose); + debug('stars', comp); + return comp; +} + +function isX(id) { + return !id || id.toLowerCase() === 'x' || id === '*'; +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceTilde(comp, loose); + }).join(' '); +} + +function replaceTilde(comp, loose) { + var r = loose ? re[TILDELOOSE] : re[TILDE]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + else if (isX(p)) + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + else if (pr) { + debug('replaceTilde pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + + debug('tilde return', ret); + return ret; + }); +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceCaret(comp, loose); + }).join(' '); +} + +function replaceCaret(comp, loose) { + debug('caret', comp, loose); + var r = loose ? re[CARETLOOSE] : re[CARET]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + else if (isX(p)) { + if (M === '0') + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + else + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; + } else if (pr) { + debug('replaceCaret pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + if (M === '0') { + if (m === '0') + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + m + '.' + (+p + 1); + else + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + (+M + 1) + '.0.0'; + } else { + debug('no pr'); + if (M === '0') { + if (m === '0') + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1); + else + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0'; + } + + debug('caret return', ret); + return ret; + }); +} + +function replaceXRanges(comp, loose) { + debug('replaceXRanges', comp, loose); + return comp.split(/\s+/).map(function(comp) { + return replaceXRange(comp, loose); + }).join(' '); +} + +function replaceXRange(comp, loose) { + comp = comp.trim(); + var r = loose ? re[XRANGELOOSE] : re[XRANGE]; + return comp.replace(r, function(ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr); + var xM = isX(M); + var xm = xM || isX(m); + var xp = xm || isX(p); + var anyX = xp; + + if (gtlt === '=' && anyX) + gtlt = ''; + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0'; + } else { + // nothing is forbidden + ret = '*'; + } + } else if (gtlt && anyX) { + // replace X with 0 + if (xm) + m = 0; + if (xp) + p = 0; + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>='; + if (xm) { + M = +M + 1; + m = 0; + p = 0; + } else if (xp) { + m = +m + 1; + p = 0; + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<'; + if (xm) + M = +M + 1; + else + m = +m + 1; + } + + ret = gtlt + M + '.' + m + '.' + p; + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + } + + debug('xRange return', ret); + + return ret; + }); +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars(comp, loose) { + debug('replaceStars', comp, loose); + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], ''); +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + + if (isX(fM)) + from = ''; + else if (isX(fm)) + from = '>=' + fM + '.0.0'; + else if (isX(fp)) + from = '>=' + fM + '.' + fm + '.0'; + else + from = '>=' + from; + + if (isX(tM)) + to = ''; + else if (isX(tm)) + to = '<' + (+tM + 1) + '.0.0'; + else if (isX(tp)) + to = '<' + tM + '.' + (+tm + 1) + '.0'; + else if (tpr) + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; + else + to = '<=' + to; + + return (from + ' ' + to).trim(); +} + + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function(version) { + if (!version) + return false; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version)) + return true; + } + return false; +}; + +function testSet(set, version) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) + return false; + } + + if (version.prerelease.length) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (var i = 0; i < set.length; i++) { + debug(set[i].semver); + if (set[i].semver === ANY) + continue; + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver; + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) + return true; + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false; + } + + return true; +} + +exports.satisfies = satisfies; +function satisfies(version, range, loose) { + try { + range = new Range(range, loose); + } catch (er) { + return false; + } + return range.test(version); +} + +exports.maxSatisfying = maxSatisfying; +function maxSatisfying(versions, range, loose) { + return versions.filter(function(version) { + return satisfies(version, range, loose); + }).sort(function(a, b) { + return rcompare(a, b, loose); + })[0] || null; +} + +exports.minSatisfying = minSatisfying; +function minSatisfying(versions, range, loose) { + return versions.filter(function(version) { + return satisfies(version, range, loose); + }).sort(function(a, b) { + return compare(a, b, loose); + })[0] || null; +} + +exports.validRange = validRange; +function validRange(range, loose) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, loose).range || '*'; + } catch (er) { + return null; + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr; +function ltr(version, range, loose) { + return outside(version, range, '<', loose); +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr; +function gtr(version, range, loose) { + return outside(version, range, '>', loose); +} + +exports.outside = outside; +function outside(version, range, hilo, loose) { + version = new SemVer(version, loose); + range = new Range(range, loose); + + var gtfn, ltefn, ltfn, comp, ecomp; + switch (hilo) { + case '>': + gtfn = gt; + ltefn = lte; + ltfn = lt; + comp = '>'; + ecomp = '>='; + break; + case '<': + gtfn = lt; + ltefn = gte; + ltfn = gt; + comp = '<'; + ecomp = '<='; + break; + default: + throw new TypeError('Must provide a hilo val of "<" or ">"'); + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, loose)) { + return false; + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i]; + + var high = null; + var low = null; + + comparators.forEach(function(comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator; + low = low || comparator; + if (gtfn(comparator.semver, high.semver, loose)) { + high = comparator; + } else if (ltfn(comparator.semver, low.semver, loose)) { + low = comparator; + } + }); + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false; + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false; + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false; + } + } + return true; +} + +exports.prerelease = prerelease; +function prerelease(version, loose) { + var parsed = parse(version, loose); + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null; +} diff --git a/node_modules/set-blocking/CHANGELOG.md b/node_modules/set-blocking/CHANGELOG.md new file mode 100644 index 00000000..03bf5919 --- /dev/null +++ b/node_modules/set-blocking/CHANGELOG.md @@ -0,0 +1,26 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +# [2.0.0](https://github.com/yargs/set-blocking/compare/v1.0.0...v2.0.0) (2016-05-17) + + +### Features + +* add an isTTY check ([#3](https://github.com/yargs/set-blocking/issues/3)) ([66ce277](https://github.com/yargs/set-blocking/commit/66ce277)) + + +### BREAKING CHANGES + +* stdio/stderr will not be set to blocking if isTTY === false + + + + +# 1.0.0 (2016-05-14) + + +### Features + +* implemented shim for stream._handle.setBlocking ([6bde0c0](https://github.com/yargs/set-blocking/commit/6bde0c0)) diff --git a/node_modules/set-blocking/LICENSE.txt b/node_modules/set-blocking/LICENSE.txt new file mode 100644 index 00000000..836440be --- /dev/null +++ b/node_modules/set-blocking/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (c) 2016, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/set-blocking/README.md b/node_modules/set-blocking/README.md new file mode 100644 index 00000000..e93b4202 --- /dev/null +++ b/node_modules/set-blocking/README.md @@ -0,0 +1,31 @@ +# set-blocking + +[![Build Status](https://travis-ci.org/yargs/set-blocking.svg)](https://travis-ci.org/yargs/set-blocking) +[![NPM version](https://img.shields.io/npm/v/set-blocking.svg)](https://www.npmjs.com/package/set-blocking) +[![Coverage Status](https://coveralls.io/repos/yargs/set-blocking/badge.svg?branch=)](https://coveralls.io/r/yargs/set-blocking?branch=master) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + +set blocking `stdio` and `stderr` ensuring that terminal output does not truncate. + +```js +const setBlocking = require('set-blocking') +setBlocking(true) +console.log(someLargeStringToOutput) +``` + +## Historical Context/Word of Warning + +This was created as a shim to address the bug discussed in [node #6456](https://github.com/nodejs/node/issues/6456). This bug crops up on +newer versions of Node.js (`0.12+`), truncating terminal output. + +You should be mindful of the side-effects caused by using `set-blocking`: + +* if your module sets blocking to `true`, it will effect other modules + consuming your library. In [yargs](https://github.com/yargs/yargs/blob/master/yargs.js#L653) we only call + `setBlocking(true)` once we already know we are about to call `process.exit(code)`. +* this patch will not apply to subprocesses spawned with `isTTY = true`, this is + the [default `spawn()` behavior](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options). + +## License + +ISC diff --git a/node_modules/set-blocking/index.js b/node_modules/set-blocking/index.js new file mode 100644 index 00000000..6f78774b --- /dev/null +++ b/node_modules/set-blocking/index.js @@ -0,0 +1,7 @@ +module.exports = function (blocking) { + [process.stdout, process.stderr].forEach(function (stream) { + if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') { + stream._handle.setBlocking(blocking) + } + }) +} diff --git a/node_modules/set-blocking/package.json b/node_modules/set-blocking/package.json new file mode 100644 index 00000000..c082db72 --- /dev/null +++ b/node_modules/set-blocking/package.json @@ -0,0 +1,42 @@ +{ + "name": "set-blocking", + "version": "2.0.0", + "description": "set blocking stdio and stderr ensuring that terminal output does not truncate", + "main": "index.js", + "scripts": { + "pretest": "standard", + "test": "nyc mocha ./test/*.js", + "coverage": "nyc report --reporter=text-lcov | coveralls", + "version": "standard-version" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/yargs/set-blocking.git" + }, + "keywords": [ + "flush", + "terminal", + "blocking", + "shim", + "stdio", + "stderr" + ], + "author": "Ben Coe ", + "license": "ISC", + "bugs": { + "url": "https://github.com/yargs/set-blocking/issues" + }, + "homepage": "https://github.com/yargs/set-blocking#readme", + "devDependencies": { + "chai": "^3.5.0", + "coveralls": "^2.11.9", + "mocha": "^2.4.5", + "nyc": "^6.4.4", + "standard": "^7.0.1", + "standard-version": "^2.2.1" + }, + "files": [ + "index.js", + "LICENSE.txt" + ] +} \ No newline at end of file diff --git a/node_modules/set-value/LICENSE b/node_modules/set-value/LICENSE new file mode 100644 index 00000000..d734237b --- /dev/null +++ b/node_modules/set-value/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2017, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/set-value/README.md b/node_modules/set-value/README.md new file mode 100644 index 00000000..e336d744 --- /dev/null +++ b/node_modules/set-value/README.md @@ -0,0 +1,150 @@ +# set-value [![NPM version](https://img.shields.io/npm/v/set-value.svg?style=flat)](https://www.npmjs.com/package/set-value) [![NPM monthly downloads](https://img.shields.io/npm/dm/set-value.svg?style=flat)](https://npmjs.org/package/set-value) [![NPM total downloads](https://img.shields.io/npm/dt/set-value.svg?style=flat)](https://npmjs.org/package/set-value) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/set-value.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/set-value) + +> Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save set-value +``` + +## Usage + +```js +var set = require('set-value'); +set(object, prop, value); +``` + +### Params + +* `object` **{object}**: The object to set `value` on +* `prop` **{string}**: The property to set. Dot-notation may be used. +* `value` **{any}**: The value to set on `object[prop]` + +## Examples + +Updates and returns the given object: + +```js +var obj = {}; +set(obj, 'a.b.c', 'd'); +console.log(obj); +//=> { a: { b: { c: 'd' } } } +``` + +### Escaping + +**Escaping with backslashes** + +Prevent set-value from splitting on a dot by prefixing it with backslashes: + +```js +console.log(set({}, 'a\\.b.c', 'd')); +//=> { 'a.b': { c: 'd' } } + +console.log(set({}, 'a\\.b\\.c', 'd')); +//=> { 'a.b.c': 'd' } +``` + +**Escaping with double-quotes or single-quotes** + +Wrap double or single quotes around the string, or part of the string, that should not be split by set-value: + +```js +console.log(set({}, '"a.b".c', 'd')); +//=> { 'a.b': { c: 'd' } } + +console.log(set({}, "'a.b'.c", "d")); +//=> { 'a.b': { c: 'd' } } + +console.log(set({}, '"this/is/a/.file.path"', 'd')); +//=> { 'this/is/a/file.path': 'd' } +``` + +### Bracket support + +set-value does not split inside brackets or braces: + +```js +console.log(set({}, '[a.b].c', 'd')); +//=> { '[a.b]': { c: 'd' } } + +console.log(set({}, "(a.b).c", "d")); +//=> { '(a.b)': { c: 'd' } } + +console.log(set({}, ".c", "d")); +//=> { '': { c: 'd' } } + +console.log(set({}, "{a..b}.c", "d")); +//=> { '{a..b}': { c: 'd' } } +``` + +## History + +### v2.0.0 + +* Adds support for escaping with double or single quotes. See [escaping](#escaping) for examples. +* Will no longer split inside brackets or braces. See [bracket support](#bracket-support) for examples. + +If there are any regressions please create a [bug report](../../issues/new). Thanks! + +## About + +### Related projects + +* [assign-value](https://www.npmjs.com/package/assign-value): Assign a value or extend a deeply nested property of an object using object path… [more](https://github.com/jonschlinkert/assign-value) | [homepage](https://github.com/jonschlinkert/assign-value "Assign a value or extend a deeply nested property of an object using object path notation.") +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (`a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value "Use property paths (`a.b.c`) to get a nested value from an object.") +* [has-value](https://www.npmjs.com/package/has-value): Returns true if a value exists, false if empty. Works with deeply nested values using… [more](https://github.com/jonschlinkert/has-value) | [homepage](https://github.com/jonschlinkert/has-value "Returns true if a value exists, false if empty. Works with deeply nested values using object paths.") +* [merge-value](https://www.npmjs.com/package/merge-value): Similar to assign-value but deeply merges object values or nested values using object path/dot notation. | [homepage](https://github.com/jonschlinkert/merge-value "Similar to assign-value but deeply merges object values or nested values using object path/dot notation.") +* [omit-value](https://www.npmjs.com/package/omit-value): Omit properties from an object or deeply nested property of an object using object path… [more](https://github.com/jonschlinkert/omit-value) | [homepage](https://github.com/jonschlinkert/omit-value "Omit properties from an object or deeply nested property of an object using object path notation.") +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value "Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths.") +* [union-value](https://www.npmjs.com/package/union-value): Set an array of unique values as the property of an object. Supports setting deeply… [more](https://github.com/jonschlinkert/union-value) | [homepage](https://github.com/jonschlinkert/union-value "Set an array of unique values as the property of an object. Supports setting deeply nested properties using using object-paths/dot notation.") +* [unset-value](https://www.npmjs.com/package/unset-value): Delete nested properties from an object using dot notation. | [homepage](https://github.com/jonschlinkert/unset-value "Delete nested properties from an object using dot notation.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 59 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [vadimdemedes](https://github.com/vadimdemedes) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 21, 2017._ \ No newline at end of file diff --git a/node_modules/set-value/index.js b/node_modules/set-value/index.js new file mode 100644 index 00000000..0b32e8fa --- /dev/null +++ b/node_modules/set-value/index.js @@ -0,0 +1,55 @@ +/*! + * set-value + * + * Copyright (c) 2014-2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var split = require('split-string'); +var extend = require('extend-shallow'); +var isPlainObject = require('is-plain-object'); +var isObject = require('is-extendable'); + +module.exports = function(obj, prop, val) { + if (!isObject(obj)) { + return obj; + } + + if (Array.isArray(prop)) { + prop = [].concat.apply([], prop).join('.'); + } + + if (typeof prop !== 'string') { + return obj; + } + + var keys = split(prop, {sep: '.', brackets: true}).filter(isValidKey); + var len = keys.length; + var idx = -1; + var current = obj; + + while (++idx < len) { + var key = keys[idx]; + if (idx !== len - 1) { + if (!isObject(current[key])) { + current[key] = {}; + } + current = current[key]; + continue; + } + + if (isPlainObject(current[key]) && isPlainObject(val)) { + current[key] = extend({}, current[key], val); + } else { + current[key] = val; + } + } + + return obj; +}; + +function isValidKey(key) { + return key !== '__proto__' && key !== 'constructor' && key !== 'prototype'; +} diff --git a/node_modules/set-value/package.json b/node_modules/set-value/package.json new file mode 100644 index 00000000..736db34c --- /dev/null +++ b/node_modules/set-value/package.json @@ -0,0 +1,79 @@ +{ + "name": "set-value", + "description": "Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths.", + "version": "2.0.1", + "homepage": "https://github.com/jonschlinkert/set-value", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "(https://github.com/wtgtybhertgeghgtwtg)", + "Vadim Demedes (https://vadimdemedes.com)" + ], + "repository": "jonschlinkert/set-value", + "bugs": { + "url": "https://github.com/jonschlinkert/set-value/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "devDependencies": { + "gulp-format-md": "^0.1.12", + "mocha": "^3.4.2" + }, + "keywords": [ + "get", + "has", + "hasown", + "key", + "keys", + "nested", + "notation", + "object", + "prop", + "properties", + "property", + "props", + "set", + "value", + "values" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "assign-value", + "get-value", + "has-value", + "merge-value", + "omit-value", + "set-value", + "union-value", + "unset-value" + ] + }, + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/signal-exit/CHANGELOG.md b/node_modules/signal-exit/CHANGELOG.md new file mode 100644 index 00000000..ed104f41 --- /dev/null +++ b/node_modules/signal-exit/CHANGELOG.md @@ -0,0 +1,35 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +### [3.0.3](https://github.com/tapjs/signal-exit/compare/v3.0.2...v3.0.3) (2020-03-26) + + +### Bug Fixes + +* patch `SIGHUP` to `SIGINT` when on Windows ([cfd1046](https://github.com/tapjs/signal-exit/commit/cfd1046079af4f0e44f93c69c237a09de8c23ef2)) +* **ci:** use Travis for Windows builds ([007add7](https://github.com/tapjs/signal-exit/commit/007add793d2b5ae3c382512103adbf321768a0b8)) + + +## [3.0.1](https://github.com/tapjs/signal-exit/compare/v3.0.0...v3.0.1) (2016-09-08) + + +### Bug Fixes + +* do not listen on SIGBUS, SIGFPE, SIGSEGV and SIGILL ([#40](https://github.com/tapjs/signal-exit/issues/40)) ([5b105fb](https://github.com/tapjs/signal-exit/commit/5b105fb)) + + + + +# [3.0.0](https://github.com/tapjs/signal-exit/compare/v2.1.2...v3.0.0) (2016-06-13) + + +### Bug Fixes + +* get our test suite running on Windows ([#23](https://github.com/tapjs/signal-exit/issues/23)) ([6f3eda8](https://github.com/tapjs/signal-exit/commit/6f3eda8)) +* hooking SIGPROF was interfering with profilers see [#21](https://github.com/tapjs/signal-exit/issues/21) ([#24](https://github.com/tapjs/signal-exit/issues/24)) ([1248a4c](https://github.com/tapjs/signal-exit/commit/1248a4c)) + + +### BREAKING CHANGES + +* signal-exit no longer wires into SIGPROF diff --git a/node_modules/signal-exit/LICENSE.txt b/node_modules/signal-exit/LICENSE.txt new file mode 100644 index 00000000..eead04a1 --- /dev/null +++ b/node_modules/signal-exit/LICENSE.txt @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) 2015, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/signal-exit/README.md b/node_modules/signal-exit/README.md new file mode 100644 index 00000000..9f8eb591 --- /dev/null +++ b/node_modules/signal-exit/README.md @@ -0,0 +1,39 @@ +# signal-exit + +[![Build Status](https://travis-ci.org/tapjs/signal-exit.png)](https://travis-ci.org/tapjs/signal-exit) +[![Coverage](https://coveralls.io/repos/tapjs/signal-exit/badge.svg?branch=master)](https://coveralls.io/r/tapjs/signal-exit?branch=master) +[![NPM version](https://img.shields.io/npm/v/signal-exit.svg)](https://www.npmjs.com/package/signal-exit) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + +When you want to fire an event no matter how a process exits: + +* reaching the end of execution. +* explicitly having `process.exit(code)` called. +* having `process.kill(pid, sig)` called. +* receiving a fatal signal from outside the process + +Use `signal-exit`. + +```js +var onExit = require('signal-exit') + +onExit(function (code, signal) { + console.log('process exited!') +}) +``` + +## API + +`var remove = onExit(function (code, signal) {}, options)` + +The return value of the function is a function that will remove the +handler. + +Note that the function *only* fires for signals if the signal would +cause the proces to exit. That is, there are no other listeners, and +it is a fatal signal. + +## Options + +* `alwaysLast`: Run this handler after any other signal or exit + handlers. This causes `process.emit` to be monkeypatched. diff --git a/node_modules/signal-exit/index.js b/node_modules/signal-exit/index.js new file mode 100644 index 00000000..6b6c43ac --- /dev/null +++ b/node_modules/signal-exit/index.js @@ -0,0 +1,163 @@ +// Note: since nyc uses this module to output coverage, any lines +// that are in the direct sync flow of nyc's outputCoverage are +// ignored, since we can never get coverage for them. +var assert = require('assert') +var signals = require('./signals.js') +var isWin = /^win/i.test(process.platform) + +var EE = require('events') +/* istanbul ignore if */ +if (typeof EE !== 'function') { + EE = EE.EventEmitter +} + +var emitter +if (process.__signal_exit_emitter__) { + emitter = process.__signal_exit_emitter__ +} else { + emitter = process.__signal_exit_emitter__ = new EE() + emitter.count = 0 + emitter.emitted = {} +} + +// Because this emitter is a global, we have to check to see if a +// previous version of this library failed to enable infinite listeners. +// I know what you're about to say. But literally everything about +// signal-exit is a compromise with evil. Get used to it. +if (!emitter.infinite) { + emitter.setMaxListeners(Infinity) + emitter.infinite = true +} + +module.exports = function (cb, opts) { + assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') + + if (loaded === false) { + load() + } + + var ev = 'exit' + if (opts && opts.alwaysLast) { + ev = 'afterexit' + } + + var remove = function () { + emitter.removeListener(ev, cb) + if (emitter.listeners('exit').length === 0 && + emitter.listeners('afterexit').length === 0) { + unload() + } + } + emitter.on(ev, cb) + + return remove +} + +module.exports.unload = unload +function unload () { + if (!loaded) { + return + } + loaded = false + + signals.forEach(function (sig) { + try { + process.removeListener(sig, sigListeners[sig]) + } catch (er) {} + }) + process.emit = originalProcessEmit + process.reallyExit = originalProcessReallyExit + emitter.count -= 1 +} + +function emit (event, code, signal) { + if (emitter.emitted[event]) { + return + } + emitter.emitted[event] = true + emitter.emit(event, code, signal) +} + +// { : , ... } +var sigListeners = {} +signals.forEach(function (sig) { + sigListeners[sig] = function listener () { + // If there are no other listeners, an exit is coming! + // Simplest way: remove us and then re-send the signal. + // We know that this will kill the process, so we can + // safely emit now. + var listeners = process.listeners(sig) + if (listeners.length === emitter.count) { + unload() + emit('exit', null, sig) + /* istanbul ignore next */ + emit('afterexit', null, sig) + /* istanbul ignore next */ + if (isWin && sig === 'SIGHUP') { + // "SIGHUP" throws an `ENOSYS` error on Windows, + // so use a supported signal instead + sig = 'SIGINT' + } + process.kill(process.pid, sig) + } + } +}) + +module.exports.signals = function () { + return signals +} + +module.exports.load = load + +var loaded = false + +function load () { + if (loaded) { + return + } + loaded = true + + // This is the number of onSignalExit's that are in play. + // It's important so that we can count the correct number of + // listeners on signals, and don't wait for the other one to + // handle it instead of us. + emitter.count += 1 + + signals = signals.filter(function (sig) { + try { + process.on(sig, sigListeners[sig]) + return true + } catch (er) { + return false + } + }) + + process.emit = processEmit + process.reallyExit = processReallyExit +} + +var originalProcessReallyExit = process.reallyExit +function processReallyExit (code) { + process.exitCode = code || 0 + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + originalProcessReallyExit.call(process, process.exitCode) +} + +var originalProcessEmit = process.emit +function processEmit (ev, arg) { + if (ev === 'exit') { + if (arg !== undefined) { + process.exitCode = arg + } + var ret = originalProcessEmit.apply(this, arguments) + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + return ret + } else { + return originalProcessEmit.apply(this, arguments) + } +} diff --git a/node_modules/signal-exit/package.json b/node_modules/signal-exit/package.json new file mode 100644 index 00000000..59b0ac12 --- /dev/null +++ b/node_modules/signal-exit/package.json @@ -0,0 +1,38 @@ +{ + "name": "signal-exit", + "version": "3.0.3", + "description": "when you want to fire an event no matter how a process exits.", + "main": "index.js", + "scripts": { + "pretest": "standard", + "test": "tap --timeout=240 ./test/*.js --cov", + "coverage": "nyc report --reporter=text-lcov | coveralls", + "release": "standard-version" + }, + "files": [ + "index.js", + "signals.js" + ], + "repository": { + "type": "git", + "url": "https://github.com/tapjs/signal-exit.git" + }, + "keywords": [ + "signal", + "exit" + ], + "author": "Ben Coe ", + "license": "ISC", + "bugs": { + "url": "https://github.com/tapjs/signal-exit/issues" + }, + "homepage": "https://github.com/tapjs/signal-exit", + "devDependencies": { + "chai": "^3.5.0", + "coveralls": "^2.11.10", + "nyc": "^8.1.0", + "standard": "^8.1.0", + "standard-version": "^2.3.0", + "tap": "^8.0.1" + } +} diff --git a/node_modules/signal-exit/signals.js b/node_modules/signal-exit/signals.js new file mode 100644 index 00000000..3bd67a8a --- /dev/null +++ b/node_modules/signal-exit/signals.js @@ -0,0 +1,53 @@ +// This is not the set of all possible signals. +// +// It IS, however, the set of all signals that trigger +// an exit on either Linux or BSD systems. Linux is a +// superset of the signal names supported on BSD, and +// the unknown signals just fail to register, so we can +// catch that easily enough. +// +// Don't bother with SIGKILL. It's uncatchable, which +// means that we can't fire any callbacks anyway. +// +// If a user does happen to register a handler on a non- +// fatal signal like SIGWINCH or something, and then +// exit, it'll end up firing `process.emit('exit')`, so +// the handler will be fired anyway. +// +// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised +// artificially, inherently leave the process in a +// state from which it is not safe to try and enter JS +// listeners. +module.exports = [ + 'SIGABRT', + 'SIGALRM', + 'SIGHUP', + 'SIGINT', + 'SIGTERM' +] + +if (process.platform !== 'win32') { + module.exports.push( + 'SIGVTALRM', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGUSR2', + 'SIGTRAP', + 'SIGSYS', + 'SIGQUIT', + 'SIGIOT' + // should detect profiler and enable/disable accordingly. + // see #21 + // 'SIGPROF' + ) +} + +if (process.platform === 'linux') { + module.exports.push( + 'SIGIO', + 'SIGPOLL', + 'SIGPWR', + 'SIGSTKFLT', + 'SIGUNUSED' + ) +} diff --git a/node_modules/snapdragon-node/LICENSE b/node_modules/snapdragon-node/LICENSE new file mode 100644 index 00000000..9a1c8567 --- /dev/null +++ b/node_modules/snapdragon-node/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/snapdragon-node/README.md b/node_modules/snapdragon-node/README.md new file mode 100644 index 00000000..2300a3cd --- /dev/null +++ b/node_modules/snapdragon-node/README.md @@ -0,0 +1,453 @@ +# snapdragon-node [![NPM version](https://img.shields.io/npm/v/snapdragon-node.svg?style=flat)](https://www.npmjs.com/package/snapdragon-node) [![NPM monthly downloads](https://img.shields.io/npm/dm/snapdragon-node.svg?style=flat)](https://npmjs.org/package/snapdragon-node) [![NPM total downloads](https://img.shields.io/npm/dt/snapdragon-node.svg?style=flat)](https://npmjs.org/package/snapdragon-node) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/snapdragon-node.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/snapdragon-node) + +> Snapdragon utility for creating a new AST node in custom code, such as plugins. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save snapdragon-node +``` + +## Usage + +With [snapdragon](https://github.com/jonschlinkert/snapdragon) v0.9.0 and higher you can use `this.node()` to create a new `Node`, whenever it makes sense. + +```js +var Node = require('snapdragon-node'); +var Snapdragon = require('snapdragon'); +var snapdragon = new Snapdragon(); + +// example usage inside a parser visitor function +snapdragon.parser.set('foo', function() { + // get the current "start" position + var pos = this.position(); + + // returns the match if regex matches the substring + // at the current position on `parser.input` + var match = this.match(/foo/); + if (match) { + // call "pos" on the node, to set the start and end + // positions, and return the node to push it onto the AST + // (snapdragon will push the node onto the correct + // nodes array, based on the stack) + return pos(new Node({type: 'bar', val: match[0]})); + } +}); +``` + +## API + +### [Node](index.js#L22) + +Create a new AST `Node` with the given `val` and `type`. + +**Params** + +* `val` **{String|Object}**: Pass a matched substring, or an object to merge onto the node. +* `type` **{String}**: The node type to use when `val` is a string. +* `returns` **{Object}**: node instance + +**Example** + +```js +var node = new Node('*', 'Star'); +var node = new Node({type: 'star', val: '*'}); +``` + +### [.isNode](index.js#L61) + +Returns true if the given value is a node. + +**Params** + +* `node` **{Object}** +* `returns` **{Boolean}** + +**Example** + +```js +var Node = require('snapdragon-node'); +var node = new Node({type: 'foo'}); +console.log(Node.isNode(node)); //=> true +console.log(Node.isNode({})); //=> false +``` + +### [.define](index.js#L80) + +Define a non-enumberable property on the node instance. Useful for adding properties that shouldn't be extended or visible during debugging. + +**Params** + +* `name` **{String}** +* `val` **{any}** +* `returns` **{Object}**: returns the node instance + +**Example** + +```js +var node = new Node(); +node.define('foo', 'something non-enumerable'); +``` + +### [.isEmpty](index.js#L100) + +Returns true if `node.val` is an empty string, or `node.nodes` does not contain any non-empty text nodes. + +**Params** + +* `fn` **{Function}**: (optional) Filter function that is called on `node` and/or child nodes. `isEmpty` will return false immediately when the filter function returns false on any nodes. +* `returns` **{Boolean}** + +**Example** + +```js +var node = new Node({type: 'text'}); +node.isEmpty(); //=> true +node.val = 'foo'; +node.isEmpty(); //=> false +``` + +### [.push](index.js#L118) + +Given node `foo` and node `bar`, push node `bar` onto `foo.nodes`, and set `foo` as `bar.parent`. + +**Params** + +* `node` **{Object}** +* `returns` **{Number}**: Returns the length of `node.nodes` + +**Example** + +```js +var foo = new Node({type: 'foo'}); +var bar = new Node({type: 'bar'}); +foo.push(bar); +``` + +### [.unshift](index.js#L140) + +Given node `foo` and node `bar`, unshift node `bar` onto `foo.nodes`, and set `foo` as `bar.parent`. + +**Params** + +* `node` **{Object}** +* `returns` **{Number}**: Returns the length of `node.nodes` + +**Example** + +```js +var foo = new Node({type: 'foo'}); +var bar = new Node({type: 'bar'}); +foo.unshift(bar); +``` + +### [.pop](index.js#L167) + +Pop a node from `node.nodes`. + +* `returns` **{Number}**: Returns the popped `node` + +**Example** + +```js +var node = new Node({type: 'foo'}); +node.push(new Node({type: 'a'})); +node.push(new Node({type: 'b'})); +node.push(new Node({type: 'c'})); +node.push(new Node({type: 'd'})); +console.log(node.nodes.length); +//=> 4 +node.pop(); +console.log(node.nodes.length); +//=> 3 +``` + +### [.shift](index.js#L190) + +Shift a node from `node.nodes`. + +* `returns` **{Object}**: Returns the shifted `node` + +**Example** + +```js +var node = new Node({type: 'foo'}); +node.push(new Node({type: 'a'})); +node.push(new Node({type: 'b'})); +node.push(new Node({type: 'c'})); +node.push(new Node({type: 'd'})); +console.log(node.nodes.length); +//=> 4 +node.shift(); +console.log(node.nodes.length); +//=> 3 +``` + +### [.remove](index.js#L205) + +Remove `node` from `node.nodes`. + +**Params** + +* `node` **{Object}** +* `returns` **{Object}**: Returns the removed node. + +**Example** + +```js +node.remove(childNode); +``` + +### [.find](index.js#L231) + +Get the first child node from `node.nodes` that matches the given `type`. If `type` is a number, the child node at that index is returned. + +**Params** + +* `type` **{String}** +* `returns` **{Object}**: Returns a child node or undefined. + +**Example** + +```js +var child = node.find(1); //<= index of the node to get +var child = node.find('foo'); //<= node.type of a child node +var child = node.find(/^(foo|bar)$/); //<= regex to match node.type +var child = node.find(['foo', 'bar']); //<= array of node.type(s) +``` + +### [.isType](index.js#L249) + +Return true if the node is the given `type`. + +**Params** + +* `type` **{String}** +* `returns` **{Boolean}** + +**Example** + +```js +var node = new Node({type: 'bar'}); +cosole.log(node.isType('foo')); // false +cosole.log(node.isType(/^(foo|bar)$/)); // true +cosole.log(node.isType(['foo', 'bar'])); // true +``` + +### [.hasType](index.js#L270) + +Return true if the `node.nodes` has the given `type`. + +**Params** + +* `type` **{String}** +* `returns` **{Boolean}** + +**Example** + +```js +var foo = new Node({type: 'foo'}); +var bar = new Node({type: 'bar'}); +foo.push(bar); + +cosole.log(foo.hasType('qux')); // false +cosole.log(foo.hasType(/^(qux|bar)$/)); // true +cosole.log(foo.hasType(['qux', 'bar'])); // true +``` + +* `returns` **{Array}** + +**Example** + +```js +var foo = new Node({type: 'foo'}); +var bar = new Node({type: 'bar'}); +var baz = new Node({type: 'baz'}); +foo.push(bar); +foo.push(baz); + +console.log(bar.siblings.length) // 2 +console.log(baz.siblings.length) // 2 +``` + +* `returns` **{Number}** + +**Example** + +```js +var foo = new Node({type: 'foo'}); +var bar = new Node({type: 'bar'}); +var baz = new Node({type: 'baz'}); +var qux = new Node({type: 'qux'}); +foo.push(bar); +foo.push(baz); +foo.unshift(qux); + +console.log(bar.index) // 1 +console.log(baz.index) // 2 +console.log(qux.index) // 0 +``` + +* `returns` **{Object}** + +**Example** + +```js +var foo = new Node({type: 'foo'}); +var bar = new Node({type: 'bar'}); +var baz = new Node({type: 'baz'}); +foo.push(bar); +foo.push(baz); + +console.log(baz.prev.type) // 'bar' +``` + +* `returns` **{Object}** + +**Example** + +```js +var foo = new Node({type: 'foo'}); +var bar = new Node({type: 'bar'}); +var baz = new Node({type: 'baz'}); +foo.push(bar); +foo.push(baz); + +console.log(bar.siblings.length) // 2 +console.log(baz.siblings.length) // 2 +``` + +* `returns` **{Object}**: The first node, or undefiend + +**Example** + +```js +var foo = new Node({type: 'foo'}); +var bar = new Node({type: 'bar'}); +var baz = new Node({type: 'baz'}); +var qux = new Node({type: 'qux'}); +foo.push(bar); +foo.push(baz); +foo.push(qux); + +console.log(foo.first.type) // 'bar' +``` + +* `returns` **{Object}**: The last node, or undefiend + +**Example** + +```js +var foo = new Node({type: 'foo'}); +var bar = new Node({type: 'bar'}); +var baz = new Node({type: 'baz'}); +var qux = new Node({type: 'qux'}); +foo.push(bar); +foo.push(baz); +foo.push(qux); + +console.log(foo.last.type) // 'qux' +``` + +* `returns` **{Object}**: The last node, or undefiend + +**Example** + +```js +var foo = new Node({type: 'foo'}); +var bar = new Node({type: 'bar'}); +var baz = new Node({type: 'baz'}); +var qux = new Node({type: 'qux'}); +foo.push(bar); +foo.push(baz); +foo.push(qux); + +console.log(foo.last.type) // 'qux' +``` + +## Release history + +Changelog entries are classified using the following labels from [keep-a-changelog](https://github.com/olivierlacan/keep-a-changelog): + +* `added`: for new features +* `changed`: for changes in existing functionality +* `deprecated`: for once-stable features removed in upcoming releases +* `removed`: for deprecated features removed in this release +* `fixed`: for any bug fixes + +Custom labels used in this changelog: + +* `dependencies`: bumps dependencies +* `housekeeping`: code re-organization, minor edits, or other changes that don't fit in one of the other categories. + +### [2.0.0] - 2017-05-01 + +**Changed** + +* `.unshiftNode` was renamed to [.unshift](#unshift) +* `.pushNode` was renamed to [.push](#push) +* `.getNode` was renamed to [.find](#find) + +**Added** + +* [.isNode](#isNode) +* [.isEmpty](#isEmpty) +* [.pop](#pop) +* [.shift](#shift) +* [.remove](#remove) + +### [0.1.0] + +First release. + +## About + +### Related projects + +* [breakdance](https://www.npmjs.com/package/breakdance): Breakdance is a node.js library for converting HTML to markdown. Highly pluggable, flexible and easy… [more](http://breakdance.io) | [homepage](http://breakdance.io "Breakdance is a node.js library for converting HTML to markdown. Highly pluggable, flexible and easy to use. It's time for your markup to get down.") +* [snapdragon-capture](https://www.npmjs.com/package/snapdragon-capture): Snapdragon plugin that adds a capture method to the parser instance. | [homepage](https://github.com/jonschlinkert/snapdragon-capture "Snapdragon plugin that adds a capture method to the parser instance.") +* [snapdragon-cheerio](https://www.npmjs.com/package/snapdragon-cheerio): Snapdragon plugin for converting a cheerio AST to a snapdragon AST. | [homepage](https://github.com/jonschlinkert/snapdragon-cheerio "Snapdragon plugin for converting a cheerio AST to a snapdragon AST.") +* [snapdragon-util](https://www.npmjs.com/package/snapdragon-util): Utilities for the snapdragon parser/compiler. | [homepage](https://github.com/jonschlinkert/snapdragon-util "Utilities for the snapdragon parser/compiler.") +* [snapdragon](https://www.npmjs.com/package/snapdragon): Easy-to-use plugin system for creating powerful, fast and versatile parsers and compilers, with built-in source-map… [more](https://github.com/jonschlinkert/snapdragon) | [homepage](https://github.com/jonschlinkert/snapdragon "Easy-to-use plugin system for creating powerful, fast and versatile parsers and compilers, with built-in source-map support.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards. + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 25, 2017._ \ No newline at end of file diff --git a/node_modules/snapdragon-node/index.js b/node_modules/snapdragon-node/index.js new file mode 100644 index 00000000..0f66ff5a --- /dev/null +++ b/node_modules/snapdragon-node/index.js @@ -0,0 +1,492 @@ +'use strict'; + +var isObject = require('isobject'); +var define = require('define-property'); +var utils = require('snapdragon-util'); +var ownNames; + +/** + * Create a new AST `Node` with the given `val` and `type`. + * + * ```js + * var node = new Node('*', 'Star'); + * var node = new Node({type: 'star', val: '*'}); + * ``` + * @name Node + * @param {String|Object} `val` Pass a matched substring, or an object to merge onto the node. + * @param {String} `type` The node type to use when `val` is a string. + * @return {Object} node instance + * @api public + */ + +function Node(val, type, parent) { + if (typeof type !== 'string') { + parent = type; + type = null; + } + + define(this, 'parent', parent); + define(this, 'isNode', true); + define(this, 'expect', null); + + if (typeof type !== 'string' && isObject(val)) { + lazyKeys(); + var keys = Object.keys(val); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (ownNames.indexOf(key) === -1) { + this[key] = val[key]; + } + } + } else { + this.type = type; + this.val = val; + } +} + +/** + * Returns true if the given value is a node. + * + * ```js + * var Node = require('snapdragon-node'); + * var node = new Node({type: 'foo'}); + * console.log(Node.isNode(node)); //=> true + * console.log(Node.isNode({})); //=> false + * ``` + * @param {Object} `node` + * @returns {Boolean} + * @api public + */ + +Node.isNode = function(node) { + return utils.isNode(node); +}; + +/** + * Define a non-enumberable property on the node instance. + * Useful for adding properties that shouldn't be extended + * or visible during debugging. + * + * ```js + * var node = new Node(); + * node.define('foo', 'something non-enumerable'); + * ``` + * @param {String} `name` + * @param {any} `val` + * @return {Object} returns the node instance + * @api public + */ + +Node.prototype.define = function(name, val) { + define(this, name, val); + return this; +}; + +/** + * Returns true if `node.val` is an empty string, or `node.nodes` does + * not contain any non-empty text nodes. + * + * ```js + * var node = new Node({type: 'text'}); + * node.isEmpty(); //=> true + * node.val = 'foo'; + * node.isEmpty(); //=> false + * ``` + * @param {Function} `fn` (optional) Filter function that is called on `node` and/or child nodes. `isEmpty` will return false immediately when the filter function returns false on any nodes. + * @return {Boolean} + * @api public + */ + +Node.prototype.isEmpty = function(fn) { + return utils.isEmpty(this, fn); +}; + +/** + * Given node `foo` and node `bar`, push node `bar` onto `foo.nodes`, and + * set `foo` as `bar.parent`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * foo.push(bar); + * ``` + * @param {Object} `node` + * @return {Number} Returns the length of `node.nodes` + * @api public + */ + +Node.prototype.push = function(node) { + assert(Node.isNode(node), 'expected node to be an instance of Node'); + define(node, 'parent', this); + + this.nodes = this.nodes || []; + return this.nodes.push(node); +}; + +/** + * Given node `foo` and node `bar`, unshift node `bar` onto `foo.nodes`, and + * set `foo` as `bar.parent`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * foo.unshift(bar); + * ``` + * @param {Object} `node` + * @return {Number} Returns the length of `node.nodes` + * @api public + */ + +Node.prototype.unshift = function(node) { + assert(Node.isNode(node), 'expected node to be an instance of Node'); + define(node, 'parent', this); + + this.nodes = this.nodes || []; + return this.nodes.unshift(node); +}; + +/** + * Pop a node from `node.nodes`. + * + * ```js + * var node = new Node({type: 'foo'}); + * node.push(new Node({type: 'a'})); + * node.push(new Node({type: 'b'})); + * node.push(new Node({type: 'c'})); + * node.push(new Node({type: 'd'})); + * console.log(node.nodes.length); + * //=> 4 + * node.pop(); + * console.log(node.nodes.length); + * //=> 3 + * ``` + * @return {Number} Returns the popped `node` + * @api public + */ + +Node.prototype.pop = function() { + return this.nodes && this.nodes.pop(); +}; + +/** + * Shift a node from `node.nodes`. + * + * ```js + * var node = new Node({type: 'foo'}); + * node.push(new Node({type: 'a'})); + * node.push(new Node({type: 'b'})); + * node.push(new Node({type: 'c'})); + * node.push(new Node({type: 'd'})); + * console.log(node.nodes.length); + * //=> 4 + * node.shift(); + * console.log(node.nodes.length); + * //=> 3 + * ``` + * @return {Object} Returns the shifted `node` + * @api public + */ + +Node.prototype.shift = function() { + return this.nodes && this.nodes.shift(); +}; + +/** + * Remove `node` from `node.nodes`. + * + * ```js + * node.remove(childNode); + * ``` + * @param {Object} `node` + * @return {Object} Returns the removed node. + * @api public + */ + +Node.prototype.remove = function(node) { + assert(Node.isNode(node), 'expected node to be an instance of Node'); + this.nodes = this.nodes || []; + var idx = node.index; + if (idx !== -1) { + node.index = -1; + return this.nodes.splice(idx, 1); + } + return null; +}; + +/** + * Get the first child node from `node.nodes` that matches the given `type`. + * If `type` is a number, the child node at that index is returned. + * + * ```js + * var child = node.find(1); //<= index of the node to get + * var child = node.find('foo'); //<= node.type of a child node + * var child = node.find(/^(foo|bar)$/); //<= regex to match node.type + * var child = node.find(['foo', 'bar']); //<= array of node.type(s) + * ``` + * @param {String} `type` + * @return {Object} Returns a child node or undefined. + * @api public + */ + +Node.prototype.find = function(type) { + return utils.findNode(this.nodes, type); +}; + +/** + * Return true if the node is the given `type`. + * + * ```js + * var node = new Node({type: 'bar'}); + * cosole.log(node.isType('foo')); // false + * cosole.log(node.isType(/^(foo|bar)$/)); // true + * cosole.log(node.isType(['foo', 'bar'])); // true + * ``` + * @param {String} `type` + * @return {Boolean} + * @api public + */ + +Node.prototype.isType = function(type) { + return utils.isType(this, type); +}; + +/** + * Return true if the `node.nodes` has the given `type`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * foo.push(bar); + * + * cosole.log(foo.hasType('qux')); // false + * cosole.log(foo.hasType(/^(qux|bar)$/)); // true + * cosole.log(foo.hasType(['qux', 'bar'])); // true + * ``` + * @param {String} `type` + * @return {Boolean} + * @api public + */ + +Node.prototype.hasType = function(type) { + return utils.hasType(this, type); +}; + +/** + * Get the siblings array, or `null` if it doesn't exist. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * foo.push(bar); + * foo.push(baz); + * + * console.log(bar.siblings.length) // 2 + * console.log(baz.siblings.length) // 2 + * ``` + * @return {Array} + * @api public + */ + +Object.defineProperty(Node.prototype, 'siblings', { + set: function() { + throw new Error('node.siblings is a getter and cannot be defined'); + }, + get: function() { + return this.parent ? this.parent.nodes : null; + } +}); + +/** + * Get the node's current index from `node.parent.nodes`. + * This should always be correct, even when the parent adds nodes. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * var qux = new Node({type: 'qux'}); + * foo.push(bar); + * foo.push(baz); + * foo.unshift(qux); + * + * console.log(bar.index) // 1 + * console.log(baz.index) // 2 + * console.log(qux.index) // 0 + * ``` + * @return {Number} + * @api public + */ + +Object.defineProperty(Node.prototype, 'index', { + set: function(index) { + define(this, 'idx', index); + }, + get: function() { + if (!Array.isArray(this.siblings)) { + return -1; + } + var tok = this.idx !== -1 ? this.siblings[this.idx] : null; + if (tok !== this) { + this.idx = this.siblings.indexOf(this); + } + return this.idx; + } +}); + +/** + * Get the previous node from the siblings array or `null`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * foo.push(bar); + * foo.push(baz); + * + * console.log(baz.prev.type) // 'bar' + * ``` + * @return {Object} + * @api public + */ + +Object.defineProperty(Node.prototype, 'prev', { + set: function() { + throw new Error('node.prev is a getter and cannot be defined'); + }, + get: function() { + if (Array.isArray(this.siblings)) { + return this.siblings[this.index - 1] || this.parent.prev; + } + return null; + } +}); + +/** + * Get the siblings array, or `null` if it doesn't exist. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * foo.push(bar); + * foo.push(baz); + * + * console.log(bar.siblings.length) // 2 + * console.log(baz.siblings.length) // 2 + * ``` + * @return {Object} + * @api public + */ + +Object.defineProperty(Node.prototype, 'next', { + set: function() { + throw new Error('node.next is a getter and cannot be defined'); + }, + get: function() { + if (Array.isArray(this.siblings)) { + return this.siblings[this.index + 1] || this.parent.next; + } + return null; + } +}); + +/** + * Get the first node from `node.nodes`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * var qux = new Node({type: 'qux'}); + * foo.push(bar); + * foo.push(baz); + * foo.push(qux); + * + * console.log(foo.first.type) // 'bar' + * ``` + * @return {Object} The first node, or undefiend + * @api public + */ + +Object.defineProperty(Node.prototype, 'first', { + get: function() { + return this.nodes ? this.nodes[0] : null; + } +}); + +/** + * Get the last node from `node.nodes`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * var qux = new Node({type: 'qux'}); + * foo.push(bar); + * foo.push(baz); + * foo.push(qux); + * + * console.log(foo.last.type) // 'qux' + * ``` + * @return {Object} The last node, or undefiend + * @api public + */ + +Object.defineProperty(Node.prototype, 'last', { + get: function() { + return this.nodes ? utils.last(this.nodes) : null; + } +}); + +/** + * Get the last node from `node.nodes`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * var qux = new Node({type: 'qux'}); + * foo.push(bar); + * foo.push(baz); + * foo.push(qux); + * + * console.log(foo.last.type) // 'qux' + * ``` + * @return {Object} The last node, or undefiend + * @api public + */ + +Object.defineProperty(Node.prototype, 'scope', { + get: function() { + if (this.isScope !== true) { + return this.parent ? this.parent.scope : this; + } + return this; + } +}); + +/** + * Get own property names from Node prototype, but only the + * first time `Node` is instantiated + */ + +function lazyKeys() { + if (!ownNames) { + ownNames = Object.getOwnPropertyNames(Node.prototype); + } +} + +/** + * Simplified assertion. Throws an error is `val` is falsey. + */ + +function assert(val, message) { + if (!val) throw new Error(message); +} + +/** + * Expose `Node` + */ + +exports = module.exports = Node; diff --git a/node_modules/snapdragon-node/node_modules/define-property/LICENSE b/node_modules/snapdragon-node/node_modules/define-property/LICENSE new file mode 100644 index 00000000..ec85897e --- /dev/null +++ b/node_modules/snapdragon-node/node_modules/define-property/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, 2017, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/snapdragon-node/node_modules/define-property/README.md b/node_modules/snapdragon-node/node_modules/define-property/README.md new file mode 100644 index 00000000..2f1af05f --- /dev/null +++ b/node_modules/snapdragon-node/node_modules/define-property/README.md @@ -0,0 +1,95 @@ +# define-property [![NPM version](https://img.shields.io/npm/v/define-property.svg?style=flat)](https://www.npmjs.com/package/define-property) [![NPM monthly downloads](https://img.shields.io/npm/dm/define-property.svg?style=flat)](https://npmjs.org/package/define-property) [![NPM total downloads](https://img.shields.io/npm/dt/define-property.svg?style=flat)](https://npmjs.org/package/define-property) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/define-property.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/define-property) + +> Define a non-enumerable property on an object. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save define-property +``` + +Install with [yarn](https://yarnpkg.com): + +```sh +$ yarn add define-property +``` + +## Usage + +**Params** + +* `obj`: The object on which to define the property. +* `prop`: The name of the property to be defined or modified. +* `descriptor`: The descriptor for the property being defined or modified. + +```js +var define = require('define-property'); +var obj = {}; +define(obj, 'foo', function(val) { + return val.toUpperCase(); +}); + +console.log(obj); +//=> {} + +console.log(obj.foo('bar')); +//=> 'BAR' +``` + +**get/set** + +```js +define(obj, 'foo', { + get: function() {}, + set: function() {} +}); +``` + +## About + +### Related projects + +* [assign-deep](https://www.npmjs.com/package/assign-deep): Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target… [more](https://github.com/jonschlinkert/assign-deep) | [homepage](https://github.com/jonschlinkert/assign-deep "Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target (first) object.") +* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow "Extend an object with the properties of additional objects. node.js/javascript util.") +* [merge-deep](https://www.npmjs.com/package/merge-deep): Recursively merge values in a javascript object. | [homepage](https://github.com/jonschlinkert/merge-deep "Recursively merge values in a javascript object.") +* [mixin-deep](https://www.npmjs.com/package/mixin-deep): Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone. | [homepage](https://github.com/jonschlinkert/mixin-deep "Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.5.0, on April 20, 2017._ \ No newline at end of file diff --git a/node_modules/snapdragon-node/node_modules/define-property/index.js b/node_modules/snapdragon-node/node_modules/define-property/index.js new file mode 100644 index 00000000..27c19ebf --- /dev/null +++ b/node_modules/snapdragon-node/node_modules/define-property/index.js @@ -0,0 +1,31 @@ +/*! + * define-property + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isDescriptor = require('is-descriptor'); + +module.exports = function defineProperty(obj, prop, val) { + if (typeof obj !== 'object' && typeof obj !== 'function') { + throw new TypeError('expected an object or function.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('expected `prop` to be a string.'); + } + + if (isDescriptor(val) && ('set' in val || 'get' in val)) { + return Object.defineProperty(obj, prop, val); + } + + return Object.defineProperty(obj, prop, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); +}; diff --git a/node_modules/snapdragon-node/node_modules/define-property/package.json b/node_modules/snapdragon-node/node_modules/define-property/package.json new file mode 100644 index 00000000..e0ab1ca0 --- /dev/null +++ b/node_modules/snapdragon-node/node_modules/define-property/package.json @@ -0,0 +1,62 @@ +{ + "name": "define-property", + "description": "Define a non-enumerable property on an object.", + "version": "1.0.0", + "homepage": "https://github.com/jonschlinkert/define-property", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/define-property", + "bugs": { + "url": "https://github.com/jonschlinkert/define-property/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "devDependencies": { + "gulp-format-md": "^0.1.12", + "mocha": "^3.2.0" + }, + "keywords": [ + "define", + "define-property", + "enumerable", + "key", + "non", + "non-enumerable", + "object", + "prop", + "property", + "value" + ], + "verb": { + "related": { + "list": [ + "extend-shallow", + "merge-deep", + "assign-deep", + "mixin-deep" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/snapdragon-node/package.json b/node_modules/snapdragon-node/package.json new file mode 100644 index 00000000..2ca80237 --- /dev/null +++ b/node_modules/snapdragon-node/package.json @@ -0,0 +1,76 @@ +{ + "name": "snapdragon-node", + "description": "Snapdragon utility for creating a new AST node in custom code, such as plugins.", + "version": "2.1.1", + "homepage": "https://github.com/jonschlinkert/snapdragon-node", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/snapdragon-node", + "bugs": { + "url": "https://github.com/jonschlinkert/snapdragon-node/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "devDependencies": { + "gulp": "^3.9.1", + "gulp-eslint": "^4.0.0", + "gulp-format-md": "^0.1.12", + "gulp-istanbul": "^1.1.2", + "gulp-mocha": "^3.0.1", + "mocha": "^3.4.2", + "snapdragon": "^0.11.0" + }, + "keywords": [ + "ast", + "compile", + "compiler", + "convert", + "node", + "parse", + "parser", + "plugin", + "render", + "snapdragon", + "snapdragonplugin", + "token", + "transform" + ], + "verb": { + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "breakdance", + "snapdragon", + "snapdragon-capture", + "snapdragon-cheerio", + "snapdragon-util" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/snapdragon-util/LICENSE b/node_modules/snapdragon-util/LICENSE new file mode 100644 index 00000000..9a1c8567 --- /dev/null +++ b/node_modules/snapdragon-util/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/snapdragon-util/README.md b/node_modules/snapdragon-util/README.md new file mode 100644 index 00000000..b654e023 --- /dev/null +++ b/node_modules/snapdragon-util/README.md @@ -0,0 +1,807 @@ +# snapdragon-util [![NPM version](https://img.shields.io/npm/v/snapdragon-util.svg?style=flat)](https://www.npmjs.com/package/snapdragon-util) [![NPM monthly downloads](https://img.shields.io/npm/dm/snapdragon-util.svg?style=flat)](https://npmjs.org/package/snapdragon-util) [![NPM total downloads](https://img.shields.io/npm/dt/snapdragon-util.svg?style=flat)](https://npmjs.org/package/snapdragon-util) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/snapdragon-util.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/snapdragon-util) + +> Utilities for the snapdragon parser/compiler. + +
      +Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [API](#api) +- [Release history](#release-history) + * [[3.0.0] - 2017-05-01](#300---2017-05-01) + * [[0.1.0]](#010) +- [About](#about) + +
      + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save snapdragon-util +``` + +Install with [yarn](https://yarnpkg.com): + +```sh +$ yarn add snapdragon-util +``` + +## Usage + +```js +var util = require('snapdragon-util'); +``` + +## API + +### [.isNode](index.js#L21) + +Returns true if the given value is a node. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Boolean}** + +**Example** + +```js +var Node = require('snapdragon-node'); +var node = new Node({type: 'foo'}); +console.log(utils.isNode(node)); //=> true +console.log(utils.isNode({})); //=> false +``` + +### [.noop](index.js#L37) + +Emit an empty string for the given `node`. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{undefined}** + +**Example** + +```js +// do nothing for beginning-of-string +snapdragon.compiler.set('bos', utils.noop); +``` + +### [.identity](index.js#L53) + +Appdend `node.val` to `compiler.output`, exactly as it was created by the parser. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{undefined}** + +**Example** + +```js +snapdragon.compiler.set('text', utils.identity); +``` + +### [.append](index.js#L76) + +Previously named `.emit`, this method appends the given `val` to `compiler.output` for the given node. Useful when you know what value should be appended advance, regardless of the actual value of `node.val`. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Function}**: Returns a compiler middleware function. + +**Example** + +```js +snapdragon.compiler + .set('i', function(node) { + this.mapVisit(node); + }) + .set('i.open', utils.append('')) + .set('i.close', utils.append('')) +``` + +### [.toNoop](index.js#L99) + +Used in compiler middleware, this onverts an AST node into an empty `text` node and deletes `node.nodes` if it exists. The advantage of this method is that, as opposed to completely removing the node, indices will not need to be re-calculated in sibling nodes, and nothing is appended to the output. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `nodes` **{Array}**: Optionally pass a new `nodes` value, to replace the existing `node.nodes` array. + +**Example** + +```js +utils.toNoop(node); +// convert `node.nodes` to the given value instead of deleting it +utils.toNoop(node, []); +``` + +### [.visit](index.js#L128) + +Visit `node` with the given `fn`. The built-in `.visit` method in snapdragon automatically calls registered compilers, this allows you to pass a visitor function. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `fn` **{Function}** +* `returns` **{Object}**: returns the node after recursively visiting all child nodes. + +**Example** + +```js +snapdragon.compiler.set('i', function(node) { + utils.visit(node, function(childNode) { + // do stuff with "childNode" + return childNode; + }); +}); +``` + +### [.mapVisit](index.js#L155) + +Map [visit](#visit) the given `fn` over `node.nodes`. This is called by [visit](#visit), use this method if you do not want `fn` to be called on the first node. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `options` **{Object}** +* `fn` **{Function}** +* `returns` **{Object}**: returns the node + +**Example** + +```js +snapdragon.compiler.set('i', function(node) { + utils.mapVisit(node, function(childNode) { + // do stuff with "childNode" + return childNode; + }); +}); +``` + +### [.addOpen](index.js#L194) + +Unshift an `*.open` node onto `node.nodes`. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `Node` **{Function}**: (required) Node constructor function from [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node). +* `filter` **{Function}**: Optionaly specify a filter function to exclude the node. +* `returns` **{Object}**: Returns the created opening node. + +**Example** + +```js +var Node = require('snapdragon-node'); +snapdragon.parser.set('brace', function(node) { + var match = this.match(/^{/); + if (match) { + var parent = new Node({type: 'brace'}); + utils.addOpen(parent, Node); + console.log(parent.nodes[0]): + // { type: 'brace.open', val: '' }; + + // push the parent "brace" node onto the stack + this.push(parent); + + // return the parent node, so it's also added to the AST + return brace; + } +}); +``` + +### [.addClose](index.js#L244) + +Push a `*.close` node onto `node.nodes`. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `Node` **{Function}**: (required) Node constructor function from [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node). +* `filter` **{Function}**: Optionaly specify a filter function to exclude the node. +* `returns` **{Object}**: Returns the created closing node. + +**Example** + +```js +var Node = require('snapdragon-node'); +snapdragon.parser.set('brace', function(node) { + var match = this.match(/^}/); + if (match) { + var parent = this.parent(); + if (parent.type !== 'brace') { + throw new Error('missing opening: ' + '}'); + } + + utils.addClose(parent, Node); + console.log(parent.nodes[parent.nodes.length - 1]): + // { type: 'brace.close', val: '' }; + + // no need to return a node, since the parent + // was already added to the AST + return; + } +}); +``` + +### [.wrapNodes](index.js#L274) + +Wraps the given `node` with `*.open` and `*.close` nodes. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `Node` **{Function}**: (required) Node constructor function from [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node). +* `filter` **{Function}**: Optionaly specify a filter function to exclude the node. +* `returns` **{Object}**: Returns the node + +### [.pushNode](index.js#L299) + +Push the given `node` onto `parent.nodes`, and set `parent` as `node.parent. + +**Params** + +* `parent` **{Object}** +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Object}**: Returns the child node + +**Example** + +```js +var parent = new Node({type: 'foo'}); +var node = new Node({type: 'bar'}); +utils.pushNode(parent, node); +console.log(parent.nodes[0].type) // 'bar' +console.log(node.parent.type) // 'foo' +``` + +### [.unshiftNode](index.js#L325) + +Unshift `node` onto `parent.nodes`, and set `parent` as `node.parent. + +**Params** + +* `parent` **{Object}** +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{undefined}** + +**Example** + +```js +var parent = new Node({type: 'foo'}); +var node = new Node({type: 'bar'}); +utils.unshiftNode(parent, node); +console.log(parent.nodes[0].type) // 'bar' +console.log(node.parent.type) // 'foo' +``` + +### [.popNode](index.js#L354) + +Pop the last `node` off of `parent.nodes`. The advantage of using this method is that it checks for `node.nodes` and works with any version of `snapdragon-node`. + +**Params** + +* `parent` **{Object}** +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Number|Undefined}**: Returns the length of `node.nodes` or undefined. + +**Example** + +```js +var parent = new Node({type: 'foo'}); +utils.pushNode(parent, new Node({type: 'foo'})); +utils.pushNode(parent, new Node({type: 'bar'})); +utils.pushNode(parent, new Node({type: 'baz'})); +console.log(parent.nodes.length); //=> 3 +utils.popNode(parent); +console.log(parent.nodes.length); //=> 2 +``` + +### [.shiftNode](index.js#L382) + +Shift the first `node` off of `parent.nodes`. The advantage of using this method is that it checks for `node.nodes` and works with any version of `snapdragon-node`. + +**Params** + +* `parent` **{Object}** +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Number|Undefined}**: Returns the length of `node.nodes` or undefined. + +**Example** + +```js +var parent = new Node({type: 'foo'}); +utils.pushNode(parent, new Node({type: 'foo'})); +utils.pushNode(parent, new Node({type: 'bar'})); +utils.pushNode(parent, new Node({type: 'baz'})); +console.log(parent.nodes.length); //=> 3 +utils.shiftNode(parent); +console.log(parent.nodes.length); //=> 2 +``` + +### [.removeNode](index.js#L409) + +Remove the specified `node` from `parent.nodes`. + +**Params** + +* `parent` **{Object}** +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Object|undefined}**: Returns the removed node, if successful, or undefined if it does not exist on `parent.nodes`. + +**Example** + +```js +var parent = new Node({type: 'abc'}); +var foo = new Node({type: 'foo'}); +utils.pushNode(parent, foo); +utils.pushNode(parent, new Node({type: 'bar'})); +utils.pushNode(parent, new Node({type: 'baz'})); +console.log(parent.nodes.length); //=> 3 +utils.removeNode(parent, foo); +console.log(parent.nodes.length); //=> 2 +``` + +### [.isType](index.js#L443) + +Returns true if `node.type` matches the given `type`. Throws a `TypeError` if `node` is not an instance of `Node`. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `type` **{String}** +* `returns` **{Boolean}** + +**Example** + +```js +var Node = require('snapdragon-node'); +var node = new Node({type: 'foo'}); +console.log(utils.isType(node, 'foo')); // false +console.log(utils.isType(node, 'bar')); // true +``` + +### [.hasType](index.js#L486) + +Returns true if the given `node` has the given `type` in `node.nodes`. Throws a `TypeError` if `node` is not an instance of `Node`. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `type` **{String}** +* `returns` **{Boolean}** + +**Example** + +```js +var Node = require('snapdragon-node'); +var node = new Node({ + type: 'foo', + nodes: [ + new Node({type: 'bar'}), + new Node({type: 'baz'}) + ] +}); +console.log(utils.hasType(node, 'xyz')); // false +console.log(utils.hasType(node, 'baz')); // true +``` + +### [.firstOfType](index.js#L519) + +Returns the first node from `node.nodes` of the given `type` + +**Params** + +* `nodes` **{Array}** +* `type` **{String}** +* `returns` **{Object|undefined}**: Returns the first matching node or undefined. + +**Example** + +```js +var node = new Node({ + type: 'foo', + nodes: [ + new Node({type: 'text', val: 'abc'}), + new Node({type: 'text', val: 'xyz'}) + ] +}); + +var textNode = utils.firstOfType(node.nodes, 'text'); +console.log(textNode.val); +//=> 'abc' +``` + +### [.findNode](index.js#L556) + +Returns the node at the specified index, or the first node of the given `type` from `node.nodes`. + +**Params** + +* `nodes` **{Array}** +* `type` **{String|Number}**: Node type or index. +* `returns` **{Object}**: Returns a node or undefined. + +**Example** + +```js +var node = new Node({ + type: 'foo', + nodes: [ + new Node({type: 'text', val: 'abc'}), + new Node({type: 'text', val: 'xyz'}) + ] +}); + +var nodeOne = utils.findNode(node.nodes, 'text'); +console.log(nodeOne.val); +//=> 'abc' + +var nodeTwo = utils.findNode(node.nodes, 1); +console.log(nodeTwo.val); +//=> 'xyz' +``` + +### [.isOpen](index.js#L584) + +Returns true if the given node is an "*.open" node. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Boolean}** + +**Example** + +```js +var Node = require('snapdragon-node'); +var brace = new Node({type: 'brace'}); +var open = new Node({type: 'brace.open'}); +var close = new Node({type: 'brace.close'}); + +console.log(utils.isOpen(brace)); // false +console.log(utils.isOpen(open)); // true +console.log(utils.isOpen(close)); // false +``` + +### [.isClose](index.js#L607) + +Returns true if the given node is a "*.close" node. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Boolean}** + +**Example** + +```js +var Node = require('snapdragon-node'); +var brace = new Node({type: 'brace'}); +var open = new Node({type: 'brace.open'}); +var close = new Node({type: 'brace.close'}); + +console.log(utils.isClose(brace)); // false +console.log(utils.isClose(open)); // false +console.log(utils.isClose(close)); // true +``` + +### [.hasOpen](index.js#L633) + +Returns true if `node.nodes` **has** an `.open` node + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Boolean}** + +**Example** + +```js +var Node = require('snapdragon-node'); +var brace = new Node({ + type: 'brace', + nodes: [] +}); + +var open = new Node({type: 'brace.open'}); +console.log(utils.hasOpen(brace)); // false + +brace.pushNode(open); +console.log(utils.hasOpen(brace)); // true +``` + +### [.hasClose](index.js#L663) + +Returns true if `node.nodes` **has** a `.close` node + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Boolean}** + +**Example** + +```js +var Node = require('snapdragon-node'); +var brace = new Node({ + type: 'brace', + nodes: [] +}); + +var close = new Node({type: 'brace.close'}); +console.log(utils.hasClose(brace)); // false + +brace.pushNode(close); +console.log(utils.hasClose(brace)); // true +``` + +### [.hasOpenAndClose](index.js#L697) + +Returns true if `node.nodes` has both `.open` and `.close` nodes + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Boolean}** + +**Example** + +```js +var Node = require('snapdragon-node'); +var brace = new Node({ + type: 'brace', + nodes: [] +}); + +var open = new Node({type: 'brace.open'}); +var close = new Node({type: 'brace.close'}); +console.log(utils.hasOpen(brace)); // false +console.log(utils.hasClose(brace)); // false + +brace.pushNode(open); +brace.pushNode(close); +console.log(utils.hasOpen(brace)); // true +console.log(utils.hasClose(brace)); // true +``` + +### [.addType](index.js#L719) + +Push the given `node` onto the `state.inside` array for the given type. This array is used as a specialized "stack" for only the given `node.type`. + +**Params** + +* `state` **{Object}**: The `compiler.state` object or custom state object. +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Array}**: Returns the `state.inside` stack for the given type. + +**Example** + +```js +var state = { inside: {}}; +var node = new Node({type: 'brace'}); +utils.addType(state, node); +console.log(state.inside); +//=> { brace: [{type: 'brace'}] } +``` + +### [.removeType](index.js#L759) + +Remove the given `node` from the `state.inside` array for the given type. This array is used as a specialized "stack" for only the given `node.type`. + +**Params** + +* `state` **{Object}**: The `compiler.state` object or custom state object. +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `returns` **{Array}**: Returns the `state.inside` stack for the given type. + +**Example** + +```js +var state = { inside: {}}; +var node = new Node({type: 'brace'}); +utils.addType(state, node); +console.log(state.inside); +//=> { brace: [{type: 'brace'}] } +utils.removeType(state, node); +//=> { brace: [] } +``` + +### [.isEmpty](index.js#L788) + +Returns true if `node.val` is an empty string, or `node.nodes` does not contain any non-empty text nodes. + +**Params** + +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `fn` **{Function}** +* `returns` **{Boolean}** + +**Example** + +```js +var node = new Node({type: 'text'}); +utils.isEmpty(node); //=> true +node.val = 'foo'; +utils.isEmpty(node); //=> false +``` + +### [.isInsideType](index.js#L833) + +Returns true if the `state.inside` stack for the given type exists and has one or more nodes on it. + +**Params** + +* `state` **{Object}** +* `type` **{String}** +* `returns` **{Boolean}** + +**Example** + +```js +var state = { inside: {}}; +var node = new Node({type: 'brace'}); +console.log(utils.isInsideType(state, 'brace')); //=> false +utils.addType(state, node); +console.log(utils.isInsideType(state, 'brace')); //=> true +utils.removeType(state, node); +console.log(utils.isInsideType(state, 'brace')); //=> false +``` + +### [.isInside](index.js#L867) + +Returns true if `node` is either a child or grand-child of the given `type`, or `state.inside[type]` is a non-empty array. + +**Params** + +* `state` **{Object}**: Either the `compiler.state` object, if it exists, or a user-supplied state object. +* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) +* `type` **{String}**: The `node.type` to check for. +* `returns` **{Boolean}** + +**Example** + +```js +var state = { inside: {}}; +var node = new Node({type: 'brace'}); +var open = new Node({type: 'brace.open'}); +console.log(utils.isInside(state, open, 'brace')); //=> false +utils.pushNode(node, open); +console.log(utils.isInside(state, open, 'brace')); //=> true +``` + +### [.last](index.js#L915) + +Get the last `n` element from the given `array`. Used for getting +a node from `node.nodes.` + +**Params** + +* `array` **{Array}** +* `n` **{Number}** +* `returns` **{undefined}** + +### [.arrayify](index.js#L935) + +Cast the given `val` to an array. + +**Params** + +* `val` **{any}** +* `returns` **{Array}** + +**Example** + +```js +console.log(utils.arraify('')); +//=> [] +console.log(utils.arraify('foo')); +//=> ['foo'] +console.log(utils.arraify(['foo'])); +//=> ['foo'] +``` + +### [.stringify](index.js#L948) + +Convert the given `val` to a string by joining with `,`. Useful +for creating a cheerio/CSS/DOM-style selector from a list of strings. + +**Params** + +* `val` **{any}** +* `returns` **{Array}** + +### [.trim](index.js#L961) + +Ensure that the given value is a string and call `.trim()` on it, +or return an empty string. + +**Params** + +* `str` **{String}** +* `returns` **{String}** + +## Release history + +Changelog entries are classified using the following labels from [keep-a-changelog](https://github.com/olivierlacan/keep-a-changelog): + +* `added`: for new features +* `changed`: for changes in existing functionality +* `deprecated`: for once-stable features removed in upcoming releases +* `removed`: for deprecated features removed in this release +* `fixed`: for any bug fixes + +Custom labels used in this changelog: + +* `dependencies`: bumps dependencies +* `housekeeping`: code re-organization, minor edits, or other changes that don't fit in one of the other categories. + +### [3.0.0] - 2017-05-01 + +**Changed** + +* `.emit` was renamed to [.append](#append) +* `.addNode` was renamed to [.pushNode](#pushNode) +* `.getNode` was renamed to [.findNode](#findNode) +* `.isEmptyNodes` was renamed to [.isEmpty](#isEmpty): also now works with `node.nodes` and/or `node.val` + +**Added** + +* [.identity](#identity) +* [.removeNode](#removeNode) +* [.shiftNode](#shiftNode) +* [.popNode](#popNode) + +### [0.1.0] + +First release. + +## About + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards. + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on May 01, 2017._ \ No newline at end of file diff --git a/node_modules/snapdragon-util/index.js b/node_modules/snapdragon-util/index.js new file mode 100644 index 00000000..68a030ec --- /dev/null +++ b/node_modules/snapdragon-util/index.js @@ -0,0 +1,1019 @@ +'use strict'; + +var typeOf = require('kind-of'); +var utils = module.exports; + +/** + * Returns true if the given value is a node. + * + * ```js + * var Node = require('snapdragon-node'); + * var node = new Node({type: 'foo'}); + * console.log(utils.isNode(node)); //=> true + * console.log(utils.isNode({})); //=> false + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @returns {Boolean} + * @api public + */ + +utils.isNode = function(node) { + return typeOf(node) === 'object' && node.isNode === true; +}; + +/** + * Emit an empty string for the given `node`. + * + * ```js + * // do nothing for beginning-of-string + * snapdragon.compiler.set('bos', utils.noop); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @returns {undefined} + * @api public + */ + +utils.noop = function(node) { + append(this, '', node); +}; + +/** + * Appdend `node.val` to `compiler.output`, exactly as it was created + * by the parser. + * + * ```js + * snapdragon.compiler.set('text', utils.identity); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @returns {undefined} + * @api public + */ + +utils.identity = function(node) { + append(this, node.val, node); +}; + +/** + * Previously named `.emit`, this method appends the given `val` + * to `compiler.output` for the given node. Useful when you know + * what value should be appended advance, regardless of the actual + * value of `node.val`. + * + * ```js + * snapdragon.compiler + * .set('i', function(node) { + * this.mapVisit(node); + * }) + * .set('i.open', utils.append('')) + * .set('i.close', utils.append('')) + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @returns {Function} Returns a compiler middleware function. + * @api public + */ + +utils.append = function(val) { + return function(node) { + append(this, val, node); + }; +}; + +/** + * Used in compiler middleware, this onverts an AST node into + * an empty `text` node and deletes `node.nodes` if it exists. + * The advantage of this method is that, as opposed to completely + * removing the node, indices will not need to be re-calculated + * in sibling nodes, and nothing is appended to the output. + * + * ```js + * utils.toNoop(node); + * // convert `node.nodes` to the given value instead of deleting it + * utils.toNoop(node, []); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Array} `nodes` Optionally pass a new `nodes` value, to replace the existing `node.nodes` array. + * @api public + */ + +utils.toNoop = function(node, nodes) { + if (nodes) { + node.nodes = nodes; + } else { + delete node.nodes; + node.type = 'text'; + node.val = ''; + } +}; + +/** + * Visit `node` with the given `fn`. The built-in `.visit` method in snapdragon + * automatically calls registered compilers, this allows you to pass a visitor + * function. + * + * ```js + * snapdragon.compiler.set('i', function(node) { + * utils.visit(node, function(childNode) { + * // do stuff with "childNode" + * return childNode; + * }); + * }); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Function} `fn` + * @return {Object} returns the node after recursively visiting all child nodes. + * @api public + */ + +utils.visit = function(node, fn) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isFunction(fn), 'expected a visitor function'); + fn(node); + return node.nodes ? utils.mapVisit(node, fn) : node; +}; + +/** + * Map [visit](#visit) the given `fn` over `node.nodes`. This is called by + * [visit](#visit), use this method if you do not want `fn` to be called on + * the first node. + * + * ```js + * snapdragon.compiler.set('i', function(node) { + * utils.mapVisit(node, function(childNode) { + * // do stuff with "childNode" + * return childNode; + * }); + * }); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Object} `options` + * @param {Function} `fn` + * @return {Object} returns the node + * @api public + */ + +utils.mapVisit = function(node, fn) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isArray(node.nodes), 'expected node.nodes to be an array'); + assert(isFunction(fn), 'expected a visitor function'); + + for (var i = 0; i < node.nodes.length; i++) { + utils.visit(node.nodes[i], fn); + } + return node; +}; + +/** + * Unshift an `*.open` node onto `node.nodes`. + * + * ```js + * var Node = require('snapdragon-node'); + * snapdragon.parser.set('brace', function(node) { + * var match = this.match(/^{/); + * if (match) { + * var parent = new Node({type: 'brace'}); + * utils.addOpen(parent, Node); + * console.log(parent.nodes[0]): + * // { type: 'brace.open', val: '' }; + * + * // push the parent "brace" node onto the stack + * this.push(parent); + * + * // return the parent node, so it's also added to the AST + * return brace; + * } + * }); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][]. + * @param {Function} `filter` Optionaly specify a filter function to exclude the node. + * @return {Object} Returns the created opening node. + * @api public + */ + +utils.addOpen = function(node, Node, val, filter) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isFunction(Node), 'expected Node to be a constructor function'); + + if (typeof val === 'function') { + filter = val; + val = ''; + } + + if (typeof filter === 'function' && !filter(node)) return; + var open = new Node({ type: node.type + '.open', val: val}); + var unshift = node.unshift || node.unshiftNode; + if (typeof unshift === 'function') { + unshift.call(node, open); + } else { + utils.unshiftNode(node, open); + } + return open; +}; + +/** + * Push a `*.close` node onto `node.nodes`. + * + * ```js + * var Node = require('snapdragon-node'); + * snapdragon.parser.set('brace', function(node) { + * var match = this.match(/^}/); + * if (match) { + * var parent = this.parent(); + * if (parent.type !== 'brace') { + * throw new Error('missing opening: ' + '}'); + * } + * + * utils.addClose(parent, Node); + * console.log(parent.nodes[parent.nodes.length - 1]): + * // { type: 'brace.close', val: '' }; + * + * // no need to return a node, since the parent + * // was already added to the AST + * return; + * } + * }); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][]. + * @param {Function} `filter` Optionaly specify a filter function to exclude the node. + * @return {Object} Returns the created closing node. + * @api public + */ + +utils.addClose = function(node, Node, val, filter) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isFunction(Node), 'expected Node to be a constructor function'); + + if (typeof val === 'function') { + filter = val; + val = ''; + } + + if (typeof filter === 'function' && !filter(node)) return; + var close = new Node({ type: node.type + '.close', val: val}); + var push = node.push || node.pushNode; + if (typeof push === 'function') { + push.call(node, close); + } else { + utils.pushNode(node, close); + } + return close; +}; + +/** + * Wraps the given `node` with `*.open` and `*.close` nodes. + * + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][]. + * @param {Function} `filter` Optionaly specify a filter function to exclude the node. + * @return {Object} Returns the node + * @api public + */ + +utils.wrapNodes = function(node, Node, filter) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isFunction(Node), 'expected Node to be a constructor function'); + + utils.addOpen(node, Node, filter); + utils.addClose(node, Node, filter); + return node; +}; + +/** + * Push the given `node` onto `parent.nodes`, and set `parent` as `node.parent. + * + * ```js + * var parent = new Node({type: 'foo'}); + * var node = new Node({type: 'bar'}); + * utils.pushNode(parent, node); + * console.log(parent.nodes[0].type) // 'bar' + * console.log(node.parent.type) // 'foo' + * ``` + * @param {Object} `parent` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Object} Returns the child node + * @api public + */ + +utils.pushNode = function(parent, node) { + assert(utils.isNode(parent), 'expected parent node to be an instance of Node'); + assert(utils.isNode(node), 'expected node to be an instance of Node'); + + node.define('parent', parent); + parent.nodes = parent.nodes || []; + parent.nodes.push(node); + return node; +}; + +/** + * Unshift `node` onto `parent.nodes`, and set `parent` as `node.parent. + * + * ```js + * var parent = new Node({type: 'foo'}); + * var node = new Node({type: 'bar'}); + * utils.unshiftNode(parent, node); + * console.log(parent.nodes[0].type) // 'bar' + * console.log(node.parent.type) // 'foo' + * ``` + * @param {Object} `parent` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {undefined} + * @api public + */ + +utils.unshiftNode = function(parent, node) { + assert(utils.isNode(parent), 'expected parent node to be an instance of Node'); + assert(utils.isNode(node), 'expected node to be an instance of Node'); + + node.define('parent', parent); + parent.nodes = parent.nodes || []; + parent.nodes.unshift(node); +}; + +/** + * Pop the last `node` off of `parent.nodes`. The advantage of + * using this method is that it checks for `node.nodes` and works + * with any version of `snapdragon-node`. + * + * ```js + * var parent = new Node({type: 'foo'}); + * utils.pushNode(parent, new Node({type: 'foo'})); + * utils.pushNode(parent, new Node({type: 'bar'})); + * utils.pushNode(parent, new Node({type: 'baz'})); + * console.log(parent.nodes.length); //=> 3 + * utils.popNode(parent); + * console.log(parent.nodes.length); //=> 2 + * ``` + * @param {Object} `parent` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Number|Undefined} Returns the length of `node.nodes` or undefined. + * @api public + */ + +utils.popNode = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + if (typeof node.pop === 'function') { + return node.pop(); + } + return node.nodes && node.nodes.pop(); +}; + +/** + * Shift the first `node` off of `parent.nodes`. The advantage of + * using this method is that it checks for `node.nodes` and works + * with any version of `snapdragon-node`. + * + * ```js + * var parent = new Node({type: 'foo'}); + * utils.pushNode(parent, new Node({type: 'foo'})); + * utils.pushNode(parent, new Node({type: 'bar'})); + * utils.pushNode(parent, new Node({type: 'baz'})); + * console.log(parent.nodes.length); //=> 3 + * utils.shiftNode(parent); + * console.log(parent.nodes.length); //=> 2 + * ``` + * @param {Object} `parent` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Number|Undefined} Returns the length of `node.nodes` or undefined. + * @api public + */ + +utils.shiftNode = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + if (typeof node.shift === 'function') { + return node.shift(); + } + return node.nodes && node.nodes.shift(); +}; + +/** + * Remove the specified `node` from `parent.nodes`. + * + * ```js + * var parent = new Node({type: 'abc'}); + * var foo = new Node({type: 'foo'}); + * utils.pushNode(parent, foo); + * utils.pushNode(parent, new Node({type: 'bar'})); + * utils.pushNode(parent, new Node({type: 'baz'})); + * console.log(parent.nodes.length); //=> 3 + * utils.removeNode(parent, foo); + * console.log(parent.nodes.length); //=> 2 + * ``` + * @param {Object} `parent` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Object|undefined} Returns the removed node, if successful, or undefined if it does not exist on `parent.nodes`. + * @api public + */ + +utils.removeNode = function(parent, node) { + assert(utils.isNode(parent), 'expected parent.node to be an instance of Node'); + assert(utils.isNode(node), 'expected node to be an instance of Node'); + + if (!parent.nodes) { + return null; + } + + if (typeof parent.remove === 'function') { + return parent.remove(node); + } + + var idx = parent.nodes.indexOf(node); + if (idx !== -1) { + return parent.nodes.splice(idx, 1); + } +}; + +/** + * Returns true if `node.type` matches the given `type`. Throws a + * `TypeError` if `node` is not an instance of `Node`. + * + * ```js + * var Node = require('snapdragon-node'); + * var node = new Node({type: 'foo'}); + * console.log(utils.isType(node, 'foo')); // false + * console.log(utils.isType(node, 'bar')); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {String} `type` + * @return {Boolean} + * @api public + */ + +utils.isType = function(node, type) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + switch (typeOf(type)) { + case 'array': + var types = type.slice(); + for (var i = 0; i < types.length; i++) { + if (utils.isType(node, types[i])) { + return true; + } + } + return false; + case 'string': + return node.type === type; + case 'regexp': + return type.test(node.type); + default: { + throw new TypeError('expected "type" to be an array, string or regexp'); + } + } +}; + +/** + * Returns true if the given `node` has the given `type` in `node.nodes`. + * Throws a `TypeError` if `node` is not an instance of `Node`. + * + * ```js + * var Node = require('snapdragon-node'); + * var node = new Node({ + * type: 'foo', + * nodes: [ + * new Node({type: 'bar'}), + * new Node({type: 'baz'}) + * ] + * }); + * console.log(utils.hasType(node, 'xyz')); // false + * console.log(utils.hasType(node, 'baz')); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {String} `type` + * @return {Boolean} + * @api public + */ + +utils.hasType = function(node, type) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + if (!Array.isArray(node.nodes)) return false; + for (var i = 0; i < node.nodes.length; i++) { + if (utils.isType(node.nodes[i], type)) { + return true; + } + } + return false; +}; + +/** + * Returns the first node from `node.nodes` of the given `type` + * + * ```js + * var node = new Node({ + * type: 'foo', + * nodes: [ + * new Node({type: 'text', val: 'abc'}), + * new Node({type: 'text', val: 'xyz'}) + * ] + * }); + * + * var textNode = utils.firstOfType(node.nodes, 'text'); + * console.log(textNode.val); + * //=> 'abc' + * ``` + * @param {Array} `nodes` + * @param {String} `type` + * @return {Object|undefined} Returns the first matching node or undefined. + * @api public + */ + +utils.firstOfType = function(nodes, type) { + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + if (utils.isType(node, type)) { + return node; + } + } +}; + +/** + * Returns the node at the specified index, or the first node of the + * given `type` from `node.nodes`. + * + * ```js + * var node = new Node({ + * type: 'foo', + * nodes: [ + * new Node({type: 'text', val: 'abc'}), + * new Node({type: 'text', val: 'xyz'}) + * ] + * }); + * + * var nodeOne = utils.findNode(node.nodes, 'text'); + * console.log(nodeOne.val); + * //=> 'abc' + * + * var nodeTwo = utils.findNode(node.nodes, 1); + * console.log(nodeTwo.val); + * //=> 'xyz' + * ``` + * + * @param {Array} `nodes` + * @param {String|Number} `type` Node type or index. + * @return {Object} Returns a node or undefined. + * @api public + */ + +utils.findNode = function(nodes, type) { + if (!Array.isArray(nodes)) { + return null; + } + if (typeof type === 'number') { + return nodes[type]; + } + return utils.firstOfType(nodes, type); +}; + +/** + * Returns true if the given node is an "*.open" node. + * + * ```js + * var Node = require('snapdragon-node'); + * var brace = new Node({type: 'brace'}); + * var open = new Node({type: 'brace.open'}); + * var close = new Node({type: 'brace.close'}); + * + * console.log(utils.isOpen(brace)); // false + * console.log(utils.isOpen(open)); // true + * console.log(utils.isOpen(close)); // false + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Boolean} + * @api public + */ + +utils.isOpen = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + return node.type.slice(-5) === '.open'; +}; + +/** + * Returns true if the given node is a "*.close" node. + * + * ```js + * var Node = require('snapdragon-node'); + * var brace = new Node({type: 'brace'}); + * var open = new Node({type: 'brace.open'}); + * var close = new Node({type: 'brace.close'}); + * + * console.log(utils.isClose(brace)); // false + * console.log(utils.isClose(open)); // false + * console.log(utils.isClose(close)); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Boolean} + * @api public + */ + +utils.isClose = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + return node.type.slice(-6) === '.close'; +}; + +/** + * Returns true if `node.nodes` **has** an `.open` node + * + * ```js + * var Node = require('snapdragon-node'); + * var brace = new Node({ + * type: 'brace', + * nodes: [] + * }); + * + * var open = new Node({type: 'brace.open'}); + * console.log(utils.hasOpen(brace)); // false + * + * brace.pushNode(open); + * console.log(utils.hasOpen(brace)); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Boolean} + * @api public + */ + +utils.hasOpen = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + var first = node.first || node.nodes ? node.nodes[0] : null; + if (utils.isNode(first)) { + return first.type === node.type + '.open'; + } + return false; +}; + +/** + * Returns true if `node.nodes` **has** a `.close` node + * + * ```js + * var Node = require('snapdragon-node'); + * var brace = new Node({ + * type: 'brace', + * nodes: [] + * }); + * + * var close = new Node({type: 'brace.close'}); + * console.log(utils.hasClose(brace)); // false + * + * brace.pushNode(close); + * console.log(utils.hasClose(brace)); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Boolean} + * @api public + */ + +utils.hasClose = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + var last = node.last || node.nodes ? node.nodes[node.nodes.length - 1] : null; + if (utils.isNode(last)) { + return last.type === node.type + '.close'; + } + return false; +}; + +/** + * Returns true if `node.nodes` has both `.open` and `.close` nodes + * + * ```js + * var Node = require('snapdragon-node'); + * var brace = new Node({ + * type: 'brace', + * nodes: [] + * }); + * + * var open = new Node({type: 'brace.open'}); + * var close = new Node({type: 'brace.close'}); + * console.log(utils.hasOpen(brace)); // false + * console.log(utils.hasClose(brace)); // false + * + * brace.pushNode(open); + * brace.pushNode(close); + * console.log(utils.hasOpen(brace)); // true + * console.log(utils.hasClose(brace)); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Boolean} + * @api public + */ + +utils.hasOpenAndClose = function(node) { + return utils.hasOpen(node) && utils.hasClose(node); +}; + +/** + * Push the given `node` onto the `state.inside` array for the + * given type. This array is used as a specialized "stack" for + * only the given `node.type`. + * + * ```js + * var state = { inside: {}}; + * var node = new Node({type: 'brace'}); + * utils.addType(state, node); + * console.log(state.inside); + * //=> { brace: [{type: 'brace'}] } + * ``` + * @param {Object} `state` The `compiler.state` object or custom state object. + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Array} Returns the `state.inside` stack for the given type. + * @api public + */ + +utils.addType = function(state, node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isObject(state), 'expected state to be an object'); + + var type = node.parent + ? node.parent.type + : node.type.replace(/\.open$/, ''); + + if (!state.hasOwnProperty('inside')) { + state.inside = {}; + } + if (!state.inside.hasOwnProperty(type)) { + state.inside[type] = []; + } + + var arr = state.inside[type]; + arr.push(node); + return arr; +}; + +/** + * Remove the given `node` from the `state.inside` array for the + * given type. This array is used as a specialized "stack" for + * only the given `node.type`. + * + * ```js + * var state = { inside: {}}; + * var node = new Node({type: 'brace'}); + * utils.addType(state, node); + * console.log(state.inside); + * //=> { brace: [{type: 'brace'}] } + * utils.removeType(state, node); + * //=> { brace: [] } + * ``` + * @param {Object} `state` The `compiler.state` object or custom state object. + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Array} Returns the `state.inside` stack for the given type. + * @api public + */ + +utils.removeType = function(state, node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isObject(state), 'expected state to be an object'); + + var type = node.parent + ? node.parent.type + : node.type.replace(/\.close$/, ''); + + if (state.inside.hasOwnProperty(type)) { + return state.inside[type].pop(); + } +}; + +/** + * Returns true if `node.val` is an empty string, or `node.nodes` does + * not contain any non-empty text nodes. + * + * ```js + * var node = new Node({type: 'text'}); + * utils.isEmpty(node); //=> true + * node.val = 'foo'; + * utils.isEmpty(node); //=> false + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Function} `fn` + * @return {Boolean} + * @api public + */ + +utils.isEmpty = function(node, fn) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + + if (!Array.isArray(node.nodes)) { + if (node.type !== 'text') { + return true; + } + if (typeof fn === 'function') { + return fn(node, node.parent); + } + return !utils.trim(node.val); + } + + for (var i = 0; i < node.nodes.length; i++) { + var child = node.nodes[i]; + if (utils.isOpen(child) || utils.isClose(child)) { + continue; + } + if (!utils.isEmpty(child, fn)) { + return false; + } + } + + return true; +}; + +/** + * Returns true if the `state.inside` stack for the given type exists + * and has one or more nodes on it. + * + * ```js + * var state = { inside: {}}; + * var node = new Node({type: 'brace'}); + * console.log(utils.isInsideType(state, 'brace')); //=> false + * utils.addType(state, node); + * console.log(utils.isInsideType(state, 'brace')); //=> true + * utils.removeType(state, node); + * console.log(utils.isInsideType(state, 'brace')); //=> false + * ``` + * @param {Object} `state` + * @param {String} `type` + * @return {Boolean} + * @api public + */ + +utils.isInsideType = function(state, type) { + assert(isObject(state), 'expected state to be an object'); + assert(isString(type), 'expected type to be a string'); + + if (!state.hasOwnProperty('inside')) { + return false; + } + + if (!state.inside.hasOwnProperty(type)) { + return false; + } + + return state.inside[type].length > 0; +}; + +/** + * Returns true if `node` is either a child or grand-child of the given `type`, + * or `state.inside[type]` is a non-empty array. + * + * ```js + * var state = { inside: {}}; + * var node = new Node({type: 'brace'}); + * var open = new Node({type: 'brace.open'}); + * console.log(utils.isInside(state, open, 'brace')); //=> false + * utils.pushNode(node, open); + * console.log(utils.isInside(state, open, 'brace')); //=> true + * ``` + * @param {Object} `state` Either the `compiler.state` object, if it exists, or a user-supplied state object. + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {String} `type` The `node.type` to check for. + * @return {Boolean} + * @api public + */ + +utils.isInside = function(state, node, type) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isObject(state), 'expected state to be an object'); + + if (Array.isArray(type)) { + for (var i = 0; i < type.length; i++) { + if (utils.isInside(state, node, type[i])) { + return true; + } + } + return false; + } + + var parent = node.parent; + if (typeof type === 'string') { + return (parent && parent.type === type) || utils.isInsideType(state, type); + } + + if (typeOf(type) === 'regexp') { + if (parent && parent.type && type.test(parent.type)) { + return true; + } + + var keys = Object.keys(state.inside); + var len = keys.length; + var idx = -1; + while (++idx < len) { + var key = keys[idx]; + var val = state.inside[key]; + + if (Array.isArray(val) && val.length !== 0 && type.test(key)) { + return true; + } + } + } + return false; +}; + +/** + * Get the last `n` element from the given `array`. Used for getting + * a node from `node.nodes.` + * + * @param {Array} `array` + * @param {Number} `n` + * @return {undefined} + * @api public + */ + +utils.last = function(arr, n) { + return arr[arr.length - (n || 1)]; +}; + +/** + * Cast the given `val` to an array. + * + * ```js + * console.log(utils.arrayify('')); + * //=> [] + * console.log(utils.arrayify('foo')); + * //=> ['foo'] + * console.log(utils.arrayify(['foo'])); + * //=> ['foo'] + * ``` + * @param {any} `val` + * @return {Array} + * @api public + */ + +utils.arrayify = function(val) { + if (typeof val === 'string' && val !== '') { + return [val]; + } + if (!Array.isArray(val)) { + return []; + } + return val; +}; + +/** + * Convert the given `val` to a string by joining with `,`. Useful + * for creating a cheerio/CSS/DOM-style selector from a list of strings. + * + * @param {any} `val` + * @return {Array} + * @api public + */ + +utils.stringify = function(val) { + return utils.arrayify(val).join(','); +}; + +/** + * Ensure that the given value is a string and call `.trim()` on it, + * or return an empty string. + * + * @param {String} `str` + * @return {String} + * @api public + */ + +utils.trim = function(str) { + return typeof str === 'string' ? str.trim() : ''; +}; + +/** + * Return true if val is an object + */ + +function isObject(val) { + return typeOf(val) === 'object'; +} + +/** + * Return true if val is a string + */ + +function isString(val) { + return typeof val === 'string'; +} + +/** + * Return true if val is a function + */ + +function isFunction(val) { + return typeof val === 'function'; +} + +/** + * Return true if val is an array + */ + +function isArray(val) { + return Array.isArray(val); +} + +/** + * Shim to ensure the `.append` methods work with any version of snapdragon + */ + +function append(compiler, val, node) { + if (typeof compiler.append !== 'function') { + return compiler.emit(val, node); + } + return compiler.append(val, node); +} + +/** + * Simplified assertion. Throws an error is `val` is falsey. + */ + +function assert(val, message) { + if (!val) throw new Error(message); +} diff --git a/node_modules/snapdragon-util/package.json b/node_modules/snapdragon-util/package.json new file mode 100644 index 00000000..434c4f50 --- /dev/null +++ b/node_modules/snapdragon-util/package.json @@ -0,0 +1,65 @@ +{ + "name": "snapdragon-util", + "description": "Utilities for the snapdragon parser/compiler.", + "version": "3.0.1", + "homepage": "https://github.com/jonschlinkert/snapdragon-util", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/snapdragon-util", + "bugs": { + "url": "https://github.com/jonschlinkert/snapdragon-util/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "kind-of": "^3.2.0" + }, + "devDependencies": { + "define-property": "^1.0.0", + "gulp": "^3.9.1", + "gulp-eslint": "^3.0.1", + "gulp-format-md": "^0.1.12", + "gulp-istanbul": "^1.1.1", + "gulp-mocha": "^3.0.0", + "isobject": "^3.0.0", + "mocha": "^3.3.0", + "snapdragon": "^0.11.0", + "snapdragon-node": "^1.0.6" + }, + "keywords": [ + "capture", + "compile", + "compiler", + "convert", + "match", + "parse", + "parser", + "plugin", + "render", + "snapdragon", + "snapdragonplugin", + "transform", + "util" + ], + "verb": { + "toc": "collapsible", + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/snapdragon/LICENSE b/node_modules/snapdragon/LICENSE new file mode 100644 index 00000000..1e49edf8 --- /dev/null +++ b/node_modules/snapdragon/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2016, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/snapdragon/README.md b/node_modules/snapdragon/README.md new file mode 100644 index 00000000..4006e10f --- /dev/null +++ b/node_modules/snapdragon/README.md @@ -0,0 +1,321 @@ +# snapdragon [![NPM version](https://img.shields.io/npm/v/snapdragon.svg?style=flat)](https://www.npmjs.com/package/snapdragon) [![NPM downloads](https://img.shields.io/npm/dm/snapdragon.svg?style=flat)](https://npmjs.org/package/snapdragon) [![Build Status](https://img.shields.io/travis/jonschlinkert/snapdragon.svg?style=flat)](https://travis-ci.org/jonschlinkert/snapdragon) + +> Fast, pluggable and easy-to-use parser-renderer factory. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save snapdragon +``` + +Created by [jonschlinkert](https://github.com/jonschlinkert) and [doowb](https://github.com/doowb). + +**Features** + +* Bootstrap your own parser, get sourcemap support for free +* All parsing and compiling is handled by simple, reusable middleware functions +* Inspired by the parsers in [pug](http://jade-lang.com) and [css](https://github.com/reworkcss/css). + +## History + +### v0.5.0 + +**Breaking changes** + +Substantial breaking changes were made in v0.5.0! Most of these changes are part of a larger refactor that will be finished in 0.6.0, including the introduction of a `Lexer` class. + +* Renderer was renamed to `Compiler` +* the `.render` method was renamed to `.compile` +* Many other smaller changes. A more detailed overview will be provided in 0.6.0. If you don't have to time review code, I recommend you wait for the 0.6.0 release. + +## Usage examples + +```js +var Snapdragon = require('snapdragon'); +var snapdragon = new Snapdragon(); +``` + +**Parse** + +```js +var ast = snapdragon.parser('some string', options) + // parser middleware that can be called by other middleware + .set('foo', function () {}) + // parser middleware, runs immediately in the order defined + .use(bar()) + .use(baz()) +``` + +**Render** + +```js +// pass the `ast` from the parse method +var res = snapdragon.compiler(ast) + // compiler middleware, called when the name of the middleware + // matches the `node.type` (defined in a parser middleware) + .set('bar', function () {}) + .set('baz', function () {}) + .compile() +``` + +See the [examples](./examples/). + +## Getting started + +**Parsers** + +Parsers are middleware functions used for parsing a string into an ast node. + +```js +var ast = snapdragon.parser(str, options) + .use(function() { + var pos = this.position(); + var m = this.match(/^\./); + if (!m) return; + return pos({ + // `type` specifies the compiler to use + type: 'dot', + val: m[0] + }); + }) +``` + +**AST node** + +When the parser finds a match, `pos()` is called, pushing a token for that node onto the ast that looks something like: + +```js +{ type: 'dot', + val: '.', + position: + { start: { lineno: 1, column: 1 }, + end: { lineno: 1, column: 2 } }} +``` + +**Renderers** + +Renderers are _named_ middleware functions that visit over an array of ast nodes to compile a string. + +```js +var res = snapdragon.compiler(ast) + .set('dot', function (node) { + console.log(node.val) + //=> '.' + return this.emit(node.val); + }) +``` + +**Source maps** + +If you want source map support, make sure to emit the position as well. + +```js +var res = snapdragon.compiler(ast) + .set('dot', function (node) { + return this.emit(node.val, node.position); + }) +``` + +## Docs + +### Parser middleware + +A parser middleware is a function that returns an abject called a `token`. This token is pushed onto the AST as a node. + +**Example token** + +```js +{ type: 'dot', + val: '.', + position: + { start: { lineno: 1, column: 1 }, + end: { lineno: 1, column: 2 } }} +``` + +**Example parser middleware** + +Match a single `.` in a string: + +1. Get the starting position by calling `this.position()` +2. pass a regex for matching a single dot to the `.match` method +3. if **no match** is found, return `undefined` +4. if a **match** is found, `pos()` is called, which returns a token with: + - `type`: the name of the [compiler] to use + - `val`: The actual value captured by the regex. In this case, a `.`. Note that you can capture and return whatever will be needed by the corresponding [compiler]. + - The ending position: automatically calculated by adding the length of the first capture group to the starting position. + +## Renderer middleware + +Renderers are run when the name of the compiler middleware matches the `type` defined on an ast `node` (which is defined in a parser). + +**Example** + +Exercise: Parse a dot, then compile it as an escaped dot. + +```js +var ast = snapdragon.parser('.') + .use(function () { + var pos = this.position(); + var m = this.match(/^\./); + if (!m) return; + return pos({ + // define the `type` of compiler to use + type: 'dot', + val: m[0] + }) + }) + +var result = snapdragon.compiler(ast) + .set('dot', function (node) { + return this.emit('\\' + node.val); + }) + .compile() + +console.log(result.output); +//=> '\.' +``` + +## API + +### [Parser](lib/parser.js#L19) + +Create a new `Parser` with the given `input` and `options`. + +**Params** + +* `input` **{String}** +* `options` **{Object}** + +### [.define](lib/parser.js#L103) + +Define a non-enumberable property on the `Parser` instance. + +**Example** + +```js +parser.define('foo', 'bar'); +``` + +**Params** + +* `key` **{String}**: propery name +* `val` **{any}**: property value +* `returns` **{Object}**: Returns the Parser instance for chaining. + +Set parser `name` with the given `fn` + +**Params** + +* `name` **{String}** +* `fn` **{Function}** + +Get parser `name` + +**Params** + +* `name` **{String}** + +Push a `token` onto the `type` stack. + +**Params** + +* `type` **{String}** +* `returns` **{Object}** `token` + +Pop a token off of the `type` stack + +**Params** + +* `type` **{String}** +* `returns` **{Object}**: Returns a token + +Return true if inside a `stack` node. Types are `braces`, `parens` or `brackets`. + +**Params** + +* `type` **{String}** +* `returns` **{Boolean}** + +**Example** + +```js +parser.isType(node, 'brace'); +``` + +**Params** + +* `node` **{Object}** +* `type` **{String}** +* `returns` **{Boolean}** + +### [.define](lib/compiler.js#L71) + +Define a non-enumberable property on the `Compiler` instance. + +**Example** + +```js +compiler.define('foo', 'bar'); +``` + +**Params** + +* `key` **{String}**: propery name +* `val` **{any}**: property value +* `returns` **{Object}**: Returns the Compiler instance for chaining. + +## About + +### Related projects + +* [braces](https://www.npmjs.com/package/braces): Fastest brace expansion for node.js, with the most complete support for the Bash 4.3 braces… [more](https://github.com/jonschlinkert/braces) | [homepage](https://github.com/jonschlinkert/braces "Fastest brace expansion for node.js, with the most complete support for the Bash 4.3 braces specification.") +* [expand-brackets](https://www.npmjs.com/package/expand-brackets): Expand POSIX bracket expressions (character classes) in glob patterns. | [homepage](https://github.com/jonschlinkert/expand-brackets "Expand POSIX bracket expressions (character classes) in glob patterns.") +* [extglob](https://www.npmjs.com/package/extglob): Convert extended globs to regex-compatible strings. Add (almost) the expressive power of regular expressions to… [more](https://github.com/jonschlinkert/extglob) | [homepage](https://github.com/jonschlinkert/extglob "Convert extended globs to regex-compatible strings. Add (almost) the expressive power of regular expressions to glob patterns.") +* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor**
      | +| --- | --- | +| 106 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [doowb](https://github.com/doowb) | + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/snapdragon/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.31, on October 10, 2016._ \ No newline at end of file diff --git a/node_modules/snapdragon/index.js b/node_modules/snapdragon/index.js new file mode 100644 index 00000000..235b464b --- /dev/null +++ b/node_modules/snapdragon/index.js @@ -0,0 +1,174 @@ +'use strict'; + +var Base = require('base'); +var define = require('define-property'); +var Compiler = require('./lib/compiler'); +var Parser = require('./lib/parser'); +var utils = require('./lib/utils'); +var regexCache = {}; +var cache = {}; + +/** + * Create a new instance of `Snapdragon` with the given `options`. + * + * ```js + * var snapdragon = new Snapdragon(); + * ``` + * + * @param {Object} `options` + * @api public + */ + +function Snapdragon(options) { + Base.call(this, null, options); + this.options = utils.extend({source: 'string'}, this.options); + this.compiler = new Compiler(this.options); + this.parser = new Parser(this.options); + + Object.defineProperty(this, 'compilers', { + get: function() { + return this.compiler.compilers; + } + }); + + Object.defineProperty(this, 'parsers', { + get: function() { + return this.parser.parsers; + } + }); + + Object.defineProperty(this, 'regex', { + get: function() { + return this.parser.regex; + } + }); +} + +/** + * Inherit Base + */ + +Base.extend(Snapdragon); + +/** + * Add a parser to `snapdragon.parsers` for capturing the given `type` using + * the specified regex or parser function. A function is useful if you need + * to customize how the token is created and/or have access to the parser + * instance to check options, etc. + * + * ```js + * snapdragon + * .capture('slash', /^\//) + * .capture('dot', function() { + * var pos = this.position(); + * var m = this.match(/^\./); + * if (!m) return; + * return pos({ + * type: 'dot', + * val: m[0] + * }); + * }); + * ``` + * @param {String} `type` + * @param {RegExp|Function} `regex` + * @return {Object} Returns the parser instance for chaining + * @api public + */ + +Snapdragon.prototype.capture = function() { + return this.parser.capture.apply(this.parser, arguments); +}; + +/** + * Register a plugin `fn`. + * + * ```js + * var snapdragon = new Snapdgragon([options]); + * snapdragon.use(function() { + * console.log(this); //<= snapdragon instance + * console.log(this.parser); //<= parser instance + * console.log(this.compiler); //<= compiler instance + * }); + * ``` + * @param {Object} `fn` + * @api public + */ + +Snapdragon.prototype.use = function(fn) { + fn.call(this, this); + return this; +}; + +/** + * Parse the given `str`. + * + * ```js + * var snapdragon = new Snapdgragon([options]); + * // register parsers + * snapdragon.parser.use(function() {}); + * + * // parse + * var ast = snapdragon.parse('foo/bar'); + * console.log(ast); + * ``` + * @param {String} `str` + * @param {Object} `options` Set `options.sourcemap` to true to enable source maps. + * @return {Object} Returns an AST. + * @api public + */ + +Snapdragon.prototype.parse = function(str, options) { + this.options = utils.extend({}, this.options, options); + var parsed = this.parser.parse(str, this.options); + + // add non-enumerable parser reference + define(parsed, 'parser', this.parser); + return parsed; +}; + +/** + * Compile the given `AST`. + * + * ```js + * var snapdragon = new Snapdgragon([options]); + * // register plugins + * snapdragon.use(function() {}); + * // register parser plugins + * snapdragon.parser.use(function() {}); + * // register compiler plugins + * snapdragon.compiler.use(function() {}); + * + * // parse + * var ast = snapdragon.parse('foo/bar'); + * + * // compile + * var res = snapdragon.compile(ast); + * console.log(res.output); + * ``` + * @param {Object} `ast` + * @param {Object} `options` + * @return {Object} Returns an object with an `output` property with the rendered string. + * @api public + */ + +Snapdragon.prototype.compile = function(ast, options) { + this.options = utils.extend({}, this.options, options); + var compiled = this.compiler.compile(ast, this.options); + + // add non-enumerable compiler reference + define(compiled, 'compiler', this.compiler); + return compiled; +}; + +/** + * Expose `Snapdragon` + */ + +module.exports = Snapdragon; + +/** + * Expose `Parser` and `Compiler` + */ + +module.exports.Compiler = Compiler; +module.exports.Parser = Parser; diff --git a/node_modules/snapdragon/node_modules/source-map/CHANGELOG.md b/node_modules/snapdragon/node_modules/source-map/CHANGELOG.md new file mode 100644 index 00000000..3a8c066c --- /dev/null +++ b/node_modules/snapdragon/node_modules/source-map/CHANGELOG.md @@ -0,0 +1,301 @@ +# Change Log + +## 0.5.6 + +* Fix for regression when people were using numbers as names in source maps. See + #236. + +## 0.5.5 + +* Fix "regression" of unsupported, implementation behavior that half the world + happens to have come to depend on. See #235. + +* Fix regression involving function hoisting in SpiderMonkey. See #233. + +## 0.5.4 + +* Large performance improvements to source-map serialization. See #228 and #229. + +## 0.5.3 + +* Do not include unnecessary distribution files. See + commit ef7006f8d1647e0a83fdc60f04f5a7ca54886f86. + +## 0.5.2 + +* Include browser distributions of the library in package.json's `files`. See + issue #212. + +## 0.5.1 + +* Fix latent bugs in IndexedSourceMapConsumer.prototype._parseMappings. See + ff05274becc9e6e1295ed60f3ea090d31d843379. + +## 0.5.0 + +* Node 0.8 is no longer supported. + +* Use webpack instead of dryice for bundling. + +* Big speedups serializing source maps. See pull request #203. + +* Fix a bug with `SourceMapConsumer.prototype.sourceContentFor` and sources that + explicitly start with the source root. See issue #199. + +## 0.4.4 + +* Fix an issue where using a `SourceMapGenerator` after having created a + `SourceMapConsumer` from it via `SourceMapConsumer.fromSourceMap` failed. See + issue #191. + +* Fix an issue with where `SourceMapGenerator` would mistakenly consider + different mappings as duplicates of each other and avoid generating them. See + issue #192. + +## 0.4.3 + +* A very large number of performance improvements, particularly when parsing + source maps. Collectively about 75% of time shaved off of the source map + parsing benchmark! + +* Fix a bug in `SourceMapConsumer.prototype.allGeneratedPositionsFor` and fuzzy + searching in the presence of a column option. See issue #177. + +* Fix a bug with joining a source and its source root when the source is above + the root. See issue #182. + +* Add the `SourceMapConsumer.prototype.hasContentsOfAllSources` method to + determine when all sources' contents are inlined into the source map. See + issue #190. + +## 0.4.2 + +* Add an `.npmignore` file so that the benchmarks aren't pulled down by + dependent projects. Issue #169. + +* Add an optional `column` argument to + `SourceMapConsumer.prototype.allGeneratedPositionsFor` and better handle lines + with no mappings. Issues #172 and #173. + +## 0.4.1 + +* Fix accidentally defining a global variable. #170. + +## 0.4.0 + +* The default direction for fuzzy searching was changed back to its original + direction. See #164. + +* There is now a `bias` option you can supply to `SourceMapConsumer` to control + the fuzzy searching direction. See #167. + +* About an 8% speed up in parsing source maps. See #159. + +* Added a benchmark for parsing and generating source maps. + +## 0.3.0 + +* Change the default direction that searching for positions fuzzes when there is + not an exact match. See #154. + +* Support for environments using json2.js for JSON serialization. See #156. + +## 0.2.0 + +* Support for consuming "indexed" source maps which do not have any remote + sections. See pull request #127. This introduces a minor backwards + incompatibility if you are monkey patching `SourceMapConsumer.prototype` + methods. + +## 0.1.43 + +* Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue + #148 for some discussion and issues #150, #151, and #152 for implementations. + +## 0.1.42 + +* Fix an issue where `SourceNode`s from different versions of the source-map + library couldn't be used in conjunction with each other. See issue #142. + +## 0.1.41 + +* Fix a bug with getting the source content of relative sources with a "./" + prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768). + +* Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the + column span of each mapping. + +* Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find + all generated positions associated with a given original source and line. + +## 0.1.40 + +* Performance improvements for parsing source maps in SourceMapConsumer. + +## 0.1.39 + +* Fix a bug where setting a source's contents to null before any source content + had been set before threw a TypeError. See issue #131. + +## 0.1.38 + +* Fix a bug where finding relative paths from an empty path were creating + absolute paths. See issue #129. + +## 0.1.37 + +* Fix a bug where if the source root was an empty string, relative source paths + would turn into absolute source paths. Issue #124. + +## 0.1.36 + +* Allow the `names` mapping property to be an empty string. Issue #121. + +## 0.1.35 + +* A third optional parameter was added to `SourceNode.fromStringWithSourceMap` + to specify a path that relative sources in the second parameter should be + relative to. Issue #105. + +* If no file property is given to a `SourceMapGenerator`, then the resulting + source map will no longer have a `null` file property. The property will + simply not exist. Issue #104. + +* Fixed a bug where consecutive newlines were ignored in `SourceNode`s. + Issue #116. + +## 0.1.34 + +* Make `SourceNode` work with windows style ("\r\n") newlines. Issue #103. + +* Fix bug involving source contents and the + `SourceMapGenerator.prototype.applySourceMap`. Issue #100. + +## 0.1.33 + +* Fix some edge cases surrounding path joining and URL resolution. + +* Add a third parameter for relative path to + `SourceMapGenerator.prototype.applySourceMap`. + +* Fix issues with mappings and EOLs. + +## 0.1.32 + +* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns + (issue 92). + +* Fixed test runner to actually report number of failed tests as its process + exit code. + +* Fixed a typo when reporting bad mappings (issue 87). + +## 0.1.31 + +* Delay parsing the mappings in SourceMapConsumer until queried for a source + location. + +* Support Sass source maps (which at the time of writing deviate from the spec + in small ways) in SourceMapConsumer. + +## 0.1.30 + +* Do not join source root with a source, when the source is a data URI. + +* Extend the test runner to allow running single specific test files at a time. + +* Performance improvements in `SourceNode.prototype.walk` and + `SourceMapConsumer.prototype.eachMapping`. + +* Source map browser builds will now work inside Workers. + +* Better error messages when attempting to add an invalid mapping to a + `SourceMapGenerator`. + +## 0.1.29 + +* Allow duplicate entries in the `names` and `sources` arrays of source maps + (usually from TypeScript) we are parsing. Fixes github issue 72. + +## 0.1.28 + +* Skip duplicate mappings when creating source maps from SourceNode; github + issue 75. + +## 0.1.27 + +* Don't throw an error when the `file` property is missing in SourceMapConsumer, + we don't use it anyway. + +## 0.1.26 + +* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70. + +## 0.1.25 + +* Make compatible with browserify + +## 0.1.24 + +* Fix issue with absolute paths and `file://` URIs. See + https://bugzilla.mozilla.org/show_bug.cgi?id=885597 + +## 0.1.23 + +* Fix issue with absolute paths and sourcesContent, github issue 64. + +## 0.1.22 + +* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21. + +## 0.1.21 + +* Fixed handling of sources that start with a slash so that they are relative to + the source root's host. + +## 0.1.20 + +* Fixed github issue #43: absolute URLs aren't joined with the source root + anymore. + +## 0.1.19 + +* Using Travis CI to run tests. + +## 0.1.18 + +* Fixed a bug in the handling of sourceRoot. + +## 0.1.17 + +* Added SourceNode.fromStringWithSourceMap. + +## 0.1.16 + +* Added missing documentation. + +* Fixed the generating of empty mappings in SourceNode. + +## 0.1.15 + +* Added SourceMapGenerator.applySourceMap. + +## 0.1.14 + +* The sourceRoot is now handled consistently. + +## 0.1.13 + +* Added SourceMapGenerator.fromSourceMap. + +## 0.1.12 + +* SourceNode now generates empty mappings too. + +## 0.1.11 + +* Added name support to SourceNode. + +## 0.1.10 + +* Added sourcesContent support to the customer and generator. diff --git a/node_modules/snapdragon/node_modules/source-map/LICENSE b/node_modules/snapdragon/node_modules/source-map/LICENSE new file mode 100644 index 00000000..ed1b7cf2 --- /dev/null +++ b/node_modules/snapdragon/node_modules/source-map/LICENSE @@ -0,0 +1,28 @@ + +Copyright (c) 2009-2011, Mozilla Foundation and contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the names of the Mozilla Foundation nor the names of project + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/snapdragon/node_modules/source-map/README.md b/node_modules/snapdragon/node_modules/source-map/README.md new file mode 100644 index 00000000..32813394 --- /dev/null +++ b/node_modules/snapdragon/node_modules/source-map/README.md @@ -0,0 +1,729 @@ +# Source Map + +[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map) + +[![NPM](https://nodei.co/npm/source-map.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map) + +This is a library to generate and consume the source map format +[described here][format]. + +[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit + +## Use with Node + + $ npm install source-map + +## Use on the Web + + + +-------------------------------------------------------------------------------- + + + + + +## Table of Contents + +- [Examples](#examples) + - [Consuming a source map](#consuming-a-source-map) + - [Generating a source map](#generating-a-source-map) + - [With SourceNode (high level API)](#with-sourcenode-high-level-api) + - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api) +- [API](#api) + - [SourceMapConsumer](#sourcemapconsumer) + - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap) + - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans) + - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition) + - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition) + - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition) + - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources) + - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing) + - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order) + - [SourceMapGenerator](#sourcemapgenerator) + - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap) + - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer) + - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping) + - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath) + - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring) + - [SourceNode](#sourcenode) + - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name) + - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath) + - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk) + - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk) + - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn) + - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn) + - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep) + - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement) + - [SourceNode.prototype.toString()](#sourcenodeprototypetostring) + - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap) + + + +## Examples + +### Consuming a source map + +```js +var rawSourceMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: 'http://example.com/www/js/', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' +}; + +var smc = new SourceMapConsumer(rawSourceMap); + +console.log(smc.sources); +// [ 'http://example.com/www/js/one.js', +// 'http://example.com/www/js/two.js' ] + +console.log(smc.originalPositionFor({ + line: 2, + column: 28 +})); +// { source: 'http://example.com/www/js/two.js', +// line: 2, +// column: 10, +// name: 'n' } + +console.log(smc.generatedPositionFor({ + source: 'http://example.com/www/js/two.js', + line: 2, + column: 10 +})); +// { line: 2, column: 28 } + +smc.eachMapping(function (m) { + // ... +}); +``` + +### Generating a source map + +In depth guide: +[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) + +#### With SourceNode (high level API) + +```js +function compile(ast) { + switch (ast.type) { + case 'BinaryExpression': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + [compile(ast.left), " + ", compile(ast.right)] + ); + case 'Literal': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + String(ast.value) + ); + // ... + default: + throw new Error("Bad AST"); + } +} + +var ast = parse("40 + 2", "add.js"); +console.log(compile(ast).toStringWithSourceMap({ + file: 'add.js' +})); +// { code: '40 + 2', +// map: [object SourceMapGenerator] } +``` + +#### With SourceMapGenerator (low level API) + +```js +var map = new SourceMapGenerator({ + file: "source-mapped.js" +}); + +map.addMapping({ + generated: { + line: 10, + column: 35 + }, + source: "foo.js", + original: { + line: 33, + column: 2 + }, + name: "christopher" +}); + +console.log(map.toString()); +// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' +``` + +## API + +Get a reference to the module: + +```js +// Node.js +var sourceMap = require('source-map'); + +// Browser builds +var sourceMap = window.sourceMap; + +// Inside Firefox +const sourceMap = require("devtools/toolkit/sourcemap/source-map.js"); +``` + +### SourceMapConsumer + +A SourceMapConsumer instance represents a parsed source map which we can query +for information about the original file positions by giving it a file position +in the generated source. + +#### new SourceMapConsumer(rawSourceMap) + +The only parameter is the raw source map (either as a string which can be +`JSON.parse`'d, or an object). According to the spec, source maps have the +following attributes: + +* `version`: Which version of the source map spec this map is following. + +* `sources`: An array of URLs to the original source files. + +* `names`: An array of identifiers which can be referenced by individual + mappings. + +* `sourceRoot`: Optional. The URL root from which all sources are relative. + +* `sourcesContent`: Optional. An array of contents of the original source files. + +* `mappings`: A string of base64 VLQs which contain the actual mappings. + +* `file`: Optional. The generated filename this source map is associated with. + +```js +var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData); +``` + +#### SourceMapConsumer.prototype.computeColumnSpans() + +Compute the last column for each generated mapping. The last column is +inclusive. + +```js +// Before: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] + +consumer.computeColumnSpans(); + +// After: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1, +// lastColumn: 9 }, +// { line: 2, +// column: 10, +// lastColumn: 19 }, +// { line: 2, +// column: 20, +// lastColumn: Infinity } ] + +``` + +#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) + +Returns the original source, line, and column information for the generated +source's line and column positions provided. The only argument is an object with +the following properties: + +* `line`: The line number in the generated source. + +* `column`: The column number in the generated source. + +* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or + `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest + element that is smaller than or greater than the one we are searching for, + respectively, if the exact element cannot be found. Defaults to + `SourceMapConsumer.GREATEST_LOWER_BOUND`. + +and an object is returned with the following properties: + +* `source`: The original source file, or null if this information is not + available. + +* `line`: The line number in the original source, or null if this information is + not available. + +* `column`: The column number in the original source, or null if this + information is not available. + +* `name`: The original identifier, or null if this information is not available. + +```js +consumer.originalPositionFor({ line: 2, column: 10 }) +// { source: 'foo.coffee', +// line: 2, +// column: 2, +// name: null } + +consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 }) +// { source: null, +// line: null, +// column: null, +// name: null } +``` + +#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) + +Returns the generated line and column information for the original source, +line, and column positions provided. The only argument is an object with +the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: The column number in the original source. + +and an object is returned with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +```js +consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 }) +// { line: 1, +// column: 56 } +``` + +#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) + +Returns all generated line and column information for the original source, line, +and column provided. If no column is provided, returns all mappings +corresponding to a either the line we are searching for or the next closest line +that has any mappings. Otherwise, returns all mappings corresponding to the +given line and either the column we are searching for or the next closest column +that has any offsets. + +The only argument is an object with the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: Optional. The column number in the original source. + +and an array of objects is returned, each with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +```js +consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] +``` + +#### SourceMapConsumer.prototype.hasContentsOfAllSources() + +Return true if we have the embedded source content for every source listed in +the source map, false otherwise. + +In other words, if this method returns `true`, then +`consumer.sourceContentFor(s)` will succeed for every source `s` in +`consumer.sources`. + +```js +// ... +if (consumer.hasContentsOfAllSources()) { + consumerReadyCallback(consumer); +} else { + fetchSources(consumer, consumerReadyCallback); +} +// ... +``` + +#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing]) + +Returns the original source content for the source provided. The only +argument is the URL of the original source file. + +If the source content for the given source is not found, then an error is +thrown. Optionally, pass `true` as the second param to have `null` returned +instead. + +```js +consumer.sources +// [ "my-cool-lib.clj" ] + +consumer.sourceContentFor("my-cool-lib.clj") +// "..." + +consumer.sourceContentFor("this is not in the source map"); +// Error: "this is not in the source map" is not in the source map + +consumer.sourceContentFor("this is not in the source map", true); +// null +``` + +#### SourceMapConsumer.prototype.eachMapping(callback, context, order) + +Iterate over each mapping between an original source/line/column and a +generated line/column in this source map. + +* `callback`: The function that is called with each mapping. Mappings have the + form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, + name }` + +* `context`: Optional. If specified, this object will be the value of `this` + every time that `callback` is called. + +* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or + `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over + the mappings sorted by the generated file's line/column order or the + original's source/line/column order, respectively. Defaults to + `SourceMapConsumer.GENERATED_ORDER`. + +```js +consumer.eachMapping(function (m) { console.log(m); }) +// ... +// { source: 'illmatic.js', +// generatedLine: 1, +// generatedColumn: 0, +// originalLine: 1, +// originalColumn: 0, +// name: null } +// { source: 'illmatic.js', +// generatedLine: 2, +// generatedColumn: 0, +// originalLine: 2, +// originalColumn: 0, +// name: null } +// ... +``` +### SourceMapGenerator + +An instance of the SourceMapGenerator represents a source map which is being +built incrementally. + +#### new SourceMapGenerator([startOfSourceMap]) + +You may pass an object with the following properties: + +* `file`: The filename of the generated source that this source map is + associated with. + +* `sourceRoot`: A root for all relative URLs in this source map. + +* `skipValidation`: Optional. When `true`, disables validation of mappings as + they are added. This can improve performance but should be used with + discretion, as a last resort. Even then, one should avoid using this flag when + running tests, if possible. + +```js +var generator = new sourceMap.SourceMapGenerator({ + file: "my-generated-javascript-file.js", + sourceRoot: "http://example.com/app/js/" +}); +``` + +#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) + +Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance. + +* `sourceMapConsumer` The SourceMap. + +```js +var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer); +``` + +#### SourceMapGenerator.prototype.addMapping(mapping) + +Add a single mapping from original source line and column to the generated +source's line and column for this source map being created. The mapping object +should have the following properties: + +* `generated`: An object with the generated line and column positions. + +* `original`: An object with the original line and column positions. + +* `source`: The original source file (relative to the sourceRoot). + +* `name`: An optional original token name for this mapping. + +```js +generator.addMapping({ + source: "module-one.scm", + original: { line: 128, column: 0 }, + generated: { line: 3, column: 456 } +}) +``` + +#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for an original source file. + +* `sourceFile` the URL of the original source file. + +* `sourceContent` the content of the source file. + +```js +generator.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) + +Applies a SourceMap for a source file to the SourceMap. +Each mapping to the supplied source file is rewritten using the +supplied SourceMap. Note: The resolution for the resulting mappings +is the minimum of this map and the supplied map. + +* `sourceMapConsumer`: The SourceMap to be applied. + +* `sourceFile`: Optional. The filename of the source file. + If omitted, sourceMapConsumer.file will be used, if it exists. + Otherwise an error will be thrown. + +* `sourceMapPath`: Optional. The dirname of the path to the SourceMap + to be applied. If relative, it is relative to the SourceMap. + + This parameter is needed when the two SourceMaps aren't in the same + directory, and the SourceMap to be applied contains relative source + paths. If so, those relative source paths need to be rewritten + relative to the SourceMap. + + If omitted, it is assumed that both SourceMaps are in the same directory, + thus not needing any rewriting. (Supplying `'.'` has the same effect.) + +#### SourceMapGenerator.prototype.toString() + +Renders the source map being generated to a string. + +```js +generator.toString() +// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}' +``` + +### SourceNode + +SourceNodes provide a way to abstract over interpolating and/or concatenating +snippets of generated JavaScript source code, while maintaining the line and +column information associated between those snippets and the original source +code. This is useful as the final intermediate representation a compiler might +use before outputting the generated JS and source map. + +#### new SourceNode([line, column, source[, chunk[, name]]]) + +* `line`: The original line number associated with this source node, or null if + it isn't associated with an original line. + +* `column`: The original column number associated with this source node, or null + if it isn't associated with an original column. + +* `source`: The original source's filename; null if no filename is provided. + +* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see + below. + +* `name`: Optional. The original identifier. + +```js +var node = new SourceNode(1, 2, "a.cpp", [ + new SourceNode(3, 4, "b.cpp", "extern int status;\n"), + new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"), + new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"), +]); +``` + +#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) + +Creates a SourceNode from generated code and a SourceMapConsumer. + +* `code`: The generated code + +* `sourceMapConsumer` The SourceMap for the generated code + +* `relativePath` The optional path that relative sources in `sourceMapConsumer` + should be relative to. + +```js +var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8")); +var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"), + consumer); +``` + +#### SourceNode.prototype.add(chunk) + +Add a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.add(" + "); +node.add(otherNode); +node.add([leftHandOperandNode, " + ", rightHandOperandNode]); +``` + +#### SourceNode.prototype.prepend(chunk) + +Prepend a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.prepend("/** Build Id: f783haef86324gf **/\n\n"); +``` + +#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for a source file. This will be added to the +`SourceMap` in the `sourcesContent` field. + +* `sourceFile`: The filename of the source file + +* `sourceContent`: The content of the source file + +```js +node.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceNode.prototype.walk(fn) + +Walk over the tree of JS snippets in this node and its children. The walking +function is called once for each snippet of JS and is passed that snippet and +the its original associated source's line/column location. + +* `fn`: The traversal function. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.walk(function (code, loc) { console.log("WALK:", code, loc); }) +// WALK: uno { source: 'b.js', line: 3, column: 4, name: null } +// WALK: dos { source: 'a.js', line: 1, column: 2, name: null } +// WALK: tres { source: 'a.js', line: 1, column: 2, name: null } +// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null } +``` + +#### SourceNode.prototype.walkSourceContents(fn) + +Walk over the tree of SourceNodes. The walking function is called for each +source file content and is passed the filename and source content. + +* `fn`: The traversal function. + +```js +var a = new SourceNode(1, 2, "a.js", "generated from a"); +a.setSourceContent("a.js", "original a"); +var b = new SourceNode(1, 2, "b.js", "generated from b"); +b.setSourceContent("b.js", "original b"); +var c = new SourceNode(1, 2, "c.js", "generated from c"); +c.setSourceContent("c.js", "original c"); + +var node = new SourceNode(null, null, null, [a, b, c]); +node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); }) +// WALK: a.js : original a +// WALK: b.js : original b +// WALK: c.js : original c +``` + +#### SourceNode.prototype.join(sep) + +Like `Array.prototype.join` except for SourceNodes. Inserts the separator +between each of this source node's children. + +* `sep`: The separator. + +```js +var lhs = new SourceNode(1, 2, "a.rs", "my_copy"); +var operand = new SourceNode(3, 4, "a.rs", "="); +var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()"); + +var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]); +var joinedNode = node.join(" "); +``` + +#### SourceNode.prototype.replaceRight(pattern, replacement) + +Call `String.prototype.replace` on the very right-most source snippet. Useful +for trimming white space from the end of a source node, etc. + +* `pattern`: The pattern to replace. + +* `replacement`: The thing to replace the pattern with. + +```js +// Trim trailing white space. +node.replaceRight(/\s*$/, ""); +``` + +#### SourceNode.prototype.toString() + +Return the string representation of this source node. Walks over the tree and +concatenates all the various snippets together to one string. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toString() +// 'unodostresquatro' +``` + +#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) + +Returns the string representation of this tree of source nodes, plus a +SourceMapGenerator which contains all the mappings between the generated and +original sources. + +The arguments are the same as those to `new SourceMapGenerator`. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toStringWithSourceMap({ file: "my-output-file.js" }) +// { code: 'unodostresquatro', +// map: [object SourceMapGenerator] } +``` diff --git a/node_modules/snapdragon/node_modules/source-map/dist/source-map.debug.js b/node_modules/snapdragon/node_modules/source-map/dist/source-map.debug.js new file mode 100644 index 00000000..b5ab6382 --- /dev/null +++ b/node_modules/snapdragon/node_modules/source-map/dist/source-map.debug.js @@ -0,0 +1,3091 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["sourceMap"] = factory(); + else + root["sourceMap"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer; + exports.SourceNode = __webpack_require__(10).SourceNode; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var base64VLQ = __webpack_require__(2); + var util = __webpack_require__(4); + var ArraySet = __webpack_require__(5).ArraySet; + var MappingList = __webpack_require__(6).MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error( + 'original.line and original.column are not numbers -- you probably meant to omit ' + + 'the original mapping entirely and only map the generated position. If so, pass ' + + 'null for the original mapping instead of an object with empty or null values.' + ); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + var base64 = __webpack_require__(3); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); + }()); + + function identity (s) { + return s; + } + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; + } + exports.toSetString = supportsNullProto ? identity : toSetString; + + function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; + } + exports.fromSetString = supportsNullProto ? identity : fromSetString; + + function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var has = Object.prototype.hasOwnProperty; + var hasNativeMap = typeof Map !== "undefined"; + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var binarySearch = __webpack_require__(8); + var ArraySet = __webpack_require__(5).ArraySet; + var base64VLQ = __webpack_require__(2); + var quickSort = __webpack_require__(9).quickSort; + + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + var util = __webpack_require__(4); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? + remainingLines[remainingLinesIndex++] : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + + +/***/ }) +/******/ ]) +}); +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBlNDczOGZjNzJhN2IyMzAzOTg4OSIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTBDLFNBQVM7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRCQUEyQixRQUFRO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNoYUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXNDLFNBQVM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hIQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQzlFQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1REFBc0Q7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxvQkFBbUI7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7O0FBRVg7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBc0Q7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQStDLG1CQUFtQixFQUFFO0FBQ3BFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixvQkFBb0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE2QixNQUFNO0FBQ25DO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXNEO0FBQ3REOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBLElBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQiwyQkFBMkI7QUFDOUMsc0JBQXFCLCtDQUErQztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsMkJBQTJCO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBLHNCQUFxQiw0QkFBNEI7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDempDQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7OztBQzlHQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVcsTUFBTTtBQUNqQjtBQUNBLFlBQVcsT0FBTztBQUNsQjtBQUNBLFlBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE1BQU07QUFDakI7QUFDQSxZQUFXLFNBQVM7QUFDcEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE1BQU07QUFDakI7QUFDQSxZQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ2pIQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsU0FBUztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBb0I7QUFDcEI7QUFDQTtBQUNBLHVDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBK0MsU0FBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSw2Q0FBNEMsY0FBYztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBLFlBQVc7QUFDWDtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBLElBQUc7O0FBRUgsV0FBVTtBQUNWOztBQUVBIiwiZmlsZSI6InNvdXJjZS1tYXAuZGVidWcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJzb3VyY2VNYXBcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGU0NzM4ZmM3MmE3YjIzMDM5ODg5IiwiLypcbiAqIENvcHlyaWdodCAyMDA5LTIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLnR4dCBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvcicpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbmV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyJykuU291cmNlTWFwQ29uc3VtZXI7XG5leHBvcnRzLlNvdXJjZU5vZGUgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2Utbm9kZScpLlNvdXJjZU5vZGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NvdXJjZS1tYXAuanNcbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBNYXBwaW5nTGlzdCA9IHJlcXVpcmUoJy4vbWFwcGluZy1saXN0JykuTWFwcGluZ0xpc3Q7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhlIFNvdXJjZU1hcEdlbmVyYXRvciByZXByZXNlbnRzIGEgc291cmNlIG1hcCB3aGljaCBpc1xuICogYmVpbmcgYnVpbHQgaW5jcmVtZW50YWxseS4gWW91IG1heSBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqICAgLSBzb3VyY2VSb290OiBBIHJvb3QgZm9yIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoaXMgc291cmNlIG1hcC5cbiAqL1xuZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKSB7XG4gIGlmICghYUFyZ3MpIHtcbiAgICBhQXJncyA9IHt9O1xuICB9XG4gIHRoaXMuX2ZpbGUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2ZpbGUnLCBudWxsKTtcbiAgdGhpcy5fc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB0aGlzLl9za2lwVmFsaWRhdGlvbiA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc2tpcFZhbGlkYXRpb24nLCBmYWxzZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbWFwcGluZ3MgPSBuZXcgTWFwcGluZ0xpc3QoKTtcbiAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gbnVsbDtcbn1cblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IgYmFzZWQgb24gYSBTb3VyY2VNYXBDb25zdW1lclxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIpIHtcbiAgICB2YXIgc291cmNlUm9vdCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VSb290O1xuICAgIHZhciBnZW5lcmF0b3IgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKHtcbiAgICAgIGZpbGU6IGFTb3VyY2VNYXBDb25zdW1lci5maWxlLFxuICAgICAgc291cmNlUm9vdDogc291cmNlUm9vdFxuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIG5ld01hcHBpbmcgPSB7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbmV3TWFwcGluZy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3TWFwcGluZy5vcmlnaW5hbCA9IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLm5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdG9yLmFkZE1hcHBpbmcobmV3TWFwcGluZyk7XG4gICAgfSk7XG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgZ2VuZXJhdG9yLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfTtcblxuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbWFwcGluZyBmcm9tIG9yaWdpbmFsIHNvdXJjZSBsaW5lIGFuZCBjb2x1bW4gdG8gdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIGZvciB0aGlzIHNvdXJjZSBtYXAgYmVpbmcgY3JlYXRlZC4gVGhlIG1hcHBpbmdcbiAqIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGdlbmVyYXRlZDogQW4gb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICogICAtIG9yaWdpbmFsOiBBbiBvYmplY3Qgd2l0aCB0aGUgb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZVJvb3QpLlxuICogICAtIG5hbWU6IEFuIG9wdGlvbmFsIG9yaWdpbmFsIHRva2VuIG5hbWUgZm9yIHRoaXMgbWFwcGluZy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hZGRNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2FkZE1hcHBpbmcoYUFyZ3MpIHtcbiAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdnZW5lcmF0ZWQnKTtcbiAgICB2YXIgb3JpZ2luYWwgPSB1dGlsLmdldEFyZyhhQXJncywgJ29yaWdpbmFsJywgbnVsbCk7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJywgbnVsbCk7XG4gICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhhQXJncywgJ25hbWUnLCBudWxsKTtcblxuICAgIGlmICghdGhpcy5fc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRlTWFwcGluZyhnZW5lcmF0ZWQsIG9yaWdpbmFsLCBzb3VyY2UsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgc291cmNlID0gU3RyaW5nKHNvdXJjZSk7XG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICBuYW1lID0gU3RyaW5nKG5hbWUpO1xuICAgICAgaWYgKCF0aGlzLl9uYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgdGhpcy5fbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX21hcHBpbmdzLmFkZCh7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogZ2VuZXJhdGVkLmNvbHVtbixcbiAgICAgIG9yaWdpbmFsTGluZTogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5saW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwuY29sdW1uLFxuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgdmFyIHNvdXJjZSA9IGFTb3VyY2VGaWxlO1xuICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5fc291cmNlUm9vdCwgc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoYVNvdXJjZUNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgLy8gQWRkIHRoZSBzb3VyY2UgY29udGVudCB0byB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgX3NvdXJjZXNDb250ZW50cyBtYXAgaWYgdGhlIHByb3BlcnR5IGlzIG51bGwuXG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV0gPSBhU291cmNlQ29udGVudDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBzb3VyY2UgZmlsZSBmcm9tIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcC5cbiAgICAgIC8vIElmIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcCBpcyBlbXB0eSwgc2V0IHRoZSBwcm9wZXJ0eSB0byBudWxsLlxuICAgICAgZGVsZXRlIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3NvdXJjZXNDb250ZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG1hcHBpbmdzIG9mIGEgc3ViLXNvdXJjZS1tYXAgZm9yIGEgc3BlY2lmaWMgc291cmNlIGZpbGUgdG8gdGhlXG4gKiBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZC4gRWFjaCBtYXBwaW5nIHRvIHRoZSBzdXBwbGllZCBzb3VyY2UgZmlsZSBpc1xuICogcmV3cml0dGVuIHVzaW5nIHRoZSBzdXBwbGllZCBzb3VyY2UgbWFwLiBOb3RlOiBUaGUgcmVzb2x1dGlvbiBmb3IgdGhlXG4gKiByZXN1bHRpbmcgbWFwcGluZ3MgaXMgdGhlIG1pbmltaXVtIG9mIHRoaXMgbWFwIGFuZCB0aGUgc3VwcGxpZWQgbWFwLlxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBhU291cmNlRmlsZSBPcHRpb25hbC4gVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZS5cbiAqICAgICAgICBJZiBvbWl0dGVkLCBTb3VyY2VNYXBDb25zdW1lcidzIGZpbGUgcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICogQHBhcmFtIGFTb3VyY2VNYXBQYXRoIE9wdGlvbmFsLiBUaGUgZGlybmFtZSBvZiB0aGUgcGF0aCB0byB0aGUgc291cmNlIG1hcFxuICogICAgICAgIHRvIGJlIGFwcGxpZWQuIElmIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgU291cmNlTWFwQ29uc3VtZXIuXG4gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgbmVlZGVkIHdoZW4gdGhlIHR3byBzb3VyY2UgbWFwcyBhcmVuJ3QgaW4gdGhlIHNhbWVcbiAqICAgICAgICBkaXJlY3RvcnksIGFuZCB0aGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkIGNvbnRhaW5zIHJlbGF0aXZlIHNvdXJjZVxuICogICAgICAgIHBhdGhzLiBJZiBzbywgdGhvc2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIG5lZWQgdG8gYmUgcmV3cml0dGVuXG4gKiAgICAgICAgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvci5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hcHBseVNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hcHBseVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIsIGFTb3VyY2VGaWxlLCBhU291cmNlTWFwUGF0aCkge1xuICAgIHZhciBzb3VyY2VGaWxlID0gYVNvdXJjZUZpbGU7XG4gICAgLy8gSWYgYVNvdXJjZUZpbGUgaXMgb21pdHRlZCwgd2Ugd2lsbCB1c2UgdGhlIGZpbGUgcHJvcGVydHkgb2YgdGhlIFNvdXJjZU1hcFxuICAgIGlmIChhU291cmNlRmlsZSA9PSBudWxsKSB7XG4gICAgICBpZiAoYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1NvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgcmVxdWlyZXMgZWl0aGVyIGFuIGV4cGxpY2l0IHNvdXJjZSBmaWxlLCAnICtcbiAgICAgICAgICAnb3IgdGhlIHNvdXJjZSBtYXBcXCdzIFwiZmlsZVwiIHByb3BlcnR5LiBCb3RoIHdlcmUgb21pdHRlZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzb3VyY2VGaWxlID0gYVNvdXJjZU1hcENvbnN1bWVyLmZpbGU7XG4gICAgfVxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICAvLyBNYWtlIFwic291cmNlRmlsZVwiIHJlbGF0aXZlIGlmIGFuIGFic29sdXRlIFVybCBpcyBwYXNzZWQuXG4gICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgfVxuICAgIC8vIEFwcGx5aW5nIHRoZSBTb3VyY2VNYXAgY2FuIGFkZCBhbmQgcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIHNvdXJjZXMgYW5kXG4gICAgLy8gdGhlIG5hbWVzIGFycmF5LlxuICAgIHZhciBuZXdTb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgdmFyIG5ld05hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgICAvLyBGaW5kIG1hcHBpbmdzIGZvciB0aGUgXCJzb3VyY2VGaWxlXCJcbiAgICB0aGlzLl9tYXBwaW5ncy51bnNvcnRlZEZvckVhY2goZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gc291cmNlRmlsZSAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGNhbiBiZSBtYXBwZWQgYnkgdGhlIHNvdXJjZSBtYXAsIHRoZW4gdXBkYXRlIHRoZSBtYXBwaW5nLlxuICAgICAgICB2YXIgb3JpZ2luYWwgPSBhU291cmNlTWFwQ29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3JpZ2luYWwuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBDb3B5IG1hcHBpbmdcbiAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbWFwcGluZy5zb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgICAgICBpZiAob3JpZ2luYWwubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIW5ld1NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgbmV3U291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmICFuZXdOYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgbmV3TmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuXG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5fc291cmNlcyA9IG5ld1NvdXJjZXM7XG4gICAgdGhpcy5fbmFtZXMgPSBuZXdOYW1lcztcblxuICAgIC8vIENvcHkgc291cmNlc0NvbnRlbnRzIG9mIGFwcGxpZWQgbWFwLlxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBBIG1hcHBpbmcgY2FuIGhhdmUgb25lIG9mIHRoZSB0aHJlZSBsZXZlbHMgb2YgZGF0YTpcbiAqXG4gKiAgIDEuIEp1c3QgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqICAgMi4gVGhlIEdlbmVyYXRlZCBwb3NpdGlvbiwgb3JpZ2luYWwgcG9zaXRpb24sIGFuZCBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIDMuIEdlbmVyYXRlZCBhbmQgb3JpZ2luYWwgcG9zaXRpb24sIG9yaWdpbmFsIHNvdXJjZSwgYXMgd2VsbCBhcyBhIG5hbWVcbiAqICAgICAgdG9rZW4uXG4gKlxuICogVG8gbWFpbnRhaW4gY29uc2lzdGVuY3ksIHdlIHZhbGlkYXRlIHRoYXQgYW55IG5ldyBtYXBwaW5nIGJlaW5nIGFkZGVkIGZhbGxzXG4gKiBpbiB0byBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllcy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3ZhbGlkYXRlTWFwcGluZyhhR2VuZXJhdGVkLCBhT3JpZ2luYWwsIGFTb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYU5hbWUpIHtcbiAgICAvLyBXaGVuIGFPcmlnaW5hbCBpcyB0cnV0aHkgYnV0IGhhcyBlbXB0eSB2YWx1ZXMgZm9yIC5saW5lIGFuZCAuY29sdW1uLFxuICAgIC8vIGl0IGlzIG1vc3QgbGlrZWx5IGEgcHJvZ3JhbW1lciBlcnJvci4gSW4gdGhpcyBjYXNlIHdlIHRocm93IGEgdmVyeVxuICAgIC8vIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgdG8gdHJ5IHRvIGd1aWRlIHRoZW0gdGhlIHJpZ2h0IHdheS5cbiAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXIvcG9seW1lci1idW5kbGVyL3B1bGwvNTE5XG4gICAgaWYgKGFPcmlnaW5hbCAmJiB0eXBlb2YgYU9yaWdpbmFsLmxpbmUgIT09ICdudW1iZXInICYmIHR5cGVvZiBhT3JpZ2luYWwuY29sdW1uICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnb3JpZ2luYWwubGluZSBhbmQgb3JpZ2luYWwuY29sdW1uIGFyZSBub3QgbnVtYmVycyAtLSB5b3UgcHJvYmFibHkgbWVhbnQgdG8gb21pdCAnICtcbiAgICAgICAgICAgICd0aGUgb3JpZ2luYWwgbWFwcGluZyBlbnRpcmVseSBhbmQgb25seSBtYXAgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi4gSWYgc28sIHBhc3MgJyArXG4gICAgICAgICAgICAnbnVsbCBmb3IgdGhlIG9yaWdpbmFsIG1hcHBpbmcgaW5zdGVhZCBvZiBhbiBvYmplY3Qgd2l0aCBlbXB0eSBvciBudWxsIHZhbHVlcy4nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAmJiBhR2VuZXJhdGVkLmxpbmUgPiAwICYmIGFHZW5lcmF0ZWQuY29sdW1uID49IDBcbiAgICAgICAgJiYgIWFPcmlnaW5hbCAmJiAhYVNvdXJjZSAmJiAhYU5hbWUpIHtcbiAgICAgIC8vIENhc2UgMS5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsICYmICdsaW5lJyBpbiBhT3JpZ2luYWwgJiYgJ2NvbHVtbicgaW4gYU9yaWdpbmFsXG4gICAgICAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsLmxpbmUgPiAwICYmIGFPcmlnaW5hbC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFTb3VyY2UpIHtcbiAgICAgIC8vIENhc2VzIDIgYW5kIDMuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1hcHBpbmc6ICcgKyBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGdlbmVyYXRlZDogYUdlbmVyYXRlZCxcbiAgICAgICAgc291cmNlOiBhU291cmNlLFxuICAgICAgICBvcmlnaW5hbDogYU9yaWdpbmFsLFxuICAgICAgICBuYW1lOiBhTmFtZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBTZXJpYWxpemUgdGhlIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIHRvIHRoZSBzdHJlYW0gb2YgYmFzZSA2NCBWTFFzXG4gKiBzcGVjaWZpZWQgYnkgdGhlIHNvdXJjZSBtYXAgZm9ybWF0LlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9zZXJpYWxpemVNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXJpYWxpemVNYXBwaW5ncygpIHtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwO1xuICAgIHZhciBwcmV2aW91c05hbWUgPSAwO1xuICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgIHZhciBuZXh0O1xuICAgIHZhciBtYXBwaW5nO1xuICAgIHZhciBuYW1lSWR4O1xuICAgIHZhciBzb3VyY2VJZHg7XG5cbiAgICB2YXIgbWFwcGluZ3MgPSB0aGlzLl9tYXBwaW5ncy50b0FycmF5KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBtYXBwaW5nID0gbWFwcGluZ3NbaV07XG4gICAgICBuZXh0ID0gJydcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgd2hpbGUgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbmV4dCArPSAnOyc7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBpZiAoIXV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZywgbWFwcGluZ3NbaSAtIDFdKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHQgKz0gJywnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbik7XG4gICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VJZHggPSB0aGlzLl9zb3VyY2VzLmluZGV4T2YobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUoc291cmNlSWR4IC0gcHJldmlvdXNTb3VyY2UpO1xuICAgICAgICBwcmV2aW91c1NvdXJjZSA9IHNvdXJjZUlkeDtcblxuICAgICAgICAvLyBsaW5lcyBhcmUgc3RvcmVkIDAtYmFzZWQgaW4gU291cmNlTWFwIHNwZWMgdmVyc2lvbiAzXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsTGluZSAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c09yaWdpbmFsTGluZSk7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmUgLSAxO1xuXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbENvbHVtbik7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5hbWVJZHggPSB0aGlzLl9uYW1lcy5pbmRleE9mKG1hcHBpbmcubmFtZSk7XG4gICAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG5hbWVJZHggLSBwcmV2aW91c05hbWUpO1xuICAgICAgICAgIHByZXZpb3VzTmFtZSA9IG5hbWVJZHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ICs9IG5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KGFTb3VyY2VzLCBhU291cmNlUm9vdCkge1xuICAgIHJldHVybiBhU291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoYVNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKGFTb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgfVxuICAgICAgdmFyIGtleSA9IHV0aWwudG9TZXRTdHJpbmcoc291cmNlKTtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc291cmNlc0NvbnRlbnRzLCBrZXkpXG4gICAgICAgID8gdGhpcy5fc291cmNlc0NvbnRlbnRzW2tleV1cbiAgICAgICAgOiBudWxsO1xuICAgIH0sIHRoaXMpO1xuICB9O1xuXG4vKipcbiAqIEV4dGVybmFsaXplIHRoZSBzb3VyY2UgbWFwLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvSlNPTiA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b0pTT04oKSB7XG4gICAgdmFyIG1hcCA9IHtcbiAgICAgIHZlcnNpb246IHRoaXMuX3ZlcnNpb24sXG4gICAgICBzb3VyY2VzOiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKSxcbiAgICAgIG5hbWVzOiB0aGlzLl9uYW1lcy50b0FycmF5KCksXG4gICAgICBtYXBwaW5nczogdGhpcy5fc2VyaWFsaXplTWFwcGluZ3MoKVxuICAgIH07XG4gICAgaWYgKHRoaXMuX2ZpbGUgIT0gbnVsbCkge1xuICAgICAgbWFwLmZpbGUgPSB0aGlzLl9maWxlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBtYXAuc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIG1hcC5zb3VyY2VzQ29udGVudCA9IHRoaXMuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQobWFwLnNvdXJjZXMsIG1hcC5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9O1xuXG4vKipcbiAqIFJlbmRlciB0aGUgc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQgdG8gYSBzdHJpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IFNvdXJjZU1hcEdlbmVyYXRvcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKlxuICogQmFzZWQgb24gdGhlIEJhc2UgNjQgVkxRIGltcGxlbWVudGF0aW9uIGluIENsb3N1cmUgQ29tcGlsZXI6XG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nsb3N1cmUtY29tcGlsZXIvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvY29tL2dvb2dsZS9kZWJ1Z2dpbmcvc291cmNlbWFwL0Jhc2U2NFZMUS5qYXZhXG4gKlxuICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkXG4gKiAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG5cbi8vIEEgc2luZ2xlIGJhc2UgNjQgZGlnaXQgY2FuIGNvbnRhaW4gNiBiaXRzIG9mIGRhdGEuIEZvciB0aGUgYmFzZSA2NCB2YXJpYWJsZVxuLy8gbGVuZ3RoIHF1YW50aXRpZXMgd2UgdXNlIGluIHRoZSBzb3VyY2UgbWFwIHNwZWMsIHRoZSBmaXJzdCBiaXQgaXMgdGhlIHNpZ24sXG4vLyB0aGUgbmV4dCBmb3VyIGJpdHMgYXJlIHRoZSBhY3R1YWwgdmFsdWUsIGFuZCB0aGUgNnRoIGJpdCBpcyB0aGVcbi8vIGNvbnRpbnVhdGlvbiBiaXQuIFRoZSBjb250aW51YXRpb24gYml0IHRlbGxzIHVzIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmVcbi8vIGRpZ2l0cyBpbiB0aGlzIHZhbHVlIGZvbGxvd2luZyB0aGlzIGRpZ2l0LlxuLy9cbi8vICAgQ29udGludWF0aW9uXG4vLyAgIHwgICAgU2lnblxuLy8gICB8ICAgIHxcbi8vICAgViAgICBWXG4vLyAgIDEwMTAxMVxuXG52YXIgVkxRX0JBU0VfU0hJRlQgPSA1O1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9CQVNFID0gMSA8PCBWTFFfQkFTRV9TSElGVDtcblxuLy8gYmluYXJ5OiAwMTExMTFcbnZhciBWTFFfQkFTRV9NQVNLID0gVkxRX0JBU0UgLSAxO1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9DT05USU5VQVRJT05fQklUID0gVkxRX0JBU0U7XG5cbi8qKlxuICogQ29udmVydHMgZnJvbSBhIHR3by1jb21wbGVtZW50IHZhbHVlIHRvIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMSBiZWNvbWVzIDIgKDEwIGJpbmFyeSksIC0xIGJlY29tZXMgMyAoMTEgYmluYXJ5KVxuICogICAyIGJlY29tZXMgNCAoMTAwIGJpbmFyeSksIC0yIGJlY29tZXMgNSAoMTAxIGJpbmFyeSlcbiAqL1xuZnVuY3Rpb24gdG9WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHJldHVybiBhVmFsdWUgPCAwXG4gICAgPyAoKC1hVmFsdWUpIDw8IDEpICsgMVxuICAgIDogKGFWYWx1ZSA8PCAxKSArIDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgdG8gYSB0d28tY29tcGxlbWVudCB2YWx1ZSBmcm9tIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMiAoMTAgYmluYXJ5KSBiZWNvbWVzIDEsIDMgKDExIGJpbmFyeSkgYmVjb21lcyAtMVxuICogICA0ICgxMDAgYmluYXJ5KSBiZWNvbWVzIDIsIDUgKDEwMSBiaW5hcnkpIGJlY29tZXMgLTJcbiAqL1xuZnVuY3Rpb24gZnJvbVZMUVNpZ25lZChhVmFsdWUpIHtcbiAgdmFyIGlzTmVnYXRpdmUgPSAoYVZhbHVlICYgMSkgPT09IDE7XG4gIHZhciBzaGlmdGVkID0gYVZhbHVlID4+IDE7XG4gIHJldHVybiBpc05lZ2F0aXZlXG4gICAgPyAtc2hpZnRlZFxuICAgIDogc2hpZnRlZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiYXNlIDY0IFZMUSBlbmNvZGVkIHZhbHVlLlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9lbmNvZGUoYVZhbHVlKSB7XG4gIHZhciBlbmNvZGVkID0gXCJcIjtcbiAgdmFyIGRpZ2l0O1xuXG4gIHZhciB2bHEgPSB0b1ZMUVNpZ25lZChhVmFsdWUpO1xuXG4gIGRvIHtcbiAgICBkaWdpdCA9IHZscSAmIFZMUV9CQVNFX01BU0s7XG4gICAgdmxxID4+Pj0gVkxRX0JBU0VfU0hJRlQ7XG4gICAgaWYgKHZscSA+IDApIHtcbiAgICAgIC8vIFRoZXJlIGFyZSBzdGlsbCBtb3JlIGRpZ2l0cyBpbiB0aGlzIHZhbHVlLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBiaXQgaXMgbWFya2VkLlxuICAgICAgZGlnaXQgfD0gVkxRX0NPTlRJTlVBVElPTl9CSVQ7XG4gICAgfVxuICAgIGVuY29kZWQgKz0gYmFzZTY0LmVuY29kZShkaWdpdCk7XG4gIH0gd2hpbGUgKHZscSA+IDApO1xuXG4gIHJldHVybiBlbmNvZGVkO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBuZXh0IGJhc2UgNjQgVkxRIHZhbHVlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJucyB0aGVcbiAqIHZhbHVlIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHZpYSB0aGUgb3V0IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZGVjb2RlKGFTdHIsIGFJbmRleCwgYU91dFBhcmFtKSB7XG4gIHZhciBzdHJMZW4gPSBhU3RyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IDA7XG4gIHZhciBzaGlmdCA9IDA7XG4gIHZhciBjb250aW51YXRpb24sIGRpZ2l0O1xuXG4gIGRvIHtcbiAgICBpZiAoYUluZGV4ID49IHN0ckxlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbW9yZSBkaWdpdHMgaW4gYmFzZSA2NCBWTFEgdmFsdWUuXCIpO1xuICAgIH1cblxuICAgIGRpZ2l0ID0gYmFzZTY0LmRlY29kZShhU3RyLmNoYXJDb2RlQXQoYUluZGV4KyspKTtcbiAgICBpZiAoZGlnaXQgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhc2U2NCBkaWdpdDogXCIgKyBhU3RyLmNoYXJBdChhSW5kZXggLSAxKSk7XG4gICAgfVxuXG4gICAgY29udGludWF0aW9uID0gISEoZGlnaXQgJiBWTFFfQ09OVElOVUFUSU9OX0JJVCk7XG4gICAgZGlnaXQgJj0gVkxRX0JBU0VfTUFTSztcbiAgICByZXN1bHQgPSByZXN1bHQgKyAoZGlnaXQgPDwgc2hpZnQpO1xuICAgIHNoaWZ0ICs9IFZMUV9CQVNFX1NISUZUO1xuICB9IHdoaWxlIChjb250aW51YXRpb24pO1xuXG4gIGFPdXRQYXJhbS52YWx1ZSA9IGZyb21WTFFTaWduZWQocmVzdWx0KTtcbiAgYU91dFBhcmFtLnJlc3QgPSBhSW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmFzZTY0LXZscS5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBpbnRUb0NoYXJNYXAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycuc3BsaXQoJycpO1xuXG4vKipcbiAqIEVuY29kZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiAwIHRvIDYzIHRvIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQuXG4gKi9cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKG51bWJlcikge1xuICBpZiAoMCA8PSBudW1iZXIgJiYgbnVtYmVyIDwgaW50VG9DaGFyTWFwLmxlbmd0aCkge1xuICAgIHJldHVybiBpbnRUb0NoYXJNYXBbbnVtYmVyXTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYzOiBcIiArIG51bWJlcik7XG59O1xuXG4vKipcbiAqIERlY29kZSBhIHNpbmdsZSBiYXNlIDY0IGNoYXJhY3RlciBjb2RlIGRpZ2l0IHRvIGFuIGludGVnZXIuIFJldHVybnMgLTEgb25cbiAqIGZhaWx1cmUuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gKGNoYXJDb2RlKSB7XG4gIHZhciBiaWdBID0gNjU7ICAgICAvLyAnQSdcbiAgdmFyIGJpZ1ogPSA5MDsgICAgIC8vICdaJ1xuXG4gIHZhciBsaXR0bGVBID0gOTc7ICAvLyAnYSdcbiAgdmFyIGxpdHRsZVogPSAxMjI7IC8vICd6J1xuXG4gIHZhciB6ZXJvID0gNDg7ICAgICAvLyAnMCdcbiAgdmFyIG5pbmUgPSA1NzsgICAgIC8vICc5J1xuXG4gIHZhciBwbHVzID0gNDM7ICAgICAvLyAnKydcbiAgdmFyIHNsYXNoID0gNDc7ICAgIC8vICcvJ1xuXG4gIHZhciBsaXR0bGVPZmZzZXQgPSAyNjtcbiAgdmFyIG51bWJlck9mZnNldCA9IDUyO1xuXG4gIC8vIDAgLSAyNTogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcbiAgaWYgKGJpZ0EgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gYmlnWikge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSBiaWdBKTtcbiAgfVxuXG4gIC8vIDI2IC0gNTE6IGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XG4gIGlmIChsaXR0bGVBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGxpdHRsZVopIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gbGl0dGxlQSArIGxpdHRsZU9mZnNldCk7XG4gIH1cblxuICAvLyA1MiAtIDYxOiAwMTIzNDU2Nzg5XG4gIGlmICh6ZXJvIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IG5pbmUpIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gemVybyArIG51bWJlck9mZnNldCk7XG4gIH1cblxuICAvLyA2MjogK1xuICBpZiAoY2hhckNvZGUgPT0gcGx1cykge1xuICAgIHJldHVybiA2MjtcbiAgfVxuXG4gIC8vIDYzOiAvXG4gIGlmIChjaGFyQ29kZSA9PSBzbGFzaCkge1xuICAgIHJldHVybiA2MztcbiAgfVxuXG4gIC8vIEludmFsaWQgYmFzZTY0IGRpZ2l0LlxuICByZXR1cm4gLTE7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmFzZTY0LmpzXG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHZhbHVlcyBmcm9tIHBhcmFtZXRlci9vcHRpb25zXG4gKiBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSBhcmdzIFRoZSBvYmplY3Qgd2UgYXJlIGV4dHJhY3RpbmcgdmFsdWVzIGZyb21cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3ZSBhcmUgZ2V0dGluZy5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgQW4gb3B0aW9uYWwgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nXG4gKiBmcm9tIHRoZSBvYmplY3QuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmcsIGFuXG4gKiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAqL1xuZnVuY3Rpb24gZ2V0QXJnKGFBcmdzLCBhTmFtZSwgYURlZmF1bHRWYWx1ZSkge1xuICBpZiAoYU5hbWUgaW4gYUFyZ3MpIHtcbiAgICByZXR1cm4gYUFyZ3NbYU5hbWVdO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gYURlZmF1bHRWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFOYW1lICsgJ1wiIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuJyk7XG4gIH1cbn1cbmV4cG9ydHMuZ2V0QXJnID0gZ2V0QXJnO1xuXG52YXIgdXJsUmVnZXhwID0gL14oPzooW1xcdytcXC0uXSspOik/XFwvXFwvKD86KFxcdys6XFx3KylAKT8oW1xcdy5dKikoPzo6KFxcZCspKT8oXFxTKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgISFhUGF0aC5tYXRjaCh1cmxSZWdleHApO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBtYXBwaW5nQS5zb3VyY2UgLSBtYXBwaW5nQi5zb3VyY2U7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDAgfHwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIG1hcHBpbmdBLm5hbWUgLSBtYXBwaW5nQi5uYW1lO1xufVxuZXhwb3J0cy5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyA9IGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zO1xuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBkZWZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgaW5kaWNlcyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiwgYnV0IGRpZmZlcmVudFxuICogc291cmNlL25hbWUvb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGFcbiAqIG1hcHBpbmcgd2l0aCBhIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5zb3VyY2UgLSBtYXBwaW5nQi5zb3VyY2U7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIG1hcHBpbmdBLm5hbWUgLSBtYXBwaW5nQi5uYW1lO1xufVxuZXhwb3J0cy5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCA9IGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkO1xuXG5mdW5jdGlvbiBzdHJjbXAoYVN0cjEsIGFTdHIyKSB7XG4gIGlmIChhU3RyMSA9PT0gYVN0cjIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2FycmF5LXNldC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9tYXBwaW5nLWxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXApIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSBKU09OLnBhcnNlKGFTb3VyY2VNYXAucmVwbGFjZSgvXlxcKVxcXVxcfScvLCAnJykpO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZU1hcC5zZWN0aW9ucyAhPSBudWxsXG4gICAgPyBuZXcgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcClcbiAgICA6IG5ldyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCk7XG59XG5cblNvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPSBmdW5jdGlvbihhU291cmNlTWFwKSB7XG4gIHJldHVybiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCk7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vLyBgX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kIGBfX29yaWdpbmFsTWFwcGluZ3NgIGFyZSBhcnJheXMgdGhhdCBob2xkIHRoZVxuLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbi8vIGFyZSBsYXppbHkgaW5zdGFudGlhdGVkLCBhY2Nlc3NlZCB2aWEgdGhlIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBnZXR0ZXJzIHJlc3BlY3RpdmVseSwgYW5kIHdlIG9ubHkgcGFyc2UgdGhlIG1hcHBpbmdzXG4vLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbi8vIHRoZXNlIGhvb3BzIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1hbnkgdGhvdXNhbmRzIG9mIG1hcHBpbmdzLCBhbmQgcGFyc2luZ1xuLy8gdGhlbSBpcyBleHBlbnNpdmUsIHNvIHdlIG9ubHkgd2FudCB0byBkbyBpdCBpZiB3ZSBtdXN0LlxuLy9cbi8vIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheXMgaXMgb2YgdGhlIGZvcm06XG4vL1xuLy8gICAgIHtcbi8vICAgICAgIGdlbmVyYXRlZExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBnZW5lcmF0ZWRDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbi8vICAgICAgICAgICAgICAgY2h1bmsgb2YgY29kZSxcbi8vICAgICAgIG9yaWdpbmFsTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4vLyAgICAgICAgICAgICBjb2RlLlxuLy8gICAgIH1cbi8vXG4vLyBBbGwgcHJvcGVydGllcyBleGNlcHQgZm9yIGBnZW5lcmF0ZWRMaW5lYCBhbmQgYGdlbmVyYXRlZENvbHVtbmAgY2FuIGJlXG4vLyBgbnVsbGAuXG4vL1xuLy8gYF9nZW5lcmF0ZWRNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucy5cbi8vXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19nZW5lcmF0ZWRNYXBwaW5ncycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MpIHtcbiAgICAgIHRoaXMuX3BhcnNlTWFwcGluZ3ModGhpcy5fbWFwcGluZ3MsIHRoaXMuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fX29yaWdpbmFsTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19vcmlnaW5hbE1hcHBpbmdzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4oc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBPcHRpb25hbC4gdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IoYUFyZ3MpIHtcbiAgICB2YXIgbGluZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpO1xuXG4gICAgLy8gV2hlbiB0aGVyZSBpcyBubyBleGFjdCBtYXRjaCwgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nXG4gICAgLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgbWFwcGluZyBsZXNzIHRoYW4gdGhlIG5lZWRsZS4gQnlcbiAgICAvLyBzZXR0aW5nIG5lZWRsZS5vcmlnaW5hbENvbHVtbiB0byAwLCB3ZSB0aHVzIGZpbmQgdGhlIGxhc3QgbWFwcGluZyBmb3JcbiAgICAvLyB0aGUgZ2l2ZW4gbGluZSwgcHJvdmlkZWQgc3VjaCBhIG1hcHBpbmcgZXhpc3RzLlxuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBzb3VyY2U6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyksXG4gICAgICBvcmlnaW5hbExpbmU6IGxpbmUsXG4gICAgICBvcmlnaW5hbENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nLCAwKVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIG5lZWRsZS5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgbmVlZGxlLnNvdXJjZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc291cmNlcy5oYXMobmVlZGxlLnNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihuZWVkbGUuc291cmNlKTtcblxuICAgIHZhciBtYXBwaW5ncyA9IFtdO1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcobmVlZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsTWFwcGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAoYUFyZ3MuY29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgIC8vIGEgbWFwcGluZyBmb3IgYSBkaWZmZXJlbnQgbGluZSB0aGFuIHRoZSBvbmUgd2UgZm91bmQuIFNpbmNlXG4gICAgICAgIC8vIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBmaW5kIGFsbCBtYXBwaW5ncyBmb3JcbiAgICAgICAgLy8gdGhlIGxpbmUgd2UgZm91bmQuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBvcmlnaW5hbExpbmUpIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgIC8vIGEgbWFwcGluZyBmb3IgYSBkaWZmZXJlbnQgbGluZSB0aGFuIHRoZSBvbmUgd2Ugd2VyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICAvLyBTaW5jZSBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJlxuICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09IGxpbmUgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPT0gb3JpZ2luYWxDb2x1bW4pIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBpbmdzO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaCB3ZSBjYW5cbiAqIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZmlsZSBwb3NpdGlvbnMgYnkgZ2l2aW5nIGl0IGEgZmlsZVxuICogcG9zaXRpb24gaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKlxuICogVGhlIG9ubHkgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gKiBhbHJlYWR5IHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNvdXJjZSBtYXBzIGhhdmUgdGhlXG4gKiBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqXG4gKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAqICAgLSBzb3VyY2VzOiBBbiBhcnJheSBvZiBVUkxzIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICogICAtIHNvdXJjZVJvb3Q6IE9wdGlvbmFsLiBUaGUgVVJMIHJvb3QgZnJvbSB3aGljaCBhbGwgc291cmNlcyBhcmUgcmVsYXRpdmUuXG4gKiAgIC0gc291cmNlc0NvbnRlbnQ6IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICpcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gKlxuICogICAgIHtcbiAqICAgICAgIHZlcnNpb24gOiAzLFxuICogICAgICAgZmlsZTogXCJvdXQuanNcIixcbiAqICAgICAgIHNvdXJjZVJvb3QgOiBcIlwiLFxuICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICBtYXBwaW5nczogXCJBQSxBQjs7QUJDREU7XCJcbiAqICAgICB9XG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNvdXJjZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzJyk7XG4gIC8vIFNhc3MgMy4zIGxlYXZlcyBvdXQgdGhlICduYW1lcycgYXJyYXksIHNvIHdlIGRldmlhdGUgZnJvbSB0aGUgc3BlYyAod2hpY2hcbiAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgdmFyIG5hbWVzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbmFtZXMnLCBbXSk7XG4gIHZhciBzb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICB2YXIgbWFwcGluZ3MgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdtYXBwaW5ncycpO1xuICB2YXIgZmlsZSA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ2ZpbGUnLCBudWxsKTtcblxuICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgLy8gc3RyaW5nIHJhdGhlciB0aGFuIGEgbnVtYmVyLCBzbyB3ZSB1c2UgbG9vc2UgZXF1YWxpdHkgY2hlY2tpbmcgaGVyZS5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgc291cmNlcyA9IHNvdXJjZXNcbiAgICAubWFwKFN0cmluZylcbiAgICAvLyBTb21lIHNvdXJjZSBtYXBzIHByb2R1Y2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIGxpa2UgXCIuL2Zvby5qc1wiIGluc3RlYWQgb2ZcbiAgICAvLyBcImZvby5qc1wiLiAgTm9ybWFsaXplIHRoZXNlIGZpcnN0IHNvIHRoYXQgZnV0dXJlIGNvbXBhcmlzb25zIHdpbGwgc3VjY2VlZC5cbiAgICAvLyBTZWUgYnVnemlsLmxhLzEwOTA3NjguXG4gICAgLm1hcCh1dGlsLm5vcm1hbGl6ZSlcbiAgICAvLyBBbHdheXMgZW5zdXJlIHRoYXQgYWJzb2x1dGUgc291cmNlcyBhcmUgaW50ZXJuYWxseSBzdG9yZWQgcmVsYXRpdmUgdG9cbiAgICAvLyB0aGUgc291cmNlIHJvb3QsIGlmIHRoZSBzb3VyY2Ugcm9vdCBpcyBhYnNvbHV0ZS4gTm90IGRvaW5nIHRoaXMgd291bGRcbiAgICAvLyBiZSBwYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMgd2hlbiB0aGUgc291cmNlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlXG4gICAgLy8gc291cmNlICh2YWxpZCwgYnV0IHdoeT8/KS4gU2VlIGdpdGh1YiBpc3N1ZSAjMTk5IGFuZCBidWd6aWwubGEvMTE4ODk4Mi5cbiAgICAubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIHJldHVybiBzb3VyY2VSb290ICYmIHV0aWwuaXNBYnNvbHV0ZShzb3VyY2VSb290KSAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlKVxuICAgICAgICA/IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlKVxuICAgICAgICA6IHNvdXJjZTtcbiAgICB9KTtcblxuICAvLyBQYXNzIGB0cnVlYCBiZWxvdyB0byBhbGxvdyBkdXBsaWNhdGUgbmFtZXMgYW5kIHNvdXJjZXMuIFdoaWxlIHNvdXJjZSBtYXBzXG4gIC8vIGFyZSBpbnRlbmRlZCB0byBiZSBjb21wcmVzc2VkIGFuZCBkZWR1cGxpY2F0ZWQsIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyXG4gIC8vIHNvbWV0aW1lcyBnZW5lcmF0ZXMgc291cmNlIG1hcHMgd2l0aCBkdXBsaWNhdGVzIGluIHRoZW0uIFNlZSBHaXRodWIgaXNzdWVcbiAgLy8gIzcyIGFuZCBidWd6aWwubGEvODg5NDkyLlxuICB0aGlzLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShuYW1lcy5tYXAoU3RyaW5nKSwgdHJ1ZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoc291cmNlcywgdHJ1ZSk7XG5cbiAgdGhpcy5zb3VyY2VSb290ID0gc291cmNlUm9vdDtcbiAgdGhpcy5zb3VyY2VzQ29udGVudCA9IHNvdXJjZXNDb250ZW50O1xuICB0aGlzLl9tYXBwaW5ncyA9IG1hcHBpbmdzO1xuICB0aGlzLmZpbGUgPSBmaWxlO1xufVxuXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQ3JlYXRlIGEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBmcm9tIGEgU291cmNlTWFwR2VuZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBTb3VyY2VNYXBHZW5lcmF0b3IgYVNvdXJjZU1hcFxuICogICAgICAgIFRoZSBzb3VyY2UgbWFwIHRoYXQgd2lsbCBiZSBjb25zdW1lZC5cbiAqIEByZXR1cm5zIEJhc2ljU291cmNlTWFwQ29uc3VtZXJcbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwKSB7XG4gICAgdmFyIHNtYyA9IE9iamVjdC5jcmVhdGUoQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuXG4gICAgdmFyIG5hbWVzID0gc21jLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9uYW1lcy50b0FycmF5KCksIHRydWUpO1xuICAgIHZhciBzb3VyY2VzID0gc21jLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX3NvdXJjZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICBzbWMuc291cmNlUm9vdCA9IGFTb3VyY2VNYXAuX3NvdXJjZVJvb3Q7XG4gICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jLnNvdXJjZVJvb3QpO1xuICAgIHNtYy5maWxlID0gYVNvdXJjZU1hcC5fZmlsZTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlUm9vdCAhPSBudWxsID8gdXRpbC5qb2luKHRoaXMuc291cmNlUm9vdCwgcykgOiBzO1xuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gYmlhczogRWl0aGVyICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICogICAgIERlZmF1bHRzIHRvICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhcbiAgICAgIG5lZWRsZSxcbiAgICAgIHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLFxuICAgICAgXCJnZW5lcmF0ZWRMaW5lXCIsXG4gICAgICBcImdlbmVyYXRlZENvbHVtblwiLFxuICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCxcbiAgICAgIHV0aWwuZ2V0QXJnKGFBcmdzLCAnYmlhcycsIFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EKVxuICAgICk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnc291cmNlJywgbnVsbCk7XG4gICAgICAgIGlmIChzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHNvdXJjZSk7XG4gICAgICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4odGhpcy5zb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICduYW1lJywgbnVsbCk7XG4gICAgICAgIGlmIChuYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgbmFtZSA9IHRoaXMuX25hbWVzLmF0KG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbmFtZTogbnVsbFxuICAgIH07XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMgPVxuICBmdW5jdGlvbiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudC5sZW5ndGggPj0gdGhpcy5fc291cmNlcy5zaXplKCkgJiZcbiAgICAgICF0aGlzLnNvdXJjZXNDb250ZW50LnNvbWUoZnVuY3Rpb24gKHNjKSB7IHJldHVybiBzYyA9PSBudWxsOyB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBhU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIGFTb3VyY2UpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhhU291cmNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKGFTb3VyY2UpXTtcbiAgICB9XG5cbiAgICB2YXIgdXJsO1xuICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbFxuICAgICAgICAmJiAodXJsID0gdXRpbC51cmxQYXJzZSh0aGlzLnNvdXJjZVJvb3QpKSkge1xuICAgICAgLy8gWFhYOiBmaWxlOi8vIFVSSXMgYW5kIGFic29sdXRlIHBhdGhzIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciBmb3JcbiAgICAgIC8vIG1hbnkgdXNlcnMuIFdlIGNhbiBoZWxwIHRoZW0gb3V0IHdoZW4gdGhleSBleHBlY3QgZmlsZTovLyBVUklzIHRvXG4gICAgICAvLyBiZWhhdmUgbGlrZSBpdCB3b3VsZCBpZiB0aGV5IHdlcmUgcnVubmluZyBhIGxvY2FsIEhUVFAgc2VydmVyLiBTZWVcbiAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTg4NTU5Ny5cbiAgICAgIHZhciBmaWxlVXJpQWJzUGF0aCA9IGFTb3VyY2UucmVwbGFjZSgvXmZpbGU6XFwvXFwvLywgXCJcIik7XG4gICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKGZpbGVVcmlBYnNQYXRoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoZmlsZVVyaUFic1BhdGgpXVxuICAgICAgfVxuXG4gICAgICBpZiAoKCF1cmwucGF0aCB8fCB1cmwucGF0aCA9PSBcIi9cIilcbiAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhcIi9cIiArIGFTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIGFTb3VyY2UpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgcmVjdXJzaXZlbHkgZnJvbVxuICAgIC8vIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvci4gSW4gdGhhdCBjYXNlLCB3ZVxuICAgIC8vIGRvbid0IHdhbnQgdG8gdGhyb3cgaWYgd2UgY2FuJ3QgZmluZCB0aGUgc291cmNlIC0gd2UganVzdCB3YW50IHRvXG4gICAgLy8gcmV0dXJuIG51bGwsIHNvIHdlIHByb3ZpZGUgYSBmbGFnIHRvIGV4aXQgZ3JhY2VmdWxseS5cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgc291cmNlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IG5lZWRsZS5zb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG5leHBvcnRzLkJhc2ljU291cmNlTWFwQ29uc3VtZXIgPSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEFuIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2hcbiAqIHdlIGNhbiBxdWVyeSBmb3IgaW5mb3JtYXRpb24uIEl0IGRpZmZlcnMgZnJvbSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluXG4gKiB0aGF0IGl0IHRha2VzIFwiaW5kZXhlZFwiIHNvdXJjZSBtYXBzIChpLmUuIG9uZXMgd2l0aCBhIFwic2VjdGlvbnNcIiBmaWVsZCkgYXNcbiAqIGlucHV0LlxuICpcbiAqIFRoZSBvbmx5IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQjaGVhZGluZz1oLjUzNWVzM3hlcHJndFxuICovXG5mdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSlcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgLy8gRmluZCB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24gd2UncmUgdHJ5aW5nIHRvIG1hcFxuICAgIC8vIHRvIGFuIG9yaWdpbmFsIHBvc2l0aW9uLlxuICAgIHZhciBzZWN0aW9uSW5kZXggPSBiaW5hcnlTZWFyY2guc2VhcmNoKG5lZWRsZSwgdGhpcy5fc2VjdGlvbnMsXG4gICAgICBmdW5jdGlvbihuZWVkbGUsIHNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNtcCA9IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC0gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZTtcbiAgICAgICAgaWYgKGNtcCkge1xuICAgICAgICAgIHJldHVybiBjbXA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgIHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbik7XG4gICAgICB9KTtcbiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW3NlY3Rpb25JbmRleF07XG5cbiAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBuYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzZWN0aW9uLmNvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgbGluZTogbmVlZGxlLmdlbmVyYXRlZExpbmUgLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgY29sdW1uOiBuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgIDogMCksXG4gICAgICBiaWFzOiBhQXJncy5iaWFzXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBzLmNvbnN1bWVyLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCk7XG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICB2YXIgY29udGVudCA9IHNlY3Rpb24uY29uc3VtZXIuc291cmNlQ29udGVudEZvcihhU291cmNlLCB0cnVlKTtcbiAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmdlbmVyYXRlZFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcblxuICAgICAgLy8gT25seSBjb25zaWRlciB0aGlzIHNlY3Rpb24gaWYgdGhlIHJlcXVlc3RlZCBzb3VyY2UgaXMgaW4gdGhlIGxpc3Qgb2ZcbiAgICAgIC8vIHNvdXJjZXMgb2YgdGhlIGNvbnN1bWVyLlxuICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuc291cmNlcy5pbmRleE9mKHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJykpID09PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBnZW5lcmF0ZWRQb3NpdGlvbiA9IHNlY3Rpb24uY29uc3VtZXIuZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpO1xuICAgICAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uKSB7XG4gICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkUG9zaXRpb24ubGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkUG9zaXRpb24uY29sdW1uICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lXG4gICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICAgOiAwKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcbiAgICAgIHZhciBzZWN0aW9uTWFwcGluZ3MgPSBzZWN0aW9uLmNvbnN1bWVyLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VjdGlvbk1hcHBpbmdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gc2VjdGlvbk1hcHBpbmdzW2pdO1xuXG4gICAgICAgIHZhciBzb3VyY2UgPSBzZWN0aW9uLmNvbnN1bWVyLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHV0aWwuam9pbihzZWN0aW9uLmNvbnN1bWVyLnNvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgICAgc291cmNlID0gdGhpcy5fc291cmNlcy5pbmRleE9mKHNvdXJjZSk7XG5cbiAgICAgICAgdmFyIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvcXVpY2stc29ydC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF07XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW5vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/node_modules/snapdragon/node_modules/source-map/dist/source-map.js b/node_modules/snapdragon/node_modules/source-map/dist/source-map.js new file mode 100644 index 00000000..4e630e29 --- /dev/null +++ b/node_modules/snapdragon/node_modules/source-map/dist/source-map.js @@ -0,0 +1,3090 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["sourceMap"] = factory(); + else + root["sourceMap"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer; + exports.SourceNode = __webpack_require__(10).SourceNode; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var base64VLQ = __webpack_require__(2); + var util = __webpack_require__(4); + var ArraySet = __webpack_require__(5).ArraySet; + var MappingList = __webpack_require__(6).MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error( + 'original.line and original.column are not numbers -- you probably meant to omit ' + + 'the original mapping entirely and only map the generated position. If so, pass ' + + 'null for the original mapping instead of an object with empty or null values.' + ); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + var base64 = __webpack_require__(3); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); + }()); + + function identity (s) { + return s; + } + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; + } + exports.toSetString = supportsNullProto ? identity : toSetString; + + function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; + } + exports.fromSetString = supportsNullProto ? identity : fromSetString; + + function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var has = Object.prototype.hasOwnProperty; + var hasNativeMap = typeof Map !== "undefined"; + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var binarySearch = __webpack_require__(8); + var ArraySet = __webpack_require__(5).ArraySet; + var base64VLQ = __webpack_require__(2); + var quickSort = __webpack_require__(9).quickSort; + + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + var util = __webpack_require__(4); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? + remainingLines[remainingLinesIndex++] : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/node_modules/snapdragon/node_modules/source-map/dist/source-map.min.js b/node_modules/snapdragon/node_modules/source-map/dist/source-map.min.js new file mode 100644 index 00000000..f2a46bd0 --- /dev/null +++ b/node_modules/snapdragon/node_modules/source-map/dist/source-map.min.js @@ -0,0 +1,2 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.sourceMap=n():e.sourceMap=n()}(this,function(){return function(e){function n(t){if(r[t])return r[t].exports;var o=r[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var r={};return n.m=e,n.c=r,n.p="",n(0)}([function(e,n,r){n.SourceMapGenerator=r(1).SourceMapGenerator,n.SourceMapConsumer=r(7).SourceMapConsumer,n.SourceNode=r(10).SourceNode},function(e,n,r){function t(e){e||(e={}),this._file=i.getArg(e,"file",null),this._sourceRoot=i.getArg(e,"sourceRoot",null),this._skipValidation=i.getArg(e,"skipValidation",!1),this._sources=new s,this._names=new s,this._mappings=new a,this._sourcesContents=null}var o=r(2),i=r(4),s=r(5).ArraySet,a=r(6).MappingList;t.prototype._version=3,t.fromSourceMap=function(e){var n=e.sourceRoot,r=new t({file:e.file,sourceRoot:n});return e.eachMapping(function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(t.source=e.source,null!=n&&(t.source=i.relative(n,t.source)),t.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(t.name=e.name)),r.addMapping(t)}),e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&r.setSourceContent(n,t)}),r},t.prototype.addMapping=function(e){var n=i.getArg(e,"generated"),r=i.getArg(e,"original",null),t=i.getArg(e,"source",null),o=i.getArg(e,"name",null);this._skipValidation||this._validateMapping(n,r,t,o),null!=t&&(t=String(t),this._sources.has(t)||this._sources.add(t)),null!=o&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:n.line,generatedColumn:n.column,originalLine:null!=r&&r.line,originalColumn:null!=r&&r.column,source:t,name:o})},t.prototype.setSourceContent=function(e,n){var r=e;null!=this._sourceRoot&&(r=i.relative(this._sourceRoot,r)),null!=n?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[i.toSetString(r)]=n):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(r)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},t.prototype.applySourceMap=function(e,n,r){var t=n;if(null==n){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');t=e.file}var o=this._sourceRoot;null!=o&&(t=i.relative(o,t));var a=new s,u=new s;this._mappings.unsortedForEach(function(n){if(n.source===t&&null!=n.originalLine){var s=e.originalPositionFor({line:n.originalLine,column:n.originalColumn});null!=s.source&&(n.source=s.source,null!=r&&(n.source=i.join(r,n.source)),null!=o&&(n.source=i.relative(o,n.source)),n.originalLine=s.line,n.originalColumn=s.column,null!=s.name&&(n.name=s.name))}var l=n.source;null==l||a.has(l)||a.add(l);var c=n.name;null==c||u.has(c)||u.add(c)},this),this._sources=a,this._names=u,e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&(null!=r&&(n=i.join(r,n)),null!=o&&(n=i.relative(o,n)),this.setSourceContent(n,t))},this)},t.prototype._validateMapping=function(e,n,r,t){if(n&&"number"!=typeof n.line&&"number"!=typeof n.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||n||r||t)&&!(e&&"line"in e&&"column"in e&&n&&"line"in n&&"column"in n&&e.line>0&&e.column>=0&&n.line>0&&n.column>=0&&r))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:r,original:n,name:t}))},t.prototype._serializeMappings=function(){for(var e,n,r,t,s=0,a=1,u=0,l=0,c=0,g=0,p="",h=this._mappings.toArray(),f=0,d=h.length;f0){if(!i.compareByGeneratedPositionsInflated(n,h[f-1]))continue;e+=","}e+=o.encode(n.generatedColumn-s),s=n.generatedColumn,null!=n.source&&(t=this._sources.indexOf(n.source),e+=o.encode(t-g),g=t,e+=o.encode(n.originalLine-1-l),l=n.originalLine-1,e+=o.encode(n.originalColumn-u),u=n.originalColumn,null!=n.name&&(r=this._names.indexOf(n.name),e+=o.encode(r-c),c=r)),p+=e}return p},t.prototype._generateSourcesContent=function(e,n){return e.map(function(e){if(!this._sourcesContents)return null;null!=n&&(e=i.relative(n,e));var r=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,r)?this._sourcesContents[r]:null},this)},t.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},t.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=t},function(e,n,r){function t(e){return e<0?(-e<<1)+1:(e<<1)+0}function o(e){var n=1===(1&e),r=e>>1;return n?-r:r}var i=r(3),s=5,a=1<>>=s,o>0&&(n|=l),r+=i.encode(n);while(o>0);return r},n.decode=function(e,n,r){var t,a,c=e.length,g=0,p=0;do{if(n>=c)throw new Error("Expected more digits in base 64 VLQ value.");if(a=i.decode(e.charCodeAt(n++)),a===-1)throw new Error("Invalid base64 digit: "+e.charAt(n-1));t=!!(a&l),a&=u,g+=a<=0;c--)s=u[c],"."===s?u.splice(c,1):".."===s?l++:l>0&&(""===s?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return r=u.join("/"),""===r&&(r=a?"/":"."),i?(i.path=r,o(i)):r}function s(e,n){""===e&&(e="."),""===n&&(n=".");var r=t(n),s=t(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||n.match(_))return n;if(s&&!s.host&&!s.path)return s.host=n,o(s);var a="/"===n.charAt(0)?n:i(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=a,o(s)):a}function a(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if(e=e.slice(0,t),e.match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)}function u(e){return e}function l(e){return g(e)?"$"+e:e}function c(e){return g(e)?e.slice(1):e}function g(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function p(e,n,r){var t=e.source-n.source;return 0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t||r?t:(t=e.generatedColumn-n.generatedColumn,0!==t?t:(t=e.generatedLine-n.generatedLine,0!==t?t:e.name-n.name))))}function h(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:(t=e.generatedColumn-n.generatedColumn,0!==t||r?t:(t=e.source-n.source,0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:e.name-n.name))))}function f(e,n){return e===n?0:e>n?1:-1}function d(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:(r=e.generatedColumn-n.generatedColumn,0!==r?r:(r=f(e.source,n.source),0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r?r:f(e.name,n.name)))))}n.getArg=r;var m=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/,_=/^data:.+\,.+$/;n.urlParse=t,n.urlGenerate=o,n.normalize=i,n.join=s,n.isAbsolute=function(e){return"/"===e.charAt(0)||!!e.match(m)},n.relative=a;var v=function(){var e=Object.create(null);return!("__proto__"in e)}();n.toSetString=v?u:l,n.fromSetString=v?u:c,n.compareByOriginalPositions=p,n.compareByGeneratedPositionsDeflated=h,n.compareByGeneratedPositionsInflated=d},function(e,n,r){function t(){this._array=[],this._set=s?new Map:Object.create(null)}var o=r(4),i=Object.prototype.hasOwnProperty,s="undefined"!=typeof Map;t.fromArray=function(e,n){for(var r=new t,o=0,i=e.length;o=0)return n}else{var r=o.toSetString(e);if(i.call(this._set,r))return this._set[r]}throw new Error('"'+e+'" is not in the set.')},t.prototype.at=function(e){if(e>=0&&er||t==r&&s>=o||i.compareByGeneratedPositionsInflated(e,n)<=0}function o(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}var i=r(4);o.prototype.unsortedForEach=function(e,n){this._array.forEach(e,n)},o.prototype.add=function(e){t(this._last,e)?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},o.prototype.toArray=function(){return this._sorted||(this._array.sort(i.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=o},function(e,n,r){function t(e){var n=e;return"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,""))),null!=n.sections?new s(n):new o(n)}function o(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=a.getArg(n,"version"),t=a.getArg(n,"sources"),o=a.getArg(n,"names",[]),i=a.getArg(n,"sourceRoot",null),s=a.getArg(n,"sourcesContent",null),u=a.getArg(n,"mappings"),c=a.getArg(n,"file",null);if(r!=this._version)throw new Error("Unsupported version: "+r);t=t.map(String).map(a.normalize).map(function(e){return i&&a.isAbsolute(i)&&a.isAbsolute(e)?a.relative(i,e):e}),this._names=l.fromArray(o.map(String),!0),this._sources=l.fromArray(t,!0),this.sourceRoot=i,this.sourcesContent=s,this._mappings=u,this.file=c}function i(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function s(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=a.getArg(n,"version"),o=a.getArg(n,"sections");if(r!=this._version)throw new Error("Unsupported version: "+r);this._sources=new l,this._names=new l;var i={line:-1,column:0};this._sections=o.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var n=a.getArg(e,"offset"),r=a.getArg(n,"line"),o=a.getArg(n,"column");if(r=0){var i=this._originalMappings[o];if(void 0===e.column)for(var s=i.originalLine;i&&i.originalLine===s;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o];else for(var l=i.originalColumn;i&&i.originalLine===n&&i.originalColumn==l;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o]}return t},n.SourceMapConsumer=t,o.prototype=Object.create(t.prototype),o.prototype.consumer=t,o.fromSourceMap=function(e){var n=Object.create(o.prototype),r=n._names=l.fromArray(e._names.toArray(),!0),t=n._sources=l.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var s=e._mappings.toArray().slice(),u=n.__generatedMappings=[],c=n.__originalMappings=[],p=0,h=s.length;p1&&(r.source=d+o[1],d+=o[1],r.originalLine=h+o[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+o[3],f=r.originalColumn,o.length>4&&(r.name=m+o[4],m+=o[4])),S.push(r),"number"==typeof r.originalLine&&A.push(r)}g(S,a.compareByGeneratedPositionsDeflated),this.__generatedMappings=S,g(A,a.compareByOriginalPositions),this.__originalMappings=A},o.prototype._findMapping=function(e,n,r,t,o,i){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return u.search(e,n,o,i)},o.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=a.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=a.join(this.sourceRoot,i)));var s=a.getArg(o,"name",null);return null!==s&&(s=this._names.at(s)),{source:i,line:a.getArg(o,"originalLine",null),column:a.getArg(o,"originalColumn",null),name:s}}}return{source:null,line:null,column:null,name:null}},o.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},o.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=a.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=a.urlParse(this.sourceRoot))){var t=e.replace(/^file:\/\//,"");if("file"==r.scheme&&this._sources.has(t))return this.sourcesContent[this._sources.indexOf(t)];if((!r.path||"/"==r.path)&&this._sources.has("/"+e))return this.sourcesContent[this._sources.indexOf("/"+e)]}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},o.prototype.generatedPositionFor=function(e){var n=a.getArg(e,"source");if(null!=this.sourceRoot&&(n=a.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};n=this._sources.indexOf(n);var r={source:n,originalLine:a.getArg(e,"line"),originalColumn:a.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=o,s.prototype=Object.create(t.prototype),s.prototype.constructor=t,s.prototype._version=3,Object.defineProperty(s.prototype,"sources",{get:function(){for(var e=[],n=0;n0?t-u>1?r(u,t,o,i,s,a):a==n.LEAST_UPPER_BOUND?t1?r(e,u,o,i,s,a):a==n.LEAST_UPPER_BOUND?u:e<0?-1:e}n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,t,o,i){if(0===t.length)return-1;var s=r(-1,t.length,e,t,o,i||n.GREATEST_LOWER_BOUND);if(s<0)return-1;for(;s-1>=0&&0===o(t[s],t[s-1],!0);)--s;return s}},function(e,n){function r(e,n,r){var t=e[n];e[n]=e[r],e[r]=t}function t(e,n){return Math.round(e+Math.random()*(n-e))}function o(e,n,i,s){if(i=0;n--)this.prepend(e[n]);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);this.children.unshift(e)}return this},t.prototype.walk=function(e){for(var n,r=0,t=this.children.length;r0){for(n=[],r=0;r 0 && aGenerated.column >= 0\n\t && !aOriginal && !aSource && !aName) {\n\t // Case 1.\n\t return;\n\t }\n\t else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n\t && aGenerated.line > 0 && aGenerated.column >= 0\n\t && aOriginal.line > 0 && aOriginal.column >= 0\n\t && aSource) {\n\t // Cases 2 and 3.\n\t return;\n\t }\n\t else {\n\t throw new Error('Invalid mapping: ' + JSON.stringify({\n\t generated: aGenerated,\n\t source: aSource,\n\t original: aOriginal,\n\t name: aName\n\t }));\n\t }\n\t };\n\t\n\t/**\n\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\n\t * specified by the source map format.\n\t */\n\tSourceMapGenerator.prototype._serializeMappings =\n\t function SourceMapGenerator_serializeMappings() {\n\t var previousGeneratedColumn = 0;\n\t var previousGeneratedLine = 1;\n\t var previousOriginalColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousName = 0;\n\t var previousSource = 0;\n\t var result = '';\n\t var next;\n\t var mapping;\n\t var nameIdx;\n\t var sourceIdx;\n\t\n\t var mappings = this._mappings.toArray();\n\t for (var i = 0, len = mappings.length; i < len; i++) {\n\t mapping = mappings[i];\n\t next = ''\n\t\n\t if (mapping.generatedLine !== previousGeneratedLine) {\n\t previousGeneratedColumn = 0;\n\t while (mapping.generatedLine !== previousGeneratedLine) {\n\t next += ';';\n\t previousGeneratedLine++;\n\t }\n\t }\n\t else {\n\t if (i > 0) {\n\t if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n\t continue;\n\t }\n\t next += ',';\n\t }\n\t }\n\t\n\t next += base64VLQ.encode(mapping.generatedColumn\n\t - previousGeneratedColumn);\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (mapping.source != null) {\n\t sourceIdx = this._sources.indexOf(mapping.source);\n\t next += base64VLQ.encode(sourceIdx - previousSource);\n\t previousSource = sourceIdx;\n\t\n\t // lines are stored 0-based in SourceMap spec version 3\n\t next += base64VLQ.encode(mapping.originalLine - 1\n\t - previousOriginalLine);\n\t previousOriginalLine = mapping.originalLine - 1;\n\t\n\t next += base64VLQ.encode(mapping.originalColumn\n\t - previousOriginalColumn);\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (mapping.name != null) {\n\t nameIdx = this._names.indexOf(mapping.name);\n\t next += base64VLQ.encode(nameIdx - previousName);\n\t previousName = nameIdx;\n\t }\n\t }\n\t\n\t result += next;\n\t }\n\t\n\t return result;\n\t };\n\t\n\tSourceMapGenerator.prototype._generateSourcesContent =\n\t function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n\t return aSources.map(function (source) {\n\t if (!this._sourcesContents) {\n\t return null;\n\t }\n\t if (aSourceRoot != null) {\n\t source = util.relative(aSourceRoot, source);\n\t }\n\t var key = util.toSetString(source);\n\t return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n\t ? this._sourcesContents[key]\n\t : null;\n\t }, this);\n\t };\n\t\n\t/**\n\t * Externalize the source map.\n\t */\n\tSourceMapGenerator.prototype.toJSON =\n\t function SourceMapGenerator_toJSON() {\n\t var map = {\n\t version: this._version,\n\t sources: this._sources.toArray(),\n\t names: this._names.toArray(),\n\t mappings: this._serializeMappings()\n\t };\n\t if (this._file != null) {\n\t map.file = this._file;\n\t }\n\t if (this._sourceRoot != null) {\n\t map.sourceRoot = this._sourceRoot;\n\t }\n\t if (this._sourcesContents) {\n\t map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n\t }\n\t\n\t return map;\n\t };\n\t\n\t/**\n\t * Render the source map being generated to a string.\n\t */\n\tSourceMapGenerator.prototype.toString =\n\t function SourceMapGenerator_toString() {\n\t return JSON.stringify(this.toJSON());\n\t };\n\t\n\texports.SourceMapGenerator = SourceMapGenerator;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t *\n\t * Based on the Base 64 VLQ implementation in Closure Compiler:\n\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n\t *\n\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are\n\t * met:\n\t *\n\t * * Redistributions of source code must retain the above copyright\n\t * notice, this list of conditions and the following disclaimer.\n\t * * Redistributions in binary form must reproduce the above\n\t * copyright notice, this list of conditions and the following\n\t * disclaimer in the documentation and/or other materials provided\n\t * with the distribution.\n\t * * Neither the name of Google Inc. nor the names of its\n\t * contributors may be used to endorse or promote products derived\n\t * from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t */\n\t\n\tvar base64 = __webpack_require__(3);\n\t\n\t// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n\t// length quantities we use in the source map spec, the first bit is the sign,\n\t// the next four bits are the actual value, and the 6th bit is the\n\t// continuation bit. The continuation bit tells us whether there are more\n\t// digits in this value following this digit.\n\t//\n\t// Continuation\n\t// | Sign\n\t// | |\n\t// V V\n\t// 101011\n\t\n\tvar VLQ_BASE_SHIFT = 5;\n\t\n\t// binary: 100000\n\tvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\t\n\t// binary: 011111\n\tvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\t\n\t// binary: 100000\n\tvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\t\n\t/**\n\t * Converts from a two-complement value to a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n\t * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n\t */\n\tfunction toVLQSigned(aValue) {\n\t return aValue < 0\n\t ? ((-aValue) << 1) + 1\n\t : (aValue << 1) + 0;\n\t}\n\t\n\t/**\n\t * Converts to a two-complement value from a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n\t * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n\t */\n\tfunction fromVLQSigned(aValue) {\n\t var isNegative = (aValue & 1) === 1;\n\t var shifted = aValue >> 1;\n\t return isNegative\n\t ? -shifted\n\t : shifted;\n\t}\n\t\n\t/**\n\t * Returns the base 64 VLQ encoded value.\n\t */\n\texports.encode = function base64VLQ_encode(aValue) {\n\t var encoded = \"\";\n\t var digit;\n\t\n\t var vlq = toVLQSigned(aValue);\n\t\n\t do {\n\t digit = vlq & VLQ_BASE_MASK;\n\t vlq >>>= VLQ_BASE_SHIFT;\n\t if (vlq > 0) {\n\t // There are still more digits in this value, so we must make sure the\n\t // continuation bit is marked.\n\t digit |= VLQ_CONTINUATION_BIT;\n\t }\n\t encoded += base64.encode(digit);\n\t } while (vlq > 0);\n\t\n\t return encoded;\n\t};\n\t\n\t/**\n\t * Decodes the next base 64 VLQ value from the given string and returns the\n\t * value and the rest of the string via the out parameter.\n\t */\n\texports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n\t var strLen = aStr.length;\n\t var result = 0;\n\t var shift = 0;\n\t var continuation, digit;\n\t\n\t do {\n\t if (aIndex >= strLen) {\n\t throw new Error(\"Expected more digits in base 64 VLQ value.\");\n\t }\n\t\n\t digit = base64.decode(aStr.charCodeAt(aIndex++));\n\t if (digit === -1) {\n\t throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n\t }\n\t\n\t continuation = !!(digit & VLQ_CONTINUATION_BIT);\n\t digit &= VLQ_BASE_MASK;\n\t result = result + (digit << shift);\n\t shift += VLQ_BASE_SHIFT;\n\t } while (continuation);\n\t\n\t aOutParam.value = fromVLQSigned(result);\n\t aOutParam.rest = aIndex;\n\t};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\t\n\t/**\n\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n\t */\n\texports.encode = function (number) {\n\t if (0 <= number && number < intToCharMap.length) {\n\t return intToCharMap[number];\n\t }\n\t throw new TypeError(\"Must be between 0 and 63: \" + number);\n\t};\n\t\n\t/**\n\t * Decode a single base 64 character code digit to an integer. Returns -1 on\n\t * failure.\n\t */\n\texports.decode = function (charCode) {\n\t var bigA = 65; // 'A'\n\t var bigZ = 90; // 'Z'\n\t\n\t var littleA = 97; // 'a'\n\t var littleZ = 122; // 'z'\n\t\n\t var zero = 48; // '0'\n\t var nine = 57; // '9'\n\t\n\t var plus = 43; // '+'\n\t var slash = 47; // '/'\n\t\n\t var littleOffset = 26;\n\t var numberOffset = 52;\n\t\n\t // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t if (bigA <= charCode && charCode <= bigZ) {\n\t return (charCode - bigA);\n\t }\n\t\n\t // 26 - 51: abcdefghijklmnopqrstuvwxyz\n\t if (littleA <= charCode && charCode <= littleZ) {\n\t return (charCode - littleA + littleOffset);\n\t }\n\t\n\t // 52 - 61: 0123456789\n\t if (zero <= charCode && charCode <= nine) {\n\t return (charCode - zero + numberOffset);\n\t }\n\t\n\t // 62: +\n\t if (charCode == plus) {\n\t return 62;\n\t }\n\t\n\t // 63: /\n\t if (charCode == slash) {\n\t return 63;\n\t }\n\t\n\t // Invalid base64 digit.\n\t return -1;\n\t};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t/**\n\t * This is a helper function for getting values from parameter/options\n\t * objects.\n\t *\n\t * @param args The object we are extracting values from\n\t * @param name The name of the property we are getting.\n\t * @param defaultValue An optional value to return if the property is missing\n\t * from the object. If this is not specified and the property is missing, an\n\t * error will be thrown.\n\t */\n\tfunction getArg(aArgs, aName, aDefaultValue) {\n\t if (aName in aArgs) {\n\t return aArgs[aName];\n\t } else if (arguments.length === 3) {\n\t return aDefaultValue;\n\t } else {\n\t throw new Error('\"' + aName + '\" is a required argument.');\n\t }\n\t}\n\texports.getArg = getArg;\n\t\n\tvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\n\tvar dataUrlRegexp = /^data:.+\\,.+$/;\n\t\n\tfunction urlParse(aUrl) {\n\t var match = aUrl.match(urlRegexp);\n\t if (!match) {\n\t return null;\n\t }\n\t return {\n\t scheme: match[1],\n\t auth: match[2],\n\t host: match[3],\n\t port: match[4],\n\t path: match[5]\n\t };\n\t}\n\texports.urlParse = urlParse;\n\t\n\tfunction urlGenerate(aParsedUrl) {\n\t var url = '';\n\t if (aParsedUrl.scheme) {\n\t url += aParsedUrl.scheme + ':';\n\t }\n\t url += '//';\n\t if (aParsedUrl.auth) {\n\t url += aParsedUrl.auth + '@';\n\t }\n\t if (aParsedUrl.host) {\n\t url += aParsedUrl.host;\n\t }\n\t if (aParsedUrl.port) {\n\t url += \":\" + aParsedUrl.port\n\t }\n\t if (aParsedUrl.path) {\n\t url += aParsedUrl.path;\n\t }\n\t return url;\n\t}\n\texports.urlGenerate = urlGenerate;\n\t\n\t/**\n\t * Normalizes a path, or the path portion of a URL:\n\t *\n\t * - Replaces consecutive slashes with one slash.\n\t * - Removes unnecessary '.' parts.\n\t * - Removes unnecessary '/..' parts.\n\t *\n\t * Based on code in the Node.js 'path' core module.\n\t *\n\t * @param aPath The path or url to normalize.\n\t */\n\tfunction normalize(aPath) {\n\t var path = aPath;\n\t var url = urlParse(aPath);\n\t if (url) {\n\t if (!url.path) {\n\t return aPath;\n\t }\n\t path = url.path;\n\t }\n\t var isAbsolute = exports.isAbsolute(path);\n\t\n\t var parts = path.split(/\\/+/);\n\t for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n\t part = parts[i];\n\t if (part === '.') {\n\t parts.splice(i, 1);\n\t } else if (part === '..') {\n\t up++;\n\t } else if (up > 0) {\n\t if (part === '') {\n\t // The first part is blank if the path is absolute. Trying to go\n\t // above the root is a no-op. Therefore we can remove all '..' parts\n\t // directly after the root.\n\t parts.splice(i + 1, up);\n\t up = 0;\n\t } else {\n\t parts.splice(i, 2);\n\t up--;\n\t }\n\t }\n\t }\n\t path = parts.join('/');\n\t\n\t if (path === '') {\n\t path = isAbsolute ? '/' : '.';\n\t }\n\t\n\t if (url) {\n\t url.path = path;\n\t return urlGenerate(url);\n\t }\n\t return path;\n\t}\n\texports.normalize = normalize;\n\t\n\t/**\n\t * Joins two paths/URLs.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be joined with the root.\n\t *\n\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n\t * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n\t * first.\n\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n\t * is updated with the result and aRoot is returned. Otherwise the result\n\t * is returned.\n\t * - If aPath is absolute, the result is aPath.\n\t * - Otherwise the two paths are joined with a slash.\n\t * - Joining for example 'http://' and 'www.example.com' is also supported.\n\t */\n\tfunction join(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t if (aPath === \"\") {\n\t aPath = \".\";\n\t }\n\t var aPathUrl = urlParse(aPath);\n\t var aRootUrl = urlParse(aRoot);\n\t if (aRootUrl) {\n\t aRoot = aRootUrl.path || '/';\n\t }\n\t\n\t // `join(foo, '//www.example.org')`\n\t if (aPathUrl && !aPathUrl.scheme) {\n\t if (aRootUrl) {\n\t aPathUrl.scheme = aRootUrl.scheme;\n\t }\n\t return urlGenerate(aPathUrl);\n\t }\n\t\n\t if (aPathUrl || aPath.match(dataUrlRegexp)) {\n\t return aPath;\n\t }\n\t\n\t // `join('http://', 'www.example.com')`\n\t if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n\t aRootUrl.host = aPath;\n\t return urlGenerate(aRootUrl);\n\t }\n\t\n\t var joined = aPath.charAt(0) === '/'\n\t ? aPath\n\t : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\t\n\t if (aRootUrl) {\n\t aRootUrl.path = joined;\n\t return urlGenerate(aRootUrl);\n\t }\n\t return joined;\n\t}\n\texports.join = join;\n\t\n\texports.isAbsolute = function (aPath) {\n\t return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n\t};\n\t\n\t/**\n\t * Make a path relative to a URL or another path.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be made relative to aRoot.\n\t */\n\tfunction relative(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t\n\t aRoot = aRoot.replace(/\\/$/, '');\n\t\n\t // It is possible for the path to be above the root. In this case, simply\n\t // checking whether the root is a prefix of the path won't work. Instead, we\n\t // need to remove components from the root one by one, until either we find\n\t // a prefix that fits, or we run out of components to remove.\n\t var level = 0;\n\t while (aPath.indexOf(aRoot + '/') !== 0) {\n\t var index = aRoot.lastIndexOf(\"/\");\n\t if (index < 0) {\n\t return aPath;\n\t }\n\t\n\t // If the only part of the root that is left is the scheme (i.e. http://,\n\t // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n\t // have exhausted all components, so the path is not relative to the root.\n\t aRoot = aRoot.slice(0, index);\n\t if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n\t return aPath;\n\t }\n\t\n\t ++level;\n\t }\n\t\n\t // Make sure we add a \"../\" for each component we removed from the root.\n\t return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n\t}\n\texports.relative = relative;\n\t\n\tvar supportsNullProto = (function () {\n\t var obj = Object.create(null);\n\t return !('__proto__' in obj);\n\t}());\n\t\n\tfunction identity (s) {\n\t return s;\n\t}\n\t\n\t/**\n\t * Because behavior goes wacky when you set `__proto__` on objects, we\n\t * have to prefix all the strings in our set with an arbitrary character.\n\t *\n\t * See https://github.com/mozilla/source-map/pull/31 and\n\t * https://github.com/mozilla/source-map/issues/30\n\t *\n\t * @param String aStr\n\t */\n\tfunction toSetString(aStr) {\n\t if (isProtoString(aStr)) {\n\t return '$' + aStr;\n\t }\n\t\n\t return aStr;\n\t}\n\texports.toSetString = supportsNullProto ? identity : toSetString;\n\t\n\tfunction fromSetString(aStr) {\n\t if (isProtoString(aStr)) {\n\t return aStr.slice(1);\n\t }\n\t\n\t return aStr;\n\t}\n\texports.fromSetString = supportsNullProto ? identity : fromSetString;\n\t\n\tfunction isProtoString(s) {\n\t if (!s) {\n\t return false;\n\t }\n\t\n\t var length = s.length;\n\t\n\t if (length < 9 /* \"__proto__\".length */) {\n\t return false;\n\t }\n\t\n\t if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n\t s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n\t s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n\t s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n\t s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n\t s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 9) !== 95 /* '_' */) {\n\t return false;\n\t }\n\t\n\t for (var i = length - 10; i >= 0; i--) {\n\t if (s.charCodeAt(i) !== 36 /* '$' */) {\n\t return false;\n\t }\n\t }\n\t\n\t return true;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings where the original positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same original source/line/column, but different generated\n\t * line and column the same. Useful when searching for a mapping with a\n\t * stubbed out mapping.\n\t */\n\tfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n\t var cmp = mappingA.source - mappingB.source;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0 || onlyCompareOriginal) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return mappingA.name - mappingB.name;\n\t}\n\texports.compareByOriginalPositions = compareByOriginalPositions;\n\t\n\t/**\n\t * Comparator between two mappings with deflated source and name indices where\n\t * the generated positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same generated line and column, but different\n\t * source/name/original line and column the same. Useful when searching for a\n\t * mapping with a stubbed out mapping.\n\t */\n\tfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0 || onlyCompareGenerated) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.source - mappingB.source;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return mappingA.name - mappingB.name;\n\t}\n\texports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\t\n\tfunction strcmp(aStr1, aStr2) {\n\t if (aStr1 === aStr2) {\n\t return 0;\n\t }\n\t\n\t if (aStr1 > aStr2) {\n\t return 1;\n\t }\n\t\n\t return -1;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings with inflated source and name strings where\n\t * the generated positions are compared.\n\t */\n\tfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = strcmp(mappingA.source, mappingB.source);\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar hasNativeMap = typeof Map !== \"undefined\";\n\t\n\t/**\n\t * A data structure which is a combination of an array and a set. Adding a new\n\t * member is O(1), testing for membership is O(1), and finding the index of an\n\t * element is O(1). Removing elements from the set is not supported. Only\n\t * strings are supported for membership.\n\t */\n\tfunction ArraySet() {\n\t this._array = [];\n\t this._set = hasNativeMap ? new Map() : Object.create(null);\n\t}\n\t\n\t/**\n\t * Static method for creating ArraySet instances from an existing array.\n\t */\n\tArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n\t var set = new ArraySet();\n\t for (var i = 0, len = aArray.length; i < len; i++) {\n\t set.add(aArray[i], aAllowDuplicates);\n\t }\n\t return set;\n\t};\n\t\n\t/**\n\t * Return how many unique items are in this ArraySet. If duplicates have been\n\t * added, than those do not count towards the size.\n\t *\n\t * @returns Number\n\t */\n\tArraySet.prototype.size = function ArraySet_size() {\n\t return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n\t};\n\t\n\t/**\n\t * Add the given string to this set.\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n\t var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n\t var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n\t var idx = this._array.length;\n\t if (!isDuplicate || aAllowDuplicates) {\n\t this._array.push(aStr);\n\t }\n\t if (!isDuplicate) {\n\t if (hasNativeMap) {\n\t this._set.set(aStr, idx);\n\t } else {\n\t this._set[sStr] = idx;\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Is the given string a member of this set?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.has = function ArraySet_has(aStr) {\n\t if (hasNativeMap) {\n\t return this._set.has(aStr);\n\t } else {\n\t var sStr = util.toSetString(aStr);\n\t return has.call(this._set, sStr);\n\t }\n\t};\n\t\n\t/**\n\t * What is the index of the given string in the array?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n\t if (hasNativeMap) {\n\t var idx = this._set.get(aStr);\n\t if (idx >= 0) {\n\t return idx;\n\t }\n\t } else {\n\t var sStr = util.toSetString(aStr);\n\t if (has.call(this._set, sStr)) {\n\t return this._set[sStr];\n\t }\n\t }\n\t\n\t throw new Error('\"' + aStr + '\" is not in the set.');\n\t};\n\t\n\t/**\n\t * What is the element at the given index?\n\t *\n\t * @param Number aIdx\n\t */\n\tArraySet.prototype.at = function ArraySet_at(aIdx) {\n\t if (aIdx >= 0 && aIdx < this._array.length) {\n\t return this._array[aIdx];\n\t }\n\t throw new Error('No element indexed by ' + aIdx);\n\t};\n\t\n\t/**\n\t * Returns the array representation of this set (which has the proper indices\n\t * indicated by indexOf). Note that this is a copy of the internal array used\n\t * for storing the members so that no one can mess with internal state.\n\t */\n\tArraySet.prototype.toArray = function ArraySet_toArray() {\n\t return this._array.slice();\n\t};\n\t\n\texports.ArraySet = ArraySet;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2014 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\t\n\t/**\n\t * Determine whether mappingB is after mappingA with respect to generated\n\t * position.\n\t */\n\tfunction generatedPositionAfter(mappingA, mappingB) {\n\t // Optimized for most common case\n\t var lineA = mappingA.generatedLine;\n\t var lineB = mappingB.generatedLine;\n\t var columnA = mappingA.generatedColumn;\n\t var columnB = mappingB.generatedColumn;\n\t return lineB > lineA || lineB == lineA && columnB >= columnA ||\n\t util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n\t}\n\t\n\t/**\n\t * A data structure to provide a sorted view of accumulated mappings in a\n\t * performance conscious manner. It trades a neglibable overhead in general\n\t * case for a large speedup in case of mappings being added in order.\n\t */\n\tfunction MappingList() {\n\t this._array = [];\n\t this._sorted = true;\n\t // Serves as infimum\n\t this._last = {generatedLine: -1, generatedColumn: 0};\n\t}\n\t\n\t/**\n\t * Iterate through internal items. This method takes the same arguments that\n\t * `Array.prototype.forEach` takes.\n\t *\n\t * NOTE: The order of the mappings is NOT guaranteed.\n\t */\n\tMappingList.prototype.unsortedForEach =\n\t function MappingList_forEach(aCallback, aThisArg) {\n\t this._array.forEach(aCallback, aThisArg);\n\t };\n\t\n\t/**\n\t * Add the given source mapping.\n\t *\n\t * @param Object aMapping\n\t */\n\tMappingList.prototype.add = function MappingList_add(aMapping) {\n\t if (generatedPositionAfter(this._last, aMapping)) {\n\t this._last = aMapping;\n\t this._array.push(aMapping);\n\t } else {\n\t this._sorted = false;\n\t this._array.push(aMapping);\n\t }\n\t};\n\t\n\t/**\n\t * Returns the flat, sorted array of mappings. The mappings are sorted by\n\t * generated position.\n\t *\n\t * WARNING: This method returns internal data without copying, for\n\t * performance. The return value must NOT be mutated, and should be treated as\n\t * an immutable borrow. If you want to take ownership, you must make your own\n\t * copy.\n\t */\n\tMappingList.prototype.toArray = function MappingList_toArray() {\n\t if (!this._sorted) {\n\t this._array.sort(util.compareByGeneratedPositionsInflated);\n\t this._sorted = true;\n\t }\n\t return this._array;\n\t};\n\t\n\texports.MappingList = MappingList;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar binarySearch = __webpack_require__(8);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar base64VLQ = __webpack_require__(2);\n\tvar quickSort = __webpack_require__(9).quickSort;\n\t\n\tfunction SourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t return sourceMap.sections != null\n\t ? new IndexedSourceMapConsumer(sourceMap)\n\t : new BasicSourceMapConsumer(sourceMap);\n\t}\n\t\n\tSourceMapConsumer.fromSourceMap = function(aSourceMap) {\n\t return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n\t}\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tSourceMapConsumer.prototype._version = 3;\n\t\n\t// `__generatedMappings` and `__originalMappings` are arrays that hold the\n\t// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n\t// are lazily instantiated, accessed via the `_generatedMappings` and\n\t// `_originalMappings` getters respectively, and we only parse the mappings\n\t// and create these arrays once queried for a source location. We jump through\n\t// these hoops because there can be many thousands of mappings, and parsing\n\t// them is expensive, so we only want to do it if we must.\n\t//\n\t// Each object in the arrays is of the form:\n\t//\n\t// {\n\t// generatedLine: The line number in the generated code,\n\t// generatedColumn: The column number in the generated code,\n\t// source: The path to the original source file that generated this\n\t// chunk of code,\n\t// originalLine: The line number in the original source that\n\t// corresponds to this chunk of generated code,\n\t// originalColumn: The column number in the original source that\n\t// corresponds to this chunk of generated code,\n\t// name: The name of the original symbol which generated this chunk of\n\t// code.\n\t// }\n\t//\n\t// All properties except for `generatedLine` and `generatedColumn` can be\n\t// `null`.\n\t//\n\t// `_generatedMappings` is ordered by the generated positions.\n\t//\n\t// `_originalMappings` is ordered by the original positions.\n\t\n\tSourceMapConsumer.prototype.__generatedMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n\t get: function () {\n\t if (!this.__generatedMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__generatedMappings;\n\t }\n\t});\n\t\n\tSourceMapConsumer.prototype.__originalMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n\t get: function () {\n\t if (!this.__originalMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__originalMappings;\n\t }\n\t});\n\t\n\tSourceMapConsumer.prototype._charIsMappingSeparator =\n\t function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n\t var c = aStr.charAt(index);\n\t return c === \";\" || c === \",\";\n\t };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t throw new Error(\"Subclasses must implement _parseMappings\");\n\t };\n\t\n\tSourceMapConsumer.GENERATED_ORDER = 1;\n\tSourceMapConsumer.ORIGINAL_ORDER = 2;\n\t\n\tSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n\tSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Iterate over each mapping between an original source/line/column and a\n\t * generated line/column in this source map.\n\t *\n\t * @param Function aCallback\n\t * The function that is called with each mapping.\n\t * @param Object aContext\n\t * Optional. If specified, this object will be the value of `this` every\n\t * time that `aCallback` is called.\n\t * @param aOrder\n\t * Either `SourceMapConsumer.GENERATED_ORDER` or\n\t * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n\t * iterate over the mappings sorted by the generated file's line/column\n\t * order or the original's source/line/column order, respectively. Defaults to\n\t * `SourceMapConsumer.GENERATED_ORDER`.\n\t */\n\tSourceMapConsumer.prototype.eachMapping =\n\t function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n\t var context = aContext || null;\n\t var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\t\n\t var mappings;\n\t switch (order) {\n\t case SourceMapConsumer.GENERATED_ORDER:\n\t mappings = this._generatedMappings;\n\t break;\n\t case SourceMapConsumer.ORIGINAL_ORDER:\n\t mappings = this._originalMappings;\n\t break;\n\t default:\n\t throw new Error(\"Unknown order of iteration.\");\n\t }\n\t\n\t var sourceRoot = this.sourceRoot;\n\t mappings.map(function (mapping) {\n\t var source = mapping.source === null ? null : this._sources.at(mapping.source);\n\t if (source != null && sourceRoot != null) {\n\t source = util.join(sourceRoot, source);\n\t }\n\t return {\n\t source: source,\n\t generatedLine: mapping.generatedLine,\n\t generatedColumn: mapping.generatedColumn,\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: mapping.name === null ? null : this._names.at(mapping.name)\n\t };\n\t }, this).forEach(aCallback, context);\n\t };\n\t\n\t/**\n\t * Returns all generated line and column information for the original source,\n\t * line, and column provided. If no column is provided, returns all mappings\n\t * corresponding to a either the line we are searching for or the next\n\t * closest line that has any mappings. Otherwise, returns all mappings\n\t * corresponding to the given line and either the column we are searching for\n\t * or the next closest column that has any offsets.\n\t *\n\t * The only argument is an object with the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: Optional. the column number in the original source.\n\t *\n\t * and an array of objects is returned, each with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\tSourceMapConsumer.prototype.allGeneratedPositionsFor =\n\t function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n\t var line = util.getArg(aArgs, 'line');\n\t\n\t // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n\t // returns the index of the closest mapping less than the needle. By\n\t // setting needle.originalColumn to 0, we thus find the last mapping for\n\t // the given line, provided such a mapping exists.\n\t var needle = {\n\t source: util.getArg(aArgs, 'source'),\n\t originalLine: line,\n\t originalColumn: util.getArg(aArgs, 'column', 0)\n\t };\n\t\n\t if (this.sourceRoot != null) {\n\t needle.source = util.relative(this.sourceRoot, needle.source);\n\t }\n\t if (!this._sources.has(needle.source)) {\n\t return [];\n\t }\n\t needle.source = this._sources.indexOf(needle.source);\n\t\n\t var mappings = [];\n\t\n\t var index = this._findMapping(needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t binarySearch.LEAST_UPPER_BOUND);\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (aArgs.column === undefined) {\n\t var originalLine = mapping.originalLine;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we found. Since\n\t // mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we found.\n\t while (mapping && mapping.originalLine === originalLine) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t } else {\n\t var originalColumn = mapping.originalColumn;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we were searching for.\n\t // Since mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we are searching for.\n\t while (mapping &&\n\t mapping.originalLine === line &&\n\t mapping.originalColumn == originalColumn) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t }\n\t }\n\t\n\t return mappings;\n\t };\n\t\n\texports.SourceMapConsumer = SourceMapConsumer;\n\t\n\t/**\n\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\n\t * query for information about the original file positions by giving it a file\n\t * position in the generated source.\n\t *\n\t * The only parameter is the raw source map (either as a JSON string, or\n\t * already parsed to an object). According to the spec, source maps have the\n\t * following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - sources: An array of URLs to the original source files.\n\t * - names: An array of identifiers which can be referrenced by individual mappings.\n\t * - sourceRoot: Optional. The URL root from which all sources are relative.\n\t * - sourcesContent: Optional. An array of contents of the original source files.\n\t * - mappings: A string of base64 VLQs which contain the actual mappings.\n\t * - file: Optional. The generated file this source map is associated with.\n\t *\n\t * Here is an example source map, taken from the source map spec[0]:\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"out.js\",\n\t * sourceRoot : \"\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AA,AB;;ABCDE;\"\n\t * }\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\tfunction BasicSourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sources = util.getArg(sourceMap, 'sources');\n\t // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n\t // requires the array) to play nice here.\n\t var names = util.getArg(sourceMap, 'names', []);\n\t var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n\t var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n\t var mappings = util.getArg(sourceMap, 'mappings');\n\t var file = util.getArg(sourceMap, 'file', null);\n\t\n\t // Once again, Sass deviates from the spec and supplies the version as a\n\t // string rather than a number, so we use loose equality checking here.\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t sources = sources\n\t .map(String)\n\t // Some source maps produce relative source paths like \"./foo.js\" instead of\n\t // \"foo.js\". Normalize these first so that future comparisons will succeed.\n\t // See bugzil.la/1090768.\n\t .map(util.normalize)\n\t // Always ensure that absolute sources are internally stored relative to\n\t // the source root, if the source root is absolute. Not doing this would\n\t // be particularly problematic when the source root is a prefix of the\n\t // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n\t .map(function (source) {\n\t return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n\t ? util.relative(sourceRoot, source)\n\t : source;\n\t });\n\t\n\t // Pass `true` below to allow duplicate names and sources. While source maps\n\t // are intended to be compressed and deduplicated, the TypeScript compiler\n\t // sometimes generates source maps with duplicates in them. See Github issue\n\t // #72 and bugzil.la/889492.\n\t this._names = ArraySet.fromArray(names.map(String), true);\n\t this._sources = ArraySet.fromArray(sources, true);\n\t\n\t this.sourceRoot = sourceRoot;\n\t this.sourcesContent = sourcesContent;\n\t this._mappings = mappings;\n\t this.file = file;\n\t}\n\t\n\tBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\t\n\t/**\n\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n\t *\n\t * @param SourceMapGenerator aSourceMap\n\t * The source map that will be consumed.\n\t * @returns BasicSourceMapConsumer\n\t */\n\tBasicSourceMapConsumer.fromSourceMap =\n\t function SourceMapConsumer_fromSourceMap(aSourceMap) {\n\t var smc = Object.create(BasicSourceMapConsumer.prototype);\n\t\n\t var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n\t var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n\t smc.sourceRoot = aSourceMap._sourceRoot;\n\t smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n\t smc.sourceRoot);\n\t smc.file = aSourceMap._file;\n\t\n\t // Because we are modifying the entries (by converting string sources and\n\t // names to indices into the sources and names ArraySets), we have to make\n\t // a copy of the entry or else bad things happen. Shared mutable state\n\t // strikes again! See github issue #191.\n\t\n\t var generatedMappings = aSourceMap._mappings.toArray().slice();\n\t var destGeneratedMappings = smc.__generatedMappings = [];\n\t var destOriginalMappings = smc.__originalMappings = [];\n\t\n\t for (var i = 0, length = generatedMappings.length; i < length; i++) {\n\t var srcMapping = generatedMappings[i];\n\t var destMapping = new Mapping;\n\t destMapping.generatedLine = srcMapping.generatedLine;\n\t destMapping.generatedColumn = srcMapping.generatedColumn;\n\t\n\t if (srcMapping.source) {\n\t destMapping.source = sources.indexOf(srcMapping.source);\n\t destMapping.originalLine = srcMapping.originalLine;\n\t destMapping.originalColumn = srcMapping.originalColumn;\n\t\n\t if (srcMapping.name) {\n\t destMapping.name = names.indexOf(srcMapping.name);\n\t }\n\t\n\t destOriginalMappings.push(destMapping);\n\t }\n\t\n\t destGeneratedMappings.push(destMapping);\n\t }\n\t\n\t quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\t\n\t return smc;\n\t };\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tBasicSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t return this._sources.toArray().map(function (s) {\n\t return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n\t }, this);\n\t }\n\t});\n\t\n\t/**\n\t * Provide the JIT with a nice shape / hidden class.\n\t */\n\tfunction Mapping() {\n\t this.generatedLine = 0;\n\t this.generatedColumn = 0;\n\t this.source = null;\n\t this.originalLine = null;\n\t this.originalColumn = null;\n\t this.name = null;\n\t}\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tBasicSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t var generatedLine = 1;\n\t var previousGeneratedColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousOriginalColumn = 0;\n\t var previousSource = 0;\n\t var previousName = 0;\n\t var length = aStr.length;\n\t var index = 0;\n\t var cachedSegments = {};\n\t var temp = {};\n\t var originalMappings = [];\n\t var generatedMappings = [];\n\t var mapping, str, segment, end, value;\n\t\n\t while (index < length) {\n\t if (aStr.charAt(index) === ';') {\n\t generatedLine++;\n\t index++;\n\t previousGeneratedColumn = 0;\n\t }\n\t else if (aStr.charAt(index) === ',') {\n\t index++;\n\t }\n\t else {\n\t mapping = new Mapping();\n\t mapping.generatedLine = generatedLine;\n\t\n\t // Because each offset is encoded relative to the previous one,\n\t // many segments often have the same encoding. We can exploit this\n\t // fact by caching the parsed variable length fields of each segment,\n\t // allowing us to avoid a second parse if we encounter the same\n\t // segment again.\n\t for (end = index; end < length; end++) {\n\t if (this._charIsMappingSeparator(aStr, end)) {\n\t break;\n\t }\n\t }\n\t str = aStr.slice(index, end);\n\t\n\t segment = cachedSegments[str];\n\t if (segment) {\n\t index += str.length;\n\t } else {\n\t segment = [];\n\t while (index < end) {\n\t base64VLQ.decode(aStr, index, temp);\n\t value = temp.value;\n\t index = temp.rest;\n\t segment.push(value);\n\t }\n\t\n\t if (segment.length === 2) {\n\t throw new Error('Found a source, but no line and column');\n\t }\n\t\n\t if (segment.length === 3) {\n\t throw new Error('Found a source and line, but no column');\n\t }\n\t\n\t cachedSegments[str] = segment;\n\t }\n\t\n\t // Generated column.\n\t mapping.generatedColumn = previousGeneratedColumn + segment[0];\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (segment.length > 1) {\n\t // Original source.\n\t mapping.source = previousSource + segment[1];\n\t previousSource += segment[1];\n\t\n\t // Original line.\n\t mapping.originalLine = previousOriginalLine + segment[2];\n\t previousOriginalLine = mapping.originalLine;\n\t // Lines are stored 0-based\n\t mapping.originalLine += 1;\n\t\n\t // Original column.\n\t mapping.originalColumn = previousOriginalColumn + segment[3];\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (segment.length > 4) {\n\t // Original name.\n\t mapping.name = previousName + segment[4];\n\t previousName += segment[4];\n\t }\n\t }\n\t\n\t generatedMappings.push(mapping);\n\t if (typeof mapping.originalLine === 'number') {\n\t originalMappings.push(mapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t this.__generatedMappings = generatedMappings;\n\t\n\t quickSort(originalMappings, util.compareByOriginalPositions);\n\t this.__originalMappings = originalMappings;\n\t };\n\t\n\t/**\n\t * Find the mapping that best matches the hypothetical \"needle\" mapping that\n\t * we are searching for in the given \"haystack\" of mappings.\n\t */\n\tBasicSourceMapConsumer.prototype._findMapping =\n\t function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n\t aColumnName, aComparator, aBias) {\n\t // To return the position we are searching for, we must first find the\n\t // mapping for the given position and then return the opposite position it\n\t // points to. Because the mappings are sorted, we can use binary search to\n\t // find the best mapping.\n\t\n\t if (aNeedle[aLineName] <= 0) {\n\t throw new TypeError('Line must be greater than or equal to 1, got '\n\t + aNeedle[aLineName]);\n\t }\n\t if (aNeedle[aColumnName] < 0) {\n\t throw new TypeError('Column must be greater than or equal to 0, got '\n\t + aNeedle[aColumnName]);\n\t }\n\t\n\t return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n\t };\n\t\n\t/**\n\t * Compute the last column for each generated mapping. The last column is\n\t * inclusive.\n\t */\n\tBasicSourceMapConsumer.prototype.computeColumnSpans =\n\t function SourceMapConsumer_computeColumnSpans() {\n\t for (var index = 0; index < this._generatedMappings.length; ++index) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t // Mappings do not contain a field for the last generated columnt. We\n\t // can come up with an optimistic estimate, however, by assuming that\n\t // mappings are contiguous (i.e. given two consecutive mappings, the\n\t // first mapping ends where the second one starts).\n\t if (index + 1 < this._generatedMappings.length) {\n\t var nextMapping = this._generatedMappings[index + 1];\n\t\n\t if (mapping.generatedLine === nextMapping.generatedLine) {\n\t mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n\t continue;\n\t }\n\t }\n\t\n\t // The last mapping for each line spans the entire line.\n\t mapping.lastGeneratedColumn = Infinity;\n\t }\n\t };\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source.\n\t * - column: The column number in the generated source.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null.\n\t * - column: The column number in the original source, or null.\n\t * - name: The original identifier, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.originalPositionFor =\n\t function SourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._generatedMappings,\n\t \"generatedLine\",\n\t \"generatedColumn\",\n\t util.compareByGeneratedPositionsDeflated,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t if (mapping.generatedLine === needle.generatedLine) {\n\t var source = util.getArg(mapping, 'source', null);\n\t if (source !== null) {\n\t source = this._sources.at(source);\n\t if (this.sourceRoot != null) {\n\t source = util.join(this.sourceRoot, source);\n\t }\n\t }\n\t var name = util.getArg(mapping, 'name', null);\n\t if (name !== null) {\n\t name = this._names.at(name);\n\t }\n\t return {\n\t source: source,\n\t line: util.getArg(mapping, 'originalLine', null),\n\t column: util.getArg(mapping, 'originalColumn', null),\n\t name: name\n\t };\n\t }\n\t }\n\t\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function BasicSourceMapConsumer_hasContentsOfAllSources() {\n\t if (!this.sourcesContent) {\n\t return false;\n\t }\n\t return this.sourcesContent.length >= this._sources.size() &&\n\t !this.sourcesContent.some(function (sc) { return sc == null; });\n\t };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tBasicSourceMapConsumer.prototype.sourceContentFor =\n\t function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t if (!this.sourcesContent) {\n\t return null;\n\t }\n\t\n\t if (this.sourceRoot != null) {\n\t aSource = util.relative(this.sourceRoot, aSource);\n\t }\n\t\n\t if (this._sources.has(aSource)) {\n\t return this.sourcesContent[this._sources.indexOf(aSource)];\n\t }\n\t\n\t var url;\n\t if (this.sourceRoot != null\n\t && (url = util.urlParse(this.sourceRoot))) {\n\t // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n\t // many users. We can help them out when they expect file:// URIs to\n\t // behave like it would if they were running a local HTTP server. See\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n\t var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n\t if (url.scheme == \"file\"\n\t && this._sources.has(fileUriAbsPath)) {\n\t return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n\t }\n\t\n\t if ((!url.path || url.path == \"/\")\n\t && this._sources.has(\"/\" + aSource)) {\n\t return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n\t }\n\t }\n\t\n\t // This function is used recursively from\n\t // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n\t // don't want to throw if we can't find the source - we just want to\n\t // return null, so we provide a flag to exit gracefully.\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: The column number in the original source.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.generatedPositionFor =\n\t function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t var source = util.getArg(aArgs, 'source');\n\t if (this.sourceRoot != null) {\n\t source = util.relative(this.sourceRoot, source);\n\t }\n\t if (!this._sources.has(source)) {\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t }\n\t source = this._sources.indexOf(source);\n\t\n\t var needle = {\n\t source: source,\n\t originalLine: util.getArg(aArgs, 'line'),\n\t originalColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (mapping.source === needle.source) {\n\t return {\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t };\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t };\n\t\n\texports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\t\n\t/**\n\t * An IndexedSourceMapConsumer instance represents a parsed source map which\n\t * we can query for information. It differs from BasicSourceMapConsumer in\n\t * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n\t * input.\n\t *\n\t * The only parameter is a raw source map (either as a JSON string, or already\n\t * parsed to an object). According to the spec for indexed source maps, they\n\t * have the following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - file: Optional. The generated file this source map is associated with.\n\t * - sections: A list of section definitions.\n\t *\n\t * Each value under the \"sections\" field has two fields:\n\t * - offset: The offset into the original specified at which this section\n\t * begins to apply, defined as an object with a \"line\" and \"column\"\n\t * field.\n\t * - map: A source map definition. This source map could also be indexed,\n\t * but doesn't have to be.\n\t *\n\t * Instead of the \"map\" field, it's also possible to have a \"url\" field\n\t * specifying a URL to retrieve a source map from, but that's currently\n\t * unsupported.\n\t *\n\t * Here's an example source map, taken from the source map spec[0], but\n\t * modified to omit a section which uses the \"url\" field.\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"app.js\",\n\t * sections: [{\n\t * offset: {line:100, column:10},\n\t * map: {\n\t * version : 3,\n\t * file: \"section.js\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AAAA,E;;ABCDE;\"\n\t * }\n\t * }],\n\t * }\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\tfunction IndexedSourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sections = util.getArg(sourceMap, 'sections');\n\t\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t this._sources = new ArraySet();\n\t this._names = new ArraySet();\n\t\n\t var lastOffset = {\n\t line: -1,\n\t column: 0\n\t };\n\t this._sections = sections.map(function (s) {\n\t if (s.url) {\n\t // The url field will require support for asynchronicity.\n\t // See https://github.com/mozilla/source-map/issues/16\n\t throw new Error('Support for url field in sections not implemented.');\n\t }\n\t var offset = util.getArg(s, 'offset');\n\t var offsetLine = util.getArg(offset, 'line');\n\t var offsetColumn = util.getArg(offset, 'column');\n\t\n\t if (offsetLine < lastOffset.line ||\n\t (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n\t throw new Error('Section offsets must be ordered and non-overlapping.');\n\t }\n\t lastOffset = offset;\n\t\n\t return {\n\t generatedOffset: {\n\t // The offset fields are 0-based, but we use 1-based indices when\n\t // encoding/decoding from VLQ.\n\t generatedLine: offsetLine + 1,\n\t generatedColumn: offsetColumn + 1\n\t },\n\t consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n\t }\n\t });\n\t}\n\t\n\tIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tIndexedSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t var sources = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n\t sources.push(this._sections[i].consumer.sources[j]);\n\t }\n\t }\n\t return sources;\n\t }\n\t});\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source.\n\t * - column: The column number in the generated source.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null.\n\t * - column: The column number in the original source, or null.\n\t * - name: The original identifier, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.originalPositionFor =\n\t function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t // Find the section containing the generated position we're trying to map\n\t // to an original position.\n\t var sectionIndex = binarySearch.search(needle, this._sections,\n\t function(needle, section) {\n\t var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n\t if (cmp) {\n\t return cmp;\n\t }\n\t\n\t return (needle.generatedColumn -\n\t section.generatedOffset.generatedColumn);\n\t });\n\t var section = this._sections[sectionIndex];\n\t\n\t if (!section) {\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t }\n\t\n\t return section.consumer.originalPositionFor({\n\t line: needle.generatedLine -\n\t (section.generatedOffset.generatedLine - 1),\n\t column: needle.generatedColumn -\n\t (section.generatedOffset.generatedLine === needle.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t bias: aArgs.bias\n\t });\n\t };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n\t return this._sections.every(function (s) {\n\t return s.consumer.hasContentsOfAllSources();\n\t });\n\t };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tIndexedSourceMapConsumer.prototype.sourceContentFor =\n\t function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t var content = section.consumer.sourceContentFor(aSource, true);\n\t if (content) {\n\t return content;\n\t }\n\t }\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: The column number in the original source.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.generatedPositionFor =\n\t function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t // Only consider this section if the requested source is in the list of\n\t // sources of the consumer.\n\t if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n\t continue;\n\t }\n\t var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n\t if (generatedPosition) {\n\t var ret = {\n\t line: generatedPosition.line +\n\t (section.generatedOffset.generatedLine - 1),\n\t column: generatedPosition.column +\n\t (section.generatedOffset.generatedLine === generatedPosition.line\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0)\n\t };\n\t return ret;\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null\n\t };\n\t };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tIndexedSourceMapConsumer.prototype._parseMappings =\n\t function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t this.__generatedMappings = [];\n\t this.__originalMappings = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t var sectionMappings = section.consumer._generatedMappings;\n\t for (var j = 0; j < sectionMappings.length; j++) {\n\t var mapping = sectionMappings[j];\n\t\n\t var source = section.consumer._sources.at(mapping.source);\n\t if (section.consumer.sourceRoot !== null) {\n\t source = util.join(section.consumer.sourceRoot, source);\n\t }\n\t this._sources.add(source);\n\t source = this._sources.indexOf(source);\n\t\n\t var name = section.consumer._names.at(mapping.name);\n\t this._names.add(name);\n\t name = this._names.indexOf(name);\n\t\n\t // The mappings coming from the consumer for the section have\n\t // generated positions relative to the start of the section, so we\n\t // need to offset them to be relative to the start of the concatenated\n\t // generated file.\n\t var adjustedMapping = {\n\t source: source,\n\t generatedLine: mapping.generatedLine +\n\t (section.generatedOffset.generatedLine - 1),\n\t generatedColumn: mapping.generatedColumn +\n\t (section.generatedOffset.generatedLine === mapping.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: name\n\t };\n\t\n\t this.__generatedMappings.push(adjustedMapping);\n\t if (typeof adjustedMapping.originalLine === 'number') {\n\t this.__originalMappings.push(adjustedMapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t quickSort(this.__originalMappings, util.compareByOriginalPositions);\n\t };\n\t\n\texports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\texports.GREATEST_LOWER_BOUND = 1;\n\texports.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Recursive implementation of binary search.\n\t *\n\t * @param aLow Indices here and lower do not contain the needle.\n\t * @param aHigh Indices here and higher do not contain the needle.\n\t * @param aNeedle The element being searched for.\n\t * @param aHaystack The non-empty array being searched.\n\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t */\n\tfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n\t // This function terminates when one of the following is true:\n\t //\n\t // 1. We find the exact element we are looking for.\n\t //\n\t // 2. We did not find the exact element, but we can return the index of\n\t // the next-closest element.\n\t //\n\t // 3. We did not find the exact element, and there is no next-closest\n\t // element than the one we are searching for, so we return -1.\n\t var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n\t var cmp = aCompare(aNeedle, aHaystack[mid], true);\n\t if (cmp === 0) {\n\t // Found the element we are looking for.\n\t return mid;\n\t }\n\t else if (cmp > 0) {\n\t // Our needle is greater than aHaystack[mid].\n\t if (aHigh - mid > 1) {\n\t // The element is in the upper half.\n\t return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // The exact needle element was not found in this haystack. Determine if\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return aHigh < aHaystack.length ? aHigh : -1;\n\t } else {\n\t return mid;\n\t }\n\t }\n\t else {\n\t // Our needle is less than aHaystack[mid].\n\t if (mid - aLow > 1) {\n\t // The element is in the lower half.\n\t return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return mid;\n\t } else {\n\t return aLow < 0 ? -1 : aLow;\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * This is an implementation of binary search which will always try and return\n\t * the index of the closest element if there is no exact hit. This is because\n\t * mappings between original and generated line/col pairs are single points,\n\t * and there is an implicit region between each of them, so a miss just means\n\t * that you aren't on the very start of a region.\n\t *\n\t * @param aNeedle The element you are looking for.\n\t * @param aHaystack The array that is being searched.\n\t * @param aCompare A function which takes the needle and an element in the\n\t * array and returns -1, 0, or 1 depending on whether the needle is less\n\t * than, equal to, or greater than the element, respectively.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n\t */\n\texports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n\t if (aHaystack.length === 0) {\n\t return -1;\n\t }\n\t\n\t var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n\t aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n\t if (index < 0) {\n\t return -1;\n\t }\n\t\n\t // We have found either the exact element, or the next-closest element than\n\t // the one we are searching for. However, there may be more than one such\n\t // element. Make sure we always return the smallest of these.\n\t while (index - 1 >= 0) {\n\t if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n\t break;\n\t }\n\t --index;\n\t }\n\t\n\t return index;\n\t};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t// It turns out that some (most?) JavaScript engines don't self-host\n\t// `Array.prototype.sort`. This makes sense because C++ will likely remain\n\t// faster than JS when doing raw CPU-intensive sorting. However, when using a\n\t// custom comparator function, calling back and forth between the VM's C++ and\n\t// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n\t// worse generated code for the comparator function than would be optimal. In\n\t// fact, when sorting with a comparator, these costs outweigh the benefits of\n\t// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n\t// a ~3500ms mean speed-up in `bench/bench.html`.\n\t\n\t/**\n\t * Swap the elements indexed by `x` and `y` in the array `ary`.\n\t *\n\t * @param {Array} ary\n\t * The array.\n\t * @param {Number} x\n\t * The index of the first item.\n\t * @param {Number} y\n\t * The index of the second item.\n\t */\n\tfunction swap(ary, x, y) {\n\t var temp = ary[x];\n\t ary[x] = ary[y];\n\t ary[y] = temp;\n\t}\n\t\n\t/**\n\t * Returns a random integer within the range `low .. high` inclusive.\n\t *\n\t * @param {Number} low\n\t * The lower bound on the range.\n\t * @param {Number} high\n\t * The upper bound on the range.\n\t */\n\tfunction randomIntInRange(low, high) {\n\t return Math.round(low + (Math.random() * (high - low)));\n\t}\n\t\n\t/**\n\t * The Quick Sort algorithm.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t * @param {Number} p\n\t * Start index of the array\n\t * @param {Number} r\n\t * End index of the array\n\t */\n\tfunction doQuickSort(ary, comparator, p, r) {\n\t // If our lower bound is less than our upper bound, we (1) partition the\n\t // array into two pieces and (2) recurse on each half. If it is not, this is\n\t // the empty array and our base case.\n\t\n\t if (p < r) {\n\t // (1) Partitioning.\n\t //\n\t // The partitioning chooses a pivot between `p` and `r` and moves all\n\t // elements that are less than or equal to the pivot to the before it, and\n\t // all the elements that are greater than it after it. The effect is that\n\t // once partition is done, the pivot is in the exact place it will be when\n\t // the array is put in sorted order, and it will not need to be moved\n\t // again. This runs in O(n) time.\n\t\n\t // Always choose a random pivot so that an input array which is reverse\n\t // sorted does not cause O(n^2) running time.\n\t var pivotIndex = randomIntInRange(p, r);\n\t var i = p - 1;\n\t\n\t swap(ary, pivotIndex, r);\n\t var pivot = ary[r];\n\t\n\t // Immediately after `j` is incremented in this loop, the following hold\n\t // true:\n\t //\n\t // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n\t //\n\t // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n\t for (var j = p; j < r; j++) {\n\t if (comparator(ary[j], pivot) <= 0) {\n\t i += 1;\n\t swap(ary, i, j);\n\t }\n\t }\n\t\n\t swap(ary, i + 1, j);\n\t var q = i + 1;\n\t\n\t // (2) Recurse on each half.\n\t\n\t doQuickSort(ary, comparator, p, q - 1);\n\t doQuickSort(ary, comparator, q + 1, r);\n\t }\n\t}\n\t\n\t/**\n\t * Sort the given array in-place with the given comparator function.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t */\n\texports.quickSort = function (ary, comparator) {\n\t doQuickSort(ary, comparator, 0, ary.length - 1);\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\tvar util = __webpack_require__(4);\n\t\n\t// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n\t// operating systems these days (capturing the result).\n\tvar REGEX_NEWLINE = /(\\r?\\n)/;\n\t\n\t// Newline character code for charCodeAt() comparisons\n\tvar NEWLINE_CODE = 10;\n\t\n\t// Private symbol for identifying `SourceNode`s when multiple versions of\n\t// the source-map library are loaded. This MUST NOT CHANGE across\n\t// versions!\n\tvar isSourceNode = \"$$$isSourceNode$$$\";\n\t\n\t/**\n\t * SourceNodes provide a way to abstract over interpolating/concatenating\n\t * snippets of generated JavaScript source code while maintaining the line and\n\t * column information associated with the original source code.\n\t *\n\t * @param aLine The original line number.\n\t * @param aColumn The original column number.\n\t * @param aSource The original source's filename.\n\t * @param aChunks Optional. An array of strings which are snippets of\n\t * generated JS, or other SourceNodes.\n\t * @param aName The original identifier.\n\t */\n\tfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n\t this.children = [];\n\t this.sourceContents = {};\n\t this.line = aLine == null ? null : aLine;\n\t this.column = aColumn == null ? null : aColumn;\n\t this.source = aSource == null ? null : aSource;\n\t this.name = aName == null ? null : aName;\n\t this[isSourceNode] = true;\n\t if (aChunks != null) this.add(aChunks);\n\t}\n\t\n\t/**\n\t * Creates a SourceNode from generated code and a SourceMapConsumer.\n\t *\n\t * @param aGeneratedCode The generated code\n\t * @param aSourceMapConsumer The SourceMap for the generated code\n\t * @param aRelativePath Optional. The path that relative sources in the\n\t * SourceMapConsumer should be relative to.\n\t */\n\tSourceNode.fromStringWithSourceMap =\n\t function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n\t // The SourceNode we want to fill with the generated code\n\t // and the SourceMap\n\t var node = new SourceNode();\n\t\n\t // All even indices of this array are one line of the generated code,\n\t // while all odd indices are the newlines between two adjacent lines\n\t // (since `REGEX_NEWLINE` captures its match).\n\t // Processed fragments are accessed by calling `shiftNextLine`.\n\t var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n\t var remainingLinesIndex = 0;\n\t var shiftNextLine = function() {\n\t var lineContents = getNextLine();\n\t // The last line of a file might not have a newline.\n\t var newLine = getNextLine() || \"\";\n\t return lineContents + newLine;\n\t\n\t function getNextLine() {\n\t return remainingLinesIndex < remainingLines.length ?\n\t remainingLines[remainingLinesIndex++] : undefined;\n\t }\n\t };\n\t\n\t // We need to remember the position of \"remainingLines\"\n\t var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\t\n\t // The generate SourceNodes we need a code range.\n\t // To extract it current and last mapping is used.\n\t // Here we store the last mapping.\n\t var lastMapping = null;\n\t\n\t aSourceMapConsumer.eachMapping(function (mapping) {\n\t if (lastMapping !== null) {\n\t // We add the code from \"lastMapping\" to \"mapping\":\n\t // First check if there is a new line in between.\n\t if (lastGeneratedLine < mapping.generatedLine) {\n\t // Associate first line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t lastGeneratedLine++;\n\t lastGeneratedColumn = 0;\n\t // The remaining code is added without mapping\n\t } else {\n\t // There is no new line in between.\n\t // Associate the code between \"lastGeneratedColumn\" and\n\t // \"mapping.generatedColumn\" with \"lastMapping\"\n\t var nextLine = remainingLines[remainingLinesIndex];\n\t var code = nextLine.substr(0, mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t addMappingWithCode(lastMapping, code);\n\t // No more remaining code, continue\n\t lastMapping = mapping;\n\t return;\n\t }\n\t }\n\t // We add the generated code until the first mapping\n\t // to the SourceNode without any mapping.\n\t // Each line is added as separate string.\n\t while (lastGeneratedLine < mapping.generatedLine) {\n\t node.add(shiftNextLine());\n\t lastGeneratedLine++;\n\t }\n\t if (lastGeneratedColumn < mapping.generatedColumn) {\n\t var nextLine = remainingLines[remainingLinesIndex];\n\t node.add(nextLine.substr(0, mapping.generatedColumn));\n\t remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t }\n\t lastMapping = mapping;\n\t }, this);\n\t // We have processed all mappings.\n\t if (remainingLinesIndex < remainingLines.length) {\n\t if (lastMapping) {\n\t // Associate the remaining code in the current line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t }\n\t // and add the remaining lines without any mapping\n\t node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n\t }\n\t\n\t // Copy sourcesContent into SourceNode\n\t aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t if (content != null) {\n\t if (aRelativePath != null) {\n\t sourceFile = util.join(aRelativePath, sourceFile);\n\t }\n\t node.setSourceContent(sourceFile, content);\n\t }\n\t });\n\t\n\t return node;\n\t\n\t function addMappingWithCode(mapping, code) {\n\t if (mapping === null || mapping.source === undefined) {\n\t node.add(code);\n\t } else {\n\t var source = aRelativePath\n\t ? util.join(aRelativePath, mapping.source)\n\t : mapping.source;\n\t node.add(new SourceNode(mapping.originalLine,\n\t mapping.originalColumn,\n\t source,\n\t code,\n\t mapping.name));\n\t }\n\t }\n\t };\n\t\n\t/**\n\t * Add a chunk of generated JS to this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.add = function SourceNode_add(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t aChunk.forEach(function (chunk) {\n\t this.add(chunk);\n\t }, this);\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t if (aChunk) {\n\t this.children.push(aChunk);\n\t }\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Add a chunk of generated JS to the beginning of this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t for (var i = aChunk.length-1; i >= 0; i--) {\n\t this.prepend(aChunk[i]);\n\t }\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t this.children.unshift(aChunk);\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Walk over the tree of JS snippets in this node and its children. The\n\t * walking function is called once for each snippet of JS and is passed that\n\t * snippet and the its original associated source's line/column location.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n\t var chunk;\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t chunk = this.children[i];\n\t if (chunk[isSourceNode]) {\n\t chunk.walk(aFn);\n\t }\n\t else {\n\t if (chunk !== '') {\n\t aFn(chunk, { source: this.source,\n\t line: this.line,\n\t column: this.column,\n\t name: this.name });\n\t }\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n\t * each of `this.children`.\n\t *\n\t * @param aSep The separator.\n\t */\n\tSourceNode.prototype.join = function SourceNode_join(aSep) {\n\t var newChildren;\n\t var i;\n\t var len = this.children.length;\n\t if (len > 0) {\n\t newChildren = [];\n\t for (i = 0; i < len-1; i++) {\n\t newChildren.push(this.children[i]);\n\t newChildren.push(aSep);\n\t }\n\t newChildren.push(this.children[i]);\n\t this.children = newChildren;\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Call String.prototype.replace on the very right-most source snippet. Useful\n\t * for trimming whitespace from the end of a source node, etc.\n\t *\n\t * @param aPattern The pattern to replace.\n\t * @param aReplacement The thing to replace the pattern with.\n\t */\n\tSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n\t var lastChild = this.children[this.children.length - 1];\n\t if (lastChild[isSourceNode]) {\n\t lastChild.replaceRight(aPattern, aReplacement);\n\t }\n\t else if (typeof lastChild === 'string') {\n\t this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n\t }\n\t else {\n\t this.children.push(''.replace(aPattern, aReplacement));\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Set the source content for a source file. This will be added to the SourceMapGenerator\n\t * in the sourcesContent field.\n\t *\n\t * @param aSourceFile The filename of the source file\n\t * @param aSourceContent The content of the source file\n\t */\n\tSourceNode.prototype.setSourceContent =\n\t function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n\t this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n\t };\n\t\n\t/**\n\t * Walk over the tree of SourceNodes. The walking function is called for each\n\t * source file content and is passed the filename and source content.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walkSourceContents =\n\t function SourceNode_walkSourceContents(aFn) {\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t if (this.children[i][isSourceNode]) {\n\t this.children[i].walkSourceContents(aFn);\n\t }\n\t }\n\t\n\t var sources = Object.keys(this.sourceContents);\n\t for (var i = 0, len = sources.length; i < len; i++) {\n\t aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n\t }\n\t };\n\t\n\t/**\n\t * Return the string representation of this source node. Walks over the tree\n\t * and concatenates all the various snippets together to one string.\n\t */\n\tSourceNode.prototype.toString = function SourceNode_toString() {\n\t var str = \"\";\n\t this.walk(function (chunk) {\n\t str += chunk;\n\t });\n\t return str;\n\t};\n\t\n\t/**\n\t * Returns the string representation of this source node along with a source\n\t * map.\n\t */\n\tSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n\t var generated = {\n\t code: \"\",\n\t line: 1,\n\t column: 0\n\t };\n\t var map = new SourceMapGenerator(aArgs);\n\t var sourceMappingActive = false;\n\t var lastOriginalSource = null;\n\t var lastOriginalLine = null;\n\t var lastOriginalColumn = null;\n\t var lastOriginalName = null;\n\t this.walk(function (chunk, original) {\n\t generated.code += chunk;\n\t if (original.source !== null\n\t && original.line !== null\n\t && original.column !== null) {\n\t if(lastOriginalSource !== original.source\n\t || lastOriginalLine !== original.line\n\t || lastOriginalColumn !== original.column\n\t || lastOriginalName !== original.name) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t lastOriginalSource = original.source;\n\t lastOriginalLine = original.line;\n\t lastOriginalColumn = original.column;\n\t lastOriginalName = original.name;\n\t sourceMappingActive = true;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t }\n\t });\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t }\n\t for (var idx = 0, length = chunk.length; idx < length; idx++) {\n\t if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n\t generated.line++;\n\t generated.column = 0;\n\t // Mappings end at eol\n\t if (idx + 1 === length) {\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t } else {\n\t generated.column++;\n\t }\n\t }\n\t });\n\t this.walkSourceContents(function (sourceFile, sourceContent) {\n\t map.setSourceContent(sourceFile, sourceContent);\n\t });\n\t\n\t return { code: generated.code, map: map };\n\t};\n\t\n\texports.SourceNode = SourceNode;\n\n\n/***/ })\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// source-map.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 42c329f865e32e011afb","/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./source-map.js\n// module id = 0\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null) {\n source = String(source);\n if (!this._sources.has(source)) {\n this._sources.add(source);\n }\n }\n\n if (name != null) {\n name = String(name);\n if (!this._names.has(name)) {\n this._names.add(name);\n }\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = Object.create(null);\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n // When aOriginal is truthy but has empty values for .line and .column,\n // it is most likely a programmer error. In this case we throw a very\n // specific error message to try to guide them the right way.\n // For example: https://github.com/Polymer/polymer-bundler/pull/519\n if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n throw new Error(\n 'original.line and original.column are not numbers -- you probably meant to omit ' +\n 'the original mapping entirely and only map the generated position. If so, pass ' +\n 'null for the original mapping instead of an object with empty or null values.'\n );\n }\n\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var next;\n var mapping;\n var nameIdx;\n var sourceIdx;\n\n var mappings = this._mappings.toArray();\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n next = ''\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n next += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n next += ',';\n }\n }\n\n next += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n next += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n next += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n next += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n next += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n\n result += next;\n }\n\n return result;\n };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this.toJSON());\n };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-generator.js\n// module id = 1\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n// Continuation\n// | Sign\n// | |\n// V V\n// 101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (aIndex >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n\n digit = base64.decode(aStr.charCodeAt(aIndex++));\n if (digit === -1) {\n throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n }\n\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aIndex;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64-vlq.js\n// module id = 2\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n var bigA = 65; // 'A'\n var bigZ = 90; // 'Z'\n\n var littleA = 97; // 'a'\n var littleZ = 122; // 'z'\n\n var zero = 48; // '0'\n var nine = 57; // '9'\n\n var plus = 43; // '+'\n var slash = 47; // '/'\n\n var littleOffset = 26;\n var numberOffset = 52;\n\n // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n if (bigA <= charCode && charCode <= bigZ) {\n return (charCode - bigA);\n }\n\n // 26 - 51: abcdefghijklmnopqrstuvwxyz\n if (littleA <= charCode && charCode <= littleZ) {\n return (charCode - littleA + littleOffset);\n }\n\n // 52 - 61: 0123456789\n if (zero <= charCode && charCode <= nine) {\n return (charCode - zero + numberOffset);\n }\n\n // 62: +\n if (charCode == plus) {\n return 62;\n }\n\n // 63: /\n if (charCode == slash) {\n return 63;\n }\n\n // Invalid base64 digit.\n return -1;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64.js\n// module id = 3\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = exports.isAbsolute(path);\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n var level = 0;\n while (aPath.indexOf(aRoot + '/') !== 0) {\n var index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n var obj = Object.create(null);\n return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n if (isProtoString(aStr)) {\n return '$' + aStr;\n }\n\n return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n if (isProtoString(aStr)) {\n return aStr.slice(1);\n }\n\n return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n if (!s) {\n return false;\n }\n\n var length = s.length;\n\n if (length < 9 /* \"__proto__\".length */) {\n return false;\n }\n\n if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n s.charCodeAt(length - 9) !== 95 /* '_' */) {\n return false;\n }\n\n for (var i = length - 10; i >= 0; i--) {\n if (s.charCodeAt(i) !== 36 /* '$' */) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/util.js\n// module id = 4\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n this._array = [];\n this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n if (hasNativeMap) {\n this._set.set(aStr, idx);\n } else {\n this._set[sStr] = idx;\n }\n }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n if (hasNativeMap) {\n return this._set.has(aStr);\n } else {\n var sStr = util.toSetString(aStr);\n return has.call(this._set, sStr);\n }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n if (hasNativeMap) {\n var idx = this._set.get(aStr);\n if (idx >= 0) {\n return idx;\n }\n } else {\n var sStr = util.toSetString(aStr);\n if (has.call(this._set, sStr)) {\n return this._set[sStr];\n }\n }\n\n throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/array-set.js\n// module id = 5\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n};\n\nexports.MappingList = MappingList;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/mapping-list.js\n// module id = 6\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap)\n : new BasicSourceMapConsumer(sourceMap);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n// {\n// generatedLine: The line number in the generated code,\n// generatedColumn: The column number in the generated code,\n// source: The path to the original source file that generated this\n// chunk of code,\n// originalLine: The line number in the original source that\n// corresponds to this chunk of generated code,\n// originalColumn: The column number in the original source that\n// corresponds to this chunk of generated code,\n// name: The name of the original symbol which generated this chunk of\n// code.\n// }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n get: function () {\n if (!this.__generatedMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n get: function () {\n if (!this.__originalMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n var c = aStr.charAt(index);\n return c === \";\" || c === \",\";\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source === null ? null : this._sources.at(mapping.source);\n if (source != null && sourceRoot != null) {\n source = util.join(sourceRoot, source);\n }\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : this._names.at(mapping.name)\n };\n }, this).forEach(aCallback, context);\n };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: Optional. the column number in the original source.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n var line = util.getArg(aArgs, 'line');\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: line,\n originalColumn: util.getArg(aArgs, 'column', 0)\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n if (!this._sources.has(needle.source)) {\n return [];\n }\n needle.source = this._sources.indexOf(needle.source);\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n var originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n var originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The only parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n sources = sources\n .map(String)\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function (source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names.map(String), true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap) {\n var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n\n // Because we are modifying the entries (by converting string sources and\n // names to indices into the sources and names ArraySets), we have to make\n // a copy of the entry or else bad things happen. Shared mutable state\n // strikes again! See github issue #191.\n\n var generatedMappings = aSourceMap._mappings.toArray().slice();\n var destGeneratedMappings = smc.__generatedMappings = [];\n var destOriginalMappings = smc.__originalMappings = [];\n\n for (var i = 0, length = generatedMappings.length; i < length; i++) {\n var srcMapping = generatedMappings[i];\n var destMapping = new Mapping;\n destMapping.generatedLine = srcMapping.generatedLine;\n destMapping.generatedColumn = srcMapping.generatedColumn;\n\n if (srcMapping.source) {\n destMapping.source = sources.indexOf(srcMapping.source);\n destMapping.originalLine = srcMapping.originalLine;\n destMapping.originalColumn = srcMapping.originalColumn;\n\n if (srcMapping.name) {\n destMapping.name = names.indexOf(srcMapping.name);\n }\n\n destOriginalMappings.push(destMapping);\n }\n\n destGeneratedMappings.push(destMapping);\n }\n\n quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n return smc;\n };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._sources.toArray().map(function (s) {\n return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n }, this);\n }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var length = aStr.length;\n var index = 0;\n var cachedSegments = {};\n var temp = {};\n var originalMappings = [];\n var generatedMappings = [];\n var mapping, str, segment, end, value;\n\n while (index < length) {\n if (aStr.charAt(index) === ';') {\n generatedLine++;\n index++;\n previousGeneratedColumn = 0;\n }\n else if (aStr.charAt(index) === ',') {\n index++;\n }\n else {\n mapping = new Mapping();\n mapping.generatedLine = generatedLine;\n\n // Because each offset is encoded relative to the previous one,\n // many segments often have the same encoding. We can exploit this\n // fact by caching the parsed variable length fields of each segment,\n // allowing us to avoid a second parse if we encounter the same\n // segment again.\n for (end = index; end < length; end++) {\n if (this._charIsMappingSeparator(aStr, end)) {\n break;\n }\n }\n str = aStr.slice(index, end);\n\n segment = cachedSegments[str];\n if (segment) {\n index += str.length;\n } else {\n segment = [];\n while (index < end) {\n base64VLQ.decode(aStr, index, temp);\n value = temp.value;\n index = temp.rest;\n segment.push(value);\n }\n\n if (segment.length === 2) {\n throw new Error('Found a source, but no line and column');\n }\n\n if (segment.length === 3) {\n throw new Error('Found a source and line, but no column');\n }\n\n cachedSegments[str] = segment;\n }\n\n // Generated column.\n mapping.generatedColumn = previousGeneratedColumn + segment[0];\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (segment.length > 1) {\n // Original source.\n mapping.source = previousSource + segment[1];\n previousSource += segment[1];\n\n // Original line.\n mapping.originalLine = previousOriginalLine + segment[2];\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n\n // Original column.\n mapping.originalColumn = previousOriginalColumn + segment[3];\n previousOriginalColumn = mapping.originalColumn;\n\n if (segment.length > 4) {\n // Original name.\n mapping.name = previousName + segment[4];\n previousName += segment[4];\n }\n }\n\n generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n originalMappings.push(mapping);\n }\n }\n }\n\n quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n this.__generatedMappings = generatedMappings;\n\n quickSort(originalMappings, util.compareByOriginalPositions);\n this.__originalMappings = originalMappings;\n };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositionsDeflated,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source !== null) {\n source = this._sources.at(source);\n if (this.sourceRoot != null) {\n source = util.join(this.sourceRoot, source);\n }\n }\n var name = util.getArg(mapping, 'name', null);\n if (name !== null) {\n name = this._names.at(name);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n function BasicSourceMapConsumer_hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function (sc) { return sc == null; });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n if (this.sourceRoot != null) {\n aSource = util.relative(this.sourceRoot, aSource);\n }\n\n if (this._sources.has(aSource)) {\n return this.sourcesContent[this._sources.indexOf(aSource)];\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + aSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n if (this.sourceRoot != null) {\n source = util.relative(this.sourceRoot, source);\n }\n if (!this._sources.has(source)) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n source = this._sources.indexOf(source);\n\n var needle = {\n source: source,\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (mapping.source === needle.source) {\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The only parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sections = util.getArg(sourceMap, 'sections');\n\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n this._sources = new ArraySet();\n this._names = new ArraySet();\n\n var lastOffset = {\n line: -1,\n column: 0\n };\n this._sections = sections.map(function (s) {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error('Support for url field in sections not implemented.');\n }\n var offset = util.getArg(s, 'offset');\n var offsetLine = util.getArg(offset, 'line');\n var offsetColumn = util.getArg(offset, 'column');\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error('Section offsets must be ordered and non-overlapping.');\n }\n lastOffset = offset;\n\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n }\n });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n get: function () {\n var sources = [];\n for (var i = 0; i < this._sections.length; i++) {\n for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n var sectionIndex = binarySearch.search(needle, this._sections,\n function(needle, section) {\n var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (needle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n var section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n return this._sections.every(function (s) {\n return s.consumer.hasContentsOfAllSources();\n });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n var content = section.consumer.sourceContentFor(aSource, true);\n if (content) {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n continue;\n }\n var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n var ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n var sectionMappings = section.consumer._generatedMappings;\n for (var j = 0; j < sectionMappings.length; j++) {\n var mapping = sectionMappings[j];\n\n var source = section.consumer._sources.at(mapping.source);\n if (section.consumer.sourceRoot !== null) {\n source = util.join(section.consumer.sourceRoot, source);\n }\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n var adjustedMapping = {\n source: source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: name\n };\n\n this.__generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === 'number') {\n this.__originalMappings.push(adjustedMapping);\n }\n }\n }\n\n quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n quickSort(this.__originalMappings, util.compareByOriginalPositions);\n };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-consumer.js\n// module id = 7\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n } else {\n return mid;\n }\n }\n else {\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n } else {\n return aLow < 0 ? -1 : aLow;\n }\n }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/binary-search.js\n// module id = 8\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n * The array.\n * @param {Number} x\n * The index of the first item.\n * @param {Number} y\n * The index of the second item.\n */\nfunction swap(ary, x, y) {\n var temp = ary[x];\n ary[x] = ary[y];\n ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n * The lower bound on the range.\n * @param {Number} high\n * The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n * @param {Number} p\n * Start index of the array\n * @param {Number} r\n * End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n // If our lower bound is less than our upper bound, we (1) partition the\n // array into two pieces and (2) recurse on each half. If it is not, this is\n // the empty array and our base case.\n\n if (p < r) {\n // (1) Partitioning.\n //\n // The partitioning chooses a pivot between `p` and `r` and moves all\n // elements that are less than or equal to the pivot to the before it, and\n // all the elements that are greater than it after it. The effect is that\n // once partition is done, the pivot is in the exact place it will be when\n // the array is put in sorted order, and it will not need to be moved\n // again. This runs in O(n) time.\n\n // Always choose a random pivot so that an input array which is reverse\n // sorted does not cause O(n^2) running time.\n var pivotIndex = randomIntInRange(p, r);\n var i = p - 1;\n\n swap(ary, pivotIndex, r);\n var pivot = ary[r];\n\n // Immediately after `j` is incremented in this loop, the following hold\n // true:\n //\n // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n //\n // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n for (var j = p; j < r; j++) {\n if (comparator(ary[j], pivot) <= 0) {\n i += 1;\n swap(ary, i, j);\n }\n }\n\n swap(ary, i + 1, j);\n var q = i + 1;\n\n // (2) Recurse on each half.\n\n doQuickSort(ary, comparator, p, q - 1);\n doQuickSort(ary, comparator, q + 1, r);\n }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/quick-sort.js\n// module id = 9\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are accessed by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var remainingLinesIndex = 0;\n var shiftNextLine = function() {\n var lineContents = getNextLine();\n // The last line of a file might not have a newline.\n var newLine = getNextLine() || \"\";\n return lineContents + newLine;\n\n function getNextLine() {\n return remainingLinesIndex < remainingLines.length ?\n remainingLines[remainingLinesIndex++] : undefined;\n }\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[remainingLinesIndex];\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[remainingLinesIndex];\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLinesIndex < remainingLines.length) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-node.js\n// module id = 10\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/node_modules/snapdragon/node_modules/source-map/package.json b/node_modules/snapdragon/node_modules/source-map/package.json new file mode 100644 index 00000000..048e3ae8 --- /dev/null +++ b/node_modules/snapdragon/node_modules/source-map/package.json @@ -0,0 +1,72 @@ +{ + "name": "source-map", + "description": "Generates and consumes source maps", + "version": "0.5.7", + "homepage": "https://github.com/mozilla/source-map", + "author": "Nick Fitzgerald ", + "contributors": [ + "Tobias Koppers ", + "Duncan Beevers ", + "Stephen Crane ", + "Ryan Seddon ", + "Miles Elam ", + "Mihai Bazon ", + "Michael Ficarra ", + "Todd Wolfson ", + "Alexander Solovyov ", + "Felix Gnass ", + "Conrad Irwin ", + "usrbincc ", + "David Glasser ", + "Chase Douglas ", + "Evan Wallace ", + "Heather Arthur ", + "Hugh Kennedy ", + "David Glasser ", + "Simon Lydell ", + "Jmeas Smith ", + "Michael Z Goddard ", + "azu ", + "John Gozde ", + "Adam Kirkton ", + "Chris Montgomery ", + "J. Ryan Stinnett ", + "Jack Herrington ", + "Chris Truter ", + "Daniel Espeset ", + "Jamie Wong ", + "Eddy Bruël ", + "Hawken Rives ", + "Gilad Peleg ", + "djchie ", + "Gary Ye ", + "Nicolas Lalevée " + ], + "repository": { + "type": "git", + "url": "http://github.com/mozilla/source-map.git" + }, + "main": "./source-map.js", + "files": [ + "source-map.js", + "lib/", + "dist/source-map.debug.js", + "dist/source-map.js", + "dist/source-map.min.js", + "dist/source-map.min.js.map" + ], + "engines": { + "node": ">=0.10.0" + }, + "license": "BSD-3-Clause", + "scripts": { + "test": "npm run build && node test/run-tests.js", + "build": "webpack --color", + "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md" + }, + "devDependencies": { + "doctoc": "^0.15.0", + "webpack": "^1.12.0" + }, + "typings": "source-map" +} diff --git a/node_modules/snapdragon/node_modules/source-map/source-map.js b/node_modules/snapdragon/node_modules/source-map/source-map.js new file mode 100644 index 00000000..bc88fe82 --- /dev/null +++ b/node_modules/snapdragon/node_modules/source-map/source-map.js @@ -0,0 +1,8 @@ +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; +exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; +exports.SourceNode = require('./lib/source-node').SourceNode; diff --git a/node_modules/snapdragon/package.json b/node_modules/snapdragon/package.json new file mode 100644 index 00000000..e4c4e738 --- /dev/null +++ b/node_modules/snapdragon/package.json @@ -0,0 +1,79 @@ +{ + "name": "snapdragon", + "description": "Fast, pluggable and easy-to-use parser-renderer factory.", + "version": "0.8.2", + "homepage": "https://github.com/jonschlinkert/snapdragon", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Edward Betts (http://edwardbetts.com)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "jonschlinkert/snapdragon", + "bugs": { + "url": "https://github.com/jonschlinkert/snapdragon/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "lib" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "devDependencies": { + "gulp": "^3.9.1", + "gulp-eslint": "^3.0.1", + "gulp-format-md": "^0.1.10", + "gulp-istanbul": "^1.1.1", + "gulp-mocha": "^3.0.1", + "gulp-unused": "^0.2.0", + "mocha": "^3.0.2" + }, + "keywords": [ + "lexer", + "snapdragon" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "description": "These libraries use snapdragon:", + "list": [ + "braces", + "expand-brackets", + "extglob", + "micromatch" + ] + }, + "reflinks": [ + "css", + "pug", + "verb", + "verb-generate-readme" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/source-map-resolve/LICENSE b/node_modules/source-map-resolve/LICENSE new file mode 100644 index 00000000..2ae97576 --- /dev/null +++ b/node_modules/source-map-resolve/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014, 2015, 2016, 2017, 2018, 2019 Simon Lydell +Copyright (c) 2019 ZHAO Jinxiang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/source-map-resolve/changelog.md b/node_modules/source-map-resolve/changelog.md new file mode 100644 index 00000000..7b3f94b4 --- /dev/null +++ b/node_modules/source-map-resolve/changelog.md @@ -0,0 +1,108 @@ +### Version 0.5.3 (2019-12-28) ### + +- Fixed: base64 encoded source maps now correctly decodes as utf-8. Previously, + non-ASCII characters could end up garbled. Thanks to ZHAO Jinxiang + (@xiaoxiangmoe)! (Note: This fix does not work in old evironments not + supporting both `TextDecoder` and `Uint8Array`.) +- Improved: Reduced size of the npm package. + +### Version 0.5.2 (2018-05-10) ### + +- Improved: Updated the version range of `atob` to disallow depending on `2.0.3` + which as a [security + vulnerability](https://snyk.io/test/npm/atob/2.0.3?severity=high&severity=medium&severity=low). + +### Version 0.5.1 (2017-10-21) ### + +- Fixed: URLs are now decoded before being passed to `read` in Node.js. This + allows reading files with spaces, for example. +- Fixed: Missing or empty `sources` fields (such as `sources: []`) in source + maps are now handled. Previously, such source maps would cause crashes or + callbacks never bing called. Now, an empty result is produced: + + ```js + sourcesResolved: [], + sourcesContent: [] + ``` + +### Version 0.5.0 (2016-02-28) ### + +- Improved: Errors now have a `sourceMapData` property that contain as much as + possible of the intended result of the function up until the error occurred. +- Changed: `resolveSources` and `resolve`, as well as their `*Sync` + alternatives, no longer fail when one single source fails to be fetched. + Instead, the `sourcesContent` array in the result object will contain error + objects for all failed sources, and strings otherwise. (Backwards-incompatible + change.) + +### Version 0.4.0 (2015-08-29) ### + +- Removed: The `ignoreSourceRoot` option of `resolveSources`. It has been + replaced with `sourceRoot: false`. (Backwards-incompatible change.) +- Added: The `sourceRoot` option of `resolveSources`. It not only allows to + ignore the source root, it also lets you replace it. +- Added: The `parseMapToJSON` method. +- Added: The `resolve` method now accepts `null, mapUrl, ...` as arguments, in + addition to the existing signature, which will read `mapUrl` instead of + looking for a sourceMappingURL in the code. + +### Version 0.3.1 (2014-08-16) ### + +- Improved: Updated the source-map-url dependency to 0.3.0. + + +### Version 0.3.0 (2014-07-02) ### + +- Removed: Argument checking. It’s not worth it. (Possibly + backwards-incompatible change.) +- Added: The `sourceRoot` property of source maps may now be ignored, which can + be useful when resolving sources outside of the browser. +- Added: It is now possible to resolve only the URLs of sources, without + reading them. + + +### Version 0.2.0 (2014-06-22) ### + +- Changed: The result of `resolveSources` is now an object, not an array. The + old result array is available in the `sourcesContent` property. + (Backwards-incompatible change.) +- Changed: `sources` has been renamed to `sourcesContent` in the result object + of `resolve`. (Backwards-incompatible change.) +- Added: `resolveSources` now also returns all sources fully resolved, in the + `sourcesResolved` property. +- Added: The result object of `resolve` now contains the `sourcesResolved` + property from `resolveSources`. + + +### Version 0.1.4 (2014-06-16) ### + +- Fixed: `sourcesContent` was mis-typed as `sourceContents`, which meant that + the `sourcesContent` property of source maps never was used when resolving + sources. + + +### Version 0.1.3 (2014-05-06) ### + +- Only documentation and meta-data changes. + + +### Version 0.1.2 (2014-03-23) ### + +- Improved: Source maps starting with `)]}'` are now parsed correctly. The spec + allows source maps to start with that character sequence to prevent XSSI + attacks. + + +### Version 0.1.1 (2014-03-06) ### + +- Improved: Make sourceRoot resolving more sensible. + + A source root such as `/scripts/subdir` is now treated as `/scripts/subdir/` + — that is, as a directory called “subdir”, not a file called “subdir”. + Pointing to a file as source root does not makes sense. + + + +### Version 0.1.0 (2014-03-03) ### + +- Initial release. diff --git a/node_modules/source-map-resolve/node_modules/.bin/atob b/node_modules/source-map-resolve/node_modules/.bin/atob new file mode 120000 index 00000000..c0ab02d3 --- /dev/null +++ b/node_modules/source-map-resolve/node_modules/.bin/atob @@ -0,0 +1 @@ +../../../atob/bin/atob.js \ No newline at end of file diff --git a/node_modules/source-map-resolve/package.json b/node_modules/source-map-resolve/package.json new file mode 100644 index 00000000..78b63982 --- /dev/null +++ b/node_modules/source-map-resolve/package.json @@ -0,0 +1,47 @@ +{ + "name": "source-map-resolve", + "version": "0.5.3", + "author": "Simon Lydell", + "license": "MIT", + "description": "Resolve the source map and/or sources for a generated file.", + "keywords": [ + "source map", + "sourcemap", + "source", + "map", + "sourceMappingURL", + "resolve", + "resolver", + "locate", + "locator", + "find", + "finder" + ], + "repository": "lydell/source-map-resolve", + "main": "lib/source-map-resolve-node.js", + "browser": "source-map-resolve.js", + "files": [ + "lib", + "source-map-resolve.js" + ], + "scripts": { + "lint": "jshint lib/ test/", + "unit": "node test/source-map-resolve.js && node test/windows.js", + "test": "npm run lint && npm run unit", + "build": "node generate-source-map-resolve.js" + }, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + }, + "devDependencies": { + "Base64": "1.1.0", + "jshint": "2.10.3", + "setimmediate": "1.0.5", + "simple-asyncify": "1.0.0", + "tape": "4.12.1" + } +} \ No newline at end of file diff --git a/node_modules/source-map-resolve/readme.md b/node_modules/source-map-resolve/readme.md new file mode 100644 index 00000000..5796ba1f --- /dev/null +++ b/node_modules/source-map-resolve/readme.md @@ -0,0 +1,231 @@ +Overview [![Build Status](https://travis-ci.org/lydell/source-map-resolve.svg?branch=master)](https://travis-ci.org/lydell/source-map-resolve) +======== + +Resolve the source map and/or sources for a generated file. + +```js +var sourceMapResolve = require("source-map-resolve") +var sourceMap = require("source-map") + +var code = [ + "!function(){...}();", + "/*# sourceMappingURL=foo.js.map */" +].join("\n") + +sourceMapResolve.resolveSourceMap(code, "/js/foo.js", fs.readFile, function(error, result) { + if (error) { + return notifyFailure(error) + } + result + // { + // map: {file: "foo.js", mappings: "...", sources: ["/coffee/foo.coffee"], names: []}, + // url: "/js/foo.js.map", + // sourcesRelativeTo: "/js/foo.js.map", + // sourceMappingURL: "foo.js.map" + // } + + sourceMapResolve.resolveSources(result.map, result.sourcesRelativeTo, fs.readFile, function(error, result) { + if (error) { + return notifyFailure(error) + } + result + // { + // sourcesResolved: ["/coffee/foo.coffee"], + // sourcesContent: [""] + // } + }) +}) + +sourceMapResolve.resolve(code, "/js/foo.js", fs.readFile, function(error, result) { + if (error) { + return notifyFailure(error) + } + result + // { + // map: {file: "foo.js", mappings: "...", sources: ["/coffee/foo.coffee"], names: []}, + // url: "/js/foo.js.map", + // sourcesRelativeTo: "/js/foo.js.map", + // sourceMappingURL: "foo.js.map", + // sourcesResolved: ["/coffee/foo.coffee"], + // sourcesContent: [""] + // } + result.map.sourcesContent = result.sourcesContent + var map = new sourceMap.sourceMapConsumer(result.map) + map.sourceContentFor("/coffee/foo.coffee") + // "" +}) +``` + + +Installation +============ + +- `npm install source-map-resolve` +- `bower install source-map-resolve` +- `component install lydell/source-map-resolve` + +Works with CommonJS, AMD and browser globals, through UMD. + +Note: This module requires `setImmediate` and `atob`. +Use polyfills if needed, such as: + +- +- + + +Usage +===== + +### `sourceMapResolve.resolveSourceMap(code, codeUrl, read, callback)` ### + +- `code` is a string of code that may or may not contain a sourceMappingURL + comment. Such a comment is used to resolve the source map. +- `codeUrl` is the url to the file containing `code`. If the sourceMappingURL + is relative, it is resolved against `codeUrl`. +- `read(url, callback)` is a function that reads `url` and responds using + `callback(error, content)`. In Node.js you might want to use `fs.readFile`, + while in the browser you might want to use an asynchronus `XMLHttpRequest`. +- `callback(error, result)` is a function that is invoked with either an error + or `null` and the result. + +The result is an object with the following properties: + +- `map`: The source map for `code`, as an object (not a string). +- `url`: The url to the source map. If the source map came from a data uri, + this property is `null`, since then there is no url to it. +- `sourcesRelativeTo`: The url that the sources of the source map are relative + to. Since the sources are relative to the source map, and the url to the + source map is provided as the `url` property, this property might seem + superfluos. However, remember that the `url` property can be `null` if the + source map came from a data uri. If so, the sources are relative to the file + containing the data uri—`codeUrl`. This property will be identical to the + `url` property or `codeUrl`, whichever is appropriate. This way you can + conveniently resolve the sources without having to think about where the + source map came from. +- `sourceMappingURL`: The url of the sourceMappingURL comment in `code`. + +If `code` contains no sourceMappingURL, the result is `null`. + +### `sourceMapResolve.resolveSources(map, mapUrl, read, [options], callback)` ### + +- `map` is a source map, as an object (not a string). +- `mapUrl` is the url to the file containing `map`. Relative sources in the + source map, if any, are resolved against `mapUrl`. +- `read(url, callback)` is a function that reads `url` and responds using + `callback(error, content)`. In Node.js you might want to use `fs.readFile`, + while in the browser you might want to use an asynchronus `XMLHttpRequest`. +- `options` is an optional object with any of the following properties: + - `sourceRoot`: Override the `sourceRoot` property of the source map, which + might only be relevant when resolving sources in the browser. This lets you + bypass it when using the module outside of a browser, if needed. Pass a + string to replace the `sourceRoot` property with, or `false` to ignore it. + Defaults to `undefined`. +- `callback(error, result)` is a function that is invoked with either an error + or `null` and the result. + +The result is an object with the following properties: + +- `sourcesResolved`: The same as `map.sources`, except all the sources are + fully resolved. +- `sourcesContent`: An array with the contents of all sources in `map.sources`, + in the same order as `map.sources`. If getting the contents of a source fails, + an error object is put into the array instead. + +### `sourceMapResolve.resolve(code, codeUrl, read, [options], callback)` ### + +The arguments are identical to `sourceMapResolve.resolveSourceMap`, except that +you may also provide the same `options` as in `sourceMapResolve.resolveSources`. + +This is a convenience method that first resolves the source map and then its +sources. You could also do this by first calling +`sourceMapResolve.resolveSourceMap` and then `sourceMapResolve.resolveSources`. + +The result is identical to `sourceMapResolve.resolveSourceMap`, with the +properties from `sourceMapResolve.resolveSources` merged into it. + +There is one extra feature available, though. If `code` is `null`, `codeUrl` is +treated as a url to the source map instead of to `code`, and will be read. This +is handy if you _sometimes_ get the source map url from the `SourceMap: ` +header (see the [Notes] section). In this case, the `sourceMappingURL` property +of the result is `null`. + + +[Notes]: #notes + +### `sourceMapResolve.*Sync()` ### + +There are also sync versions of the three previous functions. They are identical +to the async versions, except: + +- They expect a sync reading function. In Node.js you might want to use + `fs.readFileSync`, while in the browser you might want to use a synchronus + `XMLHttpRequest`. +- They throw errors and return the result instead of using a callback. + +`sourceMapResolve.resolveSourcesSync` also accepts `null` as the `read` +parameter. The result is the same as when passing a function as the `read +parameter`, except that the `sourcesContent` property of the result will be an +empty array. In other words, the sources aren’t read. You only get the +`sourcesResolved` property. (This only supported in the synchronus version, since +there is no point doing it asynchronusly.) + +### `sourceMapResolve.parseMapToJSON(string, [data])` ### + +The spec says that if a source map (as a string) starts with `)]}'`, it should +be stripped off. This is to prevent XSSI attacks. This function does that and +returns the result of `JSON.parse`ing what’s left. + +If this function throws `error`, `error.sourceMapData === data`. + +### Errors + +All errors passed to callbacks or thrown by this module have a `sourceMapData` +property that contain as much as possible of the intended result of the function +up until the error occurred. + +Note that while the `map` property of result objects always is an object, +`error.sourceMapData.map` will be a string if parsing that string fails. + + +Note +==== + +This module resolves the source map for a given generated file by looking for a +sourceMappingURL comment. The spec defines yet a way to provide the URL to the +source map: By sending the `SourceMap: ` header along with the generated +file. Since this module doesn’t retrive the generated code for you (instead +_you_ give the generated code to the module), it’s up to you to look for such a +header when you retrieve the file (should the need arise). + + +Development +=========== + +Tests +----- + +First off, run `npm install` to install testing modules and browser polyfills. + +`npm test` lints the code and runs the test suite in Node.js. + +x-package.json5 +--------------- + +package.json, component.json and bower.json are all generated from +x-package.json5 by using [`xpkg`]. Only edit x-package.json5, and remember to +run `xpkg` before commiting! + +[`xpkg`]: https://github.com/kof/node-xpkg + +Generating the browser version +------------------------------ + +source-map-resolve.js is generated from source-map-resolve-node.js and +source-map-resolve-template.js. Only edit the two latter files, _not_ +source-map-resolve.js! To generate it, run `npm run build`. + + +License +======= + +[MIT](LICENSE). diff --git a/node_modules/source-map-resolve/source-map-resolve.js b/node_modules/source-map-resolve/source-map-resolve.js new file mode 100644 index 00000000..282b1260 --- /dev/null +++ b/node_modules/source-map-resolve/source-map-resolve.js @@ -0,0 +1,348 @@ +// Note: source-map-resolve.js is generated from source-map-resolve-node.js and +// source-map-resolve-template.js. Only edit the two latter files, _not_ +// source-map-resolve.js! + +void (function(root, factory) { + if (typeof define === "function" && define.amd) { + define(["source-map-url", "resolve-url"], factory) + } else if (typeof exports === "object") { + var sourceMappingURL = require("source-map-url") + var resolveUrl = require("resolve-url") + module.exports = factory(sourceMappingURL, resolveUrl) + } else { + root.sourceMapResolve = factory(root.sourceMappingURL, root.resolveUrl) + } +}(this, function(sourceMappingURL, resolveUrl) { + + function callbackAsync(callback, error, result) { + setImmediate(function() { callback(error, result) }) + } + + function parseMapToJSON(string, data) { + try { + return JSON.parse(string.replace(/^\)\]\}'/, "")) + } catch (error) { + error.sourceMapData = data + throw error + } + } + + function readSync(read, url, data) { + var readUrl = url + try { + return String(read(readUrl)) + } catch (error) { + error.sourceMapData = data + throw error + } + } + + + + function resolveSourceMap(code, codeUrl, read, callback) { + var mapData + try { + mapData = resolveSourceMapHelper(code, codeUrl) + } catch (error) { + return callbackAsync(callback, error) + } + if (!mapData || mapData.map) { + return callbackAsync(callback, null, mapData) + } + var readUrl = mapData.url + read(readUrl, function(error, result) { + if (error) { + error.sourceMapData = mapData + return callback(error) + } + mapData.map = String(result) + try { + mapData.map = parseMapToJSON(mapData.map, mapData) + } catch (error) { + return callback(error) + } + callback(null, mapData) + }) + } + + function resolveSourceMapSync(code, codeUrl, read) { + var mapData = resolveSourceMapHelper(code, codeUrl) + if (!mapData || mapData.map) { + return mapData + } + mapData.map = readSync(read, mapData.url, mapData) + mapData.map = parseMapToJSON(mapData.map, mapData) + return mapData + } + + var dataUriRegex = /^data:([^,;]*)(;[^,;]*)*(?:,(.*))?$/ + + /** + * The media type for JSON text is application/json. + * + * {@link https://tools.ietf.org/html/rfc8259#section-11 | IANA Considerations } + * + * `text/json` is non-standard media type + */ + var jsonMimeTypeRegex = /^(?:application|text)\/json$/ + + /** + * JSON text exchanged between systems that are not part of a closed ecosystem + * MUST be encoded using UTF-8. + * + * {@link https://tools.ietf.org/html/rfc8259#section-8.1 | Character Encoding} + */ + var jsonCharacterEncoding = "utf-8" + + function base64ToBuf(b64) { + var binStr = atob(b64) + var len = binStr.length + var arr = new Uint8Array(len) + for (var i = 0; i < len; i++) { + arr[i] = binStr.charCodeAt(i) + } + return arr + } + + function decodeBase64String(b64) { + if (typeof TextDecoder === "undefined" || typeof Uint8Array === "undefined") { + return atob(b64) + } + var buf = base64ToBuf(b64); + // Note: `decoder.decode` method will throw a `DOMException` with the + // `"EncodingError"` value when an coding error is found. + var decoder = new TextDecoder(jsonCharacterEncoding, {fatal: true}) + return decoder.decode(buf); + } + + function resolveSourceMapHelper(code, codeUrl) { + var url = sourceMappingURL.getFrom(code) + if (!url) { + return null + } + + var dataUri = url.match(dataUriRegex) + if (dataUri) { + var mimeType = dataUri[1] || "text/plain" + var lastParameter = dataUri[2] || "" + var encoded = dataUri[3] || "" + var data = { + sourceMappingURL: url, + url: null, + sourcesRelativeTo: codeUrl, + map: encoded + } + if (!jsonMimeTypeRegex.test(mimeType)) { + var error = new Error("Unuseful data uri mime type: " + mimeType) + error.sourceMapData = data + throw error + } + try { + data.map = parseMapToJSON( + lastParameter === ";base64" ? decodeBase64String(encoded) : decodeURIComponent(encoded), + data + ) + } catch (error) { + error.sourceMapData = data + throw error + } + return data + } + + var mapUrl = resolveUrl(codeUrl, url) + return { + sourceMappingURL: url, + url: mapUrl, + sourcesRelativeTo: mapUrl, + map: null + } + } + + + + function resolveSources(map, mapUrl, read, options, callback) { + if (typeof options === "function") { + callback = options + options = {} + } + var pending = map.sources ? map.sources.length : 0 + var result = { + sourcesResolved: [], + sourcesContent: [] + } + + if (pending === 0) { + callbackAsync(callback, null, result) + return + } + + var done = function() { + pending-- + if (pending === 0) { + callback(null, result) + } + } + + resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { + result.sourcesResolved[index] = fullUrl + if (typeof sourceContent === "string") { + result.sourcesContent[index] = sourceContent + callbackAsync(done, null) + } else { + var readUrl = fullUrl + read(readUrl, function(error, source) { + result.sourcesContent[index] = error ? error : String(source) + done() + }) + } + }) + } + + function resolveSourcesSync(map, mapUrl, read, options) { + var result = { + sourcesResolved: [], + sourcesContent: [] + } + + if (!map.sources || map.sources.length === 0) { + return result + } + + resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { + result.sourcesResolved[index] = fullUrl + if (read !== null) { + if (typeof sourceContent === "string") { + result.sourcesContent[index] = sourceContent + } else { + var readUrl = fullUrl + try { + result.sourcesContent[index] = String(read(readUrl)) + } catch (error) { + result.sourcesContent[index] = error + } + } + } + }) + + return result + } + + var endingSlash = /\/?$/ + + function resolveSourcesHelper(map, mapUrl, options, fn) { + options = options || {} + var fullUrl + var sourceContent + var sourceRoot + for (var index = 0, len = map.sources.length; index < len; index++) { + sourceRoot = null + if (typeof options.sourceRoot === "string") { + sourceRoot = options.sourceRoot + } else if (typeof map.sourceRoot === "string" && options.sourceRoot !== false) { + sourceRoot = map.sourceRoot + } + // If the sourceRoot is the empty string, it is equivalent to not setting + // the property at all. + if (sourceRoot === null || sourceRoot === '') { + fullUrl = resolveUrl(mapUrl, map.sources[index]) + } else { + // Make sure that the sourceRoot ends with a slash, so that `/scripts/subdir` becomes + // `/scripts/subdir/`, not `/scripts/`. Pointing to a file as source root + // does not make sense. + fullUrl = resolveUrl(mapUrl, sourceRoot.replace(endingSlash, "/"), map.sources[index]) + } + sourceContent = (map.sourcesContent || [])[index] + fn(fullUrl, sourceContent, index) + } + } + + + + function resolve(code, codeUrl, read, options, callback) { + if (typeof options === "function") { + callback = options + options = {} + } + if (code === null) { + var mapUrl = codeUrl + var data = { + sourceMappingURL: null, + url: mapUrl, + sourcesRelativeTo: mapUrl, + map: null + } + var readUrl = mapUrl + read(readUrl, function(error, result) { + if (error) { + error.sourceMapData = data + return callback(error) + } + data.map = String(result) + try { + data.map = parseMapToJSON(data.map, data) + } catch (error) { + return callback(error) + } + _resolveSources(data) + }) + } else { + resolveSourceMap(code, codeUrl, read, function(error, mapData) { + if (error) { + return callback(error) + } + if (!mapData) { + return callback(null, null) + } + _resolveSources(mapData) + }) + } + + function _resolveSources(mapData) { + resolveSources(mapData.map, mapData.sourcesRelativeTo, read, options, function(error, result) { + if (error) { + return callback(error) + } + mapData.sourcesResolved = result.sourcesResolved + mapData.sourcesContent = result.sourcesContent + callback(null, mapData) + }) + } + } + + function resolveSync(code, codeUrl, read, options) { + var mapData + if (code === null) { + var mapUrl = codeUrl + mapData = { + sourceMappingURL: null, + url: mapUrl, + sourcesRelativeTo: mapUrl, + map: null + } + mapData.map = readSync(read, mapUrl, mapData) + mapData.map = parseMapToJSON(mapData.map, mapData) + } else { + mapData = resolveSourceMapSync(code, codeUrl, read) + if (!mapData) { + return null + } + } + var result = resolveSourcesSync(mapData.map, mapData.sourcesRelativeTo, read, options) + mapData.sourcesResolved = result.sourcesResolved + mapData.sourcesContent = result.sourcesContent + return mapData + } + + + + return { + resolveSourceMap: resolveSourceMap, + resolveSourceMapSync: resolveSourceMapSync, + resolveSources: resolveSources, + resolveSourcesSync: resolveSourcesSync, + resolve: resolve, + resolveSync: resolveSync, + parseMapToJSON: parseMapToJSON + } + +})); diff --git a/node_modules/source-map-url/.jshintrc b/node_modules/source-map-url/.jshintrc new file mode 100644 index 00000000..8f33293c --- /dev/null +++ b/node_modules/source-map-url/.jshintrc @@ -0,0 +1,43 @@ +{ + "bitwise": true, + "camelcase": true, + "curly": false, + "eqeqeq": true, + "es3": true, + "forin": true, + "immed": false, + "indent": false, + "latedef": "nofunc", + "newcap": false, + "noarg": true, + "noempty": true, + "nonew": false, + "plusplus": false, + "quotmark": false, + "undef": true, + "unused": "vars", + "strict": false, + "trailing": true, + "maxparams": 5, + "maxdepth": false, + "maxstatements": false, + "maxcomplexity": false, + "maxlen": 100, + + "asi": true, + "expr": true, + "globalstrict": true, + "smarttabs": true, + "sub": true, + + "node": true, + "globals": { + "describe": false, + "it": false, + "before": false, + "beforeEach": false, + "after": false, + "afterEach": false, + "define": false + } +} diff --git a/node_modules/source-map-url/LICENSE b/node_modules/source-map-url/LICENSE new file mode 100644 index 00000000..10052a95 --- /dev/null +++ b/node_modules/source-map-url/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Simon Lydell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/source-map-url/bower.json b/node_modules/source-map-url/bower.json new file mode 100644 index 00000000..9831b7cd --- /dev/null +++ b/node_modules/source-map-url/bower.json @@ -0,0 +1,20 @@ +{ + "name": "source-map-url", + "version": "0.4.0", + "author": "Simon Lydell", + "license": "MIT", + "description": "Tools for working with sourceMappingURL comments.", + "keywords": [ + "source map", + "sourceMappingURL", + "comment", + "annotation" + ], + "main": "source-map-url.js", + "authors": [ + "Simon Lydell" + ], + "ignore": [ + ".*" + ] +} \ No newline at end of file diff --git a/node_modules/source-map-url/changelog.md b/node_modules/source-map-url/changelog.md new file mode 100644 index 00000000..e291a7f7 --- /dev/null +++ b/node_modules/source-map-url/changelog.md @@ -0,0 +1,52 @@ +### Version 0.4.0 (2015-11-12) ### + +- Changed: sourceMappingURL comments used to be matched only when placed at + the end of the script. However, since several commonly used JavaScript + libraries do not follow this convention and all popular web browsers accept + non-trailing comments, this has been revised. + + So now non-trailing SourceMappingURL comments are matched as well. + + +### Version 0.3.0 (2014-08-16) ### + +- Changed: sourceMappingURL comments used to be matched only if they appeared + on their own line. However, the spec only says: + + > The generated code may include a line at the end of the source, with the following form: + > + > //# sourceMappingURL= + + So now they are matched also when they appear on the same line as code. + +- Removed: The `.set()` method. I couldn’t decide how it should work + considering the above change. Moreover, it was unnecessarily complex (and + would have gotten worse) for very little gain. It is much easier to run + `.remove()` if needed, and then simply `code += "\n//# sourceMappingURL=" + + url` (using the appropriate comment syntax and newline). KISS. + +- Changed: The `.insertBefore()` method now always inserts the string exactly + before the sourceMappingURL comment; not before the newline before the + comment (if any). Moreover, it does not ensure that the comment will be on a + new line anymore. This is up to the caller. KISS. + +- Changed: The `.remove()` method no longer removes the newline before the + sourceMappingURL (if any). + +- Changed: Renamed `.get()` to `.getFrom()`. +- Changed: Renamed `.remove()` to `.removeFrom()`. + +- Added: The `.existsIn()` method. + + +### Version 0.2.0 (2014-02-23) ### + +- Changed: A space is no longer inserted before the closing comment syntax. If + such a space is desired, it needs to be put in the closing comment syntax + itself (such as `["/*", " */"]` instead of `["/*", "*/"]`). (Backwards + incompatible change.) + + +### Version 0.1.0 (2014-02-22) ### + +- Initial release. diff --git a/node_modules/source-map-url/component.json b/node_modules/source-map-url/component.json new file mode 100644 index 00000000..11d569c9 --- /dev/null +++ b/node_modules/source-map-url/component.json @@ -0,0 +1,18 @@ +{ + "name": "source-map-url", + "version": "0.4.0", + "author": "Simon Lydell", + "license": "MIT", + "description": "Tools for working with sourceMappingURL comments.", + "keywords": [ + "source map", + "sourceMappingURL", + "comment", + "annotation" + ], + "main": "source-map-url.js", + "repo": "lydell/source-map-url", + "scripts": [ + "source-map-url.js" + ] +} diff --git a/node_modules/source-map-url/package.json b/node_modules/source-map-url/package.json new file mode 100644 index 00000000..de7c90a2 --- /dev/null +++ b/node_modules/source-map-url/package.json @@ -0,0 +1,39 @@ +{ + "name": "source-map-url", + "version": "0.4.0", + "author": "Simon Lydell", + "license": "MIT", + "description": "Tools for working with sourceMappingURL comments.", + "keywords": [ + "source map", + "sourceMappingURL", + "comment", + "annotation" + ], + "main": "source-map-url.js", + "repository": "lydell/source-map-url", + "scripts": { + "lint": "jshint source-map-url.js test/ ", + "unit": "mocha", + "test": "npm run lint && npm run unit" + }, + "devDependencies": { + "mocha": "~1.17.1", + "expect.js": "~0.3.1", + "jshint": "~2.4.3" + }, + "testling": { + "harness": "mocha", + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "chrome/latest", + "firefox/latest", + "opera/12", + "opera/latest", + "safari/5", + "iphone/6", + "android-browser/4" + ] + } +} diff --git a/node_modules/source-map-url/readme.md b/node_modules/source-map-url/readme.md new file mode 100644 index 00000000..216de5e5 --- /dev/null +++ b/node_modules/source-map-url/readme.md @@ -0,0 +1,97 @@ +Overview [![Build Status](https://travis-ci.org/lydell/source-map-url.png?branch=master)](https://travis-ci.org/lydell/source-map-url) +======== + +[![browser support](https://ci.testling.com/lydell/source-map-url.png)](https://ci.testling.com/lydell/source-map-url) + +Tools for working with sourceMappingURL comments. + +```js +var sourceMappingURL = require("source-map-url") + +var code = [ + "!function(){...}();", + "/*# sourceMappingURL=foo.js.map */" +].join("\n") + +sourceMappingURL.existsIn(code) +// true + +sourceMappingURL.getFrom(code) +// foo.js.map + +code = sourceMappingURL.insertBefore(code, "// License: MIT\n") +// !function(){...}(); +// // License: MIT +// /*# sourceMappingURL=foo.js.map */ + +code = sourceMappingURL.removeFrom(code) +// !function(){...}(); +// // License: MIT + +sourceMappingURL.existsIn(code) +// false + +sourceMappingURL.getFrom(code) +// null + +code += "//# sourceMappingURL=/other/file.js.map" +// !function(){...}(); +// // License: MIT +// //# sourceMappingURL=/other/file.js.map +``` + + +Installation +============ + +- `npm install source-map-url` +- `bower install source-map-url` +- `component install lydell/source-map-url` + +Works with CommonJS, AMD and browser globals, through UMD. + + +Usage +===== + +### `sourceMappingURL.getFrom(code)` ### + +Returns the url of the sourceMappingURL comment in `code`. Returns `null` if +there is no such comment. + +### `sourceMappingURL.existsIn(code)` ### + +Returns `true` if there is a sourceMappingURL comment in `code`, or `false` +otherwise. + +### `sourceMappingURL.removeFrom(code)` ### + +Removes the sourceMappingURL comment in `code`. Does nothing if there is no +such comment. Returns the updated `code`. + +### `sourceMappingURL.insertBefore(code, string)` ### + +Inserts `string` before the sourceMappingURL comment in `code`. Appends +`string` to `code` if there is no such comment. + +Lets you append something to a file without worrying about burying the +sourceMappingURL comment (by keeping it at the end of the file). + +### `sourceMappingURL.regex` ### + +The regex that is used to match sourceMappingURL comments. It matches both `//` +and `/**/` comments, thus supporting both JavaScript and CSS. + + +Tests +===== + +Start by running `npm test`, which lints the code and runs the test suite in Node.js. + +To run the tests in a browser, run `testling` (`npm install -g testling`) or `testling -u`. + + +License +======= + +[The X11 (“MIT”) License](LICENSE). diff --git a/node_modules/source-map-url/source-map-url.js b/node_modules/source-map-url/source-map-url.js new file mode 100644 index 00000000..1724cb7c --- /dev/null +++ b/node_modules/source-map-url/source-map-url.js @@ -0,0 +1,57 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +void (function(root, factory) { + if (typeof define === "function" && define.amd) { + define(factory) + } else if (typeof exports === "object") { + module.exports = factory() + } else { + root.sourceMappingURL = factory() + } +}(this, function() { + + var innerRegex = /[#@] sourceMappingURL=([^\s'"]*)/ + + var regex = RegExp( + "(?:" + + "/\\*" + + "(?:\\s*\r?\n(?://)?)?" + + "(?:" + innerRegex.source + ")" + + "\\s*" + + "\\*/" + + "|" + + "//(?:" + innerRegex.source + ")" + + ")" + + "\\s*" + ) + + return { + + regex: regex, + _innerRegex: innerRegex, + + getFrom: function(code) { + var match = code.match(regex) + return (match ? match[1] || match[2] || "" : null) + }, + + existsIn: function(code) { + return regex.test(code) + }, + + removeFrom: function(code) { + return code.replace(regex, "") + }, + + insertBefore: function(code, string) { + var match = code.match(regex) + if (match) { + return code.slice(0, match.index) + string + code.slice(match.index) + } else { + return code + string + } + } + } + +})); diff --git a/node_modules/source-map-url/test/source-map-url.js b/node_modules/source-map-url/test/source-map-url.js new file mode 100644 index 00000000..630bc86f --- /dev/null +++ b/node_modules/source-map-url/test/source-map-url.js @@ -0,0 +1,402 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +var expect = require("expect.js") + +var sourceMappingURL = require("../") + +var comments = { + + universal: [ + "/*# sourceMappingURL=foo.js.map */" + ], + + js: [ + "//# sourceMappingURL=foo.js.map" + ], + + block: [ + "/*", + "# sourceMappingURL=foo.js.map", + "*/" + ], + + mix: [ + "/*", + "//# sourceMappingURL=foo.js.map", + "*/" + ] + +} + +var nonTrailingComments = { + + jsLeading: { + contents: [ + "//# sourceMappingURL=foo.js.map", + "(function(){})" + ], + solution: [ + "(function(){})" + ] + }, + + mixEmbedded: { + contents: [ + "/*! Library Name v1.0.0", + "//# sourceMappingURL=foo.js.map", + "*/", + "(function(){})" + ], + solution: [ + "/*! Library Name v1.0.0", + "*/", + "(function(){})" + ] + } + +} + +function forEachComment(fn) { + forOf(comments, function(name, comment) { + var description = "the '" + name + "' syntax with " + fn(comment.join("\n"), description + "regular newlines") + fn(comment.join("\r\n"), description + "Windows newlines") + }) +} + +function forEachNonTrailingComment(fn) { + forOf(nonTrailingComments, function(name, comment) { + + var description = "the '" + name + "' syntax with " + + fn({ + contents: comment.contents.join("\n"), + solution: comment.solution.join("\n") + }, description + "regular newlines") + + fn({ + contents: comment.contents.join("\r\n"), + solution: comment.solution.join("\r\n") + }, description + "Windows newlines") + }) +} + +function forOf(obj, fn) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn(key, obj[key]) + } + } +} + + +describe("sourceMappingURL", function() { + + describe(".getFrom", function() { + + forEachComment(function(comment, description) { + + it("gets the url from " + description, function() { + expect(sourceMappingURL.getFrom("code\n" + comment)) + .to.equal("foo.js.map") + + expect(sourceMappingURL.getFrom("code" + comment)) + .to.equal("foo.js.map") + + expect(sourceMappingURL.getFrom(comment)) + .to.equal("foo.js.map") + }) + + }) + + forEachNonTrailingComment(function(comment, description) { + + it("gets the url from " + description, function() { + expect(sourceMappingURL.getFrom("code\n" + comment.contents)) + .to.equal("foo.js.map") + + expect(sourceMappingURL.getFrom("code" + comment.contents)) + .to.equal("foo.js.map") + + expect(sourceMappingURL.getFrom(comment.contents)) + .to.equal("foo.js.map") + }) + + }) + + + it("returns null if no comment", function() { + expect(sourceMappingURL.getFrom("code")) + .to.equal(null) + }) + + + it("can return an empty string as url", function() { + expect(sourceMappingURL.getFrom("/*# sourceMappingURL= */")) + .to.equal("") + }) + + + it("is detachable", function() { + var get = sourceMappingURL.getFrom + expect(get("/*# sourceMappingURL=foo */")) + .to.equal("foo") + }) + + }) + + + describe(".existsIn", function() { + + forEachComment(function(comment, description) { + + it("returns true for " + description, function() { + expect(sourceMappingURL.existsIn("code\n" + comment)) + .to.equal(true) + + expect(sourceMappingURL.existsIn("code" + comment)) + .to.equal(true) + + expect(sourceMappingURL.existsIn(comment)) + .to.equal(true) + }) + + }) + + forEachNonTrailingComment(function(comment, description) { + + it("returns true for " + description, function() { + expect(sourceMappingURL.existsIn("code\n" + comment.contents)) + .to.equal(true) + + expect(sourceMappingURL.existsIn("code" + comment.contents)) + .to.equal(true) + + expect(sourceMappingURL.existsIn(comment.contents)) + .to.equal(true) + }) + + }) + + + it("returns false if no comment", function() { + expect(sourceMappingURL.existsIn("code")) + .to.equal(false) + }) + + + it("is detachable", function() { + var has = sourceMappingURL.existsIn + expect(has("/*# sourceMappingURL=foo */")) + .to.equal(true) + }) + + }) + + + describe(".removeFrom", function() { + + forEachComment(function(comment, description) { + + it("removes the comment for " + description, function() { + expect(sourceMappingURL.removeFrom("code\n" + comment)) + .to.equal("code\n") + + expect(sourceMappingURL.removeFrom("code" + comment)) + .to.equal("code") + + expect(sourceMappingURL.removeFrom(comment)) + .to.equal("") + }) + + }) + + forEachNonTrailingComment(function(comment, description) { + + it("removes the comment for " + description, function() { + expect(sourceMappingURL.removeFrom("code\n" + comment.contents)) + .to.equal("code\n" + comment.solution) + + expect(sourceMappingURL.removeFrom("code" + comment.contents)) + .to.equal("code" + comment.solution) + + expect(sourceMappingURL.removeFrom(comment.contents)) + .to.equal(comment.solution) + }) + + }) + + + it("does nothing if no comment", function() { + expect(sourceMappingURL.removeFrom("code\n")) + .to.equal("code\n") + }) + + + it("is detachable", function() { + var remove = sourceMappingURL.removeFrom + expect(remove("/*# sourceMappingURL=foo */")) + .to.equal("") + }) + + }) + + + describe(".insertBefore", function() { + + forEachComment(function(comment, description) { + + it("inserts a string before the comment for " + description, function() { + expect(sourceMappingURL.insertBefore("code\n" + comment, "more code\n")) + .to.equal("code\nmore code\n" + comment) + + expect(sourceMappingURL.insertBefore("code" + comment, "\nmore code")) + .to.equal("code\nmore code" + comment) + + expect(sourceMappingURL.insertBefore(comment, "some code")) + .to.equal("some code" + comment) + }) + + }) + + + it("inserts a string before an embedded comment", function() { + expect(sourceMappingURL.insertBefore("/*! Library Name v1.0.0\n" + + "//# sourceMappingURL=foo.js.map\n*/\n(function(){})", "code\n")) + .to.equal("/*! Library Name v1.0.0\ncode\n" + + "//# sourceMappingURL=foo.js.map\n*/\n(function(){})") + }) + + + it("inserts a string before a leading comment", function() { + expect(sourceMappingURL.insertBefore("//# sourceMappingURL=foo.js.map\n" + + "(function(){})", "code\n")) + .to.equal("code\n//# sourceMappingURL=foo.js.map\n" + + "(function(){})") + }) + + + it("appends if no comment", function() { + expect(sourceMappingURL.insertBefore("code", "\nmore code")) + .to.equal("code\nmore code") + }) + + + it("is detachable", function() { + var insertBefore = sourceMappingURL.insertBefore + expect(insertBefore("/*# sourceMappingURL=foo */", "bar")) + .to.equal("bar/*# sourceMappingURL=foo */") + }) + + }) + + + describe(".regex", function() { + + it("includes ._innerRegex", function() { + expect(sourceMappingURL.regex.source) + .to.contain(sourceMappingURL._innerRegex.source) + }) + + + var match = function(code) { + expect(code) + .to.match(sourceMappingURL.regex) + } + + var noMatch = function(code) { + expect(code) + .not.to.match(sourceMappingURL.regex) + } + + + forEachComment(function(comment, description) { + + it("matches " + description, function() { + match("code\n" + comment) + match("code" + comment) + match(comment) + }) + + + it("matches " + description + ", with trailing whitespace", function() { + match(comment + " ") + match(comment + "\n") + match(comment + "\n\n\t\n \t ") + }) + + }) + + + it("does not match some cases that are easy to mess up", function() { + noMatch( + "/* # sourceMappingURL=foo */" + ) + + noMatch( + "// # sourceMappingURL=foo" + ) + }) + + + it("is liberal regarding inner whitespace", function() { + match( + "/*# sourceMappingURL=foo*/" + ) + + match( + "/*# sourceMappingURL=foo */" + ) + + match( + "/*# sourceMappingURL=foo \t\n" + + "*/" + ) + + match( + "/* \n" + + "# sourceMappingURL=foo\n" + + "*/" + ) + + match( + "/*\n" + + "# sourceMappingURL=foo\n" + + " */" + ) + + match( + "/*\n" + + "# sourceMappingURL=foo\n" + + "\n" + + "\t\n" + + "*/" + ) + }) + + }) + + + describe("._innerRegex", function() { + + it("matches the contents of sourceMappingURL comments", function() { + expect("# sourceMappingURL=http://www.example.com/foo/bar.js.map") + .to.match(sourceMappingURL._innerRegex) + }) + + + it("captures the url in the first capture group", function() { + expect(sourceMappingURL._innerRegex.exec("# sourceMappingURL=foo")[1]) + .to.equal("foo") + }) + + + it("supports the legacy syntax", function() { + expect("@ sourceMappingURL=http://www.example.com/foo/bar.js.map") + .to.match(sourceMappingURL._innerRegex) + }) + + }) + +}) diff --git a/node_modules/source-map-url/x-package.json5 b/node_modules/source-map-url/x-package.json5 new file mode 100644 index 00000000..bdcd6ae1 --- /dev/null +++ b/node_modules/source-map-url/x-package.json5 @@ -0,0 +1,55 @@ +{ + name: "source-map-url", + version: "0.4.0", + author: "Simon Lydell", + license: "MIT", + description: "Tools for working with sourceMappingURL comments.", + keywords: [ + "source map", + "sourceMappingURL", + "comment", + "annotation" + ], + main: "source-map-url.js", + overlay: { + npm: { + repository: "lydell/source-map-url", + scripts: { + lint: "jshint source-map-url.js test/ ", + unit: "mocha", + test: "npm run lint && npm run unit" + }, + devDependencies: { + "mocha": "~1.17.1", + "expect.js": "~0.3.1", + "jshint": "~2.4.3" + }, + testling: { + harness: "mocha", + files: "test/*.js", + browsers: [ + "ie/8..latest", + "chrome/latest", + "firefox/latest", + "opera/12", + "opera/latest", + "safari/5", + "iphone/6", + "android-browser/4" + ] + } + }, + component: { + repo: "lydell/source-map-url", + scripts: [ + "source-map-url.js" + ] + }, + bower: { + authors: ["Simon Lydell"], + ignore: [ + ".*" + ] + } + } +} diff --git a/node_modules/source-map/CHANGELOG.md b/node_modules/source-map/CHANGELOG.md new file mode 100644 index 00000000..3a8c066c --- /dev/null +++ b/node_modules/source-map/CHANGELOG.md @@ -0,0 +1,301 @@ +# Change Log + +## 0.5.6 + +* Fix for regression when people were using numbers as names in source maps. See + #236. + +## 0.5.5 + +* Fix "regression" of unsupported, implementation behavior that half the world + happens to have come to depend on. See #235. + +* Fix regression involving function hoisting in SpiderMonkey. See #233. + +## 0.5.4 + +* Large performance improvements to source-map serialization. See #228 and #229. + +## 0.5.3 + +* Do not include unnecessary distribution files. See + commit ef7006f8d1647e0a83fdc60f04f5a7ca54886f86. + +## 0.5.2 + +* Include browser distributions of the library in package.json's `files`. See + issue #212. + +## 0.5.1 + +* Fix latent bugs in IndexedSourceMapConsumer.prototype._parseMappings. See + ff05274becc9e6e1295ed60f3ea090d31d843379. + +## 0.5.0 + +* Node 0.8 is no longer supported. + +* Use webpack instead of dryice for bundling. + +* Big speedups serializing source maps. See pull request #203. + +* Fix a bug with `SourceMapConsumer.prototype.sourceContentFor` and sources that + explicitly start with the source root. See issue #199. + +## 0.4.4 + +* Fix an issue where using a `SourceMapGenerator` after having created a + `SourceMapConsumer` from it via `SourceMapConsumer.fromSourceMap` failed. See + issue #191. + +* Fix an issue with where `SourceMapGenerator` would mistakenly consider + different mappings as duplicates of each other and avoid generating them. See + issue #192. + +## 0.4.3 + +* A very large number of performance improvements, particularly when parsing + source maps. Collectively about 75% of time shaved off of the source map + parsing benchmark! + +* Fix a bug in `SourceMapConsumer.prototype.allGeneratedPositionsFor` and fuzzy + searching in the presence of a column option. See issue #177. + +* Fix a bug with joining a source and its source root when the source is above + the root. See issue #182. + +* Add the `SourceMapConsumer.prototype.hasContentsOfAllSources` method to + determine when all sources' contents are inlined into the source map. See + issue #190. + +## 0.4.2 + +* Add an `.npmignore` file so that the benchmarks aren't pulled down by + dependent projects. Issue #169. + +* Add an optional `column` argument to + `SourceMapConsumer.prototype.allGeneratedPositionsFor` and better handle lines + with no mappings. Issues #172 and #173. + +## 0.4.1 + +* Fix accidentally defining a global variable. #170. + +## 0.4.0 + +* The default direction for fuzzy searching was changed back to its original + direction. See #164. + +* There is now a `bias` option you can supply to `SourceMapConsumer` to control + the fuzzy searching direction. See #167. + +* About an 8% speed up in parsing source maps. See #159. + +* Added a benchmark for parsing and generating source maps. + +## 0.3.0 + +* Change the default direction that searching for positions fuzzes when there is + not an exact match. See #154. + +* Support for environments using json2.js for JSON serialization. See #156. + +## 0.2.0 + +* Support for consuming "indexed" source maps which do not have any remote + sections. See pull request #127. This introduces a minor backwards + incompatibility if you are monkey patching `SourceMapConsumer.prototype` + methods. + +## 0.1.43 + +* Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue + #148 for some discussion and issues #150, #151, and #152 for implementations. + +## 0.1.42 + +* Fix an issue where `SourceNode`s from different versions of the source-map + library couldn't be used in conjunction with each other. See issue #142. + +## 0.1.41 + +* Fix a bug with getting the source content of relative sources with a "./" + prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768). + +* Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the + column span of each mapping. + +* Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find + all generated positions associated with a given original source and line. + +## 0.1.40 + +* Performance improvements for parsing source maps in SourceMapConsumer. + +## 0.1.39 + +* Fix a bug where setting a source's contents to null before any source content + had been set before threw a TypeError. See issue #131. + +## 0.1.38 + +* Fix a bug where finding relative paths from an empty path were creating + absolute paths. See issue #129. + +## 0.1.37 + +* Fix a bug where if the source root was an empty string, relative source paths + would turn into absolute source paths. Issue #124. + +## 0.1.36 + +* Allow the `names` mapping property to be an empty string. Issue #121. + +## 0.1.35 + +* A third optional parameter was added to `SourceNode.fromStringWithSourceMap` + to specify a path that relative sources in the second parameter should be + relative to. Issue #105. + +* If no file property is given to a `SourceMapGenerator`, then the resulting + source map will no longer have a `null` file property. The property will + simply not exist. Issue #104. + +* Fixed a bug where consecutive newlines were ignored in `SourceNode`s. + Issue #116. + +## 0.1.34 + +* Make `SourceNode` work with windows style ("\r\n") newlines. Issue #103. + +* Fix bug involving source contents and the + `SourceMapGenerator.prototype.applySourceMap`. Issue #100. + +## 0.1.33 + +* Fix some edge cases surrounding path joining and URL resolution. + +* Add a third parameter for relative path to + `SourceMapGenerator.prototype.applySourceMap`. + +* Fix issues with mappings and EOLs. + +## 0.1.32 + +* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns + (issue 92). + +* Fixed test runner to actually report number of failed tests as its process + exit code. + +* Fixed a typo when reporting bad mappings (issue 87). + +## 0.1.31 + +* Delay parsing the mappings in SourceMapConsumer until queried for a source + location. + +* Support Sass source maps (which at the time of writing deviate from the spec + in small ways) in SourceMapConsumer. + +## 0.1.30 + +* Do not join source root with a source, when the source is a data URI. + +* Extend the test runner to allow running single specific test files at a time. + +* Performance improvements in `SourceNode.prototype.walk` and + `SourceMapConsumer.prototype.eachMapping`. + +* Source map browser builds will now work inside Workers. + +* Better error messages when attempting to add an invalid mapping to a + `SourceMapGenerator`. + +## 0.1.29 + +* Allow duplicate entries in the `names` and `sources` arrays of source maps + (usually from TypeScript) we are parsing. Fixes github issue 72. + +## 0.1.28 + +* Skip duplicate mappings when creating source maps from SourceNode; github + issue 75. + +## 0.1.27 + +* Don't throw an error when the `file` property is missing in SourceMapConsumer, + we don't use it anyway. + +## 0.1.26 + +* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70. + +## 0.1.25 + +* Make compatible with browserify + +## 0.1.24 + +* Fix issue with absolute paths and `file://` URIs. See + https://bugzilla.mozilla.org/show_bug.cgi?id=885597 + +## 0.1.23 + +* Fix issue with absolute paths and sourcesContent, github issue 64. + +## 0.1.22 + +* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21. + +## 0.1.21 + +* Fixed handling of sources that start with a slash so that they are relative to + the source root's host. + +## 0.1.20 + +* Fixed github issue #43: absolute URLs aren't joined with the source root + anymore. + +## 0.1.19 + +* Using Travis CI to run tests. + +## 0.1.18 + +* Fixed a bug in the handling of sourceRoot. + +## 0.1.17 + +* Added SourceNode.fromStringWithSourceMap. + +## 0.1.16 + +* Added missing documentation. + +* Fixed the generating of empty mappings in SourceNode. + +## 0.1.15 + +* Added SourceMapGenerator.applySourceMap. + +## 0.1.14 + +* The sourceRoot is now handled consistently. + +## 0.1.13 + +* Added SourceMapGenerator.fromSourceMap. + +## 0.1.12 + +* SourceNode now generates empty mappings too. + +## 0.1.11 + +* Added name support to SourceNode. + +## 0.1.10 + +* Added sourcesContent support to the customer and generator. diff --git a/node_modules/source-map/LICENSE b/node_modules/source-map/LICENSE new file mode 100644 index 00000000..ed1b7cf2 --- /dev/null +++ b/node_modules/source-map/LICENSE @@ -0,0 +1,28 @@ + +Copyright (c) 2009-2011, Mozilla Foundation and contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the names of the Mozilla Foundation nor the names of project + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/source-map/README.md b/node_modules/source-map/README.md new file mode 100644 index 00000000..fea4beb1 --- /dev/null +++ b/node_modules/source-map/README.md @@ -0,0 +1,742 @@ +# Source Map + +[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map) + +[![NPM](https://nodei.co/npm/source-map.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map) + +This is a library to generate and consume the source map format +[described here][format]. + +[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit + +## Use with Node + + $ npm install source-map + +## Use on the Web + + + +-------------------------------------------------------------------------------- + + + + + +## Table of Contents + +- [Examples](#examples) + - [Consuming a source map](#consuming-a-source-map) + - [Generating a source map](#generating-a-source-map) + - [With SourceNode (high level API)](#with-sourcenode-high-level-api) + - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api) +- [API](#api) + - [SourceMapConsumer](#sourcemapconsumer) + - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap) + - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans) + - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition) + - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition) + - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition) + - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources) + - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing) + - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order) + - [SourceMapGenerator](#sourcemapgenerator) + - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap) + - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer) + - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping) + - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath) + - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring) + - [SourceNode](#sourcenode) + - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name) + - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath) + - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk) + - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk) + - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn) + - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn) + - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep) + - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement) + - [SourceNode.prototype.toString()](#sourcenodeprototypetostring) + - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap) + + + +## Examples + +### Consuming a source map + +```js +var rawSourceMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: 'http://example.com/www/js/', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' +}; + +var smc = new SourceMapConsumer(rawSourceMap); + +console.log(smc.sources); +// [ 'http://example.com/www/js/one.js', +// 'http://example.com/www/js/two.js' ] + +console.log(smc.originalPositionFor({ + line: 2, + column: 28 +})); +// { source: 'http://example.com/www/js/two.js', +// line: 2, +// column: 10, +// name: 'n' } + +console.log(smc.generatedPositionFor({ + source: 'http://example.com/www/js/two.js', + line: 2, + column: 10 +})); +// { line: 2, column: 28 } + +smc.eachMapping(function (m) { + // ... +}); +``` + +### Generating a source map + +In depth guide: +[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) + +#### With SourceNode (high level API) + +```js +function compile(ast) { + switch (ast.type) { + case 'BinaryExpression': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + [compile(ast.left), " + ", compile(ast.right)] + ); + case 'Literal': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + String(ast.value) + ); + // ... + default: + throw new Error("Bad AST"); + } +} + +var ast = parse("40 + 2", "add.js"); +console.log(compile(ast).toStringWithSourceMap({ + file: 'add.js' +})); +// { code: '40 + 2', +// map: [object SourceMapGenerator] } +``` + +#### With SourceMapGenerator (low level API) + +```js +var map = new SourceMapGenerator({ + file: "source-mapped.js" +}); + +map.addMapping({ + generated: { + line: 10, + column: 35 + }, + source: "foo.js", + original: { + line: 33, + column: 2 + }, + name: "christopher" +}); + +console.log(map.toString()); +// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' +``` + +## API + +Get a reference to the module: + +```js +// Node.js +var sourceMap = require('source-map'); + +// Browser builds +var sourceMap = window.sourceMap; + +// Inside Firefox +const sourceMap = require("devtools/toolkit/sourcemap/source-map.js"); +``` + +### SourceMapConsumer + +A SourceMapConsumer instance represents a parsed source map which we can query +for information about the original file positions by giving it a file position +in the generated source. + +#### new SourceMapConsumer(rawSourceMap) + +The only parameter is the raw source map (either as a string which can be +`JSON.parse`'d, or an object). According to the spec, source maps have the +following attributes: + +* `version`: Which version of the source map spec this map is following. + +* `sources`: An array of URLs to the original source files. + +* `names`: An array of identifiers which can be referenced by individual + mappings. + +* `sourceRoot`: Optional. The URL root from which all sources are relative. + +* `sourcesContent`: Optional. An array of contents of the original source files. + +* `mappings`: A string of base64 VLQs which contain the actual mappings. + +* `file`: Optional. The generated filename this source map is associated with. + +```js +var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData); +``` + +#### SourceMapConsumer.prototype.computeColumnSpans() + +Compute the last column for each generated mapping. The last column is +inclusive. + +```js +// Before: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] + +consumer.computeColumnSpans(); + +// After: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1, +// lastColumn: 9 }, +// { line: 2, +// column: 10, +// lastColumn: 19 }, +// { line: 2, +// column: 20, +// lastColumn: Infinity } ] + +``` + +#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) + +Returns the original source, line, and column information for the generated +source's line and column positions provided. The only argument is an object with +the following properties: + +* `line`: The line number in the generated source. Line numbers in + this library are 1-based (note that the underlying source map + specification uses 0-based line numbers -- this library handles the + translation). + +* `column`: The column number in the generated source. Column numbers + in this library are 0-based. + +* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or + `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest + element that is smaller than or greater than the one we are searching for, + respectively, if the exact element cannot be found. Defaults to + `SourceMapConsumer.GREATEST_LOWER_BOUND`. + +and an object is returned with the following properties: + +* `source`: The original source file, or null if this information is not + available. + +* `line`: The line number in the original source, or null if this information is + not available. The line number is 1-based. + +* `column`: The column number in the original source, or null if this + information is not available. The column number is 0-based. + +* `name`: The original identifier, or null if this information is not available. + +```js +consumer.originalPositionFor({ line: 2, column: 10 }) +// { source: 'foo.coffee', +// line: 2, +// column: 2, +// name: null } + +consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 }) +// { source: null, +// line: null, +// column: null, +// name: null } +``` + +#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) + +Returns the generated line and column information for the original source, +line, and column positions provided. The only argument is an object with +the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. The line number is + 1-based. + +* `column`: The column number in the original source. The column + number is 0-based. + +and an object is returned with the following properties: + +* `line`: The line number in the generated source, or null. The line + number is 1-based. + +* `column`: The column number in the generated source, or null. The + column number is 0-based. + +```js +consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 }) +// { line: 1, +// column: 56 } +``` + +#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) + +Returns all generated line and column information for the original source, line, +and column provided. If no column is provided, returns all mappings +corresponding to a either the line we are searching for or the next closest line +that has any mappings. Otherwise, returns all mappings corresponding to the +given line and either the column we are searching for or the next closest column +that has any offsets. + +The only argument is an object with the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. The line number is + 1-based. + +* `column`: Optional. The column number in the original source. The + column number is 0-based. + +and an array of objects is returned, each with the following properties: + +* `line`: The line number in the generated source, or null. The line + number is 1-based. + +* `column`: The column number in the generated source, or null. The + column number is 0-based. + +```js +consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] +``` + +#### SourceMapConsumer.prototype.hasContentsOfAllSources() + +Return true if we have the embedded source content for every source listed in +the source map, false otherwise. + +In other words, if this method returns `true`, then +`consumer.sourceContentFor(s)` will succeed for every source `s` in +`consumer.sources`. + +```js +// ... +if (consumer.hasContentsOfAllSources()) { + consumerReadyCallback(consumer); +} else { + fetchSources(consumer, consumerReadyCallback); +} +// ... +``` + +#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing]) + +Returns the original source content for the source provided. The only +argument is the URL of the original source file. + +If the source content for the given source is not found, then an error is +thrown. Optionally, pass `true` as the second param to have `null` returned +instead. + +```js +consumer.sources +// [ "my-cool-lib.clj" ] + +consumer.sourceContentFor("my-cool-lib.clj") +// "..." + +consumer.sourceContentFor("this is not in the source map"); +// Error: "this is not in the source map" is not in the source map + +consumer.sourceContentFor("this is not in the source map", true); +// null +``` + +#### SourceMapConsumer.prototype.eachMapping(callback, context, order) + +Iterate over each mapping between an original source/line/column and a +generated line/column in this source map. + +* `callback`: The function that is called with each mapping. Mappings have the + form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, + name }` + +* `context`: Optional. If specified, this object will be the value of `this` + every time that `callback` is called. + +* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or + `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over + the mappings sorted by the generated file's line/column order or the + original's source/line/column order, respectively. Defaults to + `SourceMapConsumer.GENERATED_ORDER`. + +```js +consumer.eachMapping(function (m) { console.log(m); }) +// ... +// { source: 'illmatic.js', +// generatedLine: 1, +// generatedColumn: 0, +// originalLine: 1, +// originalColumn: 0, +// name: null } +// { source: 'illmatic.js', +// generatedLine: 2, +// generatedColumn: 0, +// originalLine: 2, +// originalColumn: 0, +// name: null } +// ... +``` +### SourceMapGenerator + +An instance of the SourceMapGenerator represents a source map which is being +built incrementally. + +#### new SourceMapGenerator([startOfSourceMap]) + +You may pass an object with the following properties: + +* `file`: The filename of the generated source that this source map is + associated with. + +* `sourceRoot`: A root for all relative URLs in this source map. + +* `skipValidation`: Optional. When `true`, disables validation of mappings as + they are added. This can improve performance but should be used with + discretion, as a last resort. Even then, one should avoid using this flag when + running tests, if possible. + +```js +var generator = new sourceMap.SourceMapGenerator({ + file: "my-generated-javascript-file.js", + sourceRoot: "http://example.com/app/js/" +}); +``` + +#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) + +Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance. + +* `sourceMapConsumer` The SourceMap. + +```js +var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer); +``` + +#### SourceMapGenerator.prototype.addMapping(mapping) + +Add a single mapping from original source line and column to the generated +source's line and column for this source map being created. The mapping object +should have the following properties: + +* `generated`: An object with the generated line and column positions. + +* `original`: An object with the original line and column positions. + +* `source`: The original source file (relative to the sourceRoot). + +* `name`: An optional original token name for this mapping. + +```js +generator.addMapping({ + source: "module-one.scm", + original: { line: 128, column: 0 }, + generated: { line: 3, column: 456 } +}) +``` + +#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for an original source file. + +* `sourceFile` the URL of the original source file. + +* `sourceContent` the content of the source file. + +```js +generator.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) + +Applies a SourceMap for a source file to the SourceMap. +Each mapping to the supplied source file is rewritten using the +supplied SourceMap. Note: The resolution for the resulting mappings +is the minimum of this map and the supplied map. + +* `sourceMapConsumer`: The SourceMap to be applied. + +* `sourceFile`: Optional. The filename of the source file. + If omitted, sourceMapConsumer.file will be used, if it exists. + Otherwise an error will be thrown. + +* `sourceMapPath`: Optional. The dirname of the path to the SourceMap + to be applied. If relative, it is relative to the SourceMap. + + This parameter is needed when the two SourceMaps aren't in the same + directory, and the SourceMap to be applied contains relative source + paths. If so, those relative source paths need to be rewritten + relative to the SourceMap. + + If omitted, it is assumed that both SourceMaps are in the same directory, + thus not needing any rewriting. (Supplying `'.'` has the same effect.) + +#### SourceMapGenerator.prototype.toString() + +Renders the source map being generated to a string. + +```js +generator.toString() +// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}' +``` + +### SourceNode + +SourceNodes provide a way to abstract over interpolating and/or concatenating +snippets of generated JavaScript source code, while maintaining the line and +column information associated between those snippets and the original source +code. This is useful as the final intermediate representation a compiler might +use before outputting the generated JS and source map. + +#### new SourceNode([line, column, source[, chunk[, name]]]) + +* `line`: The original line number associated with this source node, or null if + it isn't associated with an original line. The line number is 1-based. + +* `column`: The original column number associated with this source node, or null + if it isn't associated with an original column. The column number + is 0-based. + +* `source`: The original source's filename; null if no filename is provided. + +* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see + below. + +* `name`: Optional. The original identifier. + +```js +var node = new SourceNode(1, 2, "a.cpp", [ + new SourceNode(3, 4, "b.cpp", "extern int status;\n"), + new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"), + new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"), +]); +``` + +#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) + +Creates a SourceNode from generated code and a SourceMapConsumer. + +* `code`: The generated code + +* `sourceMapConsumer` The SourceMap for the generated code + +* `relativePath` The optional path that relative sources in `sourceMapConsumer` + should be relative to. + +```js +var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8")); +var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"), + consumer); +``` + +#### SourceNode.prototype.add(chunk) + +Add a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.add(" + "); +node.add(otherNode); +node.add([leftHandOperandNode, " + ", rightHandOperandNode]); +``` + +#### SourceNode.prototype.prepend(chunk) + +Prepend a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.prepend("/** Build Id: f783haef86324gf **/\n\n"); +``` + +#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for a source file. This will be added to the +`SourceMap` in the `sourcesContent` field. + +* `sourceFile`: The filename of the source file + +* `sourceContent`: The content of the source file + +```js +node.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceNode.prototype.walk(fn) + +Walk over the tree of JS snippets in this node and its children. The walking +function is called once for each snippet of JS and is passed that snippet and +the its original associated source's line/column location. + +* `fn`: The traversal function. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.walk(function (code, loc) { console.log("WALK:", code, loc); }) +// WALK: uno { source: 'b.js', line: 3, column: 4, name: null } +// WALK: dos { source: 'a.js', line: 1, column: 2, name: null } +// WALK: tres { source: 'a.js', line: 1, column: 2, name: null } +// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null } +``` + +#### SourceNode.prototype.walkSourceContents(fn) + +Walk over the tree of SourceNodes. The walking function is called for each +source file content and is passed the filename and source content. + +* `fn`: The traversal function. + +```js +var a = new SourceNode(1, 2, "a.js", "generated from a"); +a.setSourceContent("a.js", "original a"); +var b = new SourceNode(1, 2, "b.js", "generated from b"); +b.setSourceContent("b.js", "original b"); +var c = new SourceNode(1, 2, "c.js", "generated from c"); +c.setSourceContent("c.js", "original c"); + +var node = new SourceNode(null, null, null, [a, b, c]); +node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); }) +// WALK: a.js : original a +// WALK: b.js : original b +// WALK: c.js : original c +``` + +#### SourceNode.prototype.join(sep) + +Like `Array.prototype.join` except for SourceNodes. Inserts the separator +between each of this source node's children. + +* `sep`: The separator. + +```js +var lhs = new SourceNode(1, 2, "a.rs", "my_copy"); +var operand = new SourceNode(3, 4, "a.rs", "="); +var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()"); + +var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]); +var joinedNode = node.join(" "); +``` + +#### SourceNode.prototype.replaceRight(pattern, replacement) + +Call `String.prototype.replace` on the very right-most source snippet. Useful +for trimming white space from the end of a source node, etc. + +* `pattern`: The pattern to replace. + +* `replacement`: The thing to replace the pattern with. + +```js +// Trim trailing white space. +node.replaceRight(/\s*$/, ""); +``` + +#### SourceNode.prototype.toString() + +Return the string representation of this source node. Walks over the tree and +concatenates all the various snippets together to one string. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toString() +// 'unodostresquatro' +``` + +#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) + +Returns the string representation of this tree of source nodes, plus a +SourceMapGenerator which contains all the mappings between the generated and +original sources. + +The arguments are the same as those to `new SourceMapGenerator`. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toStringWithSourceMap({ file: "my-output-file.js" }) +// { code: 'unodostresquatro', +// map: [object SourceMapGenerator] } +``` diff --git a/node_modules/source-map/dist/source-map.debug.js b/node_modules/source-map/dist/source-map.debug.js new file mode 100644 index 00000000..aad0620d --- /dev/null +++ b/node_modules/source-map/dist/source-map.debug.js @@ -0,0 +1,3234 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["sourceMap"] = factory(); + else + root["sourceMap"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer; + exports.SourceNode = __webpack_require__(10).SourceNode; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var base64VLQ = __webpack_require__(2); + var util = __webpack_require__(4); + var ArraySet = __webpack_require__(5).ArraySet; + var MappingList = __webpack_require__(6).MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var sourceRelative = sourceFile; + if (sourceRoot !== null) { + sourceRelative = util.relative(sourceRoot, sourceFile); + } + + if (!generator._sources.has(sourceRelative)) { + generator._sources.add(sourceRelative); + } + + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error( + 'original.line and original.column are not numbers -- you probably meant to omit ' + + 'the original mapping entirely and only map the generated position. If so, pass ' + + 'null for the original mapping instead of an object with empty or null values.' + ); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + var base64 = __webpack_require__(3); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || urlRegexp.test(aPath); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); + }()); + + function identity (s) { + return s; + } + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; + } + exports.toSetString = supportsNullProto ? identity : toSetString; + + function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; + } + exports.fromSetString = supportsNullProto ? identity : fromSetString; + + function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 === null) { + return 1; // aStr2 !== null + } + + if (aStr2 === null) { + return -1; // aStr1 !== null + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + + /** + * Strip any JSON XSSI avoidance prefix from the string (as documented + * in the source maps specification), and then parse the string as + * JSON. + */ + function parseSourceMapInput(str) { + return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, '')); + } + exports.parseSourceMapInput = parseSourceMapInput; + + /** + * Compute the URL of a source given the the source root, the source's + * URL, and the source map's URL. + */ + function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) { + sourceURL = sourceURL || ''; + + if (sourceRoot) { + // This follows what Chrome does. + if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') { + sourceRoot += '/'; + } + // The spec says: + // Line 4: An optional source root, useful for relocating source + // files on a server or removing repeated values in the + // “sources” entry. This value is prepended to the individual + // entries in the “source” field. + sourceURL = sourceRoot + sourceURL; + } + + // Historically, SourceMapConsumer did not take the sourceMapURL as + // a parameter. This mode is still somewhat supported, which is why + // this code block is conditional. However, it's preferable to pass + // the source map URL to SourceMapConsumer, so that this function + // can implement the source URL resolution algorithm as outlined in + // the spec. This block is basically the equivalent of: + // new URL(sourceURL, sourceMapURL).toString() + // ... except it avoids using URL, which wasn't available in the + // older releases of node still supported by this library. + // + // The spec says: + // If the sources are not absolute URLs after prepending of the + // “sourceRoot”, the sources are resolved relative to the + // SourceMap (like resolving script src in a html document). + if (sourceMapURL) { + var parsed = urlParse(sourceMapURL); + if (!parsed) { + throw new Error("sourceMapURL could not be parsed"); + } + if (parsed.path) { + // Strip the last path component, but keep the "/". + var index = parsed.path.lastIndexOf('/'); + if (index >= 0) { + parsed.path = parsed.path.substring(0, index + 1); + } + } + sourceURL = join(urlGenerate(parsed), sourceURL); + } + + return normalize(sourceURL); + } + exports.computeSourceURL = computeSourceURL; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var has = Object.prototype.hasOwnProperty; + var hasNativeMap = typeof Map !== "undefined"; + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var binarySearch = __webpack_require__(8); + var ArraySet = __webpack_require__(5).ArraySet; + var base64VLQ = __webpack_require__(2); + var quickSort = __webpack_require__(9).quickSort; + + function SourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL) + : new BasicSourceMapConsumer(sourceMap, aSourceMapURL); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + configurable: true, + enumerable: true, + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + configurable: true, + enumerable: true, + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL); + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number is 1-based. + * - column: Optional. the column number in the original source. + * The column number is 0-based. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + needle.source = this._findSourceIndex(needle.source); + if (needle.source < 0) { + return []; + } + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The first parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * The second parameter, if given, is a string whose value is the URL + * at which the source map was found. This URL is used to compute the + * sources array. + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + if (sourceRoot) { + sourceRoot = util.normalize(sourceRoot); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this._absoluteSources = this._sources.toArray().map(function (s) { + return util.computeSourceURL(sourceRoot, s, aSourceMapURL); + }); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this._sourceMapURL = aSourceMapURL; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Utility function to find the index of a source. Returns -1 if not + * found. + */ + BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) { + var relativeSource = aSource; + if (this.sourceRoot != null) { + relativeSource = util.relative(this.sourceRoot, relativeSource); + } + + if (this._sources.has(relativeSource)) { + return this._sources.indexOf(relativeSource); + } + + // Maybe aSource is an absolute URL as returned by |sources|. In + // this case we can't simply undo the transform. + var i; + for (i = 0; i < this._absoluteSources.length; ++i) { + if (this._absoluteSources[i] == aSource) { + return i; + } + } + + return -1; + }; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @param String aSourceMapURL + * The URL at which the source map can be found (optional) + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + smc._sourceMapURL = aSourceMapURL; + smc._absoluteSources = smc._sources.toArray().map(function (s) { + return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL); + }); + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._absoluteSources.slice(); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. The line number + * is 1-based. + * - column: The column number in the generated source. The column + * number is 0-based. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. The + * line number is 1-based. + * - column: The column number in the original source, or null. The + * column number is 0-based. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL); + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + var index = this._findSourceIndex(aSource); + if (index >= 0) { + return this.sourcesContent[index]; + } + + var relativeSource = aSource; + if (this.sourceRoot != null) { + relativeSource = util.relative(this.sourceRoot, relativeSource); + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = relativeSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + relativeSource)) { + return this.sourcesContent[this._sources.indexOf("/" + relativeSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + relativeSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number + * is 1-based. + * - column: The column number in the original source. The column + * number is 0-based. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + source = this._findSourceIndex(source); + if (source < 0) { + return { + line: null, + column: null, + lastColumn: null + }; + } + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The first parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * The second parameter, if given, is a string whose value is the URL + * at which the source map was found. This URL is used to compute the + * sources array. + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. The line number + * is 1-based. + * - column: The column number in the generated source. The column + * number is 0-based. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. The + * line number is 1-based. + * - column: The column number in the original source, or null. The + * column number is 0-based. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number + * is 1-based. + * - column: The column number in the original source. The column + * number is 0-based. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL); + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = null; + if (mapping.name) { + name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + } + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + var util = __webpack_require__(4); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? + remainingLines[remainingLinesIndex++] : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex] || ''; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex] || ''; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + + +/***/ }) +/******/ ]) +}); +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hhQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBMkQ7QUFDM0QscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBOzs7Ozs7O0FDM0lBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLG9CQUFtQjtBQUNuQixxQkFBb0I7O0FBRXBCLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLGlCQUFnQjtBQUNoQixrQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDbEVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWE7QUFDYjs7QUFFQTtBQUNBLGVBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDdmVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUN4SEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUM5RUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7O0FBRVg7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWEsa0NBQWtDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUErQyxtQkFBbUIsRUFBRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsb0JBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBNkIsTUFBTTtBQUNuQztBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsMkJBQTJC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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNqSEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLFNBQVM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQSx1Q0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQStDLFNBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBeUMsU0FBUztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsNkNBQTRDLGNBQWM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxjQUFhO0FBQ2I7QUFDQSxZQUFXO0FBQ1g7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQSxJQUFHOztBQUVILFdBQVU7QUFDVjs7QUFFQSIsImZpbGUiOiJzb3VyY2UtbWFwLmRlYnVnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNvdXJjZU1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zb3VyY2UtbWFwLmpzXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4vLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbi8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4vLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4vLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbi8vXG4vLyAgIENvbnRpbnVhdGlvblxuLy8gICB8ICAgIFNpZ25cbi8vICAgfCAgICB8XG4vLyAgIFYgICAgVlxuLy8gICAxMDEwMTFcblxudmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbi8vIGJpbmFyeTogMDExMTExXG52YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4vKipcbiAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gKi9cbmZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICByZXR1cm4gYVZhbHVlIDwgMFxuICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gKi9cbmZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgID8gLXNoaWZ0ZWRcbiAgICA6IHNoaWZ0ZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gIHZhciBkaWdpdDtcblxuICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICBkbyB7XG4gICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgIH1cbiAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICByZXR1cm4gZW5jb2RlZDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhSW5kZXgsIGFPdXRQYXJhbSkge1xuICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSAwO1xuICB2YXIgc2hpZnQgPSAwO1xuICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICBkbyB7XG4gICAgaWYgKGFJbmRleCA+PSBzdHJMZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQ29kZUF0KGFJbmRleCsrKSk7XG4gICAgaWYgKGRpZ2l0ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgIH1cblxuICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gIGFPdXRQYXJhbS5yZXN0ID0gYUluZGV4O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC12bHEuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgaW50VG9DaGFyTWFwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcblxuLyoqXG4gKiBFbmNvZGUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgMCB0byA2MyB0byBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0LlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgaWYgKDAgPD0gbnVtYmVyICYmIG51bWJlciA8IGludFRvQ2hhck1hcC5sZW5ndGgpIHtcbiAgICByZXR1cm4gaW50VG9DaGFyTWFwW251bWJlcl07XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBudW1iZXIpO1xufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBzaW5nbGUgYmFzZSA2NCBjaGFyYWN0ZXIgY29kZSBkaWdpdCB0byBhbiBpbnRlZ2VyLiBSZXR1cm5zIC0xIG9uXG4gKiBmYWlsdXJlLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICB2YXIgYmlnQSA9IDY1OyAgICAgLy8gJ0EnXG4gIHZhciBiaWdaID0gOTA7ICAgICAvLyAnWidcblxuICB2YXIgbGl0dGxlQSA9IDk3OyAgLy8gJ2EnXG4gIHZhciBsaXR0bGVaID0gMTIyOyAvLyAneidcblxuICB2YXIgemVybyA9IDQ4OyAgICAgLy8gJzAnXG4gIHZhciBuaW5lID0gNTc7ICAgICAvLyAnOSdcblxuICB2YXIgcGx1cyA9IDQzOyAgICAgLy8gJysnXG4gIHZhciBzbGFzaCA9IDQ3OyAgICAvLyAnLydcblxuICB2YXIgbGl0dGxlT2Zmc2V0ID0gMjY7XG4gIHZhciBudW1iZXJPZmZzZXQgPSA1MjtcblxuICAvLyAwIC0gMjU6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXG4gIGlmIChiaWdBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGJpZ1opIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gYmlnQSk7XG4gIH1cblxuICAvLyAyNiAtIDUxOiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxuICBpZiAobGl0dGxlQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBsaXR0bGVaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGxpdHRsZUEgKyBsaXR0bGVPZmZzZXQpO1xuICB9XG5cbiAgLy8gNTIgLSA2MTogMDEyMzQ1Njc4OVxuICBpZiAoemVybyA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBuaW5lKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIHplcm8gKyBudW1iZXJPZmZzZXQpO1xuICB9XG5cbiAgLy8gNjI6ICtcbiAgaWYgKGNoYXJDb2RlID09IHBsdXMpIHtcbiAgICByZXR1cm4gNjI7XG4gIH1cblxuICAvLyA2MzogL1xuICBpZiAoY2hhckNvZGUgPT0gc2xhc2gpIHtcbiAgICByZXR1cm4gNjM7XG4gIH1cblxuICAvLyBJbnZhbGlkIGJhc2U2NCBkaWdpdC5cbiAgcmV0dXJuIC0xO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIvb3B0aW9uc1xuICogb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXJncyBUaGUgb2JqZWN0IHdlIGFyZSBleHRyYWN0aW5nIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGdldHRpbmcuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICogZnJvbSB0aGUgb2JqZWN0LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBhblxuICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIGdldEFyZyhhQXJncywgYU5hbWUsIGFEZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGFOYW1lIGluIGFBcmdzKSB7XG4gICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIGFEZWZhdWx0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhTmFtZSArICdcIiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LicpO1xuICB9XG59XG5leHBvcnRzLmdldEFyZyA9IGdldEFyZztcblxudmFyIHVybFJlZ2V4cCA9IC9eKD86KFtcXHcrXFwtLl0rKTopP1xcL1xcLyg/OihcXHcrOlxcdyspQCk/KFtcXHcuLV0qKSg/OjooXFxkKykpPyguKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgdXJsUmVnZXhwLnRlc3QoYVBhdGgpO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZDtcblxuZnVuY3Rpb24gc3RyY21wKGFTdHIxLCBhU3RyMikge1xuICBpZiAoYVN0cjEgPT09IGFTdHIyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoYVN0cjEgPT09IG51bGwpIHtcbiAgICByZXR1cm4gMTsgLy8gYVN0cjIgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAtMTsgLy8gYVN0cjEgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuLyoqXG4gKiBTdHJpcCBhbnkgSlNPTiBYU1NJIGF2b2lkYW5jZSBwcmVmaXggZnJvbSB0aGUgc3RyaW5nIChhcyBkb2N1bWVudGVkXG4gKiBpbiB0aGUgc291cmNlIG1hcHMgc3BlY2lmaWNhdGlvbiksIGFuZCB0aGVuIHBhcnNlIHRoZSBzdHJpbmcgYXNcbiAqIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlTWFwSW5wdXQoc3RyKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHN0ci5yZXBsYWNlKC9eXFwpXX0nW15cXG5dKlxcbi8sICcnKSk7XG59XG5leHBvcnRzLnBhcnNlU291cmNlTWFwSW5wdXQgPSBwYXJzZVNvdXJjZU1hcElucHV0O1xuXG4vKipcbiAqIENvbXB1dGUgdGhlIFVSTCBvZiBhIHNvdXJjZSBnaXZlbiB0aGUgdGhlIHNvdXJjZSByb290LCB0aGUgc291cmNlJ3NcbiAqIFVSTCwgYW5kIHRoZSBzb3VyY2UgbWFwJ3MgVVJMLlxuICovXG5mdW5jdGlvbiBjb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKSB7XG4gIHNvdXJjZVVSTCA9IHNvdXJjZVVSTCB8fCAnJztcblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIC8vIFRoaXMgZm9sbG93cyB3aGF0IENocm9tZSBkb2VzLlxuICAgIGlmIChzb3VyY2VSb290W3NvdXJjZVJvb3QubGVuZ3RoIC0gMV0gIT09ICcvJyAmJiBzb3VyY2VVUkxbMF0gIT09ICcvJykge1xuICAgICAgc291cmNlUm9vdCArPSAnLyc7XG4gICAgfVxuICAgIC8vIFRoZSBzcGVjIHNheXM6XG4gICAgLy8gICBMaW5lIDQ6IEFuIG9wdGlvbmFsIHNvdXJjZSByb290LCB1c2VmdWwgZm9yIHJlbG9jYXRpbmcgc291cmNlXG4gICAgLy8gICBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlXG4gICAgLy8gICDigJxzb3VyY2Vz4oCdIGVudHJ5LiAgVGhpcyB2YWx1ZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGluZGl2aWR1YWxcbiAgICAvLyAgIGVudHJpZXMgaW4gdGhlIOKAnHNvdXJjZeKAnSBmaWVsZC5cbiAgICBzb3VyY2VVUkwgPSBzb3VyY2VSb290ICsgc291cmNlVVJMO1xuICB9XG5cbiAgLy8gSGlzdG9yaWNhbGx5LCBTb3VyY2VNYXBDb25zdW1lciBkaWQgbm90IHRha2UgdGhlIHNvdXJjZU1hcFVSTCBhc1xuICAvLyBhIHBhcmFtZXRlci4gIFRoaXMgbW9kZSBpcyBzdGlsbCBzb21ld2hhdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeVxuICAvLyB0aGlzIGNvZGUgYmxvY2sgaXMgY29uZGl0aW9uYWwuICBIb3dldmVyLCBpdCdzIHByZWZlcmFibGUgdG8gcGFzc1xuICAvLyB0aGUgc291cmNlIG1hcCBVUkwgdG8gU291cmNlTWFwQ29uc3VtZXIsIHNvIHRoYXQgdGhpcyBmdW5jdGlvblxuICAvLyBjYW4gaW1wbGVtZW50IHRoZSBzb3VyY2UgVVJMIHJlc29sdXRpb24gYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluXG4gIC8vIHRoZSBzcGVjLiAgVGhpcyBibG9jayBpcyBiYXNpY2FsbHkgdGhlIGVxdWl2YWxlbnQgb2Y6XG4gIC8vICAgIG5ldyBVUkwoc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpLnRvU3RyaW5nKClcbiAgLy8gLi4uIGV4Y2VwdCBpdCBhdm9pZHMgdXNpbmcgVVJMLCB3aGljaCB3YXNuJ3QgYXZhaWxhYmxlIGluIHRoZVxuICAvLyBvbGRlciByZWxlYXNlcyBvZiBub2RlIHN0aWxsIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkuXG4gIC8vXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vICAgSWYgdGhlIHNvdXJjZXMgYXJlIG5vdCBhYnNvbHV0ZSBVUkxzIGFmdGVyIHByZXBlbmRpbmcgb2YgdGhlXG4gIC8vICAg4oCcc291cmNlUm9vdOKAnSwgdGhlIHNvdXJjZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZVxuICAvLyAgIFNvdXJjZU1hcCAobGlrZSByZXNvbHZpbmcgc2NyaXB0IHNyYyBpbiBhIGh0bWwgZG9jdW1lbnQpLlxuICBpZiAoc291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHBhcnNlZCA9IHVybFBhcnNlKHNvdXJjZU1hcFVSTCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNvdXJjZU1hcFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkXCIpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnBhdGgpIHtcbiAgICAgIC8vIFN0cmlwIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LCBidXQga2VlcCB0aGUgXCIvXCIuXG4gICAgICB2YXIgaW5kZXggPSBwYXJzZWQucGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgcGFyc2VkLnBhdGggPSBwYXJzZWQucGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMID0gam9pbih1cmxHZW5lcmF0ZShwYXJzZWQpLCBzb3VyY2VVUkwpO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZShzb3VyY2VVUkwpO1xufVxuZXhwb3J0cy5jb21wdXRlU291cmNlVVJMID0gY29tcHV0ZVNvdXJjZVVSTDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2FycmF5LXNldC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9tYXBwaW5nLWxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICByZXR1cm4gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGxcbiAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKVxuICAgIDogbmV3IEJhc2ljU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4vLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3Ncbi8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4vLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4vL1xuLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbi8vXG4vLyAgICAge1xuLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2Zcbi8vICAgICAgICAgICAgIGNvZGUuXG4vLyAgICAgfVxuLy9cbi8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbi8vIGBudWxsYC5cbi8vXG4vLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuLy9cbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IE9wdGlvbmFsLiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgdmFyIGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKTtcblxuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gMCwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0IG1hcHBpbmcgZm9yXG4gICAgLy8gdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgb3JpZ2luYWxMaW5lOiBsaW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICB9O1xuXG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTtcbiAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGZvdW5kLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIHdlcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG9yaWdpbmFsQ29sdW1uKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5ncztcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKlxuICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAqXG4gKiAgICAge1xuICogICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICogICAgIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTtcbiAgfVxuXG4gIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgLm1hcChTdHJpbmcpXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIC5tYXAodXRpbC5ub3JtYWxpemUpXG4gICAgLy8gQWx3YXlzIGVuc3VyZSB0aGF0IGFic29sdXRlIHNvdXJjZXMgYXJlIGludGVybmFsbHkgc3RvcmVkIHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgLy8gYmUgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZSByb290IGlzIGEgcHJlZml4IG9mIHRoZVxuICAgIC8vIHNvdXJjZSAodmFsaWQsIGJ1dCB3aHk/PykuIFNlZSBnaXRodWIgaXNzdWUgIzE5OSBhbmQgYnVnemlsLmxhLzExODg5ODIuXG4gICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSlcbiAgICAgICAgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSlcbiAgICAgICAgOiBzb3VyY2U7XG4gICAgfSk7XG5cbiAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMubWFwKFN0cmluZyksIHRydWUpO1xuICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gIHRoaXMuX2Fic29sdXRlU291cmNlcyA9IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gIH0pO1xuXG4gIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgdGhpcy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgdGhpcy5maWxlID0gZmlsZTtcbn1cblxuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdFxuICogZm91bmQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kU291cmNlSW5kZXggPSBmdW5jdGlvbihhU291cmNlKSB7XG4gIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5pbmRleE9mKHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIC8vIE1heWJlIGFTb3VyY2UgaXMgYW4gYWJzb2x1dGUgVVJMIGFzIHJldHVybmVkIGJ5IHxzb3VyY2VzfC4gIEluXG4gIC8vIHRoaXMgY2FzZSB3ZSBjYW4ndCBzaW1wbHkgdW5kbyB0aGUgdHJhbnNmb3JtLlxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLl9hYnNvbHV0ZVNvdXJjZXNbaV0gPT0gYVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICogQHBhcmFtIFN0cmluZyBhU291cmNlTWFwVVJMXG4gKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICB2YXIgbmFtZXMgPSBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuICAgIHNtYy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgICBzbWMuX2Fic29sdXRlU291cmNlcyA9IHNtYy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNtYy5zb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlU291cmNlcy5zbGljZSgpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwodGhpcy5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5hdChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmXG4gICAgICAhdGhpcy5zb3VyY2VzQ29udGVudC5zb21lKGZ1bmN0aW9uIChzYykgeyByZXR1cm4gc2MgPT0gbnVsbDsgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIHVybDtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSByZWxhdGl2ZVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICB9XG5cbiAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIHJlbGF0aXZlU291cmNlKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IGZyb21cbiAgICAvLyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IuIEluIHRoYXQgY2FzZSwgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgIC8vIHJldHVybiBudWxsLCBzbyB3ZSBwcm92aWRlIGEgZmxhZyB0byBleGl0IGdyYWNlZnVsbHkuXG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgcmVsYXRpdmVTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7XG4gICAgaWYgKHNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gbmVlZGxlLnNvdXJjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbmV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAqIHRoYXQgaXQgdGFrZXMgXCJpbmRleGVkXCIgc291cmNlIG1hcHMgKGkuZS4gb25lcyB3aXRoIGEgXCJzZWN0aW9uc1wiIGZpZWxkKSBhc1xuICogaW5wdXQuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0I2hlYWRpbmc9aC41MzVlczN4ZXByZ3RcbiAqL1xuZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSwgYVNvdXJjZU1hcFVSTClcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbiB3ZSdyZSB0cnlpbmcgdG8gbWFwXG4gICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgIGZ1bmN0aW9uKG5lZWRsZSwgc2VjdGlvbikge1xuICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIH0pO1xuICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmVcbiAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgOiAwKSxcbiAgICAgIGJpYXM6IGFBcmdzLmJpYXNcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuIFxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICA6IDApXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgdmFyIHNlY3Rpb25NYXBwaW5ncyA9IHNlY3Rpb24uY29uc3VtZXIuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlY3Rpb24uY29uc3VtZXIuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvcXVpY2stc29ydC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW5vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/node_modules/source-map/dist/source-map.js b/node_modules/source-map/dist/source-map.js new file mode 100644 index 00000000..b4eb0874 --- /dev/null +++ b/node_modules/source-map/dist/source-map.js @@ -0,0 +1,3233 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["sourceMap"] = factory(); + else + root["sourceMap"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer; + exports.SourceNode = __webpack_require__(10).SourceNode; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var base64VLQ = __webpack_require__(2); + var util = __webpack_require__(4); + var ArraySet = __webpack_require__(5).ArraySet; + var MappingList = __webpack_require__(6).MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var sourceRelative = sourceFile; + if (sourceRoot !== null) { + sourceRelative = util.relative(sourceRoot, sourceFile); + } + + if (!generator._sources.has(sourceRelative)) { + generator._sources.add(sourceRelative); + } + + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error( + 'original.line and original.column are not numbers -- you probably meant to omit ' + + 'the original mapping entirely and only map the generated position. If so, pass ' + + 'null for the original mapping instead of an object with empty or null values.' + ); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + var base64 = __webpack_require__(3); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || urlRegexp.test(aPath); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); + }()); + + function identity (s) { + return s; + } + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; + } + exports.toSetString = supportsNullProto ? identity : toSetString; + + function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; + } + exports.fromSetString = supportsNullProto ? identity : fromSetString; + + function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 === null) { + return 1; // aStr2 !== null + } + + if (aStr2 === null) { + return -1; // aStr1 !== null + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + + /** + * Strip any JSON XSSI avoidance prefix from the string (as documented + * in the source maps specification), and then parse the string as + * JSON. + */ + function parseSourceMapInput(str) { + return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, '')); + } + exports.parseSourceMapInput = parseSourceMapInput; + + /** + * Compute the URL of a source given the the source root, the source's + * URL, and the source map's URL. + */ + function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) { + sourceURL = sourceURL || ''; + + if (sourceRoot) { + // This follows what Chrome does. + if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') { + sourceRoot += '/'; + } + // The spec says: + // Line 4: An optional source root, useful for relocating source + // files on a server or removing repeated values in the + // “sources” entry. This value is prepended to the individual + // entries in the “source” field. + sourceURL = sourceRoot + sourceURL; + } + + // Historically, SourceMapConsumer did not take the sourceMapURL as + // a parameter. This mode is still somewhat supported, which is why + // this code block is conditional. However, it's preferable to pass + // the source map URL to SourceMapConsumer, so that this function + // can implement the source URL resolution algorithm as outlined in + // the spec. This block is basically the equivalent of: + // new URL(sourceURL, sourceMapURL).toString() + // ... except it avoids using URL, which wasn't available in the + // older releases of node still supported by this library. + // + // The spec says: + // If the sources are not absolute URLs after prepending of the + // “sourceRoot”, the sources are resolved relative to the + // SourceMap (like resolving script src in a html document). + if (sourceMapURL) { + var parsed = urlParse(sourceMapURL); + if (!parsed) { + throw new Error("sourceMapURL could not be parsed"); + } + if (parsed.path) { + // Strip the last path component, but keep the "/". + var index = parsed.path.lastIndexOf('/'); + if (index >= 0) { + parsed.path = parsed.path.substring(0, index + 1); + } + } + sourceURL = join(urlGenerate(parsed), sourceURL); + } + + return normalize(sourceURL); + } + exports.computeSourceURL = computeSourceURL; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var has = Object.prototype.hasOwnProperty; + var hasNativeMap = typeof Map !== "undefined"; + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var binarySearch = __webpack_require__(8); + var ArraySet = __webpack_require__(5).ArraySet; + var base64VLQ = __webpack_require__(2); + var quickSort = __webpack_require__(9).quickSort; + + function SourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL) + : new BasicSourceMapConsumer(sourceMap, aSourceMapURL); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + configurable: true, + enumerable: true, + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + configurable: true, + enumerable: true, + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL); + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number is 1-based. + * - column: Optional. the column number in the original source. + * The column number is 0-based. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + needle.source = this._findSourceIndex(needle.source); + if (needle.source < 0) { + return []; + } + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The first parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * The second parameter, if given, is a string whose value is the URL + * at which the source map was found. This URL is used to compute the + * sources array. + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + if (sourceRoot) { + sourceRoot = util.normalize(sourceRoot); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this._absoluteSources = this._sources.toArray().map(function (s) { + return util.computeSourceURL(sourceRoot, s, aSourceMapURL); + }); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this._sourceMapURL = aSourceMapURL; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Utility function to find the index of a source. Returns -1 if not + * found. + */ + BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) { + var relativeSource = aSource; + if (this.sourceRoot != null) { + relativeSource = util.relative(this.sourceRoot, relativeSource); + } + + if (this._sources.has(relativeSource)) { + return this._sources.indexOf(relativeSource); + } + + // Maybe aSource is an absolute URL as returned by |sources|. In + // this case we can't simply undo the transform. + var i; + for (i = 0; i < this._absoluteSources.length; ++i) { + if (this._absoluteSources[i] == aSource) { + return i; + } + } + + return -1; + }; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @param String aSourceMapURL + * The URL at which the source map can be found (optional) + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + smc._sourceMapURL = aSourceMapURL; + smc._absoluteSources = smc._sources.toArray().map(function (s) { + return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL); + }); + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._absoluteSources.slice(); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. The line number + * is 1-based. + * - column: The column number in the generated source. The column + * number is 0-based. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. The + * line number is 1-based. + * - column: The column number in the original source, or null. The + * column number is 0-based. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL); + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + var index = this._findSourceIndex(aSource); + if (index >= 0) { + return this.sourcesContent[index]; + } + + var relativeSource = aSource; + if (this.sourceRoot != null) { + relativeSource = util.relative(this.sourceRoot, relativeSource); + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = relativeSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + relativeSource)) { + return this.sourcesContent[this._sources.indexOf("/" + relativeSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + relativeSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number + * is 1-based. + * - column: The column number in the original source. The column + * number is 0-based. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + source = this._findSourceIndex(source); + if (source < 0) { + return { + line: null, + column: null, + lastColumn: null + }; + } + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The first parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * The second parameter, if given, is a string whose value is the URL + * at which the source map was found. This URL is used to compute the + * sources array. + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. The line number + * is 1-based. + * - column: The column number in the generated source. The column + * number is 0-based. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. The + * line number is 1-based. + * - column: The column number in the original source, or null. The + * column number is 0-based. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number + * is 1-based. + * - column: The column number in the original source. The column + * number is 0-based. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL); + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = null; + if (mapping.name) { + name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + } + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + var util = __webpack_require__(4); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? + remainingLines[remainingLinesIndex++] : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex] || ''; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex] || ''; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/node_modules/source-map/dist/source-map.min.js b/node_modules/source-map/dist/source-map.min.js new file mode 100644 index 00000000..c7c72dad --- /dev/null +++ b/node_modules/source-map/dist/source-map.min.js @@ -0,0 +1,2 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.sourceMap=n():e.sourceMap=n()}(this,function(){return function(e){function n(t){if(r[t])return r[t].exports;var o=r[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var r={};return n.m=e,n.c=r,n.p="",n(0)}([function(e,n,r){n.SourceMapGenerator=r(1).SourceMapGenerator,n.SourceMapConsumer=r(7).SourceMapConsumer,n.SourceNode=r(10).SourceNode},function(e,n,r){function t(e){e||(e={}),this._file=i.getArg(e,"file",null),this._sourceRoot=i.getArg(e,"sourceRoot",null),this._skipValidation=i.getArg(e,"skipValidation",!1),this._sources=new s,this._names=new s,this._mappings=new a,this._sourcesContents=null}var o=r(2),i=r(4),s=r(5).ArraySet,a=r(6).MappingList;t.prototype._version=3,t.fromSourceMap=function(e){var n=e.sourceRoot,r=new t({file:e.file,sourceRoot:n});return e.eachMapping(function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(t.source=e.source,null!=n&&(t.source=i.relative(n,t.source)),t.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(t.name=e.name)),r.addMapping(t)}),e.sources.forEach(function(t){var o=t;null!==n&&(o=i.relative(n,t)),r._sources.has(o)||r._sources.add(o);var s=e.sourceContentFor(t);null!=s&&r.setSourceContent(t,s)}),r},t.prototype.addMapping=function(e){var n=i.getArg(e,"generated"),r=i.getArg(e,"original",null),t=i.getArg(e,"source",null),o=i.getArg(e,"name",null);this._skipValidation||this._validateMapping(n,r,t,o),null!=t&&(t=String(t),this._sources.has(t)||this._sources.add(t)),null!=o&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:n.line,generatedColumn:n.column,originalLine:null!=r&&r.line,originalColumn:null!=r&&r.column,source:t,name:o})},t.prototype.setSourceContent=function(e,n){var r=e;null!=this._sourceRoot&&(r=i.relative(this._sourceRoot,r)),null!=n?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[i.toSetString(r)]=n):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(r)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},t.prototype.applySourceMap=function(e,n,r){var t=n;if(null==n){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');t=e.file}var o=this._sourceRoot;null!=o&&(t=i.relative(o,t));var a=new s,u=new s;this._mappings.unsortedForEach(function(n){if(n.source===t&&null!=n.originalLine){var s=e.originalPositionFor({line:n.originalLine,column:n.originalColumn});null!=s.source&&(n.source=s.source,null!=r&&(n.source=i.join(r,n.source)),null!=o&&(n.source=i.relative(o,n.source)),n.originalLine=s.line,n.originalColumn=s.column,null!=s.name&&(n.name=s.name))}var l=n.source;null==l||a.has(l)||a.add(l);var c=n.name;null==c||u.has(c)||u.add(c)},this),this._sources=a,this._names=u,e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&(null!=r&&(n=i.join(r,n)),null!=o&&(n=i.relative(o,n)),this.setSourceContent(n,t))},this)},t.prototype._validateMapping=function(e,n,r,t){if(n&&"number"!=typeof n.line&&"number"!=typeof n.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||n||r||t)&&!(e&&"line"in e&&"column"in e&&n&&"line"in n&&"column"in n&&e.line>0&&e.column>=0&&n.line>0&&n.column>=0&&r))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:r,original:n,name:t}))},t.prototype._serializeMappings=function(){for(var e,n,r,t,s=0,a=1,u=0,l=0,c=0,g=0,p="",h=this._mappings.toArray(),f=0,d=h.length;f0){if(!i.compareByGeneratedPositionsInflated(n,h[f-1]))continue;e+=","}e+=o.encode(n.generatedColumn-s),s=n.generatedColumn,null!=n.source&&(t=this._sources.indexOf(n.source),e+=o.encode(t-g),g=t,e+=o.encode(n.originalLine-1-l),l=n.originalLine-1,e+=o.encode(n.originalColumn-u),u=n.originalColumn,null!=n.name&&(r=this._names.indexOf(n.name),e+=o.encode(r-c),c=r)),p+=e}return p},t.prototype._generateSourcesContent=function(e,n){return e.map(function(e){if(!this._sourcesContents)return null;null!=n&&(e=i.relative(n,e));var r=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,r)?this._sourcesContents[r]:null},this)},t.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},t.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=t},function(e,n,r){function t(e){return e<0?(-e<<1)+1:(e<<1)+0}function o(e){var n=1===(1&e),r=e>>1;return n?-r:r}var i=r(3),s=5,a=1<>>=s,o>0&&(n|=l),r+=i.encode(n);while(o>0);return r},n.decode=function(e,n,r){var t,a,c=e.length,g=0,p=0;do{if(n>=c)throw new Error("Expected more digits in base 64 VLQ value.");if(a=i.decode(e.charCodeAt(n++)),a===-1)throw new Error("Invalid base64 digit: "+e.charAt(n-1));t=!!(a&l),a&=u,g+=a<=0;c--)s=u[c],"."===s?u.splice(c,1):".."===s?l++:l>0&&(""===s?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return r=u.join("/"),""===r&&(r=a?"/":"."),i?(i.path=r,o(i)):r}function s(e,n){""===e&&(e="."),""===n&&(n=".");var r=t(n),s=t(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||n.match(y))return n;if(s&&!s.host&&!s.path)return s.host=n,o(s);var a="/"===n.charAt(0)?n:i(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=a,o(s)):a}function a(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if(e=e.slice(0,t),e.match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)}function u(e){return e}function l(e){return g(e)?"$"+e:e}function c(e){return g(e)?e.slice(1):e}function g(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function p(e,n,r){var t=f(e.source,n.source);return 0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t||r?t:(t=e.generatedColumn-n.generatedColumn,0!==t?t:(t=e.generatedLine-n.generatedLine,0!==t?t:f(e.name,n.name)))))}function h(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:(t=e.generatedColumn-n.generatedColumn,0!==t||r?t:(t=f(e.source,n.source),0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:f(e.name,n.name)))))}function f(e,n){return e===n?0:null===e?1:null===n?-1:e>n?1:-1}function d(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:(r=e.generatedColumn-n.generatedColumn,0!==r?r:(r=f(e.source,n.source),0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r?r:f(e.name,n.name)))))}function m(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))}function _(e,n,r){if(n=n||"",e&&("/"!==e[e.length-1]&&"/"!==n[0]&&(e+="/"),n=e+n),r){var a=t(r);if(!a)throw new Error("sourceMapURL could not be parsed");if(a.path){var u=a.path.lastIndexOf("/");u>=0&&(a.path=a.path.substring(0,u+1))}n=s(o(a),n)}return i(n)}n.getArg=r;var v=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,y=/^data:.+\,.+$/;n.urlParse=t,n.urlGenerate=o,n.normalize=i,n.join=s,n.isAbsolute=function(e){return"/"===e.charAt(0)||v.test(e)},n.relative=a;var C=function(){var e=Object.create(null);return!("__proto__"in e)}();n.toSetString=C?u:l,n.fromSetString=C?u:c,n.compareByOriginalPositions=p,n.compareByGeneratedPositionsDeflated=h,n.compareByGeneratedPositionsInflated=d,n.parseSourceMapInput=m,n.computeSourceURL=_},function(e,n,r){function t(){this._array=[],this._set=s?new Map:Object.create(null)}var o=r(4),i=Object.prototype.hasOwnProperty,s="undefined"!=typeof Map;t.fromArray=function(e,n){for(var r=new t,o=0,i=e.length;o=0)return n}else{var r=o.toSetString(e);if(i.call(this._set,r))return this._set[r]}throw new Error('"'+e+'" is not in the set.')},t.prototype.at=function(e){if(e>=0&&er||t==r&&s>=o||i.compareByGeneratedPositionsInflated(e,n)<=0}function o(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}var i=r(4);o.prototype.unsortedForEach=function(e,n){this._array.forEach(e,n)},o.prototype.add=function(e){t(this._last,e)?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},o.prototype.toArray=function(){return this._sorted||(this._array.sort(i.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=o},function(e,n,r){function t(e,n){var r=e;return"string"==typeof e&&(r=a.parseSourceMapInput(e)),null!=r.sections?new s(r,n):new o(r,n)}function o(e,n){var r=e;"string"==typeof e&&(r=a.parseSourceMapInput(e));var t=a.getArg(r,"version"),o=a.getArg(r,"sources"),i=a.getArg(r,"names",[]),s=a.getArg(r,"sourceRoot",null),u=a.getArg(r,"sourcesContent",null),c=a.getArg(r,"mappings"),g=a.getArg(r,"file",null);if(t!=this._version)throw new Error("Unsupported version: "+t);s&&(s=a.normalize(s)),o=o.map(String).map(a.normalize).map(function(e){return s&&a.isAbsolute(s)&&a.isAbsolute(e)?a.relative(s,e):e}),this._names=l.fromArray(i.map(String),!0),this._sources=l.fromArray(o,!0),this._absoluteSources=this._sources.toArray().map(function(e){return a.computeSourceURL(s,e,n)}),this.sourceRoot=s,this.sourcesContent=u,this._mappings=c,this._sourceMapURL=n,this.file=g}function i(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function s(e,n){var r=e;"string"==typeof e&&(r=a.parseSourceMapInput(e));var o=a.getArg(r,"version"),i=a.getArg(r,"sections");if(o!=this._version)throw new Error("Unsupported version: "+o);this._sources=new l,this._names=new l;var s={line:-1,column:0};this._sections=i.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var r=a.getArg(e,"offset"),o=a.getArg(r,"line"),i=a.getArg(r,"column");if(o=0){var i=this._originalMappings[o];if(void 0===e.column)for(var s=i.originalLine;i&&i.originalLine===s;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o];else for(var l=i.originalColumn;i&&i.originalLine===n&&i.originalColumn==l;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o]}return t},n.SourceMapConsumer=t,o.prototype=Object.create(t.prototype),o.prototype.consumer=t,o.prototype._findSourceIndex=function(e){var n=e;if(null!=this.sourceRoot&&(n=a.relative(this.sourceRoot,n)),this._sources.has(n))return this._sources.indexOf(n);var r;for(r=0;r1&&(r.source=d+o[1],d+=o[1],r.originalLine=h+o[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+o[3],f=r.originalColumn,o.length>4&&(r.name=m+o[4],m+=o[4])),A.push(r),"number"==typeof r.originalLine&&S.push(r)}g(A,a.compareByGeneratedPositionsDeflated),this.__generatedMappings=A,g(S,a.compareByOriginalPositions),this.__originalMappings=S},o.prototype._findMapping=function(e,n,r,t,o,i){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return u.search(e,n,o,i)},o.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=a.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),i=a.computeSourceURL(this.sourceRoot,i,this._sourceMapURL));var s=a.getArg(o,"name",null);return null!==s&&(s=this._names.at(s)),{source:i,line:a.getArg(o,"originalLine",null),column:a.getArg(o,"originalColumn",null),name:s}}}return{source:null,line:null,column:null,name:null}},o.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},o.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;var r=this._findSourceIndex(e);if(r>=0)return this.sourcesContent[r];var t=e;null!=this.sourceRoot&&(t=a.relative(this.sourceRoot,t));var o;if(null!=this.sourceRoot&&(o=a.urlParse(this.sourceRoot))){var i=t.replace(/^file:\/\//,"");if("file"==o.scheme&&this._sources.has(i))return this.sourcesContent[this._sources.indexOf(i)];if((!o.path||"/"==o.path)&&this._sources.has("/"+t))return this.sourcesContent[this._sources.indexOf("/"+t)]}if(n)return null;throw new Error('"'+t+'" is not in the SourceMap.')},o.prototype.generatedPositionFor=function(e){var n=a.getArg(e,"source");if(n=this._findSourceIndex(n),n<0)return{line:null,column:null,lastColumn:null};var r={source:n,originalLine:a.getArg(e,"line"),originalColumn:a.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=o,s.prototype=Object.create(t.prototype),s.prototype.constructor=t,s.prototype._version=3,Object.defineProperty(s.prototype,"sources",{get:function(){for(var e=[],n=0;n0?t-u>1?r(u,t,o,i,s,a):a==n.LEAST_UPPER_BOUND?t1?r(e,u,o,i,s,a):a==n.LEAST_UPPER_BOUND?u:e<0?-1:e}n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,t,o,i){if(0===t.length)return-1;var s=r(-1,t.length,e,t,o,i||n.GREATEST_LOWER_BOUND);if(s<0)return-1;for(;s-1>=0&&0===o(t[s],t[s-1],!0);)--s;return s}},function(e,n){function r(e,n,r){var t=e[n];e[n]=e[r],e[r]=t}function t(e,n){return Math.round(e+Math.random()*(n-e))}function o(e,n,i,s){if(i=0;n--)this.prepend(e[n]);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);this.children.unshift(e)}return this},t.prototype.walk=function(e){for(var n,r=0,t=this.children.length;r0){for(n=[],r=0;r 0 && aGenerated.column >= 0\n\t && !aOriginal && !aSource && !aName) {\n\t // Case 1.\n\t return;\n\t }\n\t else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n\t && aGenerated.line > 0 && aGenerated.column >= 0\n\t && aOriginal.line > 0 && aOriginal.column >= 0\n\t && aSource) {\n\t // Cases 2 and 3.\n\t return;\n\t }\n\t else {\n\t throw new Error('Invalid mapping: ' + JSON.stringify({\n\t generated: aGenerated,\n\t source: aSource,\n\t original: aOriginal,\n\t name: aName\n\t }));\n\t }\n\t };\n\t\n\t/**\n\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\n\t * specified by the source map format.\n\t */\n\tSourceMapGenerator.prototype._serializeMappings =\n\t function SourceMapGenerator_serializeMappings() {\n\t var previousGeneratedColumn = 0;\n\t var previousGeneratedLine = 1;\n\t var previousOriginalColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousName = 0;\n\t var previousSource = 0;\n\t var result = '';\n\t var next;\n\t var mapping;\n\t var nameIdx;\n\t var sourceIdx;\n\t\n\t var mappings = this._mappings.toArray();\n\t for (var i = 0, len = mappings.length; i < len; i++) {\n\t mapping = mappings[i];\n\t next = ''\n\t\n\t if (mapping.generatedLine !== previousGeneratedLine) {\n\t previousGeneratedColumn = 0;\n\t while (mapping.generatedLine !== previousGeneratedLine) {\n\t next += ';';\n\t previousGeneratedLine++;\n\t }\n\t }\n\t else {\n\t if (i > 0) {\n\t if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n\t continue;\n\t }\n\t next += ',';\n\t }\n\t }\n\t\n\t next += base64VLQ.encode(mapping.generatedColumn\n\t - previousGeneratedColumn);\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (mapping.source != null) {\n\t sourceIdx = this._sources.indexOf(mapping.source);\n\t next += base64VLQ.encode(sourceIdx - previousSource);\n\t previousSource = sourceIdx;\n\t\n\t // lines are stored 0-based in SourceMap spec version 3\n\t next += base64VLQ.encode(mapping.originalLine - 1\n\t - previousOriginalLine);\n\t previousOriginalLine = mapping.originalLine - 1;\n\t\n\t next += base64VLQ.encode(mapping.originalColumn\n\t - previousOriginalColumn);\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (mapping.name != null) {\n\t nameIdx = this._names.indexOf(mapping.name);\n\t next += base64VLQ.encode(nameIdx - previousName);\n\t previousName = nameIdx;\n\t }\n\t }\n\t\n\t result += next;\n\t }\n\t\n\t return result;\n\t };\n\t\n\tSourceMapGenerator.prototype._generateSourcesContent =\n\t function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n\t return aSources.map(function (source) {\n\t if (!this._sourcesContents) {\n\t return null;\n\t }\n\t if (aSourceRoot != null) {\n\t source = util.relative(aSourceRoot, source);\n\t }\n\t var key = util.toSetString(source);\n\t return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n\t ? this._sourcesContents[key]\n\t : null;\n\t }, this);\n\t };\n\t\n\t/**\n\t * Externalize the source map.\n\t */\n\tSourceMapGenerator.prototype.toJSON =\n\t function SourceMapGenerator_toJSON() {\n\t var map = {\n\t version: this._version,\n\t sources: this._sources.toArray(),\n\t names: this._names.toArray(),\n\t mappings: this._serializeMappings()\n\t };\n\t if (this._file != null) {\n\t map.file = this._file;\n\t }\n\t if (this._sourceRoot != null) {\n\t map.sourceRoot = this._sourceRoot;\n\t }\n\t if (this._sourcesContents) {\n\t map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n\t }\n\t\n\t return map;\n\t };\n\t\n\t/**\n\t * Render the source map being generated to a string.\n\t */\n\tSourceMapGenerator.prototype.toString =\n\t function SourceMapGenerator_toString() {\n\t return JSON.stringify(this.toJSON());\n\t };\n\t\n\texports.SourceMapGenerator = SourceMapGenerator;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t *\n\t * Based on the Base 64 VLQ implementation in Closure Compiler:\n\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n\t *\n\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are\n\t * met:\n\t *\n\t * * Redistributions of source code must retain the above copyright\n\t * notice, this list of conditions and the following disclaimer.\n\t * * Redistributions in binary form must reproduce the above\n\t * copyright notice, this list of conditions and the following\n\t * disclaimer in the documentation and/or other materials provided\n\t * with the distribution.\n\t * * Neither the name of Google Inc. nor the names of its\n\t * contributors may be used to endorse or promote products derived\n\t * from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t */\n\t\n\tvar base64 = __webpack_require__(3);\n\t\n\t// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n\t// length quantities we use in the source map spec, the first bit is the sign,\n\t// the next four bits are the actual value, and the 6th bit is the\n\t// continuation bit. The continuation bit tells us whether there are more\n\t// digits in this value following this digit.\n\t//\n\t// Continuation\n\t// | Sign\n\t// | |\n\t// V V\n\t// 101011\n\t\n\tvar VLQ_BASE_SHIFT = 5;\n\t\n\t// binary: 100000\n\tvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\t\n\t// binary: 011111\n\tvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\t\n\t// binary: 100000\n\tvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\t\n\t/**\n\t * Converts from a two-complement value to a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n\t * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n\t */\n\tfunction toVLQSigned(aValue) {\n\t return aValue < 0\n\t ? ((-aValue) << 1) + 1\n\t : (aValue << 1) + 0;\n\t}\n\t\n\t/**\n\t * Converts to a two-complement value from a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n\t * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n\t */\n\tfunction fromVLQSigned(aValue) {\n\t var isNegative = (aValue & 1) === 1;\n\t var shifted = aValue >> 1;\n\t return isNegative\n\t ? -shifted\n\t : shifted;\n\t}\n\t\n\t/**\n\t * Returns the base 64 VLQ encoded value.\n\t */\n\texports.encode = function base64VLQ_encode(aValue) {\n\t var encoded = \"\";\n\t var digit;\n\t\n\t var vlq = toVLQSigned(aValue);\n\t\n\t do {\n\t digit = vlq & VLQ_BASE_MASK;\n\t vlq >>>= VLQ_BASE_SHIFT;\n\t if (vlq > 0) {\n\t // There are still more digits in this value, so we must make sure the\n\t // continuation bit is marked.\n\t digit |= VLQ_CONTINUATION_BIT;\n\t }\n\t encoded += base64.encode(digit);\n\t } while (vlq > 0);\n\t\n\t return encoded;\n\t};\n\t\n\t/**\n\t * Decodes the next base 64 VLQ value from the given string and returns the\n\t * value and the rest of the string via the out parameter.\n\t */\n\texports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n\t var strLen = aStr.length;\n\t var result = 0;\n\t var shift = 0;\n\t var continuation, digit;\n\t\n\t do {\n\t if (aIndex >= strLen) {\n\t throw new Error(\"Expected more digits in base 64 VLQ value.\");\n\t }\n\t\n\t digit = base64.decode(aStr.charCodeAt(aIndex++));\n\t if (digit === -1) {\n\t throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n\t }\n\t\n\t continuation = !!(digit & VLQ_CONTINUATION_BIT);\n\t digit &= VLQ_BASE_MASK;\n\t result = result + (digit << shift);\n\t shift += VLQ_BASE_SHIFT;\n\t } while (continuation);\n\t\n\t aOutParam.value = fromVLQSigned(result);\n\t aOutParam.rest = aIndex;\n\t};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\t\n\t/**\n\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n\t */\n\texports.encode = function (number) {\n\t if (0 <= number && number < intToCharMap.length) {\n\t return intToCharMap[number];\n\t }\n\t throw new TypeError(\"Must be between 0 and 63: \" + number);\n\t};\n\t\n\t/**\n\t * Decode a single base 64 character code digit to an integer. Returns -1 on\n\t * failure.\n\t */\n\texports.decode = function (charCode) {\n\t var bigA = 65; // 'A'\n\t var bigZ = 90; // 'Z'\n\t\n\t var littleA = 97; // 'a'\n\t var littleZ = 122; // 'z'\n\t\n\t var zero = 48; // '0'\n\t var nine = 57; // '9'\n\t\n\t var plus = 43; // '+'\n\t var slash = 47; // '/'\n\t\n\t var littleOffset = 26;\n\t var numberOffset = 52;\n\t\n\t // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t if (bigA <= charCode && charCode <= bigZ) {\n\t return (charCode - bigA);\n\t }\n\t\n\t // 26 - 51: abcdefghijklmnopqrstuvwxyz\n\t if (littleA <= charCode && charCode <= littleZ) {\n\t return (charCode - littleA + littleOffset);\n\t }\n\t\n\t // 52 - 61: 0123456789\n\t if (zero <= charCode && charCode <= nine) {\n\t return (charCode - zero + numberOffset);\n\t }\n\t\n\t // 62: +\n\t if (charCode == plus) {\n\t return 62;\n\t }\n\t\n\t // 63: /\n\t if (charCode == slash) {\n\t return 63;\n\t }\n\t\n\t // Invalid base64 digit.\n\t return -1;\n\t};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t/**\n\t * This is a helper function for getting values from parameter/options\n\t * objects.\n\t *\n\t * @param args The object we are extracting values from\n\t * @param name The name of the property we are getting.\n\t * @param defaultValue An optional value to return if the property is missing\n\t * from the object. If this is not specified and the property is missing, an\n\t * error will be thrown.\n\t */\n\tfunction getArg(aArgs, aName, aDefaultValue) {\n\t if (aName in aArgs) {\n\t return aArgs[aName];\n\t } else if (arguments.length === 3) {\n\t return aDefaultValue;\n\t } else {\n\t throw new Error('\"' + aName + '\" is a required argument.');\n\t }\n\t}\n\texports.getArg = getArg;\n\t\n\tvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\n\tvar dataUrlRegexp = /^data:.+\\,.+$/;\n\t\n\tfunction urlParse(aUrl) {\n\t var match = aUrl.match(urlRegexp);\n\t if (!match) {\n\t return null;\n\t }\n\t return {\n\t scheme: match[1],\n\t auth: match[2],\n\t host: match[3],\n\t port: match[4],\n\t path: match[5]\n\t };\n\t}\n\texports.urlParse = urlParse;\n\t\n\tfunction urlGenerate(aParsedUrl) {\n\t var url = '';\n\t if (aParsedUrl.scheme) {\n\t url += aParsedUrl.scheme + ':';\n\t }\n\t url += '//';\n\t if (aParsedUrl.auth) {\n\t url += aParsedUrl.auth + '@';\n\t }\n\t if (aParsedUrl.host) {\n\t url += aParsedUrl.host;\n\t }\n\t if (aParsedUrl.port) {\n\t url += \":\" + aParsedUrl.port\n\t }\n\t if (aParsedUrl.path) {\n\t url += aParsedUrl.path;\n\t }\n\t return url;\n\t}\n\texports.urlGenerate = urlGenerate;\n\t\n\t/**\n\t * Normalizes a path, or the path portion of a URL:\n\t *\n\t * - Replaces consecutive slashes with one slash.\n\t * - Removes unnecessary '.' parts.\n\t * - Removes unnecessary '/..' parts.\n\t *\n\t * Based on code in the Node.js 'path' core module.\n\t *\n\t * @param aPath The path or url to normalize.\n\t */\n\tfunction normalize(aPath) {\n\t var path = aPath;\n\t var url = urlParse(aPath);\n\t if (url) {\n\t if (!url.path) {\n\t return aPath;\n\t }\n\t path = url.path;\n\t }\n\t var isAbsolute = exports.isAbsolute(path);\n\t\n\t var parts = path.split(/\\/+/);\n\t for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n\t part = parts[i];\n\t if (part === '.') {\n\t parts.splice(i, 1);\n\t } else if (part === '..') {\n\t up++;\n\t } else if (up > 0) {\n\t if (part === '') {\n\t // The first part is blank if the path is absolute. Trying to go\n\t // above the root is a no-op. Therefore we can remove all '..' parts\n\t // directly after the root.\n\t parts.splice(i + 1, up);\n\t up = 0;\n\t } else {\n\t parts.splice(i, 2);\n\t up--;\n\t }\n\t }\n\t }\n\t path = parts.join('/');\n\t\n\t if (path === '') {\n\t path = isAbsolute ? '/' : '.';\n\t }\n\t\n\t if (url) {\n\t url.path = path;\n\t return urlGenerate(url);\n\t }\n\t return path;\n\t}\n\texports.normalize = normalize;\n\t\n\t/**\n\t * Joins two paths/URLs.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be joined with the root.\n\t *\n\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n\t * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n\t * first.\n\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n\t * is updated with the result and aRoot is returned. Otherwise the result\n\t * is returned.\n\t * - If aPath is absolute, the result is aPath.\n\t * - Otherwise the two paths are joined with a slash.\n\t * - Joining for example 'http://' and 'www.example.com' is also supported.\n\t */\n\tfunction join(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t if (aPath === \"\") {\n\t aPath = \".\";\n\t }\n\t var aPathUrl = urlParse(aPath);\n\t var aRootUrl = urlParse(aRoot);\n\t if (aRootUrl) {\n\t aRoot = aRootUrl.path || '/';\n\t }\n\t\n\t // `join(foo, '//www.example.org')`\n\t if (aPathUrl && !aPathUrl.scheme) {\n\t if (aRootUrl) {\n\t aPathUrl.scheme = aRootUrl.scheme;\n\t }\n\t return urlGenerate(aPathUrl);\n\t }\n\t\n\t if (aPathUrl || aPath.match(dataUrlRegexp)) {\n\t return aPath;\n\t }\n\t\n\t // `join('http://', 'www.example.com')`\n\t if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n\t aRootUrl.host = aPath;\n\t return urlGenerate(aRootUrl);\n\t }\n\t\n\t var joined = aPath.charAt(0) === '/'\n\t ? aPath\n\t : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\t\n\t if (aRootUrl) {\n\t aRootUrl.path = joined;\n\t return urlGenerate(aRootUrl);\n\t }\n\t return joined;\n\t}\n\texports.join = join;\n\t\n\texports.isAbsolute = function (aPath) {\n\t return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n\t};\n\t\n\t/**\n\t * Make a path relative to a URL or another path.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be made relative to aRoot.\n\t */\n\tfunction relative(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t\n\t aRoot = aRoot.replace(/\\/$/, '');\n\t\n\t // It is possible for the path to be above the root. In this case, simply\n\t // checking whether the root is a prefix of the path won't work. Instead, we\n\t // need to remove components from the root one by one, until either we find\n\t // a prefix that fits, or we run out of components to remove.\n\t var level = 0;\n\t while (aPath.indexOf(aRoot + '/') !== 0) {\n\t var index = aRoot.lastIndexOf(\"/\");\n\t if (index < 0) {\n\t return aPath;\n\t }\n\t\n\t // If the only part of the root that is left is the scheme (i.e. http://,\n\t // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n\t // have exhausted all components, so the path is not relative to the root.\n\t aRoot = aRoot.slice(0, index);\n\t if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n\t return aPath;\n\t }\n\t\n\t ++level;\n\t }\n\t\n\t // Make sure we add a \"../\" for each component we removed from the root.\n\t return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n\t}\n\texports.relative = relative;\n\t\n\tvar supportsNullProto = (function () {\n\t var obj = Object.create(null);\n\t return !('__proto__' in obj);\n\t}());\n\t\n\tfunction identity (s) {\n\t return s;\n\t}\n\t\n\t/**\n\t * Because behavior goes wacky when you set `__proto__` on objects, we\n\t * have to prefix all the strings in our set with an arbitrary character.\n\t *\n\t * See https://github.com/mozilla/source-map/pull/31 and\n\t * https://github.com/mozilla/source-map/issues/30\n\t *\n\t * @param String aStr\n\t */\n\tfunction toSetString(aStr) {\n\t if (isProtoString(aStr)) {\n\t return '$' + aStr;\n\t }\n\t\n\t return aStr;\n\t}\n\texports.toSetString = supportsNullProto ? identity : toSetString;\n\t\n\tfunction fromSetString(aStr) {\n\t if (isProtoString(aStr)) {\n\t return aStr.slice(1);\n\t }\n\t\n\t return aStr;\n\t}\n\texports.fromSetString = supportsNullProto ? identity : fromSetString;\n\t\n\tfunction isProtoString(s) {\n\t if (!s) {\n\t return false;\n\t }\n\t\n\t var length = s.length;\n\t\n\t if (length < 9 /* \"__proto__\".length */) {\n\t return false;\n\t }\n\t\n\t if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n\t s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n\t s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n\t s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n\t s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n\t s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 9) !== 95 /* '_' */) {\n\t return false;\n\t }\n\t\n\t for (var i = length - 10; i >= 0; i--) {\n\t if (s.charCodeAt(i) !== 36 /* '$' */) {\n\t return false;\n\t }\n\t }\n\t\n\t return true;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings where the original positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same original source/line/column, but different generated\n\t * line and column the same. Useful when searching for a mapping with a\n\t * stubbed out mapping.\n\t */\n\tfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n\t var cmp = strcmp(mappingA.source, mappingB.source);\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0 || onlyCompareOriginal) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByOriginalPositions = compareByOriginalPositions;\n\t\n\t/**\n\t * Comparator between two mappings with deflated source and name indices where\n\t * the generated positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same generated line and column, but different\n\t * source/name/original line and column the same. Useful when searching for a\n\t * mapping with a stubbed out mapping.\n\t */\n\tfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0 || onlyCompareGenerated) {\n\t return cmp;\n\t }\n\t\n\t cmp = strcmp(mappingA.source, mappingB.source);\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\t\n\tfunction strcmp(aStr1, aStr2) {\n\t if (aStr1 === aStr2) {\n\t return 0;\n\t }\n\t\n\t if (aStr1 === null) {\n\t return 1; // aStr2 !== null\n\t }\n\t\n\t if (aStr2 === null) {\n\t return -1; // aStr1 !== null\n\t }\n\t\n\t if (aStr1 > aStr2) {\n\t return 1;\n\t }\n\t\n\t return -1;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings with inflated source and name strings where\n\t * the generated positions are compared.\n\t */\n\tfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = strcmp(mappingA.source, mappingB.source);\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\t\n\t/**\n\t * Strip any JSON XSSI avoidance prefix from the string (as documented\n\t * in the source maps specification), and then parse the string as\n\t * JSON.\n\t */\n\tfunction parseSourceMapInput(str) {\n\t return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n\t}\n\texports.parseSourceMapInput = parseSourceMapInput;\n\t\n\t/**\n\t * Compute the URL of a source given the the source root, the source's\n\t * URL, and the source map's URL.\n\t */\n\tfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n\t sourceURL = sourceURL || '';\n\t\n\t if (sourceRoot) {\n\t // This follows what Chrome does.\n\t if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n\t sourceRoot += '/';\n\t }\n\t // The spec says:\n\t // Line 4: An optional source root, useful for relocating source\n\t // files on a server or removing repeated values in the\n\t // “sources” entry. This value is prepended to the individual\n\t // entries in the “source” field.\n\t sourceURL = sourceRoot + sourceURL;\n\t }\n\t\n\t // Historically, SourceMapConsumer did not take the sourceMapURL as\n\t // a parameter. This mode is still somewhat supported, which is why\n\t // this code block is conditional. However, it's preferable to pass\n\t // the source map URL to SourceMapConsumer, so that this function\n\t // can implement the source URL resolution algorithm as outlined in\n\t // the spec. This block is basically the equivalent of:\n\t // new URL(sourceURL, sourceMapURL).toString()\n\t // ... except it avoids using URL, which wasn't available in the\n\t // older releases of node still supported by this library.\n\t //\n\t // The spec says:\n\t // If the sources are not absolute URLs after prepending of the\n\t // “sourceRoot”, the sources are resolved relative to the\n\t // SourceMap (like resolving script src in a html document).\n\t if (sourceMapURL) {\n\t var parsed = urlParse(sourceMapURL);\n\t if (!parsed) {\n\t throw new Error(\"sourceMapURL could not be parsed\");\n\t }\n\t if (parsed.path) {\n\t // Strip the last path component, but keep the \"/\".\n\t var index = parsed.path.lastIndexOf('/');\n\t if (index >= 0) {\n\t parsed.path = parsed.path.substring(0, index + 1);\n\t }\n\t }\n\t sourceURL = join(urlGenerate(parsed), sourceURL);\n\t }\n\t\n\t return normalize(sourceURL);\n\t}\n\texports.computeSourceURL = computeSourceURL;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar hasNativeMap = typeof Map !== \"undefined\";\n\t\n\t/**\n\t * A data structure which is a combination of an array and a set. Adding a new\n\t * member is O(1), testing for membership is O(1), and finding the index of an\n\t * element is O(1). Removing elements from the set is not supported. Only\n\t * strings are supported for membership.\n\t */\n\tfunction ArraySet() {\n\t this._array = [];\n\t this._set = hasNativeMap ? new Map() : Object.create(null);\n\t}\n\t\n\t/**\n\t * Static method for creating ArraySet instances from an existing array.\n\t */\n\tArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n\t var set = new ArraySet();\n\t for (var i = 0, len = aArray.length; i < len; i++) {\n\t set.add(aArray[i], aAllowDuplicates);\n\t }\n\t return set;\n\t};\n\t\n\t/**\n\t * Return how many unique items are in this ArraySet. If duplicates have been\n\t * added, than those do not count towards the size.\n\t *\n\t * @returns Number\n\t */\n\tArraySet.prototype.size = function ArraySet_size() {\n\t return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n\t};\n\t\n\t/**\n\t * Add the given string to this set.\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n\t var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n\t var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n\t var idx = this._array.length;\n\t if (!isDuplicate || aAllowDuplicates) {\n\t this._array.push(aStr);\n\t }\n\t if (!isDuplicate) {\n\t if (hasNativeMap) {\n\t this._set.set(aStr, idx);\n\t } else {\n\t this._set[sStr] = idx;\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Is the given string a member of this set?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.has = function ArraySet_has(aStr) {\n\t if (hasNativeMap) {\n\t return this._set.has(aStr);\n\t } else {\n\t var sStr = util.toSetString(aStr);\n\t return has.call(this._set, sStr);\n\t }\n\t};\n\t\n\t/**\n\t * What is the index of the given string in the array?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n\t if (hasNativeMap) {\n\t var idx = this._set.get(aStr);\n\t if (idx >= 0) {\n\t return idx;\n\t }\n\t } else {\n\t var sStr = util.toSetString(aStr);\n\t if (has.call(this._set, sStr)) {\n\t return this._set[sStr];\n\t }\n\t }\n\t\n\t throw new Error('\"' + aStr + '\" is not in the set.');\n\t};\n\t\n\t/**\n\t * What is the element at the given index?\n\t *\n\t * @param Number aIdx\n\t */\n\tArraySet.prototype.at = function ArraySet_at(aIdx) {\n\t if (aIdx >= 0 && aIdx < this._array.length) {\n\t return this._array[aIdx];\n\t }\n\t throw new Error('No element indexed by ' + aIdx);\n\t};\n\t\n\t/**\n\t * Returns the array representation of this set (which has the proper indices\n\t * indicated by indexOf). Note that this is a copy of the internal array used\n\t * for storing the members so that no one can mess with internal state.\n\t */\n\tArraySet.prototype.toArray = function ArraySet_toArray() {\n\t return this._array.slice();\n\t};\n\t\n\texports.ArraySet = ArraySet;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2014 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\t\n\t/**\n\t * Determine whether mappingB is after mappingA with respect to generated\n\t * position.\n\t */\n\tfunction generatedPositionAfter(mappingA, mappingB) {\n\t // Optimized for most common case\n\t var lineA = mappingA.generatedLine;\n\t var lineB = mappingB.generatedLine;\n\t var columnA = mappingA.generatedColumn;\n\t var columnB = mappingB.generatedColumn;\n\t return lineB > lineA || lineB == lineA && columnB >= columnA ||\n\t util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n\t}\n\t\n\t/**\n\t * A data structure to provide a sorted view of accumulated mappings in a\n\t * performance conscious manner. It trades a neglibable overhead in general\n\t * case for a large speedup in case of mappings being added in order.\n\t */\n\tfunction MappingList() {\n\t this._array = [];\n\t this._sorted = true;\n\t // Serves as infimum\n\t this._last = {generatedLine: -1, generatedColumn: 0};\n\t}\n\t\n\t/**\n\t * Iterate through internal items. This method takes the same arguments that\n\t * `Array.prototype.forEach` takes.\n\t *\n\t * NOTE: The order of the mappings is NOT guaranteed.\n\t */\n\tMappingList.prototype.unsortedForEach =\n\t function MappingList_forEach(aCallback, aThisArg) {\n\t this._array.forEach(aCallback, aThisArg);\n\t };\n\t\n\t/**\n\t * Add the given source mapping.\n\t *\n\t * @param Object aMapping\n\t */\n\tMappingList.prototype.add = function MappingList_add(aMapping) {\n\t if (generatedPositionAfter(this._last, aMapping)) {\n\t this._last = aMapping;\n\t this._array.push(aMapping);\n\t } else {\n\t this._sorted = false;\n\t this._array.push(aMapping);\n\t }\n\t};\n\t\n\t/**\n\t * Returns the flat, sorted array of mappings. The mappings are sorted by\n\t * generated position.\n\t *\n\t * WARNING: This method returns internal data without copying, for\n\t * performance. The return value must NOT be mutated, and should be treated as\n\t * an immutable borrow. If you want to take ownership, you must make your own\n\t * copy.\n\t */\n\tMappingList.prototype.toArray = function MappingList_toArray() {\n\t if (!this._sorted) {\n\t this._array.sort(util.compareByGeneratedPositionsInflated);\n\t this._sorted = true;\n\t }\n\t return this._array;\n\t};\n\t\n\texports.MappingList = MappingList;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar binarySearch = __webpack_require__(8);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar base64VLQ = __webpack_require__(2);\n\tvar quickSort = __webpack_require__(9).quickSort;\n\t\n\tfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = util.parseSourceMapInput(aSourceMap);\n\t }\n\t\n\t return sourceMap.sections != null\n\t ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n\t : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n\t}\n\t\n\tSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n\t return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n\t}\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tSourceMapConsumer.prototype._version = 3;\n\t\n\t// `__generatedMappings` and `__originalMappings` are arrays that hold the\n\t// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n\t// are lazily instantiated, accessed via the `_generatedMappings` and\n\t// `_originalMappings` getters respectively, and we only parse the mappings\n\t// and create these arrays once queried for a source location. We jump through\n\t// these hoops because there can be many thousands of mappings, and parsing\n\t// them is expensive, so we only want to do it if we must.\n\t//\n\t// Each object in the arrays is of the form:\n\t//\n\t// {\n\t// generatedLine: The line number in the generated code,\n\t// generatedColumn: The column number in the generated code,\n\t// source: The path to the original source file that generated this\n\t// chunk of code,\n\t// originalLine: The line number in the original source that\n\t// corresponds to this chunk of generated code,\n\t// originalColumn: The column number in the original source that\n\t// corresponds to this chunk of generated code,\n\t// name: The name of the original symbol which generated this chunk of\n\t// code.\n\t// }\n\t//\n\t// All properties except for `generatedLine` and `generatedColumn` can be\n\t// `null`.\n\t//\n\t// `_generatedMappings` is ordered by the generated positions.\n\t//\n\t// `_originalMappings` is ordered by the original positions.\n\t\n\tSourceMapConsumer.prototype.__generatedMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n\t configurable: true,\n\t enumerable: true,\n\t get: function () {\n\t if (!this.__generatedMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__generatedMappings;\n\t }\n\t});\n\t\n\tSourceMapConsumer.prototype.__originalMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n\t configurable: true,\n\t enumerable: true,\n\t get: function () {\n\t if (!this.__originalMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__originalMappings;\n\t }\n\t});\n\t\n\tSourceMapConsumer.prototype._charIsMappingSeparator =\n\t function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n\t var c = aStr.charAt(index);\n\t return c === \";\" || c === \",\";\n\t };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t throw new Error(\"Subclasses must implement _parseMappings\");\n\t };\n\t\n\tSourceMapConsumer.GENERATED_ORDER = 1;\n\tSourceMapConsumer.ORIGINAL_ORDER = 2;\n\t\n\tSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n\tSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Iterate over each mapping between an original source/line/column and a\n\t * generated line/column in this source map.\n\t *\n\t * @param Function aCallback\n\t * The function that is called with each mapping.\n\t * @param Object aContext\n\t * Optional. If specified, this object will be the value of `this` every\n\t * time that `aCallback` is called.\n\t * @param aOrder\n\t * Either `SourceMapConsumer.GENERATED_ORDER` or\n\t * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n\t * iterate over the mappings sorted by the generated file's line/column\n\t * order or the original's source/line/column order, respectively. Defaults to\n\t * `SourceMapConsumer.GENERATED_ORDER`.\n\t */\n\tSourceMapConsumer.prototype.eachMapping =\n\t function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n\t var context = aContext || null;\n\t var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\t\n\t var mappings;\n\t switch (order) {\n\t case SourceMapConsumer.GENERATED_ORDER:\n\t mappings = this._generatedMappings;\n\t break;\n\t case SourceMapConsumer.ORIGINAL_ORDER:\n\t mappings = this._originalMappings;\n\t break;\n\t default:\n\t throw new Error(\"Unknown order of iteration.\");\n\t }\n\t\n\t var sourceRoot = this.sourceRoot;\n\t mappings.map(function (mapping) {\n\t var source = mapping.source === null ? null : this._sources.at(mapping.source);\n\t source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n\t return {\n\t source: source,\n\t generatedLine: mapping.generatedLine,\n\t generatedColumn: mapping.generatedColumn,\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: mapping.name === null ? null : this._names.at(mapping.name)\n\t };\n\t }, this).forEach(aCallback, context);\n\t };\n\t\n\t/**\n\t * Returns all generated line and column information for the original source,\n\t * line, and column provided. If no column is provided, returns all mappings\n\t * corresponding to a either the line we are searching for or the next\n\t * closest line that has any mappings. Otherwise, returns all mappings\n\t * corresponding to the given line and either the column we are searching for\n\t * or the next closest column that has any offsets.\n\t *\n\t * The only argument is an object with the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source. The line number is 1-based.\n\t * - column: Optional. the column number in the original source.\n\t * The column number is 0-based.\n\t *\n\t * and an array of objects is returned, each with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null. The\n\t * line number is 1-based.\n\t * - column: The column number in the generated source, or null.\n\t * The column number is 0-based.\n\t */\n\tSourceMapConsumer.prototype.allGeneratedPositionsFor =\n\t function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n\t var line = util.getArg(aArgs, 'line');\n\t\n\t // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n\t // returns the index of the closest mapping less than the needle. By\n\t // setting needle.originalColumn to 0, we thus find the last mapping for\n\t // the given line, provided such a mapping exists.\n\t var needle = {\n\t source: util.getArg(aArgs, 'source'),\n\t originalLine: line,\n\t originalColumn: util.getArg(aArgs, 'column', 0)\n\t };\n\t\n\t needle.source = this._findSourceIndex(needle.source);\n\t if (needle.source < 0) {\n\t return [];\n\t }\n\t\n\t var mappings = [];\n\t\n\t var index = this._findMapping(needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t binarySearch.LEAST_UPPER_BOUND);\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (aArgs.column === undefined) {\n\t var originalLine = mapping.originalLine;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we found. Since\n\t // mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we found.\n\t while (mapping && mapping.originalLine === originalLine) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t } else {\n\t var originalColumn = mapping.originalColumn;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we were searching for.\n\t // Since mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we are searching for.\n\t while (mapping &&\n\t mapping.originalLine === line &&\n\t mapping.originalColumn == originalColumn) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t }\n\t }\n\t\n\t return mappings;\n\t };\n\t\n\texports.SourceMapConsumer = SourceMapConsumer;\n\t\n\t/**\n\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\n\t * query for information about the original file positions by giving it a file\n\t * position in the generated source.\n\t *\n\t * The first parameter is the raw source map (either as a JSON string, or\n\t * already parsed to an object). According to the spec, source maps have the\n\t * following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - sources: An array of URLs to the original source files.\n\t * - names: An array of identifiers which can be referrenced by individual mappings.\n\t * - sourceRoot: Optional. The URL root from which all sources are relative.\n\t * - sourcesContent: Optional. An array of contents of the original source files.\n\t * - mappings: A string of base64 VLQs which contain the actual mappings.\n\t * - file: Optional. The generated file this source map is associated with.\n\t *\n\t * Here is an example source map, taken from the source map spec[0]:\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"out.js\",\n\t * sourceRoot : \"\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AA,AB;;ABCDE;\"\n\t * }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found. This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\tfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = util.parseSourceMapInput(aSourceMap);\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sources = util.getArg(sourceMap, 'sources');\n\t // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n\t // requires the array) to play nice here.\n\t var names = util.getArg(sourceMap, 'names', []);\n\t var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n\t var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n\t var mappings = util.getArg(sourceMap, 'mappings');\n\t var file = util.getArg(sourceMap, 'file', null);\n\t\n\t // Once again, Sass deviates from the spec and supplies the version as a\n\t // string rather than a number, so we use loose equality checking here.\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t if (sourceRoot) {\n\t sourceRoot = util.normalize(sourceRoot);\n\t }\n\t\n\t sources = sources\n\t .map(String)\n\t // Some source maps produce relative source paths like \"./foo.js\" instead of\n\t // \"foo.js\". Normalize these first so that future comparisons will succeed.\n\t // See bugzil.la/1090768.\n\t .map(util.normalize)\n\t // Always ensure that absolute sources are internally stored relative to\n\t // the source root, if the source root is absolute. Not doing this would\n\t // be particularly problematic when the source root is a prefix of the\n\t // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n\t .map(function (source) {\n\t return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n\t ? util.relative(sourceRoot, source)\n\t : source;\n\t });\n\t\n\t // Pass `true` below to allow duplicate names and sources. While source maps\n\t // are intended to be compressed and deduplicated, the TypeScript compiler\n\t // sometimes generates source maps with duplicates in them. See Github issue\n\t // #72 and bugzil.la/889492.\n\t this._names = ArraySet.fromArray(names.map(String), true);\n\t this._sources = ArraySet.fromArray(sources, true);\n\t\n\t this._absoluteSources = this._sources.toArray().map(function (s) {\n\t return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n\t });\n\t\n\t this.sourceRoot = sourceRoot;\n\t this.sourcesContent = sourcesContent;\n\t this._mappings = mappings;\n\t this._sourceMapURL = aSourceMapURL;\n\t this.file = file;\n\t}\n\t\n\tBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\t\n\t/**\n\t * Utility function to find the index of a source. Returns -1 if not\n\t * found.\n\t */\n\tBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n\t var relativeSource = aSource;\n\t if (this.sourceRoot != null) {\n\t relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t }\n\t\n\t if (this._sources.has(relativeSource)) {\n\t return this._sources.indexOf(relativeSource);\n\t }\n\t\n\t // Maybe aSource is an absolute URL as returned by |sources|. In\n\t // this case we can't simply undo the transform.\n\t var i;\n\t for (i = 0; i < this._absoluteSources.length; ++i) {\n\t if (this._absoluteSources[i] == aSource) {\n\t return i;\n\t }\n\t }\n\t\n\t return -1;\n\t};\n\t\n\t/**\n\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n\t *\n\t * @param SourceMapGenerator aSourceMap\n\t * The source map that will be consumed.\n\t * @param String aSourceMapURL\n\t * The URL at which the source map can be found (optional)\n\t * @returns BasicSourceMapConsumer\n\t */\n\tBasicSourceMapConsumer.fromSourceMap =\n\t function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n\t var smc = Object.create(BasicSourceMapConsumer.prototype);\n\t\n\t var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n\t var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n\t smc.sourceRoot = aSourceMap._sourceRoot;\n\t smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n\t smc.sourceRoot);\n\t smc.file = aSourceMap._file;\n\t smc._sourceMapURL = aSourceMapURL;\n\t smc._absoluteSources = smc._sources.toArray().map(function (s) {\n\t return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n\t });\n\t\n\t // Because we are modifying the entries (by converting string sources and\n\t // names to indices into the sources and names ArraySets), we have to make\n\t // a copy of the entry or else bad things happen. Shared mutable state\n\t // strikes again! See github issue #191.\n\t\n\t var generatedMappings = aSourceMap._mappings.toArray().slice();\n\t var destGeneratedMappings = smc.__generatedMappings = [];\n\t var destOriginalMappings = smc.__originalMappings = [];\n\t\n\t for (var i = 0, length = generatedMappings.length; i < length; i++) {\n\t var srcMapping = generatedMappings[i];\n\t var destMapping = new Mapping;\n\t destMapping.generatedLine = srcMapping.generatedLine;\n\t destMapping.generatedColumn = srcMapping.generatedColumn;\n\t\n\t if (srcMapping.source) {\n\t destMapping.source = sources.indexOf(srcMapping.source);\n\t destMapping.originalLine = srcMapping.originalLine;\n\t destMapping.originalColumn = srcMapping.originalColumn;\n\t\n\t if (srcMapping.name) {\n\t destMapping.name = names.indexOf(srcMapping.name);\n\t }\n\t\n\t destOriginalMappings.push(destMapping);\n\t }\n\t\n\t destGeneratedMappings.push(destMapping);\n\t }\n\t\n\t quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\t\n\t return smc;\n\t };\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tBasicSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t return this._absoluteSources.slice();\n\t }\n\t});\n\t\n\t/**\n\t * Provide the JIT with a nice shape / hidden class.\n\t */\n\tfunction Mapping() {\n\t this.generatedLine = 0;\n\t this.generatedColumn = 0;\n\t this.source = null;\n\t this.originalLine = null;\n\t this.originalColumn = null;\n\t this.name = null;\n\t}\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tBasicSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t var generatedLine = 1;\n\t var previousGeneratedColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousOriginalColumn = 0;\n\t var previousSource = 0;\n\t var previousName = 0;\n\t var length = aStr.length;\n\t var index = 0;\n\t var cachedSegments = {};\n\t var temp = {};\n\t var originalMappings = [];\n\t var generatedMappings = [];\n\t var mapping, str, segment, end, value;\n\t\n\t while (index < length) {\n\t if (aStr.charAt(index) === ';') {\n\t generatedLine++;\n\t index++;\n\t previousGeneratedColumn = 0;\n\t }\n\t else if (aStr.charAt(index) === ',') {\n\t index++;\n\t }\n\t else {\n\t mapping = new Mapping();\n\t mapping.generatedLine = generatedLine;\n\t\n\t // Because each offset is encoded relative to the previous one,\n\t // many segments often have the same encoding. We can exploit this\n\t // fact by caching the parsed variable length fields of each segment,\n\t // allowing us to avoid a second parse if we encounter the same\n\t // segment again.\n\t for (end = index; end < length; end++) {\n\t if (this._charIsMappingSeparator(aStr, end)) {\n\t break;\n\t }\n\t }\n\t str = aStr.slice(index, end);\n\t\n\t segment = cachedSegments[str];\n\t if (segment) {\n\t index += str.length;\n\t } else {\n\t segment = [];\n\t while (index < end) {\n\t base64VLQ.decode(aStr, index, temp);\n\t value = temp.value;\n\t index = temp.rest;\n\t segment.push(value);\n\t }\n\t\n\t if (segment.length === 2) {\n\t throw new Error('Found a source, but no line and column');\n\t }\n\t\n\t if (segment.length === 3) {\n\t throw new Error('Found a source and line, but no column');\n\t }\n\t\n\t cachedSegments[str] = segment;\n\t }\n\t\n\t // Generated column.\n\t mapping.generatedColumn = previousGeneratedColumn + segment[0];\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (segment.length > 1) {\n\t // Original source.\n\t mapping.source = previousSource + segment[1];\n\t previousSource += segment[1];\n\t\n\t // Original line.\n\t mapping.originalLine = previousOriginalLine + segment[2];\n\t previousOriginalLine = mapping.originalLine;\n\t // Lines are stored 0-based\n\t mapping.originalLine += 1;\n\t\n\t // Original column.\n\t mapping.originalColumn = previousOriginalColumn + segment[3];\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (segment.length > 4) {\n\t // Original name.\n\t mapping.name = previousName + segment[4];\n\t previousName += segment[4];\n\t }\n\t }\n\t\n\t generatedMappings.push(mapping);\n\t if (typeof mapping.originalLine === 'number') {\n\t originalMappings.push(mapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t this.__generatedMappings = generatedMappings;\n\t\n\t quickSort(originalMappings, util.compareByOriginalPositions);\n\t this.__originalMappings = originalMappings;\n\t };\n\t\n\t/**\n\t * Find the mapping that best matches the hypothetical \"needle\" mapping that\n\t * we are searching for in the given \"haystack\" of mappings.\n\t */\n\tBasicSourceMapConsumer.prototype._findMapping =\n\t function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n\t aColumnName, aComparator, aBias) {\n\t // To return the position we are searching for, we must first find the\n\t // mapping for the given position and then return the opposite position it\n\t // points to. Because the mappings are sorted, we can use binary search to\n\t // find the best mapping.\n\t\n\t if (aNeedle[aLineName] <= 0) {\n\t throw new TypeError('Line must be greater than or equal to 1, got '\n\t + aNeedle[aLineName]);\n\t }\n\t if (aNeedle[aColumnName] < 0) {\n\t throw new TypeError('Column must be greater than or equal to 0, got '\n\t + aNeedle[aColumnName]);\n\t }\n\t\n\t return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n\t };\n\t\n\t/**\n\t * Compute the last column for each generated mapping. The last column is\n\t * inclusive.\n\t */\n\tBasicSourceMapConsumer.prototype.computeColumnSpans =\n\t function SourceMapConsumer_computeColumnSpans() {\n\t for (var index = 0; index < this._generatedMappings.length; ++index) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t // Mappings do not contain a field for the last generated columnt. We\n\t // can come up with an optimistic estimate, however, by assuming that\n\t // mappings are contiguous (i.e. given two consecutive mappings, the\n\t // first mapping ends where the second one starts).\n\t if (index + 1 < this._generatedMappings.length) {\n\t var nextMapping = this._generatedMappings[index + 1];\n\t\n\t if (mapping.generatedLine === nextMapping.generatedLine) {\n\t mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n\t continue;\n\t }\n\t }\n\t\n\t // The last mapping for each line spans the entire line.\n\t mapping.lastGeneratedColumn = Infinity;\n\t }\n\t };\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source. The line number\n\t * is 1-based.\n\t * - column: The column number in the generated source. The column\n\t * number is 0-based.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null. The\n\t * line number is 1-based.\n\t * - column: The column number in the original source, or null. The\n\t * column number is 0-based.\n\t * - name: The original identifier, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.originalPositionFor =\n\t function SourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._generatedMappings,\n\t \"generatedLine\",\n\t \"generatedColumn\",\n\t util.compareByGeneratedPositionsDeflated,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t if (mapping.generatedLine === needle.generatedLine) {\n\t var source = util.getArg(mapping, 'source', null);\n\t if (source !== null) {\n\t source = this._sources.at(source);\n\t source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n\t }\n\t var name = util.getArg(mapping, 'name', null);\n\t if (name !== null) {\n\t name = this._names.at(name);\n\t }\n\t return {\n\t source: source,\n\t line: util.getArg(mapping, 'originalLine', null),\n\t column: util.getArg(mapping, 'originalColumn', null),\n\t name: name\n\t };\n\t }\n\t }\n\t\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function BasicSourceMapConsumer_hasContentsOfAllSources() {\n\t if (!this.sourcesContent) {\n\t return false;\n\t }\n\t return this.sourcesContent.length >= this._sources.size() &&\n\t !this.sourcesContent.some(function (sc) { return sc == null; });\n\t };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tBasicSourceMapConsumer.prototype.sourceContentFor =\n\t function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t if (!this.sourcesContent) {\n\t return null;\n\t }\n\t\n\t var index = this._findSourceIndex(aSource);\n\t if (index >= 0) {\n\t return this.sourcesContent[index];\n\t }\n\t\n\t var relativeSource = aSource;\n\t if (this.sourceRoot != null) {\n\t relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t }\n\t\n\t var url;\n\t if (this.sourceRoot != null\n\t && (url = util.urlParse(this.sourceRoot))) {\n\t // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n\t // many users. We can help them out when they expect file:// URIs to\n\t // behave like it would if they were running a local HTTP server. See\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n\t var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n\t if (url.scheme == \"file\"\n\t && this._sources.has(fileUriAbsPath)) {\n\t return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n\t }\n\t\n\t if ((!url.path || url.path == \"/\")\n\t && this._sources.has(\"/\" + relativeSource)) {\n\t return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n\t }\n\t }\n\t\n\t // This function is used recursively from\n\t // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n\t // don't want to throw if we can't find the source - we just want to\n\t // return null, so we provide a flag to exit gracefully.\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source. The line number\n\t * is 1-based.\n\t * - column: The column number in the original source. The column\n\t * number is 0-based.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null. The\n\t * line number is 1-based.\n\t * - column: The column number in the generated source, or null.\n\t * The column number is 0-based.\n\t */\n\tBasicSourceMapConsumer.prototype.generatedPositionFor =\n\t function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t var source = util.getArg(aArgs, 'source');\n\t source = this._findSourceIndex(source);\n\t if (source < 0) {\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t }\n\t\n\t var needle = {\n\t source: source,\n\t originalLine: util.getArg(aArgs, 'line'),\n\t originalColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (mapping.source === needle.source) {\n\t return {\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t };\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t };\n\t\n\texports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\t\n\t/**\n\t * An IndexedSourceMapConsumer instance represents a parsed source map which\n\t * we can query for information. It differs from BasicSourceMapConsumer in\n\t * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n\t * input.\n\t *\n\t * The first parameter is a raw source map (either as a JSON string, or already\n\t * parsed to an object). According to the spec for indexed source maps, they\n\t * have the following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - file: Optional. The generated file this source map is associated with.\n\t * - sections: A list of section definitions.\n\t *\n\t * Each value under the \"sections\" field has two fields:\n\t * - offset: The offset into the original specified at which this section\n\t * begins to apply, defined as an object with a \"line\" and \"column\"\n\t * field.\n\t * - map: A source map definition. This source map could also be indexed,\n\t * but doesn't have to be.\n\t *\n\t * Instead of the \"map\" field, it's also possible to have a \"url\" field\n\t * specifying a URL to retrieve a source map from, but that's currently\n\t * unsupported.\n\t *\n\t * Here's an example source map, taken from the source map spec[0], but\n\t * modified to omit a section which uses the \"url\" field.\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"app.js\",\n\t * sections: [{\n\t * offset: {line:100, column:10},\n\t * map: {\n\t * version : 3,\n\t * file: \"section.js\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AAAA,E;;ABCDE;\"\n\t * }\n\t * }],\n\t * }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found. This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\tfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = util.parseSourceMapInput(aSourceMap);\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sections = util.getArg(sourceMap, 'sections');\n\t\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t this._sources = new ArraySet();\n\t this._names = new ArraySet();\n\t\n\t var lastOffset = {\n\t line: -1,\n\t column: 0\n\t };\n\t this._sections = sections.map(function (s) {\n\t if (s.url) {\n\t // The url field will require support for asynchronicity.\n\t // See https://github.com/mozilla/source-map/issues/16\n\t throw new Error('Support for url field in sections not implemented.');\n\t }\n\t var offset = util.getArg(s, 'offset');\n\t var offsetLine = util.getArg(offset, 'line');\n\t var offsetColumn = util.getArg(offset, 'column');\n\t\n\t if (offsetLine < lastOffset.line ||\n\t (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n\t throw new Error('Section offsets must be ordered and non-overlapping.');\n\t }\n\t lastOffset = offset;\n\t\n\t return {\n\t generatedOffset: {\n\t // The offset fields are 0-based, but we use 1-based indices when\n\t // encoding/decoding from VLQ.\n\t generatedLine: offsetLine + 1,\n\t generatedColumn: offsetColumn + 1\n\t },\n\t consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n\t }\n\t });\n\t}\n\t\n\tIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tIndexedSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t var sources = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n\t sources.push(this._sections[i].consumer.sources[j]);\n\t }\n\t }\n\t return sources;\n\t }\n\t});\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source. The line number\n\t * is 1-based.\n\t * - column: The column number in the generated source. The column\n\t * number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null. The\n\t * line number is 1-based.\n\t * - column: The column number in the original source, or null. The\n\t * column number is 0-based.\n\t * - name: The original identifier, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.originalPositionFor =\n\t function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t // Find the section containing the generated position we're trying to map\n\t // to an original position.\n\t var sectionIndex = binarySearch.search(needle, this._sections,\n\t function(needle, section) {\n\t var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n\t if (cmp) {\n\t return cmp;\n\t }\n\t\n\t return (needle.generatedColumn -\n\t section.generatedOffset.generatedColumn);\n\t });\n\t var section = this._sections[sectionIndex];\n\t\n\t if (!section) {\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t }\n\t\n\t return section.consumer.originalPositionFor({\n\t line: needle.generatedLine -\n\t (section.generatedOffset.generatedLine - 1),\n\t column: needle.generatedColumn -\n\t (section.generatedOffset.generatedLine === needle.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t bias: aArgs.bias\n\t });\n\t };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n\t return this._sections.every(function (s) {\n\t return s.consumer.hasContentsOfAllSources();\n\t });\n\t };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tIndexedSourceMapConsumer.prototype.sourceContentFor =\n\t function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t var content = section.consumer.sourceContentFor(aSource, true);\n\t if (content) {\n\t return content;\n\t }\n\t }\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source. The line number\n\t * is 1-based.\n\t * - column: The column number in the original source. The column\n\t * number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null. The\n\t * line number is 1-based. \n\t * - column: The column number in the generated source, or null.\n\t * The column number is 0-based.\n\t */\n\tIndexedSourceMapConsumer.prototype.generatedPositionFor =\n\t function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t // Only consider this section if the requested source is in the list of\n\t // sources of the consumer.\n\t if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n\t continue;\n\t }\n\t var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n\t if (generatedPosition) {\n\t var ret = {\n\t line: generatedPosition.line +\n\t (section.generatedOffset.generatedLine - 1),\n\t column: generatedPosition.column +\n\t (section.generatedOffset.generatedLine === generatedPosition.line\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0)\n\t };\n\t return ret;\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null\n\t };\n\t };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tIndexedSourceMapConsumer.prototype._parseMappings =\n\t function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t this.__generatedMappings = [];\n\t this.__originalMappings = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t var sectionMappings = section.consumer._generatedMappings;\n\t for (var j = 0; j < sectionMappings.length; j++) {\n\t var mapping = sectionMappings[j];\n\t\n\t var source = section.consumer._sources.at(mapping.source);\n\t source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n\t this._sources.add(source);\n\t source = this._sources.indexOf(source);\n\t\n\t var name = null;\n\t if (mapping.name) {\n\t name = section.consumer._names.at(mapping.name);\n\t this._names.add(name);\n\t name = this._names.indexOf(name);\n\t }\n\t\n\t // The mappings coming from the consumer for the section have\n\t // generated positions relative to the start of the section, so we\n\t // need to offset them to be relative to the start of the concatenated\n\t // generated file.\n\t var adjustedMapping = {\n\t source: source,\n\t generatedLine: mapping.generatedLine +\n\t (section.generatedOffset.generatedLine - 1),\n\t generatedColumn: mapping.generatedColumn +\n\t (section.generatedOffset.generatedLine === mapping.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: name\n\t };\n\t\n\t this.__generatedMappings.push(adjustedMapping);\n\t if (typeof adjustedMapping.originalLine === 'number') {\n\t this.__originalMappings.push(adjustedMapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t quickSort(this.__originalMappings, util.compareByOriginalPositions);\n\t };\n\t\n\texports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\texports.GREATEST_LOWER_BOUND = 1;\n\texports.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Recursive implementation of binary search.\n\t *\n\t * @param aLow Indices here and lower do not contain the needle.\n\t * @param aHigh Indices here and higher do not contain the needle.\n\t * @param aNeedle The element being searched for.\n\t * @param aHaystack The non-empty array being searched.\n\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t */\n\tfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n\t // This function terminates when one of the following is true:\n\t //\n\t // 1. We find the exact element we are looking for.\n\t //\n\t // 2. We did not find the exact element, but we can return the index of\n\t // the next-closest element.\n\t //\n\t // 3. We did not find the exact element, and there is no next-closest\n\t // element than the one we are searching for, so we return -1.\n\t var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n\t var cmp = aCompare(aNeedle, aHaystack[mid], true);\n\t if (cmp === 0) {\n\t // Found the element we are looking for.\n\t return mid;\n\t }\n\t else if (cmp > 0) {\n\t // Our needle is greater than aHaystack[mid].\n\t if (aHigh - mid > 1) {\n\t // The element is in the upper half.\n\t return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // The exact needle element was not found in this haystack. Determine if\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return aHigh < aHaystack.length ? aHigh : -1;\n\t } else {\n\t return mid;\n\t }\n\t }\n\t else {\n\t // Our needle is less than aHaystack[mid].\n\t if (mid - aLow > 1) {\n\t // The element is in the lower half.\n\t return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return mid;\n\t } else {\n\t return aLow < 0 ? -1 : aLow;\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * This is an implementation of binary search which will always try and return\n\t * the index of the closest element if there is no exact hit. This is because\n\t * mappings between original and generated line/col pairs are single points,\n\t * and there is an implicit region between each of them, so a miss just means\n\t * that you aren't on the very start of a region.\n\t *\n\t * @param aNeedle The element you are looking for.\n\t * @param aHaystack The array that is being searched.\n\t * @param aCompare A function which takes the needle and an element in the\n\t * array and returns -1, 0, or 1 depending on whether the needle is less\n\t * than, equal to, or greater than the element, respectively.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n\t */\n\texports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n\t if (aHaystack.length === 0) {\n\t return -1;\n\t }\n\t\n\t var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n\t aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n\t if (index < 0) {\n\t return -1;\n\t }\n\t\n\t // We have found either the exact element, or the next-closest element than\n\t // the one we are searching for. However, there may be more than one such\n\t // element. Make sure we always return the smallest of these.\n\t while (index - 1 >= 0) {\n\t if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n\t break;\n\t }\n\t --index;\n\t }\n\t\n\t return index;\n\t};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t// It turns out that some (most?) JavaScript engines don't self-host\n\t// `Array.prototype.sort`. This makes sense because C++ will likely remain\n\t// faster than JS when doing raw CPU-intensive sorting. However, when using a\n\t// custom comparator function, calling back and forth between the VM's C++ and\n\t// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n\t// worse generated code for the comparator function than would be optimal. In\n\t// fact, when sorting with a comparator, these costs outweigh the benefits of\n\t// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n\t// a ~3500ms mean speed-up in `bench/bench.html`.\n\t\n\t/**\n\t * Swap the elements indexed by `x` and `y` in the array `ary`.\n\t *\n\t * @param {Array} ary\n\t * The array.\n\t * @param {Number} x\n\t * The index of the first item.\n\t * @param {Number} y\n\t * The index of the second item.\n\t */\n\tfunction swap(ary, x, y) {\n\t var temp = ary[x];\n\t ary[x] = ary[y];\n\t ary[y] = temp;\n\t}\n\t\n\t/**\n\t * Returns a random integer within the range `low .. high` inclusive.\n\t *\n\t * @param {Number} low\n\t * The lower bound on the range.\n\t * @param {Number} high\n\t * The upper bound on the range.\n\t */\n\tfunction randomIntInRange(low, high) {\n\t return Math.round(low + (Math.random() * (high - low)));\n\t}\n\t\n\t/**\n\t * The Quick Sort algorithm.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t * @param {Number} p\n\t * Start index of the array\n\t * @param {Number} r\n\t * End index of the array\n\t */\n\tfunction doQuickSort(ary, comparator, p, r) {\n\t // If our lower bound is less than our upper bound, we (1) partition the\n\t // array into two pieces and (2) recurse on each half. If it is not, this is\n\t // the empty array and our base case.\n\t\n\t if (p < r) {\n\t // (1) Partitioning.\n\t //\n\t // The partitioning chooses a pivot between `p` and `r` and moves all\n\t // elements that are less than or equal to the pivot to the before it, and\n\t // all the elements that are greater than it after it. The effect is that\n\t // once partition is done, the pivot is in the exact place it will be when\n\t // the array is put in sorted order, and it will not need to be moved\n\t // again. This runs in O(n) time.\n\t\n\t // Always choose a random pivot so that an input array which is reverse\n\t // sorted does not cause O(n^2) running time.\n\t var pivotIndex = randomIntInRange(p, r);\n\t var i = p - 1;\n\t\n\t swap(ary, pivotIndex, r);\n\t var pivot = ary[r];\n\t\n\t // Immediately after `j` is incremented in this loop, the following hold\n\t // true:\n\t //\n\t // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n\t //\n\t // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n\t for (var j = p; j < r; j++) {\n\t if (comparator(ary[j], pivot) <= 0) {\n\t i += 1;\n\t swap(ary, i, j);\n\t }\n\t }\n\t\n\t swap(ary, i + 1, j);\n\t var q = i + 1;\n\t\n\t // (2) Recurse on each half.\n\t\n\t doQuickSort(ary, comparator, p, q - 1);\n\t doQuickSort(ary, comparator, q + 1, r);\n\t }\n\t}\n\t\n\t/**\n\t * Sort the given array in-place with the given comparator function.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t */\n\texports.quickSort = function (ary, comparator) {\n\t doQuickSort(ary, comparator, 0, ary.length - 1);\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\tvar util = __webpack_require__(4);\n\t\n\t// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n\t// operating systems these days (capturing the result).\n\tvar REGEX_NEWLINE = /(\\r?\\n)/;\n\t\n\t// Newline character code for charCodeAt() comparisons\n\tvar NEWLINE_CODE = 10;\n\t\n\t// Private symbol for identifying `SourceNode`s when multiple versions of\n\t// the source-map library are loaded. This MUST NOT CHANGE across\n\t// versions!\n\tvar isSourceNode = \"$$$isSourceNode$$$\";\n\t\n\t/**\n\t * SourceNodes provide a way to abstract over interpolating/concatenating\n\t * snippets of generated JavaScript source code while maintaining the line and\n\t * column information associated with the original source code.\n\t *\n\t * @param aLine The original line number.\n\t * @param aColumn The original column number.\n\t * @param aSource The original source's filename.\n\t * @param aChunks Optional. An array of strings which are snippets of\n\t * generated JS, or other SourceNodes.\n\t * @param aName The original identifier.\n\t */\n\tfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n\t this.children = [];\n\t this.sourceContents = {};\n\t this.line = aLine == null ? null : aLine;\n\t this.column = aColumn == null ? null : aColumn;\n\t this.source = aSource == null ? null : aSource;\n\t this.name = aName == null ? null : aName;\n\t this[isSourceNode] = true;\n\t if (aChunks != null) this.add(aChunks);\n\t}\n\t\n\t/**\n\t * Creates a SourceNode from generated code and a SourceMapConsumer.\n\t *\n\t * @param aGeneratedCode The generated code\n\t * @param aSourceMapConsumer The SourceMap for the generated code\n\t * @param aRelativePath Optional. The path that relative sources in the\n\t * SourceMapConsumer should be relative to.\n\t */\n\tSourceNode.fromStringWithSourceMap =\n\t function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n\t // The SourceNode we want to fill with the generated code\n\t // and the SourceMap\n\t var node = new SourceNode();\n\t\n\t // All even indices of this array are one line of the generated code,\n\t // while all odd indices are the newlines between two adjacent lines\n\t // (since `REGEX_NEWLINE` captures its match).\n\t // Processed fragments are accessed by calling `shiftNextLine`.\n\t var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n\t var remainingLinesIndex = 0;\n\t var shiftNextLine = function() {\n\t var lineContents = getNextLine();\n\t // The last line of a file might not have a newline.\n\t var newLine = getNextLine() || \"\";\n\t return lineContents + newLine;\n\t\n\t function getNextLine() {\n\t return remainingLinesIndex < remainingLines.length ?\n\t remainingLines[remainingLinesIndex++] : undefined;\n\t }\n\t };\n\t\n\t // We need to remember the position of \"remainingLines\"\n\t var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\t\n\t // The generate SourceNodes we need a code range.\n\t // To extract it current and last mapping is used.\n\t // Here we store the last mapping.\n\t var lastMapping = null;\n\t\n\t aSourceMapConsumer.eachMapping(function (mapping) {\n\t if (lastMapping !== null) {\n\t // We add the code from \"lastMapping\" to \"mapping\":\n\t // First check if there is a new line in between.\n\t if (lastGeneratedLine < mapping.generatedLine) {\n\t // Associate first line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t lastGeneratedLine++;\n\t lastGeneratedColumn = 0;\n\t // The remaining code is added without mapping\n\t } else {\n\t // There is no new line in between.\n\t // Associate the code between \"lastGeneratedColumn\" and\n\t // \"mapping.generatedColumn\" with \"lastMapping\"\n\t var nextLine = remainingLines[remainingLinesIndex] || '';\n\t var code = nextLine.substr(0, mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t addMappingWithCode(lastMapping, code);\n\t // No more remaining code, continue\n\t lastMapping = mapping;\n\t return;\n\t }\n\t }\n\t // We add the generated code until the first mapping\n\t // to the SourceNode without any mapping.\n\t // Each line is added as separate string.\n\t while (lastGeneratedLine < mapping.generatedLine) {\n\t node.add(shiftNextLine());\n\t lastGeneratedLine++;\n\t }\n\t if (lastGeneratedColumn < mapping.generatedColumn) {\n\t var nextLine = remainingLines[remainingLinesIndex] || '';\n\t node.add(nextLine.substr(0, mapping.generatedColumn));\n\t remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t }\n\t lastMapping = mapping;\n\t }, this);\n\t // We have processed all mappings.\n\t if (remainingLinesIndex < remainingLines.length) {\n\t if (lastMapping) {\n\t // Associate the remaining code in the current line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t }\n\t // and add the remaining lines without any mapping\n\t node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n\t }\n\t\n\t // Copy sourcesContent into SourceNode\n\t aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t if (content != null) {\n\t if (aRelativePath != null) {\n\t sourceFile = util.join(aRelativePath, sourceFile);\n\t }\n\t node.setSourceContent(sourceFile, content);\n\t }\n\t });\n\t\n\t return node;\n\t\n\t function addMappingWithCode(mapping, code) {\n\t if (mapping === null || mapping.source === undefined) {\n\t node.add(code);\n\t } else {\n\t var source = aRelativePath\n\t ? util.join(aRelativePath, mapping.source)\n\t : mapping.source;\n\t node.add(new SourceNode(mapping.originalLine,\n\t mapping.originalColumn,\n\t source,\n\t code,\n\t mapping.name));\n\t }\n\t }\n\t };\n\t\n\t/**\n\t * Add a chunk of generated JS to this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.add = function SourceNode_add(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t aChunk.forEach(function (chunk) {\n\t this.add(chunk);\n\t }, this);\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t if (aChunk) {\n\t this.children.push(aChunk);\n\t }\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Add a chunk of generated JS to the beginning of this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t for (var i = aChunk.length-1; i >= 0; i--) {\n\t this.prepend(aChunk[i]);\n\t }\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t this.children.unshift(aChunk);\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Walk over the tree of JS snippets in this node and its children. The\n\t * walking function is called once for each snippet of JS and is passed that\n\t * snippet and the its original associated source's line/column location.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n\t var chunk;\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t chunk = this.children[i];\n\t if (chunk[isSourceNode]) {\n\t chunk.walk(aFn);\n\t }\n\t else {\n\t if (chunk !== '') {\n\t aFn(chunk, { source: this.source,\n\t line: this.line,\n\t column: this.column,\n\t name: this.name });\n\t }\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n\t * each of `this.children`.\n\t *\n\t * @param aSep The separator.\n\t */\n\tSourceNode.prototype.join = function SourceNode_join(aSep) {\n\t var newChildren;\n\t var i;\n\t var len = this.children.length;\n\t if (len > 0) {\n\t newChildren = [];\n\t for (i = 0; i < len-1; i++) {\n\t newChildren.push(this.children[i]);\n\t newChildren.push(aSep);\n\t }\n\t newChildren.push(this.children[i]);\n\t this.children = newChildren;\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Call String.prototype.replace on the very right-most source snippet. Useful\n\t * for trimming whitespace from the end of a source node, etc.\n\t *\n\t * @param aPattern The pattern to replace.\n\t * @param aReplacement The thing to replace the pattern with.\n\t */\n\tSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n\t var lastChild = this.children[this.children.length - 1];\n\t if (lastChild[isSourceNode]) {\n\t lastChild.replaceRight(aPattern, aReplacement);\n\t }\n\t else if (typeof lastChild === 'string') {\n\t this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n\t }\n\t else {\n\t this.children.push(''.replace(aPattern, aReplacement));\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Set the source content for a source file. This will be added to the SourceMapGenerator\n\t * in the sourcesContent field.\n\t *\n\t * @param aSourceFile The filename of the source file\n\t * @param aSourceContent The content of the source file\n\t */\n\tSourceNode.prototype.setSourceContent =\n\t function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n\t this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n\t };\n\t\n\t/**\n\t * Walk over the tree of SourceNodes. The walking function is called for each\n\t * source file content and is passed the filename and source content.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walkSourceContents =\n\t function SourceNode_walkSourceContents(aFn) {\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t if (this.children[i][isSourceNode]) {\n\t this.children[i].walkSourceContents(aFn);\n\t }\n\t }\n\t\n\t var sources = Object.keys(this.sourceContents);\n\t for (var i = 0, len = sources.length; i < len; i++) {\n\t aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n\t }\n\t };\n\t\n\t/**\n\t * Return the string representation of this source node. Walks over the tree\n\t * and concatenates all the various snippets together to one string.\n\t */\n\tSourceNode.prototype.toString = function SourceNode_toString() {\n\t var str = \"\";\n\t this.walk(function (chunk) {\n\t str += chunk;\n\t });\n\t return str;\n\t};\n\t\n\t/**\n\t * Returns the string representation of this source node along with a source\n\t * map.\n\t */\n\tSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n\t var generated = {\n\t code: \"\",\n\t line: 1,\n\t column: 0\n\t };\n\t var map = new SourceMapGenerator(aArgs);\n\t var sourceMappingActive = false;\n\t var lastOriginalSource = null;\n\t var lastOriginalLine = null;\n\t var lastOriginalColumn = null;\n\t var lastOriginalName = null;\n\t this.walk(function (chunk, original) {\n\t generated.code += chunk;\n\t if (original.source !== null\n\t && original.line !== null\n\t && original.column !== null) {\n\t if(lastOriginalSource !== original.source\n\t || lastOriginalLine !== original.line\n\t || lastOriginalColumn !== original.column\n\t || lastOriginalName !== original.name) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t lastOriginalSource = original.source;\n\t lastOriginalLine = original.line;\n\t lastOriginalColumn = original.column;\n\t lastOriginalName = original.name;\n\t sourceMappingActive = true;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t }\n\t });\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t }\n\t for (var idx = 0, length = chunk.length; idx < length; idx++) {\n\t if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n\t generated.line++;\n\t generated.column = 0;\n\t // Mappings end at eol\n\t if (idx + 1 === length) {\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t } else {\n\t generated.column++;\n\t }\n\t }\n\t });\n\t this.walkSourceContents(function (sourceFile, sourceContent) {\n\t map.setSourceContent(sourceFile, sourceContent);\n\t });\n\t\n\t return { code: generated.code, map: map };\n\t};\n\t\n\texports.SourceNode = SourceNode;\n\n\n/***/ })\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// source-map.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0fd5815da764db5fb9fe","/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./source-map.js\n// module id = 0\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var sourceRelative = sourceFile;\n if (sourceRoot !== null) {\n sourceRelative = util.relative(sourceRoot, sourceFile);\n }\n\n if (!generator._sources.has(sourceRelative)) {\n generator._sources.add(sourceRelative);\n }\n\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null) {\n source = String(source);\n if (!this._sources.has(source)) {\n this._sources.add(source);\n }\n }\n\n if (name != null) {\n name = String(name);\n if (!this._names.has(name)) {\n this._names.add(name);\n }\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = Object.create(null);\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n // When aOriginal is truthy but has empty values for .line and .column,\n // it is most likely a programmer error. In this case we throw a very\n // specific error message to try to guide them the right way.\n // For example: https://github.com/Polymer/polymer-bundler/pull/519\n if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n throw new Error(\n 'original.line and original.column are not numbers -- you probably meant to omit ' +\n 'the original mapping entirely and only map the generated position. If so, pass ' +\n 'null for the original mapping instead of an object with empty or null values.'\n );\n }\n\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var next;\n var mapping;\n var nameIdx;\n var sourceIdx;\n\n var mappings = this._mappings.toArray();\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n next = ''\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n next += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n next += ',';\n }\n }\n\n next += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n next += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n next += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n next += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n next += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n\n result += next;\n }\n\n return result;\n };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this.toJSON());\n };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-generator.js\n// module id = 1\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n// Continuation\n// | Sign\n// | |\n// V V\n// 101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (aIndex >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n\n digit = base64.decode(aStr.charCodeAt(aIndex++));\n if (digit === -1) {\n throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n }\n\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aIndex;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64-vlq.js\n// module id = 2\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n var bigA = 65; // 'A'\n var bigZ = 90; // 'Z'\n\n var littleA = 97; // 'a'\n var littleZ = 122; // 'z'\n\n var zero = 48; // '0'\n var nine = 57; // '9'\n\n var plus = 43; // '+'\n var slash = 47; // '/'\n\n var littleOffset = 26;\n var numberOffset = 52;\n\n // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n if (bigA <= charCode && charCode <= bigZ) {\n return (charCode - bigA);\n }\n\n // 26 - 51: abcdefghijklmnopqrstuvwxyz\n if (littleA <= charCode && charCode <= littleZ) {\n return (charCode - littleA + littleOffset);\n }\n\n // 52 - 61: 0123456789\n if (zero <= charCode && charCode <= nine) {\n return (charCode - zero + numberOffset);\n }\n\n // 62: +\n if (charCode == plus) {\n return 62;\n }\n\n // 63: /\n if (charCode == slash) {\n return 63;\n }\n\n // Invalid base64 digit.\n return -1;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64.js\n// module id = 3\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = exports.isAbsolute(path);\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n var level = 0;\n while (aPath.indexOf(aRoot + '/') !== 0) {\n var index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n var obj = Object.create(null);\n return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n if (isProtoString(aStr)) {\n return '$' + aStr;\n }\n\n return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n if (isProtoString(aStr)) {\n return aStr.slice(1);\n }\n\n return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n if (!s) {\n return false;\n }\n\n var length = s.length;\n\n if (length < 9 /* \"__proto__\".length */) {\n return false;\n }\n\n if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n s.charCodeAt(length - 9) !== 95 /* '_' */) {\n return false;\n }\n\n for (var i = length - 10; i >= 0; i--) {\n if (s.charCodeAt(i) !== 36 /* '$' */) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 === null) {\n return 1; // aStr2 !== null\n }\n\n if (aStr2 === null) {\n return -1; // aStr1 !== null\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n/**\n * Strip any JSON XSSI avoidance prefix from the string (as documented\n * in the source maps specification), and then parse the string as\n * JSON.\n */\nfunction parseSourceMapInput(str) {\n return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n}\nexports.parseSourceMapInput = parseSourceMapInput;\n\n/**\n * Compute the URL of a source given the the source root, the source's\n * URL, and the source map's URL.\n */\nfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n sourceURL = sourceURL || '';\n\n if (sourceRoot) {\n // This follows what Chrome does.\n if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n sourceRoot += '/';\n }\n // The spec says:\n // Line 4: An optional source root, useful for relocating source\n // files on a server or removing repeated values in the\n // “sources” entry. This value is prepended to the individual\n // entries in the “source” field.\n sourceURL = sourceRoot + sourceURL;\n }\n\n // Historically, SourceMapConsumer did not take the sourceMapURL as\n // a parameter. This mode is still somewhat supported, which is why\n // this code block is conditional. However, it's preferable to pass\n // the source map URL to SourceMapConsumer, so that this function\n // can implement the source URL resolution algorithm as outlined in\n // the spec. This block is basically the equivalent of:\n // new URL(sourceURL, sourceMapURL).toString()\n // ... except it avoids using URL, which wasn't available in the\n // older releases of node still supported by this library.\n //\n // The spec says:\n // If the sources are not absolute URLs after prepending of the\n // “sourceRoot”, the sources are resolved relative to the\n // SourceMap (like resolving script src in a html document).\n if (sourceMapURL) {\n var parsed = urlParse(sourceMapURL);\n if (!parsed) {\n throw new Error(\"sourceMapURL could not be parsed\");\n }\n if (parsed.path) {\n // Strip the last path component, but keep the \"/\".\n var index = parsed.path.lastIndexOf('/');\n if (index >= 0) {\n parsed.path = parsed.path.substring(0, index + 1);\n }\n }\n sourceURL = join(urlGenerate(parsed), sourceURL);\n }\n\n return normalize(sourceURL);\n}\nexports.computeSourceURL = computeSourceURL;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/util.js\n// module id = 4\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n this._array = [];\n this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n if (hasNativeMap) {\n this._set.set(aStr, idx);\n } else {\n this._set[sStr] = idx;\n }\n }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n if (hasNativeMap) {\n return this._set.has(aStr);\n } else {\n var sStr = util.toSetString(aStr);\n return has.call(this._set, sStr);\n }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n if (hasNativeMap) {\n var idx = this._set.get(aStr);\n if (idx >= 0) {\n return idx;\n }\n } else {\n var sStr = util.toSetString(aStr);\n if (has.call(this._set, sStr)) {\n return this._set[sStr];\n }\n }\n\n throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/array-set.js\n// module id = 5\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n};\n\nexports.MappingList = MappingList;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/mapping-list.js\n// module id = 6\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n// {\n// generatedLine: The line number in the generated code,\n// generatedColumn: The column number in the generated code,\n// source: The path to the original source file that generated this\n// chunk of code,\n// originalLine: The line number in the original source that\n// corresponds to this chunk of generated code,\n// originalColumn: The column number in the original source that\n// corresponds to this chunk of generated code,\n// name: The name of the original symbol which generated this chunk of\n// code.\n// }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n configurable: true,\n enumerable: true,\n get: function () {\n if (!this.__generatedMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n configurable: true,\n enumerable: true,\n get: function () {\n if (!this.__originalMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n var c = aStr.charAt(index);\n return c === \";\" || c === \",\";\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source === null ? null : this._sources.at(mapping.source);\n source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : this._names.at(mapping.name)\n };\n }, this).forEach(aCallback, context);\n };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number is 1-based.\n * - column: Optional. the column number in the original source.\n * The column number is 0-based.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n var line = util.getArg(aArgs, 'line');\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: line,\n originalColumn: util.getArg(aArgs, 'column', 0)\n };\n\n needle.source = this._findSourceIndex(needle.source);\n if (needle.source < 0) {\n return [];\n }\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n var originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n var originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The first parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found. This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n if (sourceRoot) {\n sourceRoot = util.normalize(sourceRoot);\n }\n\n sources = sources\n .map(String)\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function (source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names.map(String), true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this._absoluteSources = this._sources.toArray().map(function (s) {\n return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n });\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this._sourceMapURL = aSourceMapURL;\n this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Utility function to find the index of a source. Returns -1 if not\n * found.\n */\nBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n var relativeSource = aSource;\n if (this.sourceRoot != null) {\n relativeSource = util.relative(this.sourceRoot, relativeSource);\n }\n\n if (this._sources.has(relativeSource)) {\n return this._sources.indexOf(relativeSource);\n }\n\n // Maybe aSource is an absolute URL as returned by |sources|. In\n // this case we can't simply undo the transform.\n var i;\n for (i = 0; i < this._absoluteSources.length; ++i) {\n if (this._absoluteSources[i] == aSource) {\n return i;\n }\n }\n\n return -1;\n};\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @param String aSourceMapURL\n * The URL at which the source map can be found (optional)\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n smc._sourceMapURL = aSourceMapURL;\n smc._absoluteSources = smc._sources.toArray().map(function (s) {\n return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n });\n\n // Because we are modifying the entries (by converting string sources and\n // names to indices into the sources and names ArraySets), we have to make\n // a copy of the entry or else bad things happen. Shared mutable state\n // strikes again! See github issue #191.\n\n var generatedMappings = aSourceMap._mappings.toArray().slice();\n var destGeneratedMappings = smc.__generatedMappings = [];\n var destOriginalMappings = smc.__originalMappings = [];\n\n for (var i = 0, length = generatedMappings.length; i < length; i++) {\n var srcMapping = generatedMappings[i];\n var destMapping = new Mapping;\n destMapping.generatedLine = srcMapping.generatedLine;\n destMapping.generatedColumn = srcMapping.generatedColumn;\n\n if (srcMapping.source) {\n destMapping.source = sources.indexOf(srcMapping.source);\n destMapping.originalLine = srcMapping.originalLine;\n destMapping.originalColumn = srcMapping.originalColumn;\n\n if (srcMapping.name) {\n destMapping.name = names.indexOf(srcMapping.name);\n }\n\n destOriginalMappings.push(destMapping);\n }\n\n destGeneratedMappings.push(destMapping);\n }\n\n quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n return smc;\n };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._absoluteSources.slice();\n }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var length = aStr.length;\n var index = 0;\n var cachedSegments = {};\n var temp = {};\n var originalMappings = [];\n var generatedMappings = [];\n var mapping, str, segment, end, value;\n\n while (index < length) {\n if (aStr.charAt(index) === ';') {\n generatedLine++;\n index++;\n previousGeneratedColumn = 0;\n }\n else if (aStr.charAt(index) === ',') {\n index++;\n }\n else {\n mapping = new Mapping();\n mapping.generatedLine = generatedLine;\n\n // Because each offset is encoded relative to the previous one,\n // many segments often have the same encoding. We can exploit this\n // fact by caching the parsed variable length fields of each segment,\n // allowing us to avoid a second parse if we encounter the same\n // segment again.\n for (end = index; end < length; end++) {\n if (this._charIsMappingSeparator(aStr, end)) {\n break;\n }\n }\n str = aStr.slice(index, end);\n\n segment = cachedSegments[str];\n if (segment) {\n index += str.length;\n } else {\n segment = [];\n while (index < end) {\n base64VLQ.decode(aStr, index, temp);\n value = temp.value;\n index = temp.rest;\n segment.push(value);\n }\n\n if (segment.length === 2) {\n throw new Error('Found a source, but no line and column');\n }\n\n if (segment.length === 3) {\n throw new Error('Found a source and line, but no column');\n }\n\n cachedSegments[str] = segment;\n }\n\n // Generated column.\n mapping.generatedColumn = previousGeneratedColumn + segment[0];\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (segment.length > 1) {\n // Original source.\n mapping.source = previousSource + segment[1];\n previousSource += segment[1];\n\n // Original line.\n mapping.originalLine = previousOriginalLine + segment[2];\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n\n // Original column.\n mapping.originalColumn = previousOriginalColumn + segment[3];\n previousOriginalColumn = mapping.originalColumn;\n\n if (segment.length > 4) {\n // Original name.\n mapping.name = previousName + segment[4];\n previousName += segment[4];\n }\n }\n\n generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n originalMappings.push(mapping);\n }\n }\n }\n\n quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n this.__generatedMappings = generatedMappings;\n\n quickSort(originalMappings, util.compareByOriginalPositions);\n this.__originalMappings = originalMappings;\n };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source. The line number\n * is 1-based.\n * - column: The column number in the generated source. The column\n * number is 0-based.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null. The\n * line number is 1-based.\n * - column: The column number in the original source, or null. The\n * column number is 0-based.\n * - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositionsDeflated,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source !== null) {\n source = this._sources.at(source);\n source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n }\n var name = util.getArg(mapping, 'name', null);\n if (name !== null) {\n name = this._names.at(name);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n function BasicSourceMapConsumer_hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function (sc) { return sc == null; });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n var index = this._findSourceIndex(aSource);\n if (index >= 0) {\n return this.sourcesContent[index];\n }\n\n var relativeSource = aSource;\n if (this.sourceRoot != null) {\n relativeSource = util.relative(this.sourceRoot, relativeSource);\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + relativeSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number\n * is 1-based.\n * - column: The column number in the original source. The column\n * number is 0-based.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n source = this._findSourceIndex(source);\n if (source < 0) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n\n var needle = {\n source: source,\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (mapping.source === needle.source) {\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The first parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found. This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sections = util.getArg(sourceMap, 'sections');\n\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n this._sources = new ArraySet();\n this._names = new ArraySet();\n\n var lastOffset = {\n line: -1,\n column: 0\n };\n this._sections = sections.map(function (s) {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error('Support for url field in sections not implemented.');\n }\n var offset = util.getArg(s, 'offset');\n var offsetLine = util.getArg(offset, 'line');\n var offsetColumn = util.getArg(offset, 'column');\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error('Section offsets must be ordered and non-overlapping.');\n }\n lastOffset = offset;\n\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n }\n });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n get: function () {\n var sources = [];\n for (var i = 0; i < this._sections.length; i++) {\n for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source. The line number\n * is 1-based.\n * - column: The column number in the generated source. The column\n * number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null. The\n * line number is 1-based.\n * - column: The column number in the original source, or null. The\n * column number is 0-based.\n * - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n var sectionIndex = binarySearch.search(needle, this._sections,\n function(needle, section) {\n var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (needle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n var section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n return this._sections.every(function (s) {\n return s.consumer.hasContentsOfAllSources();\n });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n var content = section.consumer.sourceContentFor(aSource, true);\n if (content) {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number\n * is 1-based.\n * - column: The column number in the original source. The column\n * number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based. \n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n continue;\n }\n var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n var ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n var sectionMappings = section.consumer._generatedMappings;\n for (var j = 0; j < sectionMappings.length; j++) {\n var mapping = sectionMappings[j];\n\n var source = section.consumer._sources.at(mapping.source);\n source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = null;\n if (mapping.name) {\n name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n }\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n var adjustedMapping = {\n source: source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: name\n };\n\n this.__generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === 'number') {\n this.__originalMappings.push(adjustedMapping);\n }\n }\n }\n\n quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n quickSort(this.__originalMappings, util.compareByOriginalPositions);\n };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-consumer.js\n// module id = 7\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n } else {\n return mid;\n }\n }\n else {\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n } else {\n return aLow < 0 ? -1 : aLow;\n }\n }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/binary-search.js\n// module id = 8\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n * The array.\n * @param {Number} x\n * The index of the first item.\n * @param {Number} y\n * The index of the second item.\n */\nfunction swap(ary, x, y) {\n var temp = ary[x];\n ary[x] = ary[y];\n ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n * The lower bound on the range.\n * @param {Number} high\n * The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n * @param {Number} p\n * Start index of the array\n * @param {Number} r\n * End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n // If our lower bound is less than our upper bound, we (1) partition the\n // array into two pieces and (2) recurse on each half. If it is not, this is\n // the empty array and our base case.\n\n if (p < r) {\n // (1) Partitioning.\n //\n // The partitioning chooses a pivot between `p` and `r` and moves all\n // elements that are less than or equal to the pivot to the before it, and\n // all the elements that are greater than it after it. The effect is that\n // once partition is done, the pivot is in the exact place it will be when\n // the array is put in sorted order, and it will not need to be moved\n // again. This runs in O(n) time.\n\n // Always choose a random pivot so that an input array which is reverse\n // sorted does not cause O(n^2) running time.\n var pivotIndex = randomIntInRange(p, r);\n var i = p - 1;\n\n swap(ary, pivotIndex, r);\n var pivot = ary[r];\n\n // Immediately after `j` is incremented in this loop, the following hold\n // true:\n //\n // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n //\n // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n for (var j = p; j < r; j++) {\n if (comparator(ary[j], pivot) <= 0) {\n i += 1;\n swap(ary, i, j);\n }\n }\n\n swap(ary, i + 1, j);\n var q = i + 1;\n\n // (2) Recurse on each half.\n\n doQuickSort(ary, comparator, p, q - 1);\n doQuickSort(ary, comparator, q + 1, r);\n }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/quick-sort.js\n// module id = 9\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are accessed by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var remainingLinesIndex = 0;\n var shiftNextLine = function() {\n var lineContents = getNextLine();\n // The last line of a file might not have a newline.\n var newLine = getNextLine() || \"\";\n return lineContents + newLine;\n\n function getNextLine() {\n return remainingLinesIndex < remainingLines.length ?\n remainingLines[remainingLinesIndex++] : undefined;\n }\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[remainingLinesIndex] || '';\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[remainingLinesIndex] || '';\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLinesIndex < remainingLines.length) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-node.js\n// module id = 10\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/node_modules/source-map/package.json b/node_modules/source-map/package.json new file mode 100644 index 00000000..24663417 --- /dev/null +++ b/node_modules/source-map/package.json @@ -0,0 +1,73 @@ +{ + "name": "source-map", + "description": "Generates and consumes source maps", + "version": "0.6.1", + "homepage": "https://github.com/mozilla/source-map", + "author": "Nick Fitzgerald ", + "contributors": [ + "Tobias Koppers ", + "Duncan Beevers ", + "Stephen Crane ", + "Ryan Seddon ", + "Miles Elam ", + "Mihai Bazon ", + "Michael Ficarra ", + "Todd Wolfson ", + "Alexander Solovyov ", + "Felix Gnass ", + "Conrad Irwin ", + "usrbincc ", + "David Glasser ", + "Chase Douglas ", + "Evan Wallace ", + "Heather Arthur ", + "Hugh Kennedy ", + "David Glasser ", + "Simon Lydell ", + "Jmeas Smith ", + "Michael Z Goddard ", + "azu ", + "John Gozde ", + "Adam Kirkton ", + "Chris Montgomery ", + "J. Ryan Stinnett ", + "Jack Herrington ", + "Chris Truter ", + "Daniel Espeset ", + "Jamie Wong ", + "Eddy Bruël ", + "Hawken Rives ", + "Gilad Peleg ", + "djchie ", + "Gary Ye ", + "Nicolas Lalevée " + ], + "repository": { + "type": "git", + "url": "http://github.com/mozilla/source-map.git" + }, + "main": "./source-map.js", + "files": [ + "source-map.js", + "source-map.d.ts", + "lib/", + "dist/source-map.debug.js", + "dist/source-map.js", + "dist/source-map.min.js", + "dist/source-map.min.js.map" + ], + "engines": { + "node": ">=0.10.0" + }, + "license": "BSD-3-Clause", + "scripts": { + "test": "npm run build && node test/run-tests.js", + "build": "webpack --color", + "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md" + }, + "devDependencies": { + "doctoc": "^0.15.0", + "webpack": "^1.12.0" + }, + "typings": "source-map" +} diff --git a/node_modules/source-map/source-map.d.ts b/node_modules/source-map/source-map.d.ts new file mode 100644 index 00000000..8f972b0c --- /dev/null +++ b/node_modules/source-map/source-map.d.ts @@ -0,0 +1,98 @@ +export interface StartOfSourceMap { + file?: string; + sourceRoot?: string; +} + +export interface RawSourceMap extends StartOfSourceMap { + version: string; + sources: string[]; + names: string[]; + sourcesContent?: string[]; + mappings: string; +} + +export interface Position { + line: number; + column: number; +} + +export interface LineRange extends Position { + lastColumn: number; +} + +export interface FindPosition extends Position { + // SourceMapConsumer.GREATEST_LOWER_BOUND or SourceMapConsumer.LEAST_UPPER_BOUND + bias?: number; +} + +export interface SourceFindPosition extends FindPosition { + source: string; +} + +export interface MappedPosition extends Position { + source: string; + name?: string; +} + +export interface MappingItem { + source: string; + generatedLine: number; + generatedColumn: number; + originalLine: number; + originalColumn: number; + name: string; +} + +export class SourceMapConsumer { + static GENERATED_ORDER: number; + static ORIGINAL_ORDER: number; + + static GREATEST_LOWER_BOUND: number; + static LEAST_UPPER_BOUND: number; + + constructor(rawSourceMap: RawSourceMap); + computeColumnSpans(): void; + originalPositionFor(generatedPosition: FindPosition): MappedPosition; + generatedPositionFor(originalPosition: SourceFindPosition): LineRange; + allGeneratedPositionsFor(originalPosition: MappedPosition): Position[]; + hasContentsOfAllSources(): boolean; + sourceContentFor(source: string, returnNullOnMissing?: boolean): string; + eachMapping(callback: (mapping: MappingItem) => void, context?: any, order?: number): void; +} + +export interface Mapping { + generated: Position; + original: Position; + source: string; + name?: string; +} + +export class SourceMapGenerator { + constructor(startOfSourceMap?: StartOfSourceMap); + static fromSourceMap(sourceMapConsumer: SourceMapConsumer): SourceMapGenerator; + addMapping(mapping: Mapping): void; + setSourceContent(sourceFile: string, sourceContent: string): void; + applySourceMap(sourceMapConsumer: SourceMapConsumer, sourceFile?: string, sourceMapPath?: string): void; + toString(): string; +} + +export interface CodeWithSourceMap { + code: string; + map: SourceMapGenerator; +} + +export class SourceNode { + constructor(); + constructor(line: number, column: number, source: string); + constructor(line: number, column: number, source: string, chunk?: string, name?: string); + static fromStringWithSourceMap(code: string, sourceMapConsumer: SourceMapConsumer, relativePath?: string): SourceNode; + add(chunk: string): void; + prepend(chunk: string): void; + setSourceContent(sourceFile: string, sourceContent: string): void; + walk(fn: (chunk: string, mapping: MappedPosition) => void): void; + walkSourceContents(fn: (file: string, content: string) => void): void; + join(sep: string): SourceNode; + replaceRight(pattern: string, replacement: string): SourceNode; + toString(): string; + toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap; +} diff --git a/node_modules/source-map/source-map.js b/node_modules/source-map/source-map.js new file mode 100644 index 00000000..bc88fe82 --- /dev/null +++ b/node_modules/source-map/source-map.js @@ -0,0 +1,8 @@ +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; +exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; +exports.SourceNode = require('./lib/source-node').SourceNode; diff --git a/node_modules/sparkles/LICENSE b/node_modules/sparkles/LICENSE new file mode 100644 index 00000000..fb6dcd48 --- /dev/null +++ b/node_modules/sparkles/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blaine Bublitz and Eric Schoffstall + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/node_modules/sparkles/README.md b/node_modules/sparkles/README.md new file mode 100644 index 00000000..3655d49f --- /dev/null +++ b/node_modules/sparkles/README.md @@ -0,0 +1,62 @@ +

      + + + +

      + +# sparkles + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Namespaced global event emitter + +## Usage + +Sparkles exports a function that returns a singleton `EventEmitter`. +This EE can be shared across your application, whether or not node loads +multiple copies. + +```js +var sparkles = require('sparkles')(); // make sure to call the function + +sparkles.on('my-event', function(evt){ + console.log('my-event handled', evt); +}); + +sparkles.emit('my-event', { my: 'event' }); +``` + +## API + +### sparkles(namespace) + +Returns an EventEmitter that is shared amongst the provided namespace. If no namespace +is provided, returns a default EventEmitter. + +### sparkles.exists(namespace); + +Checks whether a namespace exists and returns true or false. + +## Why the name? + +This is a "global emitter"; shortened: "glitter" but it was already taken; so we got sparkles instead :smile: + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/sparkles.svg +[npm-url]: https://www.npmjs.com/package/sparkles +[npm-image]: http://img.shields.io/npm/v/sparkles.svg + +[travis-url]: https://travis-ci.org/gulpjs/sparkles +[travis-image]: http://img.shields.io/travis/gulpjs/sparkles.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/sparkles +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/sparkles.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/sparkles +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/sparkles/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/sparkles/index.js b/node_modules/sparkles/index.js new file mode 100644 index 00000000..e2936329 --- /dev/null +++ b/node_modules/sparkles/index.js @@ -0,0 +1,45 @@ +'use strict'; + +var EventEmitter = require('events').EventEmitter; + +var sparklesNamespace = 'store@sparkles'; +var defaultNamespace = 'default'; + +function getStore() { + var store = global[sparklesNamespace]; + + if (!store) { + store = global[sparklesNamespace] = {}; + } + + return store; +} + +function getEmitter(namespace) { + + var store = getStore(); + + namespace = namespace || defaultNamespace; + + var ee = store[namespace]; + + if (!ee) { + ee = store[namespace] = new EventEmitter(); + ee.setMaxListeners(0); + ee.remove = function remove() { + ee.removeAllListeners(); + delete store[namespace]; + }; + } + + return ee; +} + +function exists(namespace) { + var store = getStore(); + + return !!(store[namespace]); +} + +module.exports = getEmitter; +module.exports.exists = exists; diff --git a/node_modules/sparkles/package.json b/node_modules/sparkles/package.json new file mode 100644 index 00000000..b55dd388 --- /dev/null +++ b/node_modules/sparkles/package.json @@ -0,0 +1,42 @@ +{ + "name": "sparkles", + "version": "1.0.1", + "description": "Namespaced global event emitter", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Blaine Bublitz " + ], + "repository": "gulpjs/sparkles", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint .", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": {}, + "devDependencies": { + "eslint": "^2.13.0", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "mocha": "^3.5.3" + }, + "keywords": [ + "ee", + "emitter", + "events", + "global", + "namespaced" + ] +} diff --git a/node_modules/spdx-correct/LICENSE b/node_modules/spdx-correct/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/node_modules/spdx-correct/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/node_modules/spdx-correct/README.md b/node_modules/spdx-correct/README.md new file mode 100644 index 00000000..ab388cf9 --- /dev/null +++ b/node_modules/spdx-correct/README.md @@ -0,0 +1,14 @@ +```javascript +var correct = require('spdx-correct') +var assert = require('assert') + +assert.equal(correct('mit'), 'MIT') + +assert.equal(correct('Apache 2'), 'Apache-2.0') + +assert(correct('No idea what license') === null) + +// disable upgrade option +assert(correct('GPL-3.0'), 'GPL-3.0-or-later') +assert(correct('GPL-3.0', { upgrade: false }), 'GPL-3.0') +``` diff --git a/node_modules/spdx-correct/index.js b/node_modules/spdx-correct/index.js new file mode 100644 index 00000000..c51a79f5 --- /dev/null +++ b/node_modules/spdx-correct/index.js @@ -0,0 +1,364 @@ +/* +Copyright spdx-correct.js contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +var parse = require('spdx-expression-parse') +var spdxLicenseIds = require('spdx-license-ids') + +function valid (string) { + try { + parse(string) + return true + } catch (error) { + return false + } +} + +// Common transpositions of license identifier acronyms +var transpositions = [ + ['APGL', 'AGPL'], + ['Gpl', 'GPL'], + ['GLP', 'GPL'], + ['APL', 'Apache'], + ['ISD', 'ISC'], + ['GLP', 'GPL'], + ['IST', 'ISC'], + ['Claude', 'Clause'], + [' or later', '+'], + [' International', ''], + ['GNU', 'GPL'], + ['GUN', 'GPL'], + ['+', ''], + ['GNU GPL', 'GPL'], + ['GNU/GPL', 'GPL'], + ['GNU GLP', 'GPL'], + ['GNU General Public License', 'GPL'], + ['Gnu public license', 'GPL'], + ['GNU Public License', 'GPL'], + ['GNU GENERAL PUBLIC LICENSE', 'GPL'], + ['MTI', 'MIT'], + ['Mozilla Public License', 'MPL'], + ['Universal Permissive License', 'UPL'], + ['WTH', 'WTF'], + ['-License', ''] +] + +var TRANSPOSED = 0 +var CORRECT = 1 + +// Simple corrections to nearly valid identifiers. +var transforms = [ + // e.g. 'mit' + function (argument) { + return argument.toUpperCase() + }, + // e.g. 'MIT ' + function (argument) { + return argument.trim() + }, + // e.g. 'M.I.T.' + function (argument) { + return argument.replace(/\./g, '') + }, + // e.g. 'Apache- 2.0' + function (argument) { + return argument.replace(/\s+/g, '') + }, + // e.g. 'CC BY 4.0'' + function (argument) { + return argument.replace(/\s+/g, '-') + }, + // e.g. 'LGPLv2.1' + function (argument) { + return argument.replace('v', '-') + }, + // e.g. 'Apache 2.0' + function (argument) { + return argument.replace(/,?\s*(\d)/, '-$1') + }, + // e.g. 'GPL 2' + function (argument) { + return argument.replace(/,?\s*(\d)/, '-$1.0') + }, + // e.g. 'Apache Version 2.0' + function (argument) { + return argument + .replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2') + }, + // e.g. 'Apache Version 2' + function (argument) { + return argument + .replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0') + }, + // e.g. 'ZLIB' + function (argument) { + return argument[0].toUpperCase() + argument.slice(1) + }, + // e.g. 'MPL/2.0' + function (argument) { + return argument.replace('/', '-') + }, + // e.g. 'Apache 2' + function (argument) { + return argument + .replace(/\s*V\s*(\d)/, '-$1') + .replace(/(\d)$/, '$1.0') + }, + // e.g. 'GPL-2.0', 'GPL-3.0' + function (argument) { + if (argument.indexOf('3.0') !== -1) { + return argument + '-or-later' + } else { + return argument + '-only' + } + }, + // e.g. 'GPL-2.0-' + function (argument) { + return argument + 'only' + }, + // e.g. 'GPL2' + function (argument) { + return argument.replace(/(\d)$/, '-$1.0') + }, + // e.g. 'BSD 3' + function (argument) { + return argument.replace(/(-| )?(\d)$/, '-$2-Clause') + }, + // e.g. 'BSD clause 3' + function (argument) { + return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause') + }, + // e.g. 'New BSD license' + function (argument) { + return argument.replace(/\b(Modified|New|Revised)(-| )?BSD((-| )License)?/i, 'BSD-3-Clause') + }, + // e.g. 'Simplified BSD license' + function (argument) { + return argument.replace(/\bSimplified(-| )?BSD((-| )License)?/i, 'BSD-2-Clause') + }, + // e.g. 'Free BSD license' + function (argument) { + return argument.replace(/\b(Free|Net)(-| )?BSD((-| )License)?/i, 'BSD-2-Clause-$1BSD') + }, + // e.g. 'Clear BSD license' + function (argument) { + return argument.replace(/\bClear(-| )?BSD((-| )License)?/i, 'BSD-3-Clause-Clear') + }, + // e.g. 'Old BSD License' + function (argument) { + return argument.replace(/\b(Old|Original)(-| )?BSD((-| )License)?/i, 'BSD-4-Clause') + }, + // e.g. 'BY-NC-4.0' + function (argument) { + return 'CC-' + argument + }, + // e.g. 'BY-NC' + function (argument) { + return 'CC-' + argument + '-4.0' + }, + // e.g. 'Attribution-NonCommercial' + function (argument) { + return argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, '') + }, + // e.g. 'Attribution-NonCommercial' + function (argument) { + return 'CC-' + + argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, '') + + '-4.0' + } +] + +var licensesWithVersions = spdxLicenseIds + .map(function (id) { + var match = /^(.*)-\d+\.\d+$/.exec(id) + return match + ? [match[0], match[1]] + : [id, null] + }) + .reduce(function (objectMap, item) { + var key = item[1] + objectMap[key] = objectMap[key] || [] + objectMap[key].push(item[0]) + return objectMap + }, {}) + +var licensesWithOneVersion = Object.keys(licensesWithVersions) + .map(function makeEntries (key) { + return [key, licensesWithVersions[key]] + }) + .filter(function identifySoleVersions (item) { + return ( + // Licenses has just one valid version suffix. + item[1].length === 1 && + item[0] !== null && + // APL will be considered Apache, rather than APL-1.0 + item[0] !== 'APL' + ) + }) + .map(function createLastResorts (item) { + return [item[0], item[1][0]] + }) + +licensesWithVersions = undefined + +// If all else fails, guess that strings containing certain substrings +// meant to identify certain licenses. +var lastResorts = [ + ['UNLI', 'Unlicense'], + ['WTF', 'WTFPL'], + ['2 CLAUSE', 'BSD-2-Clause'], + ['2-CLAUSE', 'BSD-2-Clause'], + ['3 CLAUSE', 'BSD-3-Clause'], + ['3-CLAUSE', 'BSD-3-Clause'], + ['AFFERO', 'AGPL-3.0-or-later'], + ['AGPL', 'AGPL-3.0-or-later'], + ['APACHE', 'Apache-2.0'], + ['ARTISTIC', 'Artistic-2.0'], + ['Affero', 'AGPL-3.0-or-later'], + ['BEER', 'Beerware'], + ['BOOST', 'BSL-1.0'], + ['BSD', 'BSD-2-Clause'], + ['CDDL', 'CDDL-1.1'], + ['ECLIPSE', 'EPL-1.0'], + ['FUCK', 'WTFPL'], + ['GNU', 'GPL-3.0-or-later'], + ['LGPL', 'LGPL-3.0-or-later'], + ['GPLV1', 'GPL-1.0-only'], + ['GPL-1', 'GPL-1.0-only'], + ['GPLV2', 'GPL-2.0-only'], + ['GPL-2', 'GPL-2.0-only'], + ['GPL', 'GPL-3.0-or-later'], + ['MIT +NO-FALSE-ATTRIBS', 'MITNFA'], + ['MIT', 'MIT'], + ['MPL', 'MPL-2.0'], + ['X11', 'X11'], + ['ZLIB', 'Zlib'] +].concat(licensesWithOneVersion) + +var SUBSTRING = 0 +var IDENTIFIER = 1 + +var validTransformation = function (identifier) { + for (var i = 0; i < transforms.length; i++) { + var transformed = transforms[i](identifier).trim() + if (transformed !== identifier && valid(transformed)) { + return transformed + } + } + return null +} + +var validLastResort = function (identifier) { + var upperCased = identifier.toUpperCase() + for (var i = 0; i < lastResorts.length; i++) { + var lastResort = lastResorts[i] + if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) { + return lastResort[IDENTIFIER] + } + } + return null +} + +var anyCorrection = function (identifier, check) { + for (var i = 0; i < transpositions.length; i++) { + var transposition = transpositions[i] + var transposed = transposition[TRANSPOSED] + if (identifier.indexOf(transposed) > -1) { + var corrected = identifier.replace( + transposed, + transposition[CORRECT] + ) + var checked = check(corrected) + if (checked !== null) { + return checked + } + } + } + return null +} + +module.exports = function (identifier, options) { + options = options || {} + var upgrade = options.upgrade === undefined ? true : !!options.upgrade + function postprocess (value) { + return upgrade ? upgradeGPLs(value) : value + } + var validArugment = ( + typeof identifier === 'string' && + identifier.trim().length !== 0 + ) + if (!validArugment) { + throw Error('Invalid argument. Expected non-empty string.') + } + identifier = identifier.trim() + if (valid(identifier)) { + return postprocess(identifier) + } + var noPlus = identifier.replace(/\+$/, '').trim() + if (valid(noPlus)) { + return postprocess(noPlus) + } + var transformed = validTransformation(identifier) + if (transformed !== null) { + return postprocess(transformed) + } + transformed = anyCorrection(identifier, function (argument) { + if (valid(argument)) { + return argument + } + return validTransformation(argument) + }) + if (transformed !== null) { + return postprocess(transformed) + } + transformed = validLastResort(identifier) + if (transformed !== null) { + return postprocess(transformed) + } + transformed = anyCorrection(identifier, validLastResort) + if (transformed !== null) { + return postprocess(transformed) + } + return null +} + +function upgradeGPLs (value) { + if ([ + 'GPL-1.0', 'LGPL-1.0', 'AGPL-1.0', + 'GPL-2.0', 'LGPL-2.0', 'AGPL-2.0', + 'LGPL-2.1' + ].indexOf(value) !== -1) { + return value + '-only' + } else if ([ + 'GPL-1.0+', 'GPL-2.0+', 'GPL-3.0+', + 'LGPL-2.0+', 'LGPL-2.1+', 'LGPL-3.0+', + 'AGPL-1.0+', 'AGPL-3.0+' + ].indexOf(value) !== -1) { + return value.replace(/\+$/, '-or-later') + } else if (['GPL-3.0', 'LGPL-3.0', 'AGPL-3.0'].indexOf(value) !== -1) { + return value + '-or-later' + } else { + return value + } +} diff --git a/node_modules/spdx-correct/package.json b/node_modules/spdx-correct/package.json new file mode 100644 index 00000000..35c68bda --- /dev/null +++ b/node_modules/spdx-correct/package.json @@ -0,0 +1,39 @@ +{ + "name": "spdx-correct", + "description": "correct invalid SPDX expressions", + "version": "3.1.1", + "author": "Kyle E. Mitchell (https://kemitchell.com)", + "contributors": [ + "Kyle E. Mitchell (https://kemitchell.com)", + "Christian Zommerfelds ", + "Tal Einat ", + "Dan Butvinik " + ], + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + }, + "devDependencies": { + "defence-cli": "^2.0.1", + "replace-require-self": "^1.0.0", + "standard": "^11.0.0", + "standard-markdown": "^4.0.2", + "tape": "^4.9.0" + }, + "files": [ + "index.js" + ], + "keywords": [ + "SPDX", + "law", + "legal", + "license", + "metadata" + ], + "license": "Apache-2.0", + "repository": "jslicense/spdx-correct.js", + "scripts": { + "lint": "standard && standard-markdown README.md", + "test": "defence README.md | replace-require-self | node && node test.js" + } +} diff --git a/node_modules/spdx-exceptions/README.md b/node_modules/spdx-exceptions/README.md new file mode 100644 index 00000000..6c927ecc --- /dev/null +++ b/node_modules/spdx-exceptions/README.md @@ -0,0 +1,36 @@ +The package exports an array of strings. Each string is an identifier +for a license exception under the [Software Package Data Exchange +(SPDX)][SPDX] software license metadata standard. + +[SPDX]: https://spdx.org + +## Copyright and Licensing + +### SPDX + +"SPDX" is a federally registered United States trademark of The Linux +Foundation Corporation. + +From version 2.0 of the [SPDX] specification: + +> Copyright © 2010-2015 Linux Foundation and its Contributors. Licensed +> under the Creative Commons Attribution License 3.0 Unported. All other +> rights are expressly reserved. + +The Linux Foundation and the SPDX working groups are good people. Only +they decide what "SPDX" means, as a standard and otherwise. I respect +their work and their rights. You should, too. + +### This Package + +> I created this package by copying exception identifiers out of the +> SPDX specification. That work was mechanical, routine, and required no +> creativity whatsoever. - Kyle Mitchell, package author + +United States users concerned about intellectual property may wish to +discuss the following Supreme Court decisions with their attorneys: + +- _Baker v. Selden_, 101 U.S. 99 (1879) + +- _Feist Publications, Inc., v. Rural Telephone Service Co._, + 499 U.S. 340 (1991) diff --git a/node_modules/spdx-exceptions/index.json b/node_modules/spdx-exceptions/index.json new file mode 100644 index 00000000..f88f088a --- /dev/null +++ b/node_modules/spdx-exceptions/index.json @@ -0,0 +1,40 @@ +[ + "389-exception", + "Autoconf-exception-2.0", + "Autoconf-exception-3.0", + "Bison-exception-2.2", + "Bootloader-exception", + "Classpath-exception-2.0", + "CLISP-exception-2.0", + "DigiRule-FOSS-exception", + "eCos-exception-2.0", + "Fawkes-Runtime-exception", + "FLTK-exception", + "Font-exception-2.0", + "freertos-exception-2.0", + "GCC-exception-2.0", + "GCC-exception-3.1", + "gnu-javamail-exception", + "GPL-3.0-linking-exception", + "GPL-3.0-linking-source-exception", + "GPL-CC-1.0", + "i2p-gpl-java-exception", + "Libtool-exception", + "Linux-syscall-note", + "LLVM-exception", + "LZMA-exception", + "mif-exception", + "Nokia-Qt-exception-1.1", + "OCaml-LGPL-linking-exception", + "OCCT-exception-1.0", + "OpenJDK-assembly-exception-1.0", + "openvpn-openssl-exception", + "PS-or-PDF-font-exception-20170817", + "Qt-GPL-exception-1.0", + "Qt-LGPL-exception-1.1", + "Qwt-exception-1.0", + "Swift-exception", + "u-boot-exception-2.0", + "Universal-FOSS-exception-1.0", + "WxWindows-exception-3.1" +] diff --git a/node_modules/spdx-exceptions/package.json b/node_modules/spdx-exceptions/package.json new file mode 100644 index 00000000..2bafc6a3 --- /dev/null +++ b/node_modules/spdx-exceptions/package.json @@ -0,0 +1,17 @@ +{ + "name": "spdx-exceptions", + "description": "list of SPDX standard license exceptions", + "version": "2.3.0", + "author": "The Linux Foundation", + "contributors": [ + "Kyle E. Mitchell (https://kemitchell.com/)" + ], + "license": "CC-BY-3.0", + "repository": "kemitchell/spdx-exceptions.json", + "files": [ + "index.json" + ], + "scripts": { + "build": "node build.js" + } +} diff --git a/node_modules/spdx-expression-parse/AUTHORS b/node_modules/spdx-expression-parse/AUTHORS new file mode 100644 index 00000000..257a76b9 --- /dev/null +++ b/node_modules/spdx-expression-parse/AUTHORS @@ -0,0 +1,4 @@ +C. Scott Ananian (http://cscott.net) +Kyle E. Mitchell (https://kemitchell.com) +Shinnosuke Watanabe +Antoine Motet diff --git a/node_modules/spdx-expression-parse/LICENSE b/node_modules/spdx-expression-parse/LICENSE new file mode 100644 index 00000000..831618ea --- /dev/null +++ b/node_modules/spdx-expression-parse/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2015 Kyle E. Mitchell & other authors listed in AUTHORS + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/spdx-expression-parse/README.md b/node_modules/spdx-expression-parse/README.md new file mode 100644 index 00000000..9406462e --- /dev/null +++ b/node_modules/spdx-expression-parse/README.md @@ -0,0 +1,91 @@ +This package parses [SPDX license expression](https://spdx.org/spdx-specification-21-web-version#h.jxpfx0ykyb60) strings describing license terms, like [package.json license strings](https://docs.npmjs.com/files/package.json#license), into consistently structured ECMAScript objects. The npm command-line interface depends on this package, as do many automatic license-audit tools. + +In a nutshell: + +```javascript +var parse = require('spdx-expression-parse') +var assert = require('assert') + +assert.deepEqual( + // Licensed under the terms of the Two-Clause BSD License. + parse('BSD-2-Clause'), + {license: 'BSD-2-Clause'} +) + +assert.throws(function () { + // An invalid SPDX license expression. + // Should be `Apache-2.0`. + parse('Apache 2') +}) + +assert.deepEqual( + // Dual licensed under either: + // - LGPL 2.1 + // - a combination of Three-Clause BSD and MIT + parse('(LGPL-2.1 OR BSD-3-Clause AND MIT)'), + { + left: {license: 'LGPL-2.1'}, + conjunction: 'or', + right: { + left: {license: 'BSD-3-Clause'}, + conjunction: 'and', + right: {license: 'MIT'} + } + } +) +``` + +The syntax comes from the [Software Package Data eXchange (SPDX)](https://spdx.org/), a standard from the [Linux Foundation](https://www.linuxfoundation.org) for shareable data about software package license terms. SPDX aims to make sharing and auditing license data easy, especially for users of open-source software. + +The bulk of the SPDX standard describes syntax and semantics of XML metadata files. This package implements two lightweight, plain-text components of that larger standard: + +1. The [license list](https://spdx.org/licenses), a mapping from specific string identifiers, like `Apache-2.0`, to standard form license texts and bolt-on license exceptions. The [spdx-license-ids](https://www.npmjs.com/package/spdx-license-ids) and [spdx-exceptions](https://www.npmjs.com/package/spdx-exceptions) packages implement the license list. `spdx-expression-parse` depends on and `require()`s them. + + Any license identifier from the license list is a valid license expression: + + ```javascript + var identifiers = [] + .concat(require('spdx-license-ids')) + .concat(require('spdx-license-ids/deprecated')) + + identifiers.forEach(function (id) { + assert.deepEqual(parse(id), {license: id}) + }) + ``` + + So is any license identifier `WITH` a standardized license exception: + + ```javascript + identifiers.forEach(function (id) { + require('spdx-exceptions').forEach(function (e) { + assert.deepEqual( + parse(id + ' WITH ' + e), + {license: id, exception: e} + ) + }) + }) + ``` + +2. The license expression language, for describing simple and complex license terms, like `MIT` for MIT-licensed and `(GPL-2.0 OR Apache-2.0)` for dual-licensing under GPL 2.0 and Apache 2.0. `spdx-expression-parse` itself implements license expression language, exporting a parser. + + ```javascript + assert.deepEqual( + // Licensed under a combination of: + // - the MIT License AND + // - a combination of: + // - LGPL 2.1 (or a later version) AND + // - Three-Clause BSD + parse('(MIT AND (LGPL-2.1+ AND BSD-3-Clause))'), + { + left: {license: 'MIT'}, + conjunction: 'and', + right: { + left: {license: 'LGPL-2.1', plus: true}, + conjunction: 'and', + right: {license: 'BSD-3-Clause'} + } + } + ) + ``` + +The Linux Foundation and its contributors license the SPDX standard under the terms of [the Creative Commons Attribution License 3.0 Unported (SPDX: "CC-BY-3.0")](http://spdx.org/licenses/CC-BY-3.0). "SPDX" is a United States federally registered trademark of the Linux Foundation. The authors of this package license their work under the terms of the MIT License. diff --git a/node_modules/spdx-expression-parse/index.js b/node_modules/spdx-expression-parse/index.js new file mode 100644 index 00000000..52fab560 --- /dev/null +++ b/node_modules/spdx-expression-parse/index.js @@ -0,0 +1,8 @@ +'use strict' + +var scan = require('./scan') +var parse = require('./parse') + +module.exports = function (source) { + return parse(scan(source)) +} diff --git a/node_modules/spdx-expression-parse/package.json b/node_modules/spdx-expression-parse/package.json new file mode 100644 index 00000000..c9edc9f9 --- /dev/null +++ b/node_modules/spdx-expression-parse/package.json @@ -0,0 +1,39 @@ +{ + "name": "spdx-expression-parse", + "description": "parse SPDX license expressions", + "version": "3.0.1", + "author": "Kyle E. Mitchell (https://kemitchell.com)", + "files": [ + "AUTHORS", + "index.js", + "parse.js", + "scan.js" + ], + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + }, + "devDependencies": { + "defence-cli": "^3.0.1", + "replace-require-self": "^1.0.0", + "standard": "^14.1.0" + }, + "keywords": [ + "SPDX", + "law", + "legal", + "license", + "metadata", + "package", + "package.json", + "standards" + ], + "license": "MIT", + "repository": "jslicense/spdx-expression-parse.js", + "scripts": { + "lint": "standard", + "test:readme": "defence -i javascript README.md | replace-require-self | node", + "test:suite": "node test.js", + "test": "npm run test:suite && npm run test:readme" + } +} diff --git a/node_modules/spdx-expression-parse/parse.js b/node_modules/spdx-expression-parse/parse.js new file mode 100644 index 00000000..5a00b45c --- /dev/null +++ b/node_modules/spdx-expression-parse/parse.js @@ -0,0 +1,138 @@ +'use strict' + +// The ABNF grammar in the spec is totally ambiguous. +// +// This parser follows the operator precedence defined in the +// `Order of Precedence and Parentheses` section. + +module.exports = function (tokens) { + var index = 0 + + function hasMore () { + return index < tokens.length + } + + function token () { + return hasMore() ? tokens[index] : null + } + + function next () { + if (!hasMore()) { + throw new Error() + } + index++ + } + + function parseOperator (operator) { + var t = token() + if (t && t.type === 'OPERATOR' && operator === t.string) { + next() + return t.string + } + } + + function parseWith () { + if (parseOperator('WITH')) { + var t = token() + if (t && t.type === 'EXCEPTION') { + next() + return t.string + } + throw new Error('Expected exception after `WITH`') + } + } + + function parseLicenseRef () { + // TODO: Actually, everything is concatenated into one string + // for backward-compatibility but it could be better to return + // a nice structure. + var begin = index + var string = '' + var t = token() + if (t.type === 'DOCUMENTREF') { + next() + string += 'DocumentRef-' + t.string + ':' + if (!parseOperator(':')) { + throw new Error('Expected `:` after `DocumentRef-...`') + } + } + t = token() + if (t.type === 'LICENSEREF') { + next() + string += 'LicenseRef-' + t.string + return { license: string } + } + index = begin + } + + function parseLicense () { + var t = token() + if (t && t.type === 'LICENSE') { + next() + var node = { license: t.string } + if (parseOperator('+')) { + node.plus = true + } + var exception = parseWith() + if (exception) { + node.exception = exception + } + return node + } + } + + function parseParenthesizedExpression () { + var left = parseOperator('(') + if (!left) { + return + } + + var expr = parseExpression() + + if (!parseOperator(')')) { + throw new Error('Expected `)`') + } + + return expr + } + + function parseAtom () { + return ( + parseParenthesizedExpression() || + parseLicenseRef() || + parseLicense() + ) + } + + function makeBinaryOpParser (operator, nextParser) { + return function parseBinaryOp () { + var left = nextParser() + if (!left) { + return + } + + if (!parseOperator(operator)) { + return left + } + + var right = parseBinaryOp() + if (!right) { + throw new Error('Expected expression') + } + return { + left: left, + conjunction: operator.toLowerCase(), + right: right + } + } + } + + var parseAnd = makeBinaryOpParser('AND', parseAtom) + var parseExpression = makeBinaryOpParser('OR', parseAnd) + + var node = parseExpression() + if (!node || hasMore()) { + throw new Error('Syntax error') + } + return node +} diff --git a/node_modules/spdx-expression-parse/scan.js b/node_modules/spdx-expression-parse/scan.js new file mode 100644 index 00000000..b74fce2e --- /dev/null +++ b/node_modules/spdx-expression-parse/scan.js @@ -0,0 +1,131 @@ +'use strict' + +var licenses = [] + .concat(require('spdx-license-ids')) + .concat(require('spdx-license-ids/deprecated')) +var exceptions = require('spdx-exceptions') + +module.exports = function (source) { + var index = 0 + + function hasMore () { + return index < source.length + } + + // `value` can be a regexp or a string. + // If it is recognized, the matching source string is returned and + // the index is incremented. Otherwise `undefined` is returned. + function read (value) { + if (value instanceof RegExp) { + var chars = source.slice(index) + var match = chars.match(value) + if (match) { + index += match[0].length + return match[0] + } + } else { + if (source.indexOf(value, index) === index) { + index += value.length + return value + } + } + } + + function skipWhitespace () { + read(/[ ]*/) + } + + function operator () { + var string + var possibilities = ['WITH', 'AND', 'OR', '(', ')', ':', '+'] + for (var i = 0; i < possibilities.length; i++) { + string = read(possibilities[i]) + if (string) { + break + } + } + + if (string === '+' && index > 1 && source[index - 2] === ' ') { + throw new Error('Space before `+`') + } + + return string && { + type: 'OPERATOR', + string: string + } + } + + function idstring () { + return read(/[A-Za-z0-9-.]+/) + } + + function expectIdstring () { + var string = idstring() + if (!string) { + throw new Error('Expected idstring at offset ' + index) + } + return string + } + + function documentRef () { + if (read('DocumentRef-')) { + var string = expectIdstring() + return { type: 'DOCUMENTREF', string: string } + } + } + + function licenseRef () { + if (read('LicenseRef-')) { + var string = expectIdstring() + return { type: 'LICENSEREF', string: string } + } + } + + function identifier () { + var begin = index + var string = idstring() + + if (licenses.indexOf(string) !== -1) { + return { + type: 'LICENSE', + string: string + } + } else if (exceptions.indexOf(string) !== -1) { + return { + type: 'EXCEPTION', + string: string + } + } + + index = begin + } + + // Tries to read the next token. Returns `undefined` if no token is + // recognized. + function parseToken () { + // Ordering matters + return ( + operator() || + documentRef() || + licenseRef() || + identifier() + ) + } + + var tokens = [] + while (hasMore()) { + skipWhitespace() + if (!hasMore()) { + break + } + + var token = parseToken() + if (!token) { + throw new Error('Unexpected `' + source[index] + + '` at offset ' + index) + } + + tokens.push(token) + } + return tokens +} diff --git a/node_modules/spdx-license-ids/README.md b/node_modules/spdx-license-ids/README.md new file mode 100644 index 00000000..699514d1 --- /dev/null +++ b/node_modules/spdx-license-ids/README.md @@ -0,0 +1,52 @@ +# spdx-license-ids + +[![npm version](https://img.shields.io/npm/v/spdx-license-ids.svg)](https://www.npmjs.com/package/spdx-license-ids) +[![Github Actions](https://action-badges.now.sh/shinnn/spdx-license-ids)](https://wdp9fww0r9.execute-api.us-west-2.amazonaws.com/production/results/shinnn/spdx-license-ids) + +A list of [SPDX license](https://spdx.org/licenses/) identifiers + +## Installation + +[Download JSON directly](https://raw.githubusercontent.com/shinnn/spdx-license-ids/master/index.json), or [use](https://docs.npmjs.com/cli/install) [npm](https://docs.npmjs.com/about-npm/): + +``` +npm install spdx-license-ids +``` + +## [Node.js](https://nodejs.org/) API + +### require('spdx-license-ids') + +Type: `string[]` + +All license IDs except for the currently deprecated ones. + +```javascript +const ids = require('spdx-license-ids'); +//=> ['0BSD', 'AAL', 'ADSL', 'AFL-1.1', 'AFL-1.2', 'AFL-2.0', 'AFL-2.1', 'AFL-3.0', 'AGPL-1.0-only', ...] + +ids.includes('BSD-3-Clause'); //=> true +ids.includes('CC-BY-1.0'); //=> true + +ids.includes('GPL-3.0'); //=> false +``` + +### require('spdx-license-ids/deprecated') + +Type: `string[]` + +Deprecated license IDs. + +```javascript +const deprecatedIds = require('spdx-license-ids/deprecated'); +//=> ['AGPL-1.0', 'AGPL-3.0', 'GFDL-1.1', 'GFDL-1.2', 'GFDL-1.3', 'GPL-1.0', 'GPL-2.0', ...] + +deprecatedIds.includes('BSD-3-Clause'); //=> false +deprecatedIds.includes('CC-BY-1.0'); //=> false + +deprecatedIds.includes('GPL-3.0'); //=> true +``` + +## License + +[Creative Commons Zero v1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/deed) diff --git a/node_modules/spdx-license-ids/deprecated.json b/node_modules/spdx-license-ids/deprecated.json new file mode 100644 index 00000000..c7de0985 --- /dev/null +++ b/node_modules/spdx-license-ids/deprecated.json @@ -0,0 +1,26 @@ +[ + "AGPL-1.0", + "AGPL-3.0", + "BSD-2-Clause-FreeBSD", + "BSD-2-Clause-NetBSD", + "GFDL-1.1", + "GFDL-1.2", + "GFDL-1.3", + "GPL-1.0", + "GPL-2.0", + "GPL-2.0-with-GCC-exception", + "GPL-2.0-with-autoconf-exception", + "GPL-2.0-with-bison-exception", + "GPL-2.0-with-classpath-exception", + "GPL-2.0-with-font-exception", + "GPL-3.0", + "GPL-3.0-with-GCC-exception", + "GPL-3.0-with-autoconf-exception", + "LGPL-2.0", + "LGPL-2.1", + "LGPL-3.0", + "Nunit", + "StandardML-NJ", + "eCos-2.0", + "wxWindows" +] diff --git a/node_modules/spdx-license-ids/index.json b/node_modules/spdx-license-ids/index.json new file mode 100644 index 00000000..864d2410 --- /dev/null +++ b/node_modules/spdx-license-ids/index.json @@ -0,0 +1,420 @@ +[ + "0BSD", + "AAL", + "ADSL", + "AFL-1.1", + "AFL-1.2", + "AFL-2.0", + "AFL-2.1", + "AFL-3.0", + "AGPL-1.0-only", + "AGPL-1.0-or-later", + "AGPL-3.0-only", + "AGPL-3.0-or-later", + "AMDPLPA", + "AML", + "AMPAS", + "ANTLR-PD", + "ANTLR-PD-fallback", + "APAFML", + "APL-1.0", + "APSL-1.0", + "APSL-1.1", + "APSL-1.2", + "APSL-2.0", + "Abstyles", + "Adobe-2006", + "Adobe-Glyph", + "Afmparse", + "Aladdin", + "Apache-1.0", + "Apache-1.1", + "Apache-2.0", + "Artistic-1.0", + "Artistic-1.0-Perl", + "Artistic-1.0-cl8", + "Artistic-2.0", + "BSD-1-Clause", + "BSD-2-Clause", + "BSD-2-Clause-Patent", + "BSD-2-Clause-Views", + "BSD-3-Clause", + "BSD-3-Clause-Attribution", + "BSD-3-Clause-Clear", + "BSD-3-Clause-LBNL", + "BSD-3-Clause-No-Nuclear-License", + "BSD-3-Clause-No-Nuclear-License-2014", + "BSD-3-Clause-No-Nuclear-Warranty", + "BSD-3-Clause-Open-MPI", + "BSD-4-Clause", + "BSD-4-Clause-UC", + "BSD-Protection", + "BSD-Source-Code", + "BSL-1.0", + "BUSL-1.1", + "Bahyph", + "Barr", + "Beerware", + "BitTorrent-1.0", + "BitTorrent-1.1", + "BlueOak-1.0.0", + "Borceux", + "CAL-1.0", + "CAL-1.0-Combined-Work-Exception", + "CATOSL-1.1", + "CC-BY-1.0", + "CC-BY-2.0", + "CC-BY-2.5", + "CC-BY-3.0", + "CC-BY-3.0-AT", + "CC-BY-3.0-US", + "CC-BY-4.0", + "CC-BY-NC-1.0", + "CC-BY-NC-2.0", + "CC-BY-NC-2.5", + "CC-BY-NC-3.0", + "CC-BY-NC-4.0", + "CC-BY-NC-ND-1.0", + "CC-BY-NC-ND-2.0", + "CC-BY-NC-ND-2.5", + "CC-BY-NC-ND-3.0", + "CC-BY-NC-ND-3.0-IGO", + "CC-BY-NC-ND-4.0", + "CC-BY-NC-SA-1.0", + "CC-BY-NC-SA-2.0", + "CC-BY-NC-SA-2.5", + "CC-BY-NC-SA-3.0", + "CC-BY-NC-SA-4.0", + "CC-BY-ND-1.0", + "CC-BY-ND-2.0", + "CC-BY-ND-2.5", + "CC-BY-ND-3.0", + "CC-BY-ND-4.0", + "CC-BY-SA-1.0", + "CC-BY-SA-2.0", + "CC-BY-SA-2.0-UK", + "CC-BY-SA-2.5", + "CC-BY-SA-3.0", + "CC-BY-SA-3.0-AT", + "CC-BY-SA-4.0", + "CC-PDDC", + "CC0-1.0", + "CDDL-1.0", + "CDDL-1.1", + "CDLA-Permissive-1.0", + "CDLA-Sharing-1.0", + "CECILL-1.0", + "CECILL-1.1", + "CECILL-2.0", + "CECILL-2.1", + "CECILL-B", + "CECILL-C", + "CERN-OHL-1.1", + "CERN-OHL-1.2", + "CERN-OHL-P-2.0", + "CERN-OHL-S-2.0", + "CERN-OHL-W-2.0", + "CNRI-Jython", + "CNRI-Python", + "CNRI-Python-GPL-Compatible", + "CPAL-1.0", + "CPL-1.0", + "CPOL-1.02", + "CUA-OPL-1.0", + "Caldera", + "ClArtistic", + "Condor-1.1", + "Crossword", + "CrystalStacker", + "Cube", + "D-FSL-1.0", + "DOC", + "DSDP", + "Dotseqn", + "ECL-1.0", + "ECL-2.0", + "EFL-1.0", + "EFL-2.0", + "EPICS", + "EPL-1.0", + "EPL-2.0", + "EUDatagrid", + "EUPL-1.0", + "EUPL-1.1", + "EUPL-1.2", + "Entessa", + "ErlPL-1.1", + "Eurosym", + "FSFAP", + "FSFUL", + "FSFULLR", + "FTL", + "Fair", + "Frameworx-1.0", + "FreeImage", + "GFDL-1.1-invariants-only", + "GFDL-1.1-invariants-or-later", + "GFDL-1.1-no-invariants-only", + "GFDL-1.1-no-invariants-or-later", + "GFDL-1.1-only", + "GFDL-1.1-or-later", + "GFDL-1.2-invariants-only", + "GFDL-1.2-invariants-or-later", + "GFDL-1.2-no-invariants-only", + "GFDL-1.2-no-invariants-or-later", + "GFDL-1.2-only", + "GFDL-1.2-or-later", + "GFDL-1.3-invariants-only", + "GFDL-1.3-invariants-or-later", + "GFDL-1.3-no-invariants-only", + "GFDL-1.3-no-invariants-or-later", + "GFDL-1.3-only", + "GFDL-1.3-or-later", + "GL2PS", + "GLWTPL", + "GPL-1.0-only", + "GPL-1.0-or-later", + "GPL-2.0-only", + "GPL-2.0-or-later", + "GPL-3.0-only", + "GPL-3.0-or-later", + "Giftware", + "Glide", + "Glulxe", + "HPND", + "HPND-sell-variant", + "HTMLTIDY", + "HaskellReport", + "Hippocratic-2.1", + "IBM-pibs", + "ICU", + "IJG", + "IPA", + "IPL-1.0", + "ISC", + "ImageMagick", + "Imlib2", + "Info-ZIP", + "Intel", + "Intel-ACPI", + "Interbase-1.0", + "JPNIC", + "JSON", + "JasPer-2.0", + "LAL-1.2", + "LAL-1.3", + "LGPL-2.0-only", + "LGPL-2.0-or-later", + "LGPL-2.1-only", + "LGPL-2.1-or-later", + "LGPL-3.0-only", + "LGPL-3.0-or-later", + "LGPLLR", + "LPL-1.0", + "LPL-1.02", + "LPPL-1.0", + "LPPL-1.1", + "LPPL-1.2", + "LPPL-1.3a", + "LPPL-1.3c", + "Latex2e", + "Leptonica", + "LiLiQ-P-1.1", + "LiLiQ-R-1.1", + "LiLiQ-Rplus-1.1", + "Libpng", + "Linux-OpenIB", + "MIT", + "MIT-0", + "MIT-CMU", + "MIT-advertising", + "MIT-enna", + "MIT-feh", + "MIT-open-group", + "MITNFA", + "MPL-1.0", + "MPL-1.1", + "MPL-2.0", + "MPL-2.0-no-copyleft-exception", + "MS-PL", + "MS-RL", + "MTLL", + "MakeIndex", + "MirOS", + "Motosoto", + "MulanPSL-1.0", + "MulanPSL-2.0", + "Multics", + "Mup", + "NASA-1.3", + "NBPL-1.0", + "NCGL-UK-2.0", + "NCSA", + "NGPL", + "NIST-PD", + "NIST-PD-fallback", + "NLOD-1.0", + "NLPL", + "NOSL", + "NPL-1.0", + "NPL-1.1", + "NPOSL-3.0", + "NRL", + "NTP", + "NTP-0", + "Naumen", + "Net-SNMP", + "NetCDF", + "Newsletr", + "Nokia", + "Noweb", + "O-UDA-1.0", + "OCCT-PL", + "OCLC-2.0", + "ODC-By-1.0", + "ODbL-1.0", + "OFL-1.0", + "OFL-1.0-RFN", + "OFL-1.0-no-RFN", + "OFL-1.1", + "OFL-1.1-RFN", + "OFL-1.1-no-RFN", + "OGC-1.0", + "OGL-Canada-2.0", + "OGL-UK-1.0", + "OGL-UK-2.0", + "OGL-UK-3.0", + "OGTSL", + "OLDAP-1.1", + "OLDAP-1.2", + "OLDAP-1.3", + "OLDAP-1.4", + "OLDAP-2.0", + "OLDAP-2.0.1", + "OLDAP-2.1", + "OLDAP-2.2", + "OLDAP-2.2.1", + "OLDAP-2.2.2", + "OLDAP-2.3", + "OLDAP-2.4", + "OLDAP-2.5", + "OLDAP-2.6", + "OLDAP-2.7", + "OLDAP-2.8", + "OML", + "OPL-1.0", + "OSET-PL-2.1", + "OSL-1.0", + "OSL-1.1", + "OSL-2.0", + "OSL-2.1", + "OSL-3.0", + "OpenSSL", + "PDDL-1.0", + "PHP-3.0", + "PHP-3.01", + "PSF-2.0", + "Parity-6.0.0", + "Parity-7.0.0", + "Plexus", + "PolyForm-Noncommercial-1.0.0", + "PolyForm-Small-Business-1.0.0", + "PostgreSQL", + "Python-2.0", + "QPL-1.0", + "Qhull", + "RHeCos-1.1", + "RPL-1.1", + "RPL-1.5", + "RPSL-1.0", + "RSA-MD", + "RSCPL", + "Rdisc", + "Ruby", + "SAX-PD", + "SCEA", + "SGI-B-1.0", + "SGI-B-1.1", + "SGI-B-2.0", + "SHL-0.5", + "SHL-0.51", + "SISSL", + "SISSL-1.2", + "SMLNJ", + "SMPPL", + "SNIA", + "SPL-1.0", + "SSH-OpenSSH", + "SSH-short", + "SSPL-1.0", + "SWL", + "Saxpath", + "Sendmail", + "Sendmail-8.23", + "SimPL-2.0", + "Sleepycat", + "Spencer-86", + "Spencer-94", + "Spencer-99", + "SugarCRM-1.1.3", + "TAPR-OHL-1.0", + "TCL", + "TCP-wrappers", + "TMate", + "TORQUE-1.1", + "TOSL", + "TU-Berlin-1.0", + "TU-Berlin-2.0", + "UCL-1.0", + "UPL-1.0", + "Unicode-DFS-2015", + "Unicode-DFS-2016", + "Unicode-TOU", + "Unlicense", + "VOSTROM", + "VSL-1.0", + "Vim", + "W3C", + "W3C-19980720", + "W3C-20150513", + "WTFPL", + "Watcom-1.0", + "Wsuipa", + "X11", + "XFree86-1.1", + "XSkat", + "Xerox", + "Xnet", + "YPL-1.0", + "YPL-1.1", + "ZPL-1.1", + "ZPL-2.0", + "ZPL-2.1", + "Zed", + "Zend-2.0", + "Zimbra-1.3", + "Zimbra-1.4", + "Zlib", + "blessing", + "bzip2-1.0.5", + "bzip2-1.0.6", + "copyleft-next-0.3.0", + "copyleft-next-0.3.1", + "curl", + "diffmark", + "dvipdfm", + "eGenix", + "etalab-2.0", + "gSOAP-1.3b", + "gnuplot", + "iMatix", + "libpng-2.0", + "libselinux-1.0", + "libtiff", + "mpich2", + "psfrag", + "psutils", + "xinetd", + "xpp", + "zlib-acknowledgement" +] diff --git a/node_modules/spdx-license-ids/package.json b/node_modules/spdx-license-ids/package.json new file mode 100644 index 00000000..eea63125 --- /dev/null +++ b/node_modules/spdx-license-ids/package.json @@ -0,0 +1,40 @@ +{ + "name": "spdx-license-ids", + "version": "3.0.7", + "description": "A list of SPDX license identifiers", + "repository": "jslicense/spdx-license-ids", + "author": "Shinnosuke Watanabe (https://github.com/shinnn)", + "license": "CC0-1.0", + "scripts": { + "build": "node build.js", + "pretest": "eslint .", + "latest": "node latest.js", + "test": "node test.js" + }, + "files": [ + "deprecated.json", + "index.json" + ], + "keywords": [ + "spdx", + "license", + "licenses", + "id", + "identifier", + "identifiers", + "json", + "array", + "oss" + ], + "devDependencies": { + "@shinnn/eslint-config": "^6.8.7", + "chalk": "^2.4.1", + "eslint": "^5.10.0", + "get-spdx-license-ids": "^2.1.0", + "rmfr": "^2.0.0", + "tape": "^4.9.1" + }, + "eslintConfig": { + "extends": "@shinnn" + } +} diff --git a/node_modules/split-string/LICENSE b/node_modules/split-string/LICENSE new file mode 100644 index 00000000..e33d14b7 --- /dev/null +++ b/node_modules/split-string/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/split-string/README.md b/node_modules/split-string/README.md new file mode 100644 index 00000000..d622e44d --- /dev/null +++ b/node_modules/split-string/README.md @@ -0,0 +1,321 @@ +# split-string [![NPM version](https://img.shields.io/npm/v/split-string.svg?style=flat)](https://www.npmjs.com/package/split-string) [![NPM monthly downloads](https://img.shields.io/npm/dm/split-string.svg?style=flat)](https://npmjs.org/package/split-string) [![NPM total downloads](https://img.shields.io/npm/dt/split-string.svg?style=flat)](https://npmjs.org/package/split-string) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/split-string.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/split-string) + +> Split a string on a character except when the character is escaped. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save split-string +``` + + + +
      +Why use this? + +
      + +Although it's easy to split on a string: + +```js +console.log('a.b.c'.split('.')); +//=> ['a', 'b', 'c'] +``` + +It's more challenging to split a string whilst respecting escaped or quoted characters. + +**Bad** + +```js +console.log('a\\.b.c'.split('.')); +//=> ['a\\', 'b', 'c'] + +console.log('"a.b.c".d'.split('.')); +//=> ['"a', 'b', 'c"', 'd'] +``` + +**Good** + +```js +var split = require('split-string'); +console.log(split('a\\.b.c')); +//=> ['a.b', 'c'] + +console.log(split('"a.b.c".d')); +//=> ['a.b.c', 'd'] +``` + +See the [options](#options) to learn how to choose the separator or retain quotes or escaping. + +
      + +
      + +## Usage + +```js +var split = require('split-string'); + +split('a.b.c'); +//=> ['a', 'b', 'c'] + +// respects escaped characters +split('a.b.c\\.d'); +//=> ['a', 'b', 'c.d'] + +// respects double-quoted strings +split('a."b.c.d".e'); +//=> ['a', 'b.c.d', 'e'] +``` + +**Brackets** + +Also respects brackets [unless disabled](#optionsbrackets): + +```js +split('a (b c d) e', ' '); +//=> ['a', '(b c d)', 'e'] +``` + +## Options + +### options.brackets + +**Type**: `object|boolean` + +**Default**: `undefined` + +**Description** + +If enabled, split-string will not split inside brackets. The following brackets types are supported when `options.brackets` is `true`, + +```js +{ + '<': '>', + '(': ')', + '[': ']', + '{': '}' +} +``` + +Or, if object of brackets must be passed, each property on the object must be a bracket type, where the property key is the opening delimiter and property value is the closing delimiter. + +**Examples** + +```js +// no bracket support by default +split('a.{b.c}'); +//=> [ 'a', '{b', 'c}' ] + +// support all basic bracket types: "<>{}[]()" +split('a.{b.c}', {brackets: true}); +//=> [ 'a', '{b.c}' ] + +// also supports nested brackets +split('a.{b.{c.d}.e}.f', {brackets: true}); +//=> [ 'a', '{b.{c.d}.e}', 'f' ] + +// support only the specified brackets +split('[a.b].(c.d)', {brackets: {'[': ']'}}); +//=> [ '[a.b]', '(c', 'd)' ] +``` + +### options.sep + +**Type**: `string` + +**Default**: `.` + +The separator/character to split on. + +**Example** + +```js +split('a.b,c', {sep: ','}); +//=> ['a.b', 'c'] + +// you can also pass the separator as string as the last argument +split('a.b,c', ','); +//=> ['a.b', 'c'] +``` + +### options.keepEscaping + +**Type**: `boolean` + +**Default**: `undefined` + +Keep backslashes in the result. + +**Example** + +```js +split('a.b\\.c'); +//=> ['a', 'b.c'] + +split('a.b.\\c', {keepEscaping: true}); +//=> ['a', 'b\.c'] +``` + +### options.keepQuotes + +**Type**: `boolean` + +**Default**: `undefined` + +Keep single- or double-quotes in the result. + +**Example** + +```js +split('a."b.c.d".e'); +//=> ['a', 'b.c.d', 'e'] + +split('a."b.c.d".e', {keepQuotes: true}); +//=> ['a', '"b.c.d"', 'e'] + +split('a.\'b.c.d\'.e', {keepQuotes: true}); +//=> ['a', '\'b.c.d\'', 'e'] +``` + +### options.keepDoubleQuotes + +**Type**: `boolean` + +**Default**: `undefined` + +Keep double-quotes in the result. + +**Example** + +```js +split('a."b.c.d".e'); +//=> ['a', 'b.c.d', 'e'] + +split('a."b.c.d".e', {keepDoubleQuotes: true}); +//=> ['a', '"b.c.d"', 'e'] +``` + +### options.keepSingleQuotes + +**Type**: `boolean` + +**Default**: `undefined` + +Keep single-quotes in the result. + +**Example** + +```js +split('a.\'b.c.d\'.e'); +//=> ['a', 'b.c.d', 'e'] + +split('a.\'b.c.d\'.e', {keepSingleQuotes: true}); +//=> ['a', '\'b.c.d\'', 'e'] +``` + +## Customizer + +**Type**: `function` + +**Default**: `undefined` + +Pass a function as the last argument to customize how tokens are added to the array. + +**Example** + +```js +var arr = split('a.b', function(tok) { + if (tok.arr[tok.arr.length - 1] === 'a') { + tok.split = false; + } +}); +console.log(arr); +//=> ['a.b'] +``` + +**Properties** + +The `tok` object has the following properties: + +* `tok.val` (string) The current value about to be pushed onto the result array +* `tok.idx` (number) the current index in the string +* `tok.str` (string) the entire string +* `tok.arr` (array) the result array + +## Release history + +### v3.0.0 - 2017-06-17 + +**Added** + +* adds support for brackets + +## About + +
      +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
      + +
      +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
      + +
      +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
      + +### Related projects + +You might also be interested in these projects: + +* [deromanize](https://www.npmjs.com/package/deromanize): Convert roman numerals to arabic numbers (useful for books, outlines, documentation, slide decks, etc) | [homepage](https://github.com/jonschlinkert/deromanize "Convert roman numerals to arabic numbers (useful for books, outlines, documentation, slide decks, etc)") +* [randomatic](https://www.npmjs.com/package/randomatic): Generate randomized strings of a specified length using simple character sequences. The original generate-password. | [homepage](https://github.com/jonschlinkert/randomatic "Generate randomized strings of a specified length using simple character sequences. The original generate-password.") +* [repeat-string](https://www.npmjs.com/package/repeat-string): Repeat the given string n times. Fastest implementation for repeating a string. | [homepage](https://github.com/jonschlinkert/repeat-string "Repeat the given string n times. Fastest implementation for repeating a string.") +* [romanize](https://www.npmjs.com/package/romanize): Convert numbers to roman numerals (useful for books, outlines, documentation, slide decks, etc) | [homepage](https://github.com/jonschlinkert/romanize "Convert numbers to roman numerals (useful for books, outlines, documentation, slide decks, etc)") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 28 | [jonschlinkert](https://github.com/jonschlinkert) | +| 9 | [doowb](https://github.com/doowb) | + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on November 19, 2017._ \ No newline at end of file diff --git a/node_modules/split-string/index.js b/node_modules/split-string/index.js new file mode 100644 index 00000000..7bc0ea91 --- /dev/null +++ b/node_modules/split-string/index.js @@ -0,0 +1,171 @@ +/*! + * split-string + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var extend = require('extend-shallow'); + +module.exports = function(str, options, fn) { + if (typeof str !== 'string') { + throw new TypeError('expected a string'); + } + + if (typeof options === 'function') { + fn = options; + options = null; + } + + // allow separator to be defined as a string + if (typeof options === 'string') { + options = { sep: options }; + } + + var opts = extend({sep: '.'}, options); + var quotes = opts.quotes || ['"', "'", '`']; + var brackets; + + if (opts.brackets === true) { + brackets = { + '<': '>', + '(': ')', + '[': ']', + '{': '}' + }; + } else if (opts.brackets) { + brackets = opts.brackets; + } + + var tokens = []; + var stack = []; + var arr = ['']; + var sep = opts.sep; + var len = str.length; + var idx = -1; + var closeIdx; + + function expected() { + if (brackets && stack.length) { + return brackets[stack[stack.length - 1]]; + } + } + + while (++idx < len) { + var ch = str[idx]; + var next = str[idx + 1]; + var tok = { val: ch, idx: idx, arr: arr, str: str }; + tokens.push(tok); + + if (ch === '\\') { + tok.val = keepEscaping(opts, str, idx) === true ? (ch + next) : next; + tok.escaped = true; + if (typeof fn === 'function') { + fn(tok); + } + arr[arr.length - 1] += tok.val; + idx++; + continue; + } + + if (brackets && brackets[ch]) { + stack.push(ch); + var e = expected(); + var i = idx + 1; + + if (str.indexOf(e, i + 1) !== -1) { + while (stack.length && i < len) { + var s = str[++i]; + if (s === '\\') { + s++; + continue; + } + + if (quotes.indexOf(s) !== -1) { + i = getClosingQuote(str, s, i + 1); + continue; + } + + e = expected(); + if (stack.length && str.indexOf(e, i + 1) === -1) { + break; + } + + if (brackets[s]) { + stack.push(s); + continue; + } + + if (e === s) { + stack.pop(); + } + } + } + + closeIdx = i; + if (closeIdx === -1) { + arr[arr.length - 1] += ch; + continue; + } + + ch = str.slice(idx, closeIdx + 1); + tok.val = ch; + tok.idx = idx = closeIdx; + } + + if (quotes.indexOf(ch) !== -1) { + closeIdx = getClosingQuote(str, ch, idx + 1); + if (closeIdx === -1) { + arr[arr.length - 1] += ch; + continue; + } + + if (keepQuotes(ch, opts) === true) { + ch = str.slice(idx, closeIdx + 1); + } else { + ch = str.slice(idx + 1, closeIdx); + } + + tok.val = ch; + tok.idx = idx = closeIdx; + } + + if (typeof fn === 'function') { + fn(tok, tokens); + ch = tok.val; + idx = tok.idx; + } + + if (tok.val === sep && tok.split !== false) { + arr.push(''); + continue; + } + + arr[arr.length - 1] += tok.val; + } + + return arr; +}; + +function getClosingQuote(str, ch, i, brackets) { + var idx = str.indexOf(ch, i); + if (str.charAt(idx - 1) === '\\') { + return getClosingQuote(str, ch, idx + 1); + } + return idx; +} + +function keepQuotes(ch, opts) { + if (opts.keepDoubleQuotes === true && ch === '"') return true; + if (opts.keepSingleQuotes === true && ch === "'") return true; + return opts.keepQuotes; +} + +function keepEscaping(opts, str, idx) { + if (typeof opts.keepEscaping === 'function') { + return opts.keepEscaping(str, idx); + } + return opts.keepEscaping === true || str[idx + 1] === '\\'; +} diff --git a/node_modules/split-string/node_modules/extend-shallow/LICENSE b/node_modules/split-string/node_modules/extend-shallow/LICENSE new file mode 100644 index 00000000..99c93691 --- /dev/null +++ b/node_modules/split-string/node_modules/extend-shallow/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2015, 2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/split-string/node_modules/extend-shallow/README.md b/node_modules/split-string/node_modules/extend-shallow/README.md new file mode 100644 index 00000000..dee226f4 --- /dev/null +++ b/node_modules/split-string/node_modules/extend-shallow/README.md @@ -0,0 +1,97 @@ +# extend-shallow [![NPM version](https://img.shields.io/npm/v/extend-shallow.svg?style=flat)](https://www.npmjs.com/package/extend-shallow) [![NPM monthly downloads](https://img.shields.io/npm/dm/extend-shallow.svg?style=flat)](https://npmjs.org/package/extend-shallow) [![NPM total downloads](https://img.shields.io/npm/dt/extend-shallow.svg?style=flat)](https://npmjs.org/package/extend-shallow) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/extend-shallow.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/extend-shallow) + +> Extend an object with the properties of additional objects. node.js/javascript util. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save extend-shallow +``` + +## Usage + +```js +var extend = require('extend-shallow'); + +extend({a: 'b'}, {c: 'd'}) +//=> {a: 'b', c: 'd'} +``` + +Pass an empty object to shallow clone: + +```js +var obj = {}; +extend(obj, {a: 'b'}, {c: 'd'}) +//=> {a: 'b', c: 'd'} +``` + +## About + +
      +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
      + +
      +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
      + +
      +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
      + +### Related projects + +You might also be interested in these projects: + +* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow "Extend an object with the properties of additional objects. node.js/javascript util.") +* [for-in](https://www.npmjs.com/package/for-in): Iterate over the own and inherited enumerable properties of an object, and return an object… [more](https://github.com/jonschlinkert/for-in) | [homepage](https://github.com/jonschlinkert/for-in "Iterate over the own and inherited enumerable properties of an object, and return an object with properties that evaluate to true from the callback. Exit early by returning `false`. JavaScript/Node.js") +* [for-own](https://www.npmjs.com/package/for-own): Iterate over the own enumerable properties of an object, and return an object with properties… [more](https://github.com/jonschlinkert/for-own) | [homepage](https://github.com/jonschlinkert/for-own "Iterate over the own enumerable properties of an object, and return an object with properties that evaluate to true from the callback. Exit early by returning `false`. JavaScript/Node.js.") +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") +* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 33 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [pdehaan](https://github.com/pdehaan) | + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on November 19, 2017._ \ No newline at end of file diff --git a/node_modules/split-string/node_modules/extend-shallow/index.js b/node_modules/split-string/node_modules/extend-shallow/index.js new file mode 100644 index 00000000..c9582f8f --- /dev/null +++ b/node_modules/split-string/node_modules/extend-shallow/index.js @@ -0,0 +1,60 @@ +'use strict'; + +var isExtendable = require('is-extendable'); +var assignSymbols = require('assign-symbols'); + +module.exports = Object.assign || function(obj/*, objects*/) { + if (obj === null || typeof obj === 'undefined') { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!isObject(obj)) { + obj = {}; + } + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isString(val)) { + val = toObject(val); + } + if (isObject(val)) { + assign(obj, val); + assignSymbols(obj, val); + } + } + return obj; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +function isString(val) { + return (val && typeof val === 'string'); +} + +function toObject(str) { + var obj = {}; + for (var i in str) { + obj[i] = str[i]; + } + return obj; +} + +function isObject(val) { + return (val && typeof val === 'object') || isExtendable(val); +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +function isEnum(obj, key) { + return Object.prototype.propertyIsEnumerable.call(obj, key); +} diff --git a/node_modules/split-string/node_modules/extend-shallow/package.json b/node_modules/split-string/node_modules/extend-shallow/package.json new file mode 100644 index 00000000..e5e91053 --- /dev/null +++ b/node_modules/split-string/node_modules/extend-shallow/package.json @@ -0,0 +1,83 @@ +{ + "name": "extend-shallow", + "description": "Extend an object with the properties of additional objects. node.js/javascript util.", + "version": "3.0.2", + "homepage": "https://github.com/jonschlinkert/extend-shallow", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Peter deHaan (http://about.me/peterdehaan)" + ], + "repository": "jonschlinkert/extend-shallow", + "bugs": { + "url": "https://github.com/jonschlinkert/extend-shallow/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "devDependencies": { + "array-slice": "^1.0.0", + "benchmarked": "^2.0.0", + "for-own": "^1.0.0", + "gulp-format-md": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.1", + "minimist": "^1.2.0", + "mocha": "^3.5.3", + "object-assign": "^4.1.1" + }, + "keywords": [ + "assign", + "clone", + "extend", + "merge", + "obj", + "object", + "object-assign", + "object.assign", + "prop", + "properties", + "property", + "props", + "shallow", + "util", + "utility", + "utils", + "value" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "related": { + "list": [ + "extend-shallow", + "for-in", + "for-own", + "is-plain-object", + "isobject", + "kind-of" + ] + }, + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/split-string/node_modules/is-extendable/LICENSE b/node_modules/split-string/node_modules/is-extendable/LICENSE new file mode 100644 index 00000000..c0d7f136 --- /dev/null +++ b/node_modules/split-string/node_modules/is-extendable/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/split-string/node_modules/is-extendable/README.md b/node_modules/split-string/node_modules/is-extendable/README.md new file mode 100644 index 00000000..875b56a7 --- /dev/null +++ b/node_modules/split-string/node_modules/is-extendable/README.md @@ -0,0 +1,88 @@ +# is-extendable [![NPM version](https://img.shields.io/npm/v/is-extendable.svg?style=flat)](https://www.npmjs.com/package/is-extendable) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-extendable.svg?style=flat)](https://npmjs.org/package/is-extendable) [![NPM total downloads](https://img.shields.io/npm/dt/is-extendable.svg?style=flat)](https://npmjs.org/package/is-extendable) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-extendable.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-extendable) + +> Returns true if a value is a plain object, array or function. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-extendable +``` + +## Usage + +```js +var isExtendable = require('is-extendable'); +``` + +Returns true if the value is any of the following: + +* array +* plain object +* function + +## Notes + +All objects in JavaScript can have keys, but it's a pain to check for this, since we ether need to verify that the value is not `null` or `undefined` and: + +* the value is not a primitive, or +* that the object is a plain object, function or array + +Also note that an `extendable` object is not the same as an [extensible object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible), which is one that (in es6) is not sealed, frozen, or marked as non-extensible using `preventExtensions`. + +## Release history + +### v1.0.0 - 2017/07/20 + +**Breaking changes** + +* No longer considers date, regex or error objects to be extendable + +## About + +### Related projects + +* [assign-deep](https://www.npmjs.com/package/assign-deep): Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target… [more](https://github.com/jonschlinkert/assign-deep) | [homepage](https://github.com/jonschlinkert/assign-deep "Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target (first) object.") +* [is-equal-shallow](https://www.npmjs.com/package/is-equal-shallow): Does a shallow comparison of two objects, returning false if the keys or values differ. | [homepage](https://github.com/jonschlinkert/is-equal-shallow "Does a shallow comparison of two objects, returning false if the keys or values differ.") +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") +* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 20, 2017._ \ No newline at end of file diff --git a/node_modules/split-string/node_modules/is-extendable/index.d.ts b/node_modules/split-string/node_modules/is-extendable/index.d.ts new file mode 100644 index 00000000..b96d5075 --- /dev/null +++ b/node_modules/split-string/node_modules/is-extendable/index.d.ts @@ -0,0 +1,5 @@ +export = isExtendable; + +declare function isExtendable(val: any): boolean; + +declare namespace isExtendable {} diff --git a/node_modules/split-string/node_modules/is-extendable/index.js b/node_modules/split-string/node_modules/is-extendable/index.js new file mode 100644 index 00000000..a8b26ad0 --- /dev/null +++ b/node_modules/split-string/node_modules/is-extendable/index.js @@ -0,0 +1,14 @@ +/*! + * is-extendable + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isPlainObject = require('is-plain-object'); + +module.exports = function isExtendable(val) { + return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); +}; diff --git a/node_modules/split-string/node_modules/is-extendable/package.json b/node_modules/split-string/node_modules/is-extendable/package.json new file mode 100644 index 00000000..2aaab65a --- /dev/null +++ b/node_modules/split-string/node_modules/is-extendable/package.json @@ -0,0 +1,67 @@ +{ + "name": "is-extendable", + "description": "Returns true if a value is a plain object, array or function.", + "version": "1.0.1", + "homepage": "https://github.com/jonschlinkert/is-extendable", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/is-extendable", + "bugs": { + "url": "https://github.com/jonschlinkert/is-extendable/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "index.d.ts" + ], + "main": "index.js", + "types": "index.d.ts", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.4.2" + }, + "keywords": [ + "array", + "assign", + "check", + "date", + "extend", + "extendable", + "extensible", + "function", + "is", + "object", + "regex", + "test" + ], + "verb": { + "related": { + "list": [ + "assign-deep", + "is-equal-shallow", + "is-plain-object", + "isobject", + "kind-of" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/split-string/package.json b/node_modules/split-string/package.json new file mode 100644 index 00000000..8f490a24 --- /dev/null +++ b/node_modules/split-string/package.json @@ -0,0 +1,65 @@ +{ + "name": "split-string", + "description": "Split a string on a character except when the character is escaped.", + "version": "3.1.0", + "homepage": "https://github.com/jonschlinkert/split-string", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "jonschlinkert/split-string", + "bugs": { + "url": "https://github.com/jonschlinkert/split-string/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "keywords": [ + "character", + "escape", + "split", + "string" + ], + "verb": { + "toc": false, + "layout": "default", + "titles": [ + ".", + "install", + "Why use this?" + ], + "related": { + "list": [ + "deromanize", + "randomatic", + "repeat-string", + "romanize" + ] + }, + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/sshpk/.npmignore b/node_modules/sshpk/.npmignore new file mode 100644 index 00000000..8000b595 --- /dev/null +++ b/node_modules/sshpk/.npmignore @@ -0,0 +1,9 @@ +.gitmodules +deps +docs +Makefile +node_modules +test +tools +coverage +man/src diff --git a/node_modules/sshpk/.travis.yml b/node_modules/sshpk/.travis.yml new file mode 100644 index 00000000..c3394c25 --- /dev/null +++ b/node_modules/sshpk/.travis.yml @@ -0,0 +1,11 @@ +language: node_js +node_js: + - "5.10" + - "4.4" + - "4.1" + - "0.12" + - "0.10" +before_install: + - "make check" +after_success: + - '[ "${TRAVIS_NODE_VERSION}" = "4.4" ] && make codecovio' diff --git a/node_modules/sshpk/LICENSE b/node_modules/sshpk/LICENSE new file mode 100644 index 00000000..f6d947d2 --- /dev/null +++ b/node_modules/sshpk/LICENSE @@ -0,0 +1,18 @@ +Copyright Joyent, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/node_modules/sshpk/README.md b/node_modules/sshpk/README.md new file mode 100644 index 00000000..5740f74d --- /dev/null +++ b/node_modules/sshpk/README.md @@ -0,0 +1,804 @@ +sshpk +========= + +Parse, convert, fingerprint and use SSH keys (both public and private) in pure +node -- no `ssh-keygen` or other external dependencies. + +Supports RSA, DSA, ECDSA (nistp-\*) and ED25519 key types, in PEM (PKCS#1, +PKCS#8) and OpenSSH formats. + +This library has been extracted from +[`node-http-signature`](https://github.com/joyent/node-http-signature) +(work by [Mark Cavage](https://github.com/mcavage) and +[Dave Eddy](https://github.com/bahamas10)) and +[`node-ssh-fingerprint`](https://github.com/bahamas10/node-ssh-fingerprint) +(work by Dave Eddy), with additions (including ECDSA support) by +[Alex Wilson](https://github.com/arekinath). + +Install +------- + +``` +npm install sshpk +``` + +Examples +-------- + +```js +var sshpk = require('sshpk'); + +var fs = require('fs'); + +/* Read in an OpenSSH-format public key */ +var keyPub = fs.readFileSync('id_rsa.pub'); +var key = sshpk.parseKey(keyPub, 'ssh'); + +/* Get metadata about the key */ +console.log('type => %s', key.type); +console.log('size => %d bits', key.size); +console.log('comment => %s', key.comment); + +/* Compute key fingerprints, in new OpenSSH (>6.7) format, and old MD5 */ +console.log('fingerprint => %s', key.fingerprint().toString()); +console.log('old-style fingerprint => %s', key.fingerprint('md5').toString()); +``` + +Example output: + +``` +type => rsa +size => 2048 bits +comment => foo@foo.com +fingerprint => SHA256:PYC9kPVC6J873CSIbfp0LwYeczP/W4ffObNCuDJ1u5w +old-style fingerprint => a0:c8:ad:6c:32:9a:32:fa:59:cc:a9:8c:0a:0d:6e:bd +``` + +More examples: converting between formats: + +```js +/* Read in a PEM public key */ +var keyPem = fs.readFileSync('id_rsa.pem'); +var key = sshpk.parseKey(keyPem, 'pem'); + +/* Convert to PEM PKCS#8 public key format */ +var pemBuf = key.toBuffer('pkcs8'); + +/* Convert to SSH public key format (and return as a string) */ +var sshKey = key.toString('ssh'); +``` + +Signing and verifying: + +```js +/* Read in an OpenSSH/PEM *private* key */ +var keyPriv = fs.readFileSync('id_ecdsa'); +var key = sshpk.parsePrivateKey(keyPriv, 'pem'); + +var data = 'some data'; + +/* Sign some data with the key */ +var s = key.createSign('sha1'); +s.update(data); +var signature = s.sign(); + +/* Now load the public key (could also use just key.toPublic()) */ +var keyPub = fs.readFileSync('id_ecdsa.pub'); +key = sshpk.parseKey(keyPub, 'ssh'); + +/* Make a crypto.Verifier with this key */ +var v = key.createVerify('sha1'); +v.update(data); +var valid = v.verify(signature); +/* => true! */ +``` + +Matching fingerprints with keys: + +```js +var fp = sshpk.parseFingerprint('SHA256:PYC9kPVC6J873CSIbfp0LwYeczP/W4ffObNCuDJ1u5w'); + +var keys = [sshpk.parseKey(...), sshpk.parseKey(...), ...]; + +keys.forEach(function (key) { + if (fp.matches(key)) + console.log('found it!'); +}); +``` + +Usage +----- + +## Public keys + +### `parseKey(data[, format = 'auto'[, options]])` + +Parses a key from a given data format and returns a new `Key` object. + +Parameters + +- `data` -- Either a Buffer or String, containing the key +- `format` -- String name of format to use, valid options are: + - `auto`: choose automatically from all below + - `pem`: supports both PKCS#1 and PKCS#8 + - `ssh`: standard OpenSSH format, + - `pkcs1`, `pkcs8`: variants of `pem` + - `rfc4253`: raw OpenSSH wire format + - `openssh`: new post-OpenSSH 6.5 internal format, produced by + `ssh-keygen -o` + - `dnssec`: `.key` file format output by `dnssec-keygen` etc + - `putty`: the PuTTY `.ppk` file format (supports truncated variant without + all the lines from `Private-Lines:` onwards) +- `options` -- Optional Object, extra options, with keys: + - `filename` -- Optional String, name for the key being parsed + (eg. the filename that was opened). Used to generate + Error messages + - `passphrase` -- Optional String, encryption passphrase used to decrypt an + encrypted PEM file + +### `Key.isKey(obj)` + +Returns `true` if the given object is a valid `Key` object created by a version +of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `Key#type` + +String, the type of key. Valid options are `rsa`, `dsa`, `ecdsa`. + +### `Key#size` + +Integer, "size" of the key in bits. For RSA/DSA this is the size of the modulus; +for ECDSA this is the bit size of the curve in use. + +### `Key#comment` + +Optional string, a key comment used by some formats (eg the `ssh` format). + +### `Key#curve` + +Only present if `this.type === 'ecdsa'`, string containing the name of the +named curve used with this key. Possible values include `nistp256`, `nistp384` +and `nistp521`. + +### `Key#toBuffer([format = 'ssh'])` + +Convert the key into a given data format and return the serialized key as +a Buffer. + +Parameters + +- `format` -- String name of format to use, for valid options see `parseKey()` + +### `Key#toString([format = 'ssh])` + +Same as `this.toBuffer(format).toString()`. + +### `Key#fingerprint([algorithm = 'sha256'[, hashType = 'ssh']])` + +Creates a new `Fingerprint` object representing this Key's fingerprint. + +Parameters + +- `algorithm` -- String name of hash algorithm to use, valid options are `md5`, + `sha1`, `sha256`, `sha384`, `sha512` +- `hashType` -- String name of fingerprint hash type to use, valid options are + `ssh` (the type of fingerprint used by OpenSSH, e.g. in + `ssh-keygen`), `spki` (used by HPKP, some OpenSSL applications) + +### `Key#createVerify([hashAlgorithm])` + +Creates a `crypto.Verifier` specialized to use this Key (and the correct public +key algorithm to match it). The returned Verifier has the same API as a regular +one, except that the `verify()` function takes only the target signature as an +argument. + +Parameters + +- `hashAlgorithm` -- optional String name of hash algorithm to use, any + supported by OpenSSL are valid, usually including + `sha1`, `sha256`. + +`v.verify(signature[, format])` Parameters + +- `signature` -- either a Signature object, or a Buffer or String +- `format` -- optional String, name of format to interpret given String with. + Not valid if `signature` is a Signature or Buffer. + +### `Key#createDiffieHellman()` +### `Key#createDH()` + +Creates a Diffie-Hellman key exchange object initialized with this key and all +necessary parameters. This has the same API as a `crypto.DiffieHellman` +instance, except that functions take `Key` and `PrivateKey` objects as +arguments, and return them where indicated for. + +This is only valid for keys belonging to a cryptosystem that supports DHE +or a close analogue (i.e. `dsa`, `ecdsa` and `curve25519` keys). An attempt +to call this function on other keys will yield an `Error`. + +## Private keys + +### `parsePrivateKey(data[, format = 'auto'[, options]])` + +Parses a private key from a given data format and returns a new +`PrivateKey` object. + +Parameters + +- `data` -- Either a Buffer or String, containing the key +- `format` -- String name of format to use, valid options are: + - `auto`: choose automatically from all below + - `pem`: supports both PKCS#1 and PKCS#8 + - `ssh`, `openssh`: new post-OpenSSH 6.5 internal format, produced by + `ssh-keygen -o` + - `pkcs1`, `pkcs8`: variants of `pem` + - `rfc4253`: raw OpenSSH wire format + - `dnssec`: `.private` format output by `dnssec-keygen` etc. +- `options` -- Optional Object, extra options, with keys: + - `filename` -- Optional String, name for the key being parsed + (eg. the filename that was opened). Used to generate + Error messages + - `passphrase` -- Optional String, encryption passphrase used to decrypt an + encrypted PEM file + +### `generatePrivateKey(type[, options])` + +Generates a new private key of a certain key type, from random data. + +Parameters + +- `type` -- String, type of key to generate. Currently supported are `'ecdsa'` + and `'ed25519'` +- `options` -- optional Object, with keys: + - `curve` -- optional String, for `'ecdsa'` keys, specifies the curve to use. + If ECDSA is specified and this option is not given, defaults to + using `'nistp256'`. + +### `PrivateKey.isPrivateKey(obj)` + +Returns `true` if the given object is a valid `PrivateKey` object created by a +version of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `PrivateKey#type` + +String, the type of key. Valid options are `rsa`, `dsa`, `ecdsa`. + +### `PrivateKey#size` + +Integer, "size" of the key in bits. For RSA/DSA this is the size of the modulus; +for ECDSA this is the bit size of the curve in use. + +### `PrivateKey#curve` + +Only present if `this.type === 'ecdsa'`, string containing the name of the +named curve used with this key. Possible values include `nistp256`, `nistp384` +and `nistp521`. + +### `PrivateKey#toBuffer([format = 'pkcs1'])` + +Convert the key into a given data format and return the serialized key as +a Buffer. + +Parameters + +- `format` -- String name of format to use, valid options are listed under + `parsePrivateKey`. Note that ED25519 keys default to `openssh` + format instead (as they have no `pkcs1` representation). + +### `PrivateKey#toString([format = 'pkcs1'])` + +Same as `this.toBuffer(format).toString()`. + +### `PrivateKey#toPublic()` + +Extract just the public part of this private key, and return it as a `Key` +object. + +### `PrivateKey#fingerprint([algorithm = 'sha256'])` + +Same as `this.toPublic().fingerprint()`. + +### `PrivateKey#createVerify([hashAlgorithm])` + +Same as `this.toPublic().createVerify()`. + +### `PrivateKey#createSign([hashAlgorithm])` + +Creates a `crypto.Sign` specialized to use this PrivateKey (and the correct +key algorithm to match it). The returned Signer has the same API as a regular +one, except that the `sign()` function takes no arguments, and returns a +`Signature` object. + +Parameters + +- `hashAlgorithm` -- optional String name of hash algorithm to use, any + supported by OpenSSL are valid, usually including + `sha1`, `sha256`. + +`v.sign()` Parameters + +- none + +### `PrivateKey#derive(newType)` + +Derives a related key of type `newType` from this key. Currently this is +only supported to change between `ed25519` and `curve25519` keys which are +stored with the same private key (but usually distinct public keys in order +to avoid degenerate keys that lead to a weak Diffie-Hellman exchange). + +Parameters + +- `newType` -- String, type of key to derive, either `ed25519` or `curve25519` + +## Fingerprints + +### `parseFingerprint(fingerprint[, options])` + +Pre-parses a fingerprint, creating a `Fingerprint` object that can be used to +quickly locate a key by using the `Fingerprint#matches` function. + +Parameters + +- `fingerprint` -- String, the fingerprint value, in any supported format +- `options` -- Optional Object, with properties: + - `algorithms` -- Array of strings, names of hash algorithms to limit + support to. If `fingerprint` uses a hash algorithm not on + this list, throws `InvalidAlgorithmError`. + - `hashType` -- String, the type of hash the fingerprint uses, either `ssh` + or `spki` (normally auto-detected based on the format, but + can be overridden) + - `type` -- String, the entity this fingerprint identifies, either `key` or + `certificate` + +### `Fingerprint.isFingerprint(obj)` + +Returns `true` if the given object is a valid `Fingerprint` object created by a +version of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `Fingerprint#toString([format])` + +Returns a fingerprint as a string, in the given format. + +Parameters + +- `format` -- Optional String, format to use, valid options are `hex` and + `base64`. If this `Fingerprint` uses the `md5` algorithm, the + default format is `hex`. Otherwise, the default is `base64`. + +### `Fingerprint#matches(keyOrCertificate)` + +Verifies whether or not this `Fingerprint` matches a given `Key` or +`Certificate`. This function uses double-hashing to avoid leaking timing +information. Returns a boolean. + +Note that a `Key`-type Fingerprint will always return `false` if asked to match +a `Certificate` and vice versa. + +Parameters + +- `keyOrCertificate` -- a `Key` object or `Certificate` object, the entity to + match this fingerprint against + +## Signatures + +### `parseSignature(signature, algorithm, format)` + +Parses a signature in a given format, creating a `Signature` object. Useful +for converting between the SSH and ASN.1 (PKCS/OpenSSL) signature formats, and +also returned as output from `PrivateKey#createSign().sign()`. + +A Signature object can also be passed to a verifier produced by +`Key#createVerify()` and it will automatically be converted internally into the +correct format for verification. + +Parameters + +- `signature` -- a Buffer (binary) or String (base64), data of the actual + signature in the given format +- `algorithm` -- a String, name of the algorithm to be used, possible values + are `rsa`, `dsa`, `ecdsa` +- `format` -- a String, either `asn1` or `ssh` + +### `Signature.isSignature(obj)` + +Returns `true` if the given object is a valid `Signature` object created by a +version of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `Signature#toBuffer([format = 'asn1'])` + +Converts a Signature to the given format and returns it as a Buffer. + +Parameters + +- `format` -- a String, either `asn1` or `ssh` + +### `Signature#toString([format = 'asn1'])` + +Same as `this.toBuffer(format).toString('base64')`. + +## Certificates + +`sshpk` includes basic support for parsing certificates in X.509 (PEM) format +and the OpenSSH certificate format. This feature is intended to be used mainly +to access basic metadata about certificates, extract public keys from them, and +also to generate simple self-signed certificates from an existing key. + +Notably, there is no implementation of CA chain-of-trust verification, and only +very minimal support for key usage restrictions. Please do the security world +a favour, and DO NOT use this code for certificate verification in the +traditional X.509 CA chain style. + +### `parseCertificate(data, format)` + +Parameters + + - `data` -- a Buffer or String + - `format` -- a String, format to use, one of `'openssh'`, `'pem'` (X.509 in a + PEM wrapper), or `'x509'` (raw DER encoded) + +### `createSelfSignedCertificate(subject, privateKey[, options])` + +Parameters + + - `subject` -- an Identity, the subject of the certificate + - `privateKey` -- a PrivateKey, the key of the subject: will be used both to be + placed in the certificate and also to sign it (since this is + a self-signed certificate) + - `options` -- optional Object, with keys: + - `lifetime` -- optional Number, lifetime of the certificate from now in + seconds + - `validFrom`, `validUntil` -- optional Dates, beginning and end of + certificate validity period. If given + `lifetime` will be ignored + - `serial` -- optional Buffer, the serial number of the certificate + - `purposes` -- optional Array of String, X.509 key usage restrictions + +### `createCertificate(subject, key, issuer, issuerKey[, options])` + +Parameters + + - `subject` -- an Identity, the subject of the certificate + - `key` -- a Key, the public key of the subject + - `issuer` -- an Identity, the issuer of the certificate who will sign it + - `issuerKey` -- a PrivateKey, the issuer's private key for signing + - `options` -- optional Object, with keys: + - `lifetime` -- optional Number, lifetime of the certificate from now in + seconds + - `validFrom`, `validUntil` -- optional Dates, beginning and end of + certificate validity period. If given + `lifetime` will be ignored + - `serial` -- optional Buffer, the serial number of the certificate + - `purposes` -- optional Array of String, X.509 key usage restrictions + +### `Certificate#subjects` + +Array of `Identity` instances describing the subject of this certificate. + +### `Certificate#issuer` + +The `Identity` of the Certificate's issuer (signer). + +### `Certificate#subjectKey` + +The public key of the subject of the certificate, as a `Key` instance. + +### `Certificate#issuerKey` + +The public key of the signing issuer of this certificate, as a `Key` instance. +May be `undefined` if the issuer's key is unknown (e.g. on an X509 certificate). + +### `Certificate#serial` + +The serial number of the certificate. As this is normally a 64-bit or wider +integer, it is returned as a Buffer. + +### `Certificate#purposes` + +Array of Strings indicating the X.509 key usage purposes that this certificate +is valid for. The possible strings at the moment are: + + * `'signature'` -- key can be used for digital signatures + * `'identity'` -- key can be used to attest about the identity of the signer + (X.509 calls this `nonRepudiation`) + * `'codeSigning'` -- key can be used to sign executable code + * `'keyEncryption'` -- key can be used to encrypt other keys + * `'encryption'` -- key can be used to encrypt data (only applies for RSA) + * `'keyAgreement'` -- key can be used for key exchange protocols such as + Diffie-Hellman + * `'ca'` -- key can be used to sign other certificates (is a Certificate + Authority) + * `'crl'` -- key can be used to sign Certificate Revocation Lists (CRLs) + +### `Certificate#getExtension(nameOrOid)` + +Retrieves information about a certificate extension, if present, or returns +`undefined` if not. The string argument `nameOrOid` should be either the OID +(for X509 extensions) or the name (for OpenSSH extensions) of the extension +to retrieve. + +The object returned will have the following properties: + + * `format` -- String, set to either `'x509'` or `'openssh'` + * `name` or `oid` -- String, only one set based on value of `format` + * `data` -- Buffer, the raw data inside the extension + +### `Certificate#getExtensions()` + +Returns an Array of all present certificate extensions, in the same manner and +format as `getExtension()`. + +### `Certificate#isExpired([when])` + +Tests whether the Certificate is currently expired (i.e. the `validFrom` and +`validUntil` dates specify a range of time that does not include the current +time). + +Parameters + + - `when` -- optional Date, if specified, tests whether the Certificate was or + will be expired at the specified time instead of now + +Returns a Boolean. + +### `Certificate#isSignedByKey(key)` + +Tests whether the Certificate was validly signed by the given (public) Key. + +Parameters + + - `key` -- a Key instance + +Returns a Boolean. + +### `Certificate#isSignedBy(certificate)` + +Tests whether this Certificate was validly signed by the subject of the given +certificate. Also tests that the issuer Identity of this Certificate and the +subject Identity of the other Certificate are equivalent. + +Parameters + + - `certificate` -- another Certificate instance + +Returns a Boolean. + +### `Certificate#fingerprint([hashAlgo])` + +Returns the X509-style fingerprint of the entire certificate (as a Fingerprint +instance). This matches what a web-browser or similar would display as the +certificate fingerprint and should not be confused with the fingerprint of the +subject's public key. + +Parameters + + - `hashAlgo` -- an optional String, any hash function name + +### `Certificate#toBuffer([format])` + +Serializes the Certificate to a Buffer and returns it. + +Parameters + + - `format` -- an optional String, output format, one of `'openssh'`, `'pem'` or + `'x509'`. Defaults to `'x509'`. + +Returns a Buffer. + +### `Certificate#toString([format])` + + - `format` -- an optional String, output format, one of `'openssh'`, `'pem'` or + `'x509'`. Defaults to `'pem'`. + +Returns a String. + +## Certificate identities + +### `identityForHost(hostname)` + +Constructs a host-type Identity for a given hostname. + +Parameters + + - `hostname` -- the fully qualified DNS name of the host + +Returns an Identity instance. + +### `identityForUser(uid)` + +Constructs a user-type Identity for a given UID. + +Parameters + + - `uid` -- a String, user identifier (login name) + +Returns an Identity instance. + +### `identityForEmail(email)` + +Constructs an email-type Identity for a given email address. + +Parameters + + - `email` -- a String, email address + +Returns an Identity instance. + +### `identityFromDN(dn)` + +Parses an LDAP-style DN string (e.g. `'CN=foo, C=US'`) and turns it into an +Identity instance. + +Parameters + + - `dn` -- a String + +Returns an Identity instance. + +### `identityFromArray(arr)` + +Constructs an Identity from an array of DN components (see `Identity#toArray()` +for the format). + +Parameters + + - `arr` -- an Array of Objects, DN components with `name` and `value` + +Returns an Identity instance. + + +Supported attributes in DNs: + +| Attribute name | OID | +| -------------- | --- | +| `cn` | `2.5.4.3` | +| `o` | `2.5.4.10` | +| `ou` | `2.5.4.11` | +| `l` | `2.5.4.7` | +| `s` | `2.5.4.8` | +| `c` | `2.5.4.6` | +| `sn` | `2.5.4.4` | +| `postalCode` | `2.5.4.17` | +| `serialNumber` | `2.5.4.5` | +| `street` | `2.5.4.9` | +| `x500UniqueIdentifier` | `2.5.4.45` | +| `role` | `2.5.4.72` | +| `telephoneNumber` | `2.5.4.20` | +| `description` | `2.5.4.13` | +| `dc` | `0.9.2342.19200300.100.1.25` | +| `uid` | `0.9.2342.19200300.100.1.1` | +| `mail` | `0.9.2342.19200300.100.1.3` | +| `title` | `2.5.4.12` | +| `gn` | `2.5.4.42` | +| `initials` | `2.5.4.43` | +| `pseudonym` | `2.5.4.65` | + +### `Identity#toString()` + +Returns the identity as an LDAP-style DN string. +e.g. `'CN=foo, O=bar corp, C=us'` + +### `Identity#type` + +The type of identity. One of `'host'`, `'user'`, `'email'` or `'unknown'` + +### `Identity#hostname` +### `Identity#uid` +### `Identity#email` + +Set when `type` is `'host'`, `'user'`, or `'email'`, respectively. Strings. + +### `Identity#cn` + +The value of the first `CN=` in the DN, if any. It's probably better to use +the `#get()` method instead of this property. + +### `Identity#get(name[, asArray])` + +Returns the value of a named attribute in the Identity DN. If there is no +attribute of the given name, returns `undefined`. If multiple components +of the DN contain an attribute of this name, an exception is thrown unless +the `asArray` argument is given as `true` -- then they will be returned as +an Array in the same order they appear in the DN. + +Parameters + + - `name` -- a String + - `asArray` -- an optional Boolean + +### `Identity#toArray()` + +Returns the Identity as an Array of DN component objects. This looks like: + +```js +[ { + "name": "cn", + "value": "Joe Bloggs" +}, +{ + "name": "o", + "value": "Organisation Ltd" +} ] +``` + +Each object has a `name` and a `value` property. The returned objects may be +safely modified. + +Errors +------ + +### `InvalidAlgorithmError` + +The specified algorithm is not valid, either because it is not supported, or +because it was not included on a list of allowed algorithms. + +Thrown by `Fingerprint.parse`, `Key#fingerprint`. + +Properties + +- `algorithm` -- the algorithm that could not be validated + +### `FingerprintFormatError` + +The fingerprint string given could not be parsed as a supported fingerprint +format, or the specified fingerprint format is invalid. + +Thrown by `Fingerprint.parse`, `Fingerprint#toString`. + +Properties + +- `fingerprint` -- if caused by a fingerprint, the string value given +- `format` -- if caused by an invalid format specification, the string value given + +### `KeyParseError` + +The key data given could not be parsed as a valid key. + +Properties + +- `keyName` -- `filename` that was given to `parseKey` +- `format` -- the `format` that was trying to parse the key (see `parseKey`) +- `innerErr` -- the inner Error thrown by the format parser + +### `KeyEncryptedError` + +The key is encrypted with a symmetric key (ie, it is password protected). The +parsing operation would succeed if it was given the `passphrase` option. + +Properties + +- `keyName` -- `filename` that was given to `parseKey` +- `format` -- the `format` that was trying to parse the key (currently can only + be `"pem"`) + +### `CertificateParseError` + +The certificate data given could not be parsed as a valid certificate. + +Properties + +- `certName` -- `filename` that was given to `parseCertificate` +- `format` -- the `format` that was trying to parse the key + (see `parseCertificate`) +- `innerErr` -- the inner Error thrown by the format parser + +Friends of sshpk +---------------- + + * [`sshpk-agent`](https://github.com/arekinath/node-sshpk-agent) is a library + for speaking the `ssh-agent` protocol from node.js, which uses `sshpk` diff --git a/node_modules/sshpk/man/man1/sshpk-conv.1 b/node_modules/sshpk/man/man1/sshpk-conv.1 new file mode 100644 index 00000000..0887dce2 --- /dev/null +++ b/node_modules/sshpk/man/man1/sshpk-conv.1 @@ -0,0 +1,135 @@ +.TH sshpk\-conv 1 "Jan 2016" sshpk "sshpk Commands" +.SH NAME +.PP +sshpk\-conv \- convert between key formats +.SH SYNOPSYS +.PP +\fB\fCsshpk\-conv\fR \-t FORMAT [FILENAME] [OPTIONS...] +.PP +\fB\fCsshpk\-conv\fR \-i [FILENAME] [OPTIONS...] +.SH DESCRIPTION +.PP +Reads in a public or private key and converts it between different formats, +particularly formats used in the SSH protocol and the well\-known PEM PKCS#1/7 +formats. +.PP +In the second form, with the \fB\fC\-i\fR option given, identifies a key and prints to +stderr information about its nature, size and fingerprint. +.SH EXAMPLES +.PP +Assume the following SSH\-format public key in \fB\fCid_ecdsa.pub\fR: +.PP +.RS +.nf +ecdsa\-sha2\-nistp256 AAAAE2VjZHNhLXNoYTI...9M/4c4= user@host +.fi +.RE +.PP +Identify it with \fB\fC\-i\fR: +.PP +.RS +.nf +$ sshpk\-conv \-i id_ecdsa.pub +id_ecdsa: a 256 bit ECDSA public key +ECDSA curve: nistp256 +Comment: user@host +Fingerprint: + SHA256:vCNX7eUkdvqqW0m4PoxQAZRv+CM4P4fS8+CbliAvS4k + 81:ad:d5:57:e5:6f:7d:a2:93:79:56:af:d7:c0:38:51 +.fi +.RE +.PP +Convert it to \fB\fCpkcs8\fR format, for use with e.g. OpenSSL: +.PP +.RS +.nf +$ sshpk\-conv \-t pkcs8 id_ecdsa +\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAsA4R6N6AS3gzaPBeLjG2ObSgUsR +zOt+kWJoijLnw3ZMYUKmAx+lD0I5XUxdrPcs1vH5f3cn9TvRvO9L0z/hzg== +\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- +.fi +.RE +.PP +Retrieve the public half of a private key: +.PP +.RS +.nf +$ openssl genrsa 2048 | sshpk\-conv \-t ssh \-c foo@bar +ssh\-rsa AAAAB3NzaC1yc2EAAA...koK7 foo@bar +.fi +.RE +.PP +Convert a private key to PKCS#1 (OpenSSL) format from a new\-style OpenSSH key +format (the \fB\fCssh\-keygen \-o\fR format): +.PP +.RS +.nf +$ ssh\-keygen \-o \-f foobar +\&... +$ sshpk\-conv \-p \-t pkcs1 foobar +\-\-\-\-\-BEGIN RSA PRIVATE KEY\-\-\-\-\- +MIIDpAIBAAKCAQEA6T/GYJndb1TRH3+NL.... +\-\-\-\-\-END RSA PRIVATE KEY\-\-\-\-\- +.fi +.RE +.SH OPTIONS +.TP +\fB\fC\-i, \-\-identify\fR +Instead of converting the key, output identifying information about it to +stderr, including its type, size and fingerprints. +.TP +\fB\fC\-p, \-\-private\fR +Treat the key as a private key instead of a public key (the default). If you +supply \fB\fCsshpk\-conv\fR with a private key and do not give this option, it will +extract only the public half of the key from it and work with that. +.TP +\fB\fC\-f PATH, \-\-file=PATH\fR +Input file to take the key from instead of stdin. If a filename is supplied +as a positional argument, it is equivalent to using this option. +.TP +\fB\fC\-o PATH, \-\-out=PATH\fR +Output file name to use instead of stdout. +.PP +\fB\fC\-T FORMAT, \-\-informat=FORMAT\fR +.TP +\fB\fC\-t FORMAT, \-\-outformat=FORMAT\fR +Selects the input and output formats to be used (see FORMATS, below). +.TP +\fB\fC\-c TEXT, \-\-comment=TEXT\fR +Sets the key comment for the output file, if supported. +.SH FORMATS +.PP +Currently supported formats: +.TP +\fB\fCpem, pkcs1\fR +The standard PEM format used by older OpenSSH and most TLS libraries such as +OpenSSL. The classic \fB\fCid_rsa\fR file is usually in this format. It is an ASN.1 +encoded structure, base64\-encoded and placed between PEM headers. +.TP +\fB\fCssh\fR +The SSH public key text format (the format of an \fB\fCid_rsa.pub\fR file). A single +line, containing 3 space separated parts: the key type, key body and optional +key comment. +.TP +\fB\fCpkcs8\fR +A newer PEM format, usually used only for public keys by TLS libraries such +as OpenSSL. The ASN.1 structure is more generic than that of \fB\fCpkcs1\fR\&. +.TP +\fB\fCopenssh\fR +The new \fB\fCssh\-keygen \-o\fR format from OpenSSH. This can be mistaken for a PEM +encoding but is actually an OpenSSH internal format. +.TP +\fB\fCrfc4253\fR +The internal binary format of keys when sent over the wire in the SSH +protocol. This is also the format that the \fB\fCssh\-agent\fR uses in its protocol. +.SH SEE ALSO +.PP +.BR ssh-keygen (1), +.BR openssl (1) +.SH BUGS +.PP +Encrypted (password\-protected) keys are not supported. +.PP +Report bugs at Github +\[la]https://github.com/arekinath/node-sshpk/issues\[ra] diff --git a/node_modules/sshpk/man/man1/sshpk-sign.1 b/node_modules/sshpk/man/man1/sshpk-sign.1 new file mode 100644 index 00000000..749916ba --- /dev/null +++ b/node_modules/sshpk/man/man1/sshpk-sign.1 @@ -0,0 +1,81 @@ +.TH sshpk\-sign 1 "Jan 2016" sshpk "sshpk Commands" +.SH NAME +.PP +sshpk\-sign \- sign data using an SSH key +.SH SYNOPSYS +.PP +\fB\fCsshpk\-sign\fR \-i KEYPATH [OPTION...] +.SH DESCRIPTION +.PP +Takes in arbitrary bytes, and signs them using an SSH private key. The key can +be of any type or format supported by the \fB\fCsshpk\fR library, including the +standard OpenSSH formats, as well as PEM PKCS#1 and PKCS#8. +.PP +The signature is printed out in Base64 encoding, unless the \fB\fC\-\-binary\fR or \fB\fC\-b\fR +option is given. +.SH EXAMPLES +.PP +Signing with default settings: +.PP +.RS +.nf +$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa +MEUCIAMdLS/vXrrtWFepwe... +.fi +.RE +.PP +Signing in SSH (RFC 4253) format (rather than the default ASN.1): +.PP +.RS +.nf +$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa \-t ssh +AAAAFGVjZHNhLXNoYTIt... +.fi +.RE +.PP +Saving the binary signature to a file: +.PP +.RS +.nf +$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa \\ + \-o signature.bin \-b +$ cat signature.bin | base64 +MEUCIAMdLS/vXrrtWFepwe... +.fi +.RE +.SH OPTIONS +.TP +\fB\fC\-v, \-\-verbose\fR +Print extra information about the key and signature to stderr when signing. +.TP +\fB\fC\-b, \-\-binary\fR +Don't base64\-encode the signature before outputting it. +.TP +\fB\fC\-i KEY, \-\-identity=KEY\fR +Select the key to be used for signing. \fB\fCKEY\fR must be a relative or absolute +filesystem path to the key file. Any format supported by the \fB\fCsshpk\fR library +is supported, including OpenSSH formats and standard PEM PKCS. +.TP +\fB\fC\-f PATH, \-\-file=PATH\fR +Input file to sign instead of stdin. +.TP +\fB\fC\-o PATH, \-\-out=PATH\fR +Output file to save signature in instead of stdout. +.TP +\fB\fC\-H HASH, \-\-hash=HASH\fR +Set the hash algorithm to be used for signing. This should be one of \fB\fCsha1\fR, +\fB\fCsha256\fR or \fB\fCsha512\fR\&. Some key types may place restrictions on which hash +algorithms may be used (e.g. ED25519 keys can only use SHA\-512). +.TP +\fB\fC\-t FORMAT, \-\-format=FORMAT\fR +Choose the signature format to use, from \fB\fCasn1\fR, \fB\fCssh\fR or \fB\fCraw\fR (only for +ED25519 signatures). The \fB\fCasn1\fR format is the default, as it is the format +used with TLS and typically the standard in most non\-SSH libraries (e.g. +OpenSSL). The \fB\fCssh\fR format is used in the SSH protocol and by the ssh\-agent. +.SH SEE ALSO +.PP +.BR sshpk-verify (1) +.SH BUGS +.PP +Report bugs at Github +\[la]https://github.com/arekinath/node-sshpk/issues\[ra] diff --git a/node_modules/sshpk/man/man1/sshpk-verify.1 b/node_modules/sshpk/man/man1/sshpk-verify.1 new file mode 100644 index 00000000..f79169d2 --- /dev/null +++ b/node_modules/sshpk/man/man1/sshpk-verify.1 @@ -0,0 +1,68 @@ +.TH sshpk\-verify 1 "Jan 2016" sshpk "sshpk Commands" +.SH NAME +.PP +sshpk\-verify \- verify a signature on data using an SSH key +.SH SYNOPSYS +.PP +\fB\fCsshpk\-verify\fR \-i KEYPATH \-s SIGNATURE [OPTION...] +.SH DESCRIPTION +.PP +Takes in arbitrary bytes and a Base64\-encoded signature, and verifies that the +signature was produced by the private half of the given SSH public key. +.SH EXAMPLES +.PP +.RS +.nf +$ printf 'foo' | sshpk\-verify \-i ~/.ssh/id_ecdsa \-s MEUCIQCYp... +OK +$ printf 'foo' | sshpk\-verify \-i ~/.ssh/id_ecdsa \-s GARBAGE... +NOT OK +.fi +.RE +.SH EXIT STATUS +.TP +\fB\fC0\fR +Signature validates and matches the key. +.TP +\fB\fC1\fR +Signature is parseable and the correct length but does not match the key or +otherwise is invalid. +.TP +\fB\fC2\fR +The signature or key could not be parsed. +.TP +\fB\fC3\fR +Invalid commandline options were supplied. +.SH OPTIONS +.TP +\fB\fC\-v, \-\-verbose\fR +Print extra information about the key and signature to stderr when verifying. +.TP +\fB\fC\-i KEY, \-\-identity=KEY\fR +Select the key to be used for verification. \fB\fCKEY\fR must be a relative or +absolute filesystem path to the key file. Any format supported by the \fB\fCsshpk\fR +library is supported, including OpenSSH formats and standard PEM PKCS. +.TP +\fB\fC\-s BASE64, \-\-signature=BASE64\fR +Supplies the base64\-encoded signature to be verified. +.TP +\fB\fC\-f PATH, \-\-file=PATH\fR +Input file to verify instead of stdin. +.TP +\fB\fC\-H HASH, \-\-hash=HASH\fR +Set the hash algorithm to be used for signing. This should be one of \fB\fCsha1\fR, +\fB\fCsha256\fR or \fB\fCsha512\fR\&. Some key types may place restrictions on which hash +algorithms may be used (e.g. ED25519 keys can only use SHA\-512). +.TP +\fB\fC\-t FORMAT, \-\-format=FORMAT\fR +Choose the signature format to use, from \fB\fCasn1\fR, \fB\fCssh\fR or \fB\fCraw\fR (only for +ED25519 signatures). The \fB\fCasn1\fR format is the default, as it is the format +used with TLS and typically the standard in most non\-SSH libraries (e.g. +OpenSSL). The \fB\fCssh\fR format is used in the SSH protocol and by the ssh\-agent. +.SH SEE ALSO +.PP +.BR sshpk-sign (1) +.SH BUGS +.PP +Report bugs at Github +\[la]https://github.com/arekinath/node-sshpk/issues\[ra] diff --git a/node_modules/sshpk/package.json b/node_modules/sshpk/package.json new file mode 100644 index 00000000..cc78787f --- /dev/null +++ b/node_modules/sshpk/package.json @@ -0,0 +1,60 @@ +{ + "name": "sshpk", + "version": "1.16.1", + "description": "A library for finding and using SSH public keys", + "main": "lib/index.js", + "scripts": { + "test": "tape test/*.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/joyent/node-sshpk.git" + }, + "author": "Joyent, Inc", + "contributors": [ + { + "name": "Dave Eddy", + "email": "dave@daveeddy.com" + }, + { + "name": "Mark Cavage", + "email": "mcavage@gmail.com" + }, + { + "name": "Alex Wilson", + "email": "alex@cooperi.net" + } + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/arekinath/node-sshpk/issues" + }, + "engines": { + "node": ">=0.10.0" + }, + "directories": { + "bin": "./bin", + "lib": "./lib", + "man": "./man/man1" + }, + "homepage": "https://github.com/arekinath/node-sshpk#readme", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "dashdash": "^1.12.0", + "getpass": "^0.1.1", + "safer-buffer": "^2.0.2", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0", + "ecc-jsbn": "~0.1.1", + "bcrypt-pbkdf": "^1.0.0" + }, + "optionalDependencies": { + }, + "devDependencies": { + "tape": "^3.5.0", + "benchmark": "^1.0.0", + "sinon": "^1.17.2", + "temp": "^0.8.2" + } +} diff --git a/node_modules/stack-trace/.npmignore b/node_modules/stack-trace/.npmignore new file mode 100644 index 00000000..b59f7e3a --- /dev/null +++ b/node_modules/stack-trace/.npmignore @@ -0,0 +1 @@ +test/ \ No newline at end of file diff --git a/node_modules/stack-trace/License b/node_modules/stack-trace/License new file mode 100644 index 00000000..11ec094e --- /dev/null +++ b/node_modules/stack-trace/License @@ -0,0 +1,19 @@ +Copyright (c) 2011 Felix Geisendörfer (felix@debuggable.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. diff --git a/node_modules/stack-trace/Makefile b/node_modules/stack-trace/Makefile new file mode 100644 index 00000000..a7ce31d3 --- /dev/null +++ b/node_modules/stack-trace/Makefile @@ -0,0 +1,11 @@ +SHELL := /bin/bash + +test: + @./test/run.js + +release: + git push + git push --tags + npm publish . + +.PHONY: test diff --git a/node_modules/stack-trace/Readme.md b/node_modules/stack-trace/Readme.md new file mode 100644 index 00000000..fcd1b97c --- /dev/null +++ b/node_modules/stack-trace/Readme.md @@ -0,0 +1,98 @@ +# stack-trace + +Get v8 stack traces as an array of CallSite objects. + +## Install + +``` bash +npm install stack-trace +``` + +## Usage + +The stack-trace module makes it easy for you to capture the current stack: + +``` javascript +var stackTrace = require('stack-trace'); +var trace = stackTrace.get(); + +require('assert').strictEqual(trace[0].getFileName(), __filename); +``` + +However, sometimes you have already popped the stack you are interested in, +and all you have left is an `Error` object. This module can help: + +``` javascript +var stackTrace = require('stack-trace'); +var err = new Error('something went wrong'); +var trace = stackTrace.parse(err); + +require('assert').strictEqual(trace[0].getFileName(), __filename); +``` + +Please note that parsing the `Error#stack` property is not perfect, only +certain properties can be retrieved with it as noted in the API docs below. + +## Long stack traces + +stack-trace works great with [long-stack-traces][], when parsing an `err.stack` +that has crossed the event loop boundary, a `CallSite` object returning +`'----------------------------------------'` for `getFileName()` is created. +All other methods of the event loop boundary call site return `null`. + +[long-stack-traces]: https://github.com/tlrobinson/long-stack-traces + +## API + +### stackTrace.get([belowFn]) + +Returns an array of `CallSite` objects, where element `0` is the current call +site. + +When passing a function on the current stack as the `belowFn` parameter, the +returned array will only include `CallSite` objects below this function. + +### stackTrace.parse(err) + +Parses the `err.stack` property of an `Error` object into an array compatible +with those returned by `stackTrace.get()`. However, only the following methods +are implemented on the returned `CallSite` objects. + +* getTypeName +* getFunctionName +* getMethodName +* getFileName +* getLineNumber +* getColumnNumber +* isNative + +Note: Except `getFunctionName()`, all of the above methods return exactly the +same values as you would get from `stackTrace.get()`. `getFunctionName()` +is sometimes a little different, but still useful. + +### CallSite + +The official v8 CallSite object API can be found [here][v8stackapi]. A quick +excerpt: + +> A CallSite object defines the following methods: +> +> * **getThis**: returns the value of this +> * **getTypeName**: returns the type of this as a string. This is the name of the function stored in the constructor field of this, if available, otherwise the object's [[Class]] internal property. +> * **getFunction**: returns the current function +> * **getFunctionName**: returns the name of the current function, typically its name property. If a name property is not available an attempt will be made to try to infer a name from the function's context. +> * **getMethodName**: returns the name of the property of this or one of its prototypes that holds the current function +> * **getFileName**: if this function was defined in a script returns the name of the script +> * **getLineNumber**: if this function was defined in a script returns the current line number +> * **getColumnNumber**: if this function was defined in a script returns the current column number +> * **getEvalOrigin**: if this function was created using a call to eval returns a CallSite object representing the location where eval was called +> * **isToplevel**: is this a toplevel invocation, that is, is this the global object? +> * **isEval**: does this call take place in code defined by a call to eval? +> * **isNative**: is this call in native V8 code? +> * **isConstructor**: is this a constructor call? + +[v8stackapi]: http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi + +## License + +stack-trace is licensed under the MIT license. diff --git a/node_modules/stack-trace/package.json b/node_modules/stack-trace/package.json new file mode 100644 index 00000000..9cd0d074 --- /dev/null +++ b/node_modules/stack-trace/package.json @@ -0,0 +1,21 @@ +{ + "author": "Felix Geisendörfer (http://debuggable.com/)", + "name": "stack-trace", + "description": "Get v8 stack traces as an array of CallSite objects.", + "version": "0.0.10", + "homepage": "https://github.com/felixge/node-stack-trace", + "repository": { + "type": "git", + "url": "git://github.com/felixge/node-stack-trace.git" + }, + "main": "./lib/stack-trace", + "engines": { + "node": "*" + }, + "license": "MIT", + "dependencies": {}, + "devDependencies": { + "far": "0.0.3", + "long-stack-traces": "0.1.2" + } +} diff --git a/node_modules/static-extend/LICENSE b/node_modules/static-extend/LICENSE new file mode 100644 index 00000000..e28e6032 --- /dev/null +++ b/node_modules/static-extend/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/static-extend/index.js b/node_modules/static-extend/index.js new file mode 100644 index 00000000..f4124b2a --- /dev/null +++ b/node_modules/static-extend/index.js @@ -0,0 +1,90 @@ +/*! + * static-extend + * + * Copyright (c) 2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var copy = require('object-copy'); +var define = require('define-property'); +var util = require('util'); + +/** + * Returns a function for extending the static properties, + * prototype properties, and descriptors from the `Parent` + * constructor onto `Child` constructors. + * + * ```js + * var extend = require('static-extend'); + * Parent.extend = extend(Parent); + * + * // optionally pass a custom merge function as the second arg + * Parent.extend = extend(Parent, function(Child) { + * Child.prototype.mixin = function(key, val) { + * Child.prototype[key] = val; + * }; + * }); + * + * // extend "child" constructors + * Parent.extend(Child); + * + * // optionally define prototype methods as the second arg + * Parent.extend(Child, { + * foo: function() {}, + * bar: function() {} + * }); + * ``` + * @param {Function} `Parent` Parent ctor + * @param {Function} `extendFn` Optional extend function for handling any necessary custom merging. Useful when updating methods that require a specific prototype. + * @param {Function} `Child` Child ctor + * @param {Object} `proto` Optionally pass additional prototype properties to inherit. + * @return {Object} + * @api public + */ + +function extend(Parent, extendFn) { + if (typeof Parent !== 'function') { + throw new TypeError('expected Parent to be a function.'); + } + + return function(Ctor, proto) { + if (typeof Ctor !== 'function') { + throw new TypeError('expected Ctor to be a function.'); + } + + util.inherits(Ctor, Parent); + copy(Ctor, Parent); + + // proto can be null or a plain object + if (typeof proto === 'object') { + var obj = Object.create(proto); + + for (var k in obj) { + Ctor.prototype[k] = obj[k]; + } + } + + // keep a reference to the parent prototype + define(Ctor.prototype, '_parent_', { + configurable: true, + set: function() {}, + get: function() { + return Parent.prototype; + } + }); + + if (typeof extendFn === 'function') { + extendFn(Ctor, Parent); + } + + Ctor.extend = extend(Ctor, extendFn); + }; +}; + +/** + * Expose `extend` + */ + +module.exports = extend; diff --git a/node_modules/static-extend/package.json b/node_modules/static-extend/package.json new file mode 100644 index 00000000..a63ab950 --- /dev/null +++ b/node_modules/static-extend/package.json @@ -0,0 +1,63 @@ +{ + "name": "static-extend", + "description": "Adds a static `extend` method to a class, to simplify inheritance. Extends the static properties, prototype properties, and descriptors from a `Parent` constructor onto `Child` constructors.", + "version": "0.1.2", + "homepage": "https://github.com/jonschlinkert/static-extend", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/static-extend", + "bugs": { + "url": "https://github.com/jonschlinkert/static-extend/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "devDependencies": { + "gulp-format-md": "^0.1.9", + "mocha": "^2.5.3" + }, + "keywords": [ + "class", + "ctor", + "descriptor", + "extend", + "extends", + "inherit", + "inheritance", + "merge", + "method", + "prop", + "properties", + "property", + "prototype" + ], + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "reflinks": [ + "verb", + "verb-readme-generator" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/stdout-stream/.travis.yml b/node_modules/stdout-stream/.travis.yml new file mode 100644 index 00000000..4ff8a05b --- /dev/null +++ b/node_modules/stdout-stream/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.8" + - "0.10" + +script: "npm test" diff --git a/node_modules/stdout-stream/LICENSE b/node_modules/stdout-stream/LICENSE new file mode 100644 index 00000000..4b30ed5d --- /dev/null +++ b/node_modules/stdout-stream/LICENSE @@ -0,0 +1,20 @@ +Copyright 2013 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/stdout-stream/README.md b/node_modules/stdout-stream/README.md new file mode 100644 index 00000000..ede4fcd8 --- /dev/null +++ b/node_modules/stdout-stream/README.md @@ -0,0 +1,45 @@ +# stdout-stream + +Non-blocking stdout stream + + npm install stdout-stream + +[![build status](http://img.shields.io/travis/mafintosh/level-filesystem.svg?style=flat)](http://travis-ci.org/mafintosh/stdout-stream) +![dat](http://img.shields.io/badge/Development%20sponsored%20by-dat-green.svg?style=flat) + + +## Rant + +Try saving this example as `example.js` + +``` js +console.error('start'); +process.stdout.write(new Buffer(1024*1024)); +console.error('end'); +``` + +And run the following program + +``` +node example.js | sleep 1000 +``` + +The program will never print `end` since stdout in node currently is blocking - even when its being piped (!). + +stdout-stream tries to fix this by being a stream that writes to stdout but never blocks + +## Usage + +``` js +var stdout = require('stdout-stream'); + +stdout.write('hello\n'); // write should NEVER block +stdout.write('non-blocking\n') +stdout.write('world\n'); +``` + +`stdout-stream` should behave in the same way as `process.stdout` (i.e. do not end on pipe etc) + +## License + +MIT diff --git a/node_modules/stdout-stream/index.js b/node_modules/stdout-stream/index.js new file mode 100644 index 00000000..a8ab7524 --- /dev/null +++ b/node_modules/stdout-stream/index.js @@ -0,0 +1,53 @@ +var fs = require('fs'); +var Writable = require('readable-stream/writable'); + +var exists = function(path) { + try { + return fs.existsSync(path); + } catch (err) { + return false; + } +}; + +module.exports = function() { + var s = new Writable({highWaterMark:0}); + + var cb; + var data; + var tries = 0; + var offset = 0; + + var write = function() { + fs.write(1, data, offset, data.length - offset, null, onwrite); + }; + + var onwrite = function(err, written) { + if (err && err.code === 'EPIPE') return cb() + if (err && err.code === 'EAGAIN' && tries++ < 30) return setTimeout(write, 10); + if (err) return cb(err); + + tries = 0; + if (offset + written >= data.length) return cb(); + + offset += written; + write(); + }; + + s._write = function(_data, enc, _cb) { + offset = 0; + cb = _cb; + data = _data; + write(); + }; + + s._isStdio = true; + s.isTTY = process.stdout.isTTY; + + s.on('finish', function() { + fs.close(1, function(err) { + if (err) s.emit('error', err); + }); + }); + + return s; +}(); diff --git a/node_modules/stdout-stream/package.json b/node_modules/stdout-stream/package.json new file mode 100644 index 00000000..c6f74d78 --- /dev/null +++ b/node_modules/stdout-stream/package.json @@ -0,0 +1,16 @@ +{ + "name": "stdout-stream", + "description": "Non-blocking stdout stream", + "version": "1.4.1", + "repository": "mafintosh/stdout-stream", + "devDependencies": { + "tape": "~2.12.3" + }, + "scripts": { + "test": "tape test/index.js" + }, + "dependencies": { + "readable-stream": "^2.0.1" + }, + "license": "MIT" +} diff --git a/node_modules/stdout-stream/test/fixtures/end.js b/node_modules/stdout-stream/test/fixtures/end.js new file mode 100644 index 00000000..cdfeba31 --- /dev/null +++ b/node_modules/stdout-stream/test/fixtures/end.js @@ -0,0 +1,8 @@ +var stdout = require('../../'); + +stdout.write('stdout'); +stdout.end(function() { + setTimeout(function() { + process.exit(0); + }, 10); +}); \ No newline at end of file diff --git a/node_modules/stdout-stream/test/fixtures/hello-world.js b/node_modules/stdout-stream/test/fixtures/hello-world.js new file mode 100644 index 00000000..096ee273 --- /dev/null +++ b/node_modules/stdout-stream/test/fixtures/hello-world.js @@ -0,0 +1,4 @@ +var stdout = require('../../'); + +stdout.write('hello\n'); +stdout.write('world\n'); \ No newline at end of file diff --git a/node_modules/stdout-stream/test/index.js b/node_modules/stdout-stream/test/index.js new file mode 100644 index 00000000..d26d0798 --- /dev/null +++ b/node_modules/stdout-stream/test/index.js @@ -0,0 +1,33 @@ +var tape = require('tape'); +var proc = require('child_process'); +var path = require('path'); + +tape('print to stdout', function(t) { + proc.exec('"'+process.execPath+'" '+path.join(__dirname,'fixtures','hello-world.js'), function(err, stdout) { + t.ok(!err); + t.same(stdout,'hello\nworld\n'); + t.end(); + }); +}); + +tape('end stdout', function(t) { + var ch = proc.exec('"'+process.execPath+'" '+path.join(__dirname,'fixtures','end.js')); + var buf = []; + var processOnExit = false; + var stdoutOnEnd = false; + + ch.stdout.on('data', function(data) { + buf.push(data); + }); + ch.stdout.on('end', function() { + t.same(Buffer.concat(buf).toString(), 'stdout'); + t.ok(!processOnExit); + stdoutOnEnd = true; + }); + ch.on('exit', function(code) { + processOnExit = true; + t.ok(stdoutOnEnd); + t.same(code, 0); + t.end(); + }); +}); \ No newline at end of file diff --git a/node_modules/stream-exhaust/README.md b/node_modules/stream-exhaust/README.md new file mode 100644 index 00000000..1caffb57 --- /dev/null +++ b/node_modules/stream-exhaust/README.md @@ -0,0 +1,33 @@ +# stream-exhaust + +Ensure that the provided stream is flowing data, even if the stream hasn't been +piped to another stream. + +```javascript +var exhaustively = require('stream-exhaust'); + +exhaustively(fs.createReadStream(__filename)) + .on('close', () => { console.log('all done, despite being streams{1+N}!') }); +``` + +## Prior Art + +This is based on [stream-consume](https://github.com/aroneous/stream-consume) +by [aroneous](https://github.com/aroneous). It is a separate package because it has +different semantics: + +1. It does not call `.resume()` on streams2+ streams. streams2 streams monkeypatch `.pipe` +when entering flowing mode; avoiding `resume()` avoids that fate. +2. It does not examine `._readableState`; instead it checks for the presence of `._read`. + +## API + +### exhaust(Stream s) -> Stream s + +Takes a stream, `s`, and returns it. Ensures that the stream is flowing, either by calling +`.resume()` if the stream is a streams1 stream, or by piping it to a "black hole" stream that +continually asks for more data. + +## License + +MIT diff --git a/node_modules/stream-exhaust/index.js b/node_modules/stream-exhaust/index.js new file mode 100644 index 00000000..7a1d2734 --- /dev/null +++ b/node_modules/stream-exhaust/index.js @@ -0,0 +1,34 @@ +var Writable = require('stream').Writable; +var inherits = require('util').inherits; + +module.exports = resumer; + +function resumer(stream) { + if (!stream.readable) { + return stream; + } + + if (stream._read) { + stream.pipe(new Sink); + return stream; + } + + if (typeof stream.resume === 'function') { + stream.resume(); + return stream; + } + + return stream; +} + +function Sink() { + Writable.call(this, { + objectMode: true + }); +} + +inherits(Sink, Writable); + +Sink.prototype._write = function(chunk, encoding, cb) { + setImmediate(cb); +}; diff --git a/node_modules/stream-exhaust/package.json b/node_modules/stream-exhaust/package.json new file mode 100644 index 00000000..ed4dcbce --- /dev/null +++ b/node_modules/stream-exhaust/package.json @@ -0,0 +1,24 @@ +{ + "name": "stream-exhaust", + "version": "1.0.2", + "description": "Ensure that a stream is flowing data without mutating it", + "main": "index.js", + "scripts": { + "test": "node test.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/chrisdickinson/stream-exhaust.git" + }, + "author": "Chris Dickinson ", + "license": "MIT", + "bugs": { + "url": "https://github.com/chrisdickinson/stream-exhaust.git" + }, + "homepage": "https://github.com/chrisdickinson/stream-exhaust.git", + "devDependencies": { + "readable-stream": "^1.0.31", + "tape": "^2.14.0", + "through2": "^0.5.1" + } +} diff --git a/node_modules/stream-exhaust/test.js b/node_modules/stream-exhaust/test.js new file mode 100644 index 00000000..34530bf9 --- /dev/null +++ b/node_modules/stream-exhaust/test.js @@ -0,0 +1,209 @@ +var test = require('tape'); +var exhaust = require('./index.js'); +var Stream = require('stream'); +var Readable = Stream.Readable; +var Writable = Stream.Writable; +var Duplex = Stream.Duplex; +var through = require('through2'); +var S2Readable = require('readable-stream').Readable; + +test('it should cause a Readable stream to complete if it\'s not piped anywhere', function(assert) { + var rs = new Readable({highWaterMark: 2}); + var a = 0; + var ended = false; + rs._read = function() { + if (a++ < 100) { + rs.push(a + ""); + } else { + ended = true; + rs.push(null); + } + }; + + rs.on("end", function() { + assert.ok(a > 99, 'a should be > 99'); + assert.ok(ended, 'it should end'); + assert.end(); + }); + + exhaust(rs); +}); + +test('should work with Readable streams in objectMode', function(assert) { + var rs = new Readable({highWaterMark: 2, objectMode: true}); + var a = 0; + var ended = false; + rs._read = function() { + if (a++ < 100) { + rs.push(a); + } else { + ended = true; + rs.push(null); + } + }; + + rs.on("end", function() { + assert.ok(a > 99, 'a > 99'); + assert.ok(ended, 'ended is true'); + assert.end(); + }); + + exhaust(rs); +}); + +test('should not interfere with a Readable stream that is piped somewhere', function(assert) { + var rs = new Readable({highWaterMark: 2}); + var a = 0; + var ended = false; + rs._read = function() { + if (a++ < 100) { + rs.push("."); + } else { + ended = true; + rs.push(null); + } + }; + + var sizeRead = 0; + var ws = new Writable({highWaterMark: 2}); + ws._write = function(chunk, enc, next) { + sizeRead += chunk.length; + next(); + } + + ws.on("finish", function() { + assert.ok(a > 99, 'a > 99'); + assert.ok(ended, 'ended is true'); + assert.equal(sizeRead, 100, 'sizeRead === 100'); + assert.end(); + }); + + rs.pipe(ws); + + exhaust(rs); +}); + +test('should not interfere with a Writable stream', function(assert) { + var rs = new Readable({highWaterMark: 2}); + var a = 0; + var ended = false; + rs._read = function() { + if (a++ < 100) { + rs.push("."); + } else { + ended = true; + rs.push(null); + } + }; + + var sizeRead = 0; + var ws = new Writable({highWaterMark: 2}); + ws._write = function(chunk, enc, next) { + sizeRead += chunk.length; + next(); + } + + ws.on("finish", function() { + assert.ok(a > 99, 'a > 99'); + assert.ok(ended, 'ended is true'); + assert.equal(sizeRead, 100, 'sizeRead === 100'); + assert.end(); + }); + + rs.pipe(ws); + + exhaust(ws); +}); + +test('should handle a Transform stream', function(assert) { + var rs = new Readable({highWaterMark: 2}); + var a = 0; + var ended = false; + rs._read = function() { + if (a++ < 100) { + rs.push("."); + } else { + ended = true; + rs.push(null); + } + }; + + var sizeRead = 0; + var flushed = false; + var ts = through({highWaterMark: 2}, function(chunk, enc, cb) { + sizeRead += chunk.length; + this.push(chunk); + cb(); + }, function(cb) { + flushed = true; + cb(); + }); + + ts.on("end", function() { + assert.ok(a > 99, 'a > 99'); + assert.ok(ended, 'ended is true'); + assert.equal(sizeRead, 100, 'sizeRead === 100'); + assert.ok(flushed, 'flushed is true'); + assert.end(); + }); + + rs.pipe(ts); + + exhaust(ts); +}); + +test('should handle a classic stream', function(assert) { + var rs = new Stream(); + var ended = false; + var i; + + rs.on("end", function() { + assert.ok(ended, 'ended is true'); + assert.end(); + }); + + exhaust(rs); + + for (i = 0; i < 100; i++) { + rs.emit("data", i); + } + ended = true; + rs.emit("end"); +}); + +test('should not modify .pipe', function(assert) { + var stream = new S2Readable; + + var pipe = stream.pipe; + + stream._read = function() { + stream.push('ending'); + stream.push(null); + }; + + exhaust(stream); + + assert.equal(stream.pipe, pipe); + assert.end(); +}); + +test('does not error on no resume but readable set to true', function(assert) { + var rs = new Stream(); + rs.readable = true; + + var ended = false; + var i; + + rs.on("end", function() { + assert.ok(ended, 'ended is true'); + assert.end(); + }); + + exhaust(rs); + + for (i = 0; i < 100; i++) { + rs.emit("data", i); + } + ended = true; + rs.emit("end"); +}); diff --git a/node_modules/stream-shift/.travis.yml b/node_modules/stream-shift/.travis.yml new file mode 100644 index 00000000..ecd4193f --- /dev/null +++ b/node_modules/stream-shift/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.10" + - "0.12" + - "4" + - "6" diff --git a/node_modules/stream-shift/LICENSE b/node_modules/stream-shift/LICENSE new file mode 100644 index 00000000..bae9da7b --- /dev/null +++ b/node_modules/stream-shift/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/stream-shift/README.md b/node_modules/stream-shift/README.md new file mode 100644 index 00000000..d9cc2d94 --- /dev/null +++ b/node_modules/stream-shift/README.md @@ -0,0 +1,25 @@ +# stream-shift + +Returns the next buffer/object in a stream's readable queue + +``` +npm install stream-shift +``` + +[![build status](http://img.shields.io/travis/mafintosh/stream-shift.svg?style=flat)](http://travis-ci.org/mafintosh/stream-shift) + +## Usage + +``` js +var shift = require('stream-shift') + +console.log(shift(someStream)) // first item in its buffer +``` + +## Credit + +Thanks [@dignifiedquire](https://github.com/dignifiedquire) for making this work on node 6 + +## License + +MIT diff --git a/node_modules/stream-shift/index.js b/node_modules/stream-shift/index.js new file mode 100644 index 00000000..33cc4d74 --- /dev/null +++ b/node_modules/stream-shift/index.js @@ -0,0 +1,20 @@ +module.exports = shift + +function shift (stream) { + var rs = stream._readableState + if (!rs) return null + return (rs.objectMode || typeof stream._duplexState === 'number') ? stream.read() : stream.read(getStateLength(rs)) +} + +function getStateLength (state) { + if (state.buffer.length) { + // Since node 6.3.0 state.buffer is a BufferList not an array + if (state.buffer.head) { + return state.buffer.head.data.length + } + + return state.buffer[0].length + } + + return state.length +} diff --git a/node_modules/stream-shift/package.json b/node_modules/stream-shift/package.json new file mode 100644 index 00000000..fe7347a0 --- /dev/null +++ b/node_modules/stream-shift/package.json @@ -0,0 +1,25 @@ +{ + "name": "stream-shift", + "version": "1.0.1", + "description": "Returns the next buffer/object in a stream's readable queue", + "main": "index.js", + "dependencies": {}, + "devDependencies": { + "standard": "^7.1.2", + "tape": "^4.6.0", + "through2": "^2.0.1" + }, + "scripts": { + "test": "standard && tape test.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/mafintosh/stream-shift.git" + }, + "author": "Mathias Buus (@mafintosh)", + "license": "MIT", + "bugs": { + "url": "https://github.com/mafintosh/stream-shift/issues" + }, + "homepage": "https://github.com/mafintosh/stream-shift" +} diff --git a/node_modules/stream-shift/test.js b/node_modules/stream-shift/test.js new file mode 100644 index 00000000..c0222c37 --- /dev/null +++ b/node_modules/stream-shift/test.js @@ -0,0 +1,48 @@ +var tape = require('tape') +var through = require('through2') +var stream = require('stream') +var shift = require('./') + +tape('shifts next', function (t) { + var passthrough = through() + + passthrough.write('hello') + passthrough.write('world') + + t.same(shift(passthrough), Buffer('hello')) + t.same(shift(passthrough), Buffer('world')) + t.end() +}) + +tape('shifts next with core', function (t) { + var passthrough = stream.PassThrough() + + passthrough.write('hello') + passthrough.write('world') + + t.same(shift(passthrough), Buffer('hello')) + t.same(shift(passthrough), Buffer('world')) + t.end() +}) + +tape('shifts next with object mode', function (t) { + var passthrough = through({objectMode: true}) + + passthrough.write({hello: 1}) + passthrough.write({world: 1}) + + t.same(shift(passthrough), {hello: 1}) + t.same(shift(passthrough), {world: 1}) + t.end() +}) + +tape('shifts next with object mode with core', function (t) { + var passthrough = stream.PassThrough({objectMode: true}) + + passthrough.write({hello: 1}) + passthrough.write({world: 1}) + + t.same(shift(passthrough), {hello: 1}) + t.same(shift(passthrough), {world: 1}) + t.end() +}) diff --git a/node_modules/string-width/index.js b/node_modules/string-width/index.js new file mode 100644 index 00000000..b9bec624 --- /dev/null +++ b/node_modules/string-width/index.js @@ -0,0 +1,37 @@ +'use strict'; +var stripAnsi = require('strip-ansi'); +var codePointAt = require('code-point-at'); +var isFullwidthCodePoint = require('is-fullwidth-code-point'); + +// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1345 +module.exports = function (str) { + if (typeof str !== 'string' || str.length === 0) { + return 0; + } + + var width = 0; + + str = stripAnsi(str); + + for (var i = 0; i < str.length; i++) { + var code = codePointAt(str, i); + + // ignore control characters + if (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) { + continue; + } + + // surrogates + if (code >= 0x10000) { + i++; + } + + if (isFullwidthCodePoint(code)) { + width += 2; + } else { + width++; + } + } + + return width; +}; diff --git a/node_modules/string-width/license b/node_modules/string-width/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/string-width/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js b/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js new file mode 100644 index 00000000..a7d3e385 --- /dev/null +++ b/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js @@ -0,0 +1,46 @@ +'use strict'; +var numberIsNan = require('number-is-nan'); + +module.exports = function (x) { + if (numberIsNan(x)) { + return false; + } + + // https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1369 + + // code points are derived from: + // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt + if (x >= 0x1100 && ( + x <= 0x115f || // Hangul Jamo + 0x2329 === x || // LEFT-POINTING ANGLE BRACKET + 0x232a === x || // RIGHT-POINTING ANGLE BRACKET + // CJK Radicals Supplement .. Enclosed CJK Letters and Months + (0x2e80 <= x && x <= 0x3247 && x !== 0x303f) || + // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A + 0x3250 <= x && x <= 0x4dbf || + // CJK Unified Ideographs .. Yi Radicals + 0x4e00 <= x && x <= 0xa4c6 || + // Hangul Jamo Extended-A + 0xa960 <= x && x <= 0xa97c || + // Hangul Syllables + 0xac00 <= x && x <= 0xd7a3 || + // CJK Compatibility Ideographs + 0xf900 <= x && x <= 0xfaff || + // Vertical Forms + 0xfe10 <= x && x <= 0xfe19 || + // CJK Compatibility Forms .. Small Form Variants + 0xfe30 <= x && x <= 0xfe6b || + // Halfwidth and Fullwidth Forms + 0xff01 <= x && x <= 0xff60 || + 0xffe0 <= x && x <= 0xffe6 || + // Kana Supplement + 0x1b000 <= x && x <= 0x1b001 || + // Enclosed Ideographic Supplement + 0x1f200 <= x && x <= 0x1f251 || + // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane + 0x20000 <= x && x <= 0x3fffd)) { + return true; + } + + return false; +} diff --git a/node_modules/string-width/node_modules/is-fullwidth-code-point/license b/node_modules/string-width/node_modules/is-fullwidth-code-point/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/string-width/node_modules/is-fullwidth-code-point/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json b/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json new file mode 100644 index 00000000..b678d40d --- /dev/null +++ b/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json @@ -0,0 +1,45 @@ +{ + "name": "is-fullwidth-code-point", + "version": "1.0.0", + "description": "Check if the character represented by a given Unicode code point is fullwidth", + "license": "MIT", + "repository": "sindresorhus/is-fullwidth-code-point", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "node test.js" + }, + "files": [ + "index.js" + ], + "keywords": [ + "fullwidth", + "full-width", + "full", + "width", + "unicode", + "character", + "char", + "string", + "str", + "codepoint", + "code", + "point", + "is", + "detect", + "check" + ], + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "devDependencies": { + "ava": "0.0.4", + "code-point-at": "^1.0.0" + } +} diff --git a/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md b/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md new file mode 100644 index 00000000..4936464b --- /dev/null +++ b/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md @@ -0,0 +1,39 @@ +# is-fullwidth-code-point [![Build Status](https://travis-ci.org/sindresorhus/is-fullwidth-code-point.svg?branch=master)](https://travis-ci.org/sindresorhus/is-fullwidth-code-point) + +> Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) + + +## Install + +``` +$ npm install --save is-fullwidth-code-point +``` + + +## Usage + +```js +var isFullwidthCodePoint = require('is-fullwidth-code-point'); + +isFullwidthCodePoint('谢'.codePointAt()); +//=> true + +isFullwidthCodePoint('a'.codePointAt()); +//=> false +``` + + +## API + +### isFullwidthCodePoint(input) + +#### input + +Type: `number` + +[Code point](https://en.wikipedia.org/wiki/Code_point) of a character. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/string-width/package.json b/node_modules/string-width/package.json new file mode 100644 index 00000000..5ba43616 --- /dev/null +++ b/node_modules/string-width/package.json @@ -0,0 +1,56 @@ +{ + "name": "string-width", + "version": "1.0.2", + "description": "Get the visual width of a string - the number of columns required to display it", + "license": "MIT", + "repository": "sindresorhus/string-width", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "string", + "str", + "character", + "char", + "unicode", + "width", + "visual", + "column", + "columns", + "fullwidth", + "full-width", + "full", + "ansi", + "escape", + "codes", + "cli", + "command-line", + "terminal", + "console", + "cjk", + "chinese", + "japanese", + "korean", + "fixed-width" + ], + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/string-width/readme.md b/node_modules/string-width/readme.md new file mode 100644 index 00000000..1ab42c93 --- /dev/null +++ b/node_modules/string-width/readme.md @@ -0,0 +1,42 @@ +# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width) + +> Get the visual width of a string - the number of columns required to display it + +Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. + +Useful to be able to measure the actual width of command-line output. + + +## Install + +``` +$ npm install --save string-width +``` + + +## Usage + +```js +const stringWidth = require('string-width'); + +stringWidth('古'); +//=> 2 + +stringWidth('\u001b[1m古\u001b[22m'); +//=> 2 + +stringWidth('a'); +//=> 1 +``` + + +## Related + +- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module +- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string +- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/string_decoder/.travis.yml b/node_modules/string_decoder/.travis.yml new file mode 100644 index 00000000..3347a725 --- /dev/null +++ b/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/string_decoder/LICENSE b/node_modules/string_decoder/LICENSE new file mode 100644 index 00000000..778edb20 --- /dev/null +++ b/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + diff --git a/node_modules/string_decoder/README.md b/node_modules/string_decoder/README.md new file mode 100644 index 00000000..5fd58315 --- /dev/null +++ b/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/string_decoder/node_modules/safe-buffer/LICENSE b/node_modules/string_decoder/node_modules/safe-buffer/LICENSE new file mode 100644 index 00000000..0c068cee --- /dev/null +++ b/node_modules/string_decoder/node_modules/safe-buffer/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/string_decoder/node_modules/safe-buffer/README.md b/node_modules/string_decoder/node_modules/safe-buffer/README.md new file mode 100644 index 00000000..e9a81afd --- /dev/null +++ b/node_modules/string_decoder/node_modules/safe-buffer/README.md @@ -0,0 +1,584 @@ +# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url] + +[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg +[travis-url]: https://travis-ci.org/feross/safe-buffer +[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg +[npm-url]: https://npmjs.org/package/safe-buffer +[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg +[downloads-url]: https://npmjs.org/package/safe-buffer +[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg +[standard-url]: https://standardjs.com + +#### Safer Node.js Buffer API + +**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`, +`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.** + +**Uses the built-in implementation when available.** + +## install + +``` +npm install safe-buffer +``` + +## usage + +The goal of this package is to provide a safe replacement for the node.js `Buffer`. + +It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to +the top of your node.js modules: + +```js +var Buffer = require('safe-buffer').Buffer + +// Existing buffer code will continue to work without issues: + +new Buffer('hey', 'utf8') +new Buffer([1, 2, 3], 'utf8') +new Buffer(obj) +new Buffer(16) // create an uninitialized buffer (potentially unsafe) + +// But you can use these new explicit APIs to make clear what you want: + +Buffer.from('hey', 'utf8') // convert from many types to a Buffer +Buffer.alloc(16) // create a zero-filled buffer (safe) +Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe) +``` + +## api + +### Class Method: Buffer.from(array) + + +* `array` {Array} + +Allocates a new `Buffer` using an `array` of octets. + +```js +const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]); + // creates a new Buffer containing ASCII bytes + // ['b','u','f','f','e','r'] +``` + +A `TypeError` will be thrown if `array` is not an `Array`. + +### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]]) + + +* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or + a `new ArrayBuffer()` +* `byteOffset` {Number} Default: `0` +* `length` {Number} Default: `arrayBuffer.length - byteOffset` + +When passed a reference to the `.buffer` property of a `TypedArray` instance, +the newly created `Buffer` will share the same allocated memory as the +TypedArray. + +```js +const arr = new Uint16Array(2); +arr[0] = 5000; +arr[1] = 4000; + +const buf = Buffer.from(arr.buffer); // shares the memory with arr; + +console.log(buf); + // Prints: + +// changing the TypedArray changes the Buffer also +arr[1] = 6000; + +console.log(buf); + // Prints: +``` + +The optional `byteOffset` and `length` arguments specify a memory range within +the `arrayBuffer` that will be shared by the `Buffer`. + +```js +const ab = new ArrayBuffer(10); +const buf = Buffer.from(ab, 0, 2); +console.log(buf.length); + // Prints: 2 +``` + +A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`. + +### Class Method: Buffer.from(buffer) + + +* `buffer` {Buffer} + +Copies the passed `buffer` data onto a new `Buffer` instance. + +```js +const buf1 = Buffer.from('buffer'); +const buf2 = Buffer.from(buf1); + +buf1[0] = 0x61; +console.log(buf1.toString()); + // 'auffer' +console.log(buf2.toString()); + // 'buffer' (copy is not changed) +``` + +A `TypeError` will be thrown if `buffer` is not a `Buffer`. + +### Class Method: Buffer.from(str[, encoding]) + + +* `str` {String} String to encode. +* `encoding` {String} Encoding to use, Default: `'utf8'` + +Creates a new `Buffer` containing the given JavaScript string `str`. If +provided, the `encoding` parameter identifies the character encoding. +If not provided, `encoding` defaults to `'utf8'`. + +```js +const buf1 = Buffer.from('this is a tést'); +console.log(buf1.toString()); + // prints: this is a tést +console.log(buf1.toString('ascii')); + // prints: this is a tC)st + +const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex'); +console.log(buf2.toString()); + // prints: this is a tést +``` + +A `TypeError` will be thrown if `str` is not a string. + +### Class Method: Buffer.alloc(size[, fill[, encoding]]) + + +* `size` {Number} +* `fill` {Value} Default: `undefined` +* `encoding` {String} Default: `utf8` + +Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the +`Buffer` will be *zero-filled*. + +```js +const buf = Buffer.alloc(5); +console.log(buf); + // +``` + +The `size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +If `fill` is specified, the allocated `Buffer` will be initialized by calling +`buf.fill(fill)`. See [`buf.fill()`][] for more information. + +```js +const buf = Buffer.alloc(5, 'a'); +console.log(buf); + // +``` + +If both `fill` and `encoding` are specified, the allocated `Buffer` will be +initialized by calling `buf.fill(fill, encoding)`. For example: + +```js +const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64'); +console.log(buf); + // +``` + +Calling `Buffer.alloc(size)` can be significantly slower than the alternative +`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance +contents will *never contain sensitive data*. + +A `TypeError` will be thrown if `size` is not a number. + +### Class Method: Buffer.allocUnsafe(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* `Buffer` of `size` bytes. The `size` must +be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit +architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is +thrown. A zero-length Buffer will be created if a `size` less than or equal to +0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +```js +const buf = Buffer.allocUnsafe(5); +console.log(buf); + // + // (octets will be different, every time) +buf.fill(0); +console.log(buf); + // +``` + +A `TypeError` will be thrown if `size` is not a number. + +Note that the `Buffer` module pre-allocates an internal `Buffer` instance of +size `Buffer.poolSize` that is used as a pool for the fast allocation of new +`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated +`new Buffer(size)` constructor) only when `size` is less than or equal to +`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default +value of `Buffer.poolSize` is `8192` but can be modified. + +Use of this pre-allocated internal memory pool is a key difference between +calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`. +Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer +pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal +Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The +difference is subtle but can be important when an application requires the +additional performance that `Buffer.allocUnsafe(size)` provides. + +### Class Method: Buffer.allocUnsafeSlow(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes. The +`size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances, +allocations under 4KB are, by default, sliced from a single pre-allocated +`Buffer`. This allows applications to avoid the garbage collection overhead of +creating many individually allocated Buffers. This approach improves both +performance and memory usage by eliminating the need to track and cleanup as +many `Persistent` objects. + +However, in the case where a developer may need to retain a small chunk of +memory from a pool for an indeterminate amount of time, it may be appropriate +to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then +copy out the relevant bits. + +```js +// need to keep around a few small chunks of memory +const store = []; + +socket.on('readable', () => { + const data = socket.read(); + // allocate for retained data + const sb = Buffer.allocUnsafeSlow(10); + // copy the data into the new allocation + data.copy(sb, 0, 0, 10); + store.push(sb); +}); +``` + +Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after* +a developer has observed undue memory retention in their applications. + +A `TypeError` will be thrown if `size` is not a number. + +### All the Rest + +The rest of the `Buffer` API is exactly the same as in node.js. +[See the docs](https://nodejs.org/api/buffer.html). + + +## Related links + +- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660) +- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4) + +## Why is `Buffer` unsafe? + +Today, the node.js `Buffer` constructor is overloaded to handle many different argument +types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.), +`ArrayBuffer`, and also `Number`. + +The API is optimized for convenience: you can throw any type at it, and it will try to do +what you want. + +Because the Buffer constructor is so powerful, you often see code like this: + +```js +// Convert UTF-8 strings to hex +function toHex (str) { + return new Buffer(str).toString('hex') +} +``` + +***But what happens if `toHex` is called with a `Number` argument?*** + +### Remote Memory Disclosure + +If an attacker can make your program call the `Buffer` constructor with a `Number` +argument, then they can make it allocate uninitialized memory from the node.js process. +This could potentially disclose TLS private keys, user data, or database passwords. + +When the `Buffer` constructor is passed a `Number` argument, it returns an +**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like +this, you **MUST** overwrite the contents before returning it to the user. + +From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size): + +> `new Buffer(size)` +> +> - `size` Number +> +> The underlying memory for `Buffer` instances created in this way is not initialized. +> **The contents of a newly created `Buffer` are unknown and could contain sensitive +> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes. + +(Emphasis our own.) + +Whenever the programmer intended to create an uninitialized `Buffer` you often see code +like this: + +```js +var buf = new Buffer(16) + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### Would this ever be a problem in real code? + +Yes. It's surprisingly common to forget to check the type of your variables in a +dynamically-typed language like JavaScript. + +Usually the consequences of assuming the wrong type is that your program crashes with an +uncaught exception. But the failure mode for forgetting to check the type of arguments to +the `Buffer` constructor is more catastrophic. + +Here's an example of a vulnerable service that takes a JSON payload and converts it to +hex: + +```js +// Take a JSON payload {str: "some string"} and convert it to hex +var server = http.createServer(function (req, res) { + var data = '' + req.setEncoding('utf8') + req.on('data', function (chunk) { + data += chunk + }) + req.on('end', function () { + var body = JSON.parse(data) + res.end(new Buffer(body.str).toString('hex')) + }) +}) + +server.listen(8080) +``` + +In this example, an http client just has to send: + +```json +{ + "str": 1000 +} +``` + +and it will get back 1,000 bytes of uninitialized memory from the server. + +This is a very serious bug. It's similar in severity to the +[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process +memory by remote attackers. + + +### Which real-world packages were vulnerable? + +#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht) + +[Mathias Buus](https://github.com/mafintosh) and I +([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages, +[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow +anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get +them to reveal 20 bytes at a time of uninitialized memory from the node.js process. + +Here's +[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8) +that fixed it. We released a new fixed version, created a +[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all +vulnerable versions on npm so users will get a warning to upgrade to a newer version. + +#### [`ws`](https://www.npmjs.com/package/ws) + +That got us wondering if there were other vulnerable packages. Sure enough, within a short +period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the +most popular WebSocket implementation in node.js. + +If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as +expected, then uninitialized server memory would be disclosed to the remote peer. + +These were the vulnerable methods: + +```js +socket.send(number) +socket.ping(number) +socket.pong(number) +``` + +Here's a vulnerable socket server with some echo functionality: + +```js +server.on('connection', function (socket) { + socket.on('message', function (message) { + message = JSON.parse(message) + if (message.type === 'echo') { + socket.send(message.data) // send back the user's message + } + }) +}) +``` + +`socket.send(number)` called on the server, will disclose server memory. + +Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue +was fixed, with a more detailed explanation. Props to +[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the +[Node Security Project disclosure](https://nodesecurity.io/advisories/67). + + +### What's the solution? + +It's important that node.js offers a fast way to get memory otherwise performance-critical +applications would needlessly get a lot slower. + +But we need a better way to *signal our intent* as programmers. **When we want +uninitialized memory, we should request it explicitly.** + +Sensitive functionality should not be packed into a developer-friendly API that loosely +accepts many different types. This type of API encourages the lazy practice of passing +variables in without checking the type very carefully. + +#### A new API: `Buffer.allocUnsafe(number)` + +The functionality of creating buffers with uninitialized memory should be part of another +API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that +frequently gets user input of all sorts of different types passed into it. + +```js +var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory! + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### How do we fix node.js core? + +We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as +`semver-major`) which defends against one case: + +```js +var str = 16 +new Buffer(str, 'utf8') +``` + +In this situation, it's implied that the programmer intended the first argument to be a +string, since they passed an encoding as a second argument. Today, node.js will allocate +uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not +what the programmer intended. + +But this is only a partial solution, since if the programmer does `new Buffer(variable)` +(without an `encoding` parameter) there's no way to know what they intended. If `variable` +is sometimes a number, then uninitialized memory will sometimes be returned. + +### What's the real long-term fix? + +We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when +we need uninitialized memory. But that would break 1000s of packages. + +~~We believe the best solution is to:~~ + +~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~ + +~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~ + +#### Update + +We now support adding three new APIs: + +- `Buffer.from(value)` - convert from any type to a buffer +- `Buffer.alloc(size)` - create a zero-filled buffer +- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size + +This solves the core problem that affected `ws` and `bittorrent-dht` which is +`Buffer(variable)` getting tricked into taking a number argument. + +This way, existing code continues working and the impact on the npm ecosystem will be +minimal. Over time, npm maintainers can migrate performance-critical code to use +`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`. + + +### Conclusion + +We think there's a serious design issue with the `Buffer` API as it exists today. It +promotes insecure software by putting high-risk functionality into a convenient API +with friendly "developer ergonomics". + +This wasn't merely a theoretical exercise because we found the issue in some of the +most popular npm packages. + +Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of +`buffer`. + +```js +var Buffer = require('safe-buffer').Buffer +``` + +Eventually, we hope that node.js core can switch to this new, safer behavior. We believe +the impact on the ecosystem would be minimal since it's not a breaking change. +Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while +older, insecure packages would magically become safe from this attack vector. + + +## links + +- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514) +- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67) +- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68) + + +## credit + +The original issues in `bittorrent-dht` +([disclosure](https://nodesecurity.io/advisories/68)) and +`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by +[Mathias Buus](https://github.com/mafintosh) and +[Feross Aboukhadijeh](http://feross.org/). + +Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues +and for his work running the [Node Security Project](https://nodesecurity.io/). + +Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and +auditing the code. + + +## license + +MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org) diff --git a/node_modules/string_decoder/node_modules/safe-buffer/index.d.ts b/node_modules/string_decoder/node_modules/safe-buffer/index.d.ts new file mode 100644 index 00000000..e9fed809 --- /dev/null +++ b/node_modules/string_decoder/node_modules/safe-buffer/index.d.ts @@ -0,0 +1,187 @@ +declare module "safe-buffer" { + export class Buffer { + length: number + write(string: string, offset?: number, length?: number, encoding?: string): number; + toString(encoding?: string, start?: number, end?: number): string; + toJSON(): { type: 'Buffer', data: any[] }; + equals(otherBuffer: Buffer): boolean; + compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; + copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + slice(start?: number, end?: number): Buffer; + writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readUInt8(offset: number, noAssert?: boolean): number; + readUInt16LE(offset: number, noAssert?: boolean): number; + readUInt16BE(offset: number, noAssert?: boolean): number; + readUInt32LE(offset: number, noAssert?: boolean): number; + readUInt32BE(offset: number, noAssert?: boolean): number; + readInt8(offset: number, noAssert?: boolean): number; + readInt16LE(offset: number, noAssert?: boolean): number; + readInt16BE(offset: number, noAssert?: boolean): number; + readInt32LE(offset: number, noAssert?: boolean): number; + readInt32BE(offset: number, noAssert?: boolean): number; + readFloatLE(offset: number, noAssert?: boolean): number; + readFloatBE(offset: number, noAssert?: boolean): number; + readDoubleLE(offset: number, noAssert?: boolean): number; + readDoubleBE(offset: number, noAssert?: boolean): number; + swap16(): Buffer; + swap32(): Buffer; + swap64(): Buffer; + writeUInt8(value: number, offset: number, noAssert?: boolean): number; + writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeInt8(value: number, offset: number, noAssert?: boolean): number; + writeInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeFloatLE(value: number, offset: number, noAssert?: boolean): number; + writeFloatBE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; + fill(value: any, offset?: number, end?: number): this; + indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; + + /** + * Allocates a new buffer containing the given {str}. + * + * @param str String to store in buffer. + * @param encoding encoding to use, optional. Default is 'utf8' + */ + constructor (str: string, encoding?: string); + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + */ + constructor (size: number); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: Uint8Array); + /** + * Produces a Buffer backed by the same allocated memory as + * the given {ArrayBuffer}. + * + * + * @param arrayBuffer The ArrayBuffer with which to share memory. + */ + constructor (arrayBuffer: ArrayBuffer); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: any[]); + /** + * Copies the passed {buffer} data onto a new {Buffer} instance. + * + * @param buffer The buffer to copy. + */ + constructor (buffer: Buffer); + prototype: Buffer; + /** + * Allocates a new Buffer using an {array} of octets. + * + * @param array + */ + static from(array: any[]): Buffer; + /** + * When passed a reference to the .buffer property of a TypedArray instance, + * the newly created Buffer will share the same allocated memory as the TypedArray. + * The optional {byteOffset} and {length} arguments specify a memory range + * within the {arrayBuffer} that will be shared by the Buffer. + * + * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer() + * @param byteOffset + * @param length + */ + static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; + /** + * Copies the passed {buffer} data onto a new Buffer instance. + * + * @param buffer + */ + static from(buffer: Buffer): Buffer; + /** + * Creates a new Buffer containing the given JavaScript string {str}. + * If provided, the {encoding} parameter identifies the character encoding. + * If not provided, {encoding} defaults to 'utf8'. + * + * @param str + */ + static from(str: string, encoding?: string): Buffer; + /** + * Returns true if {obj} is a Buffer + * + * @param obj object to test. + */ + static isBuffer(obj: any): obj is Buffer; + /** + * Returns true if {encoding} is a valid encoding argument. + * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex' + * + * @param encoding string to test. + */ + static isEncoding(encoding: string): boolean; + /** + * Gives the actual byte length of a string. encoding defaults to 'utf8'. + * This is not the same as String.prototype.length since that returns the number of characters in a string. + * + * @param string string to test. + * @param encoding encoding used to evaluate (defaults to 'utf8') + */ + static byteLength(string: string, encoding?: string): number; + /** + * Returns a buffer which is the result of concatenating all the buffers in the list together. + * + * If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer. + * If the list has exactly one item, then the first item of the list is returned. + * If the list has more than one item, then a new Buffer is created. + * + * @param list An array of Buffer objects to concatenate + * @param totalLength Total length of the buffers when concatenated. + * If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly. + */ + static concat(list: Buffer[], totalLength?: number): Buffer; + /** + * The same as buf1.compare(buf2). + */ + static compare(buf1: Buffer, buf2: Buffer): number; + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + * @param fill if specified, buffer will be initialized by calling buf.fill(fill). + * If parameter is omitted, buffer will be filled with zeros. + * @param encoding encoding used for call to buf.fill while initalizing + */ + static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; + /** + * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafe(size: number): Buffer; + /** + * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafeSlow(size: number): Buffer; + } +} \ No newline at end of file diff --git a/node_modules/string_decoder/node_modules/safe-buffer/index.js b/node_modules/string_decoder/node_modules/safe-buffer/index.js new file mode 100644 index 00000000..22438dab --- /dev/null +++ b/node_modules/string_decoder/node_modules/safe-buffer/index.js @@ -0,0 +1,62 @@ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} diff --git a/node_modules/string_decoder/node_modules/safe-buffer/package.json b/node_modules/string_decoder/node_modules/safe-buffer/package.json new file mode 100644 index 00000000..623fbc3f --- /dev/null +++ b/node_modules/string_decoder/node_modules/safe-buffer/package.json @@ -0,0 +1,37 @@ +{ + "name": "safe-buffer", + "description": "Safer Node.js Buffer API", + "version": "5.1.2", + "author": { + "name": "Feross Aboukhadijeh", + "email": "feross@feross.org", + "url": "http://feross.org" + }, + "bugs": { + "url": "https://github.com/feross/safe-buffer/issues" + }, + "devDependencies": { + "standard": "*", + "tape": "^4.0.0" + }, + "homepage": "https://github.com/feross/safe-buffer", + "keywords": [ + "buffer", + "buffer allocate", + "node security", + "safe", + "safe-buffer", + "security", + "uninitialized" + ], + "license": "MIT", + "main": "index.js", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "git://github.com/feross/safe-buffer.git" + }, + "scripts": { + "test": "standard && tape test/*.js" + } +} diff --git a/node_modules/string_decoder/package.json b/node_modules/string_decoder/package.json new file mode 100644 index 00000000..518c3eb9 --- /dev/null +++ b/node_modules/string_decoder/package.json @@ -0,0 +1,31 @@ +{ + "name": "string_decoder", + "version": "1.1.1", + "description": "The string_decoder module from Node core", + "main": "lib/string_decoder.js", + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "scripts": { + "test": "tap test/parallel/*.js && node test/verify-dependencies", + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT" +} diff --git a/node_modules/strip-ansi/index.js b/node_modules/strip-ansi/index.js new file mode 100644 index 00000000..099480fb --- /dev/null +++ b/node_modules/strip-ansi/index.js @@ -0,0 +1,6 @@ +'use strict'; +var ansiRegex = require('ansi-regex')(); + +module.exports = function (str) { + return typeof str === 'string' ? str.replace(ansiRegex, '') : str; +}; diff --git a/node_modules/strip-ansi/license b/node_modules/strip-ansi/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/strip-ansi/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/strip-ansi/package.json b/node_modules/strip-ansi/package.json new file mode 100644 index 00000000..301685ba --- /dev/null +++ b/node_modules/strip-ansi/package.json @@ -0,0 +1,57 @@ +{ + "name": "strip-ansi", + "version": "3.0.1", + "description": "Strip ANSI escape codes", + "license": "MIT", + "repository": "chalk/strip-ansi", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "maintainers": [ + "Sindre Sorhus (sindresorhus.com)", + "Joshua Boy Nicolai Appelman (jbna.nl)", + "JD Ballard (github.com/qix-)" + ], + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/strip-ansi/readme.md b/node_modules/strip-ansi/readme.md new file mode 100644 index 00000000..cb7d9ff7 --- /dev/null +++ b/node_modules/strip-ansi/readme.md @@ -0,0 +1,33 @@ +# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) + +> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install --save strip-ansi +``` + + +## Usage + +```js +var stripAnsi = require('strip-ansi'); + +stripAnsi('\u001b[4mcake\u001b[0m'); +//=> 'cake' +``` + + +## Related + +- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module +- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes +- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/strip-bom-string/LICENSE b/node_modules/strip-bom-string/LICENSE new file mode 100644 index 00000000..ec85897e --- /dev/null +++ b/node_modules/strip-bom-string/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, 2017, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/strip-bom-string/README.md b/node_modules/strip-bom-string/README.md new file mode 100644 index 00000000..e7e5990f --- /dev/null +++ b/node_modules/strip-bom-string/README.md @@ -0,0 +1,66 @@ +# strip-bom-string [![NPM version](https://img.shields.io/npm/v/strip-bom-string.svg?style=flat)](https://www.npmjs.com/package/strip-bom-string) [![NPM monthly downloads](https://img.shields.io/npm/dm/strip-bom-string.svg?style=flat)](https://npmjs.org/package/strip-bom-string) [![NPM total downloads](https://img.shields.io/npm/dt/strip-bom-string.svg?style=flat)](https://npmjs.org/package/strip-bom-string) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/strip-bom-string.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/strip-bom-string) + +> Strip a byte order mark (BOM) from a string. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save strip-bom-string +``` + +## Usage + +```js +var strip = require('strip-bom-string'); +strip('\ufefffoo'); +//=> 'foo' +``` + +## About + +### Related projects + +* [cr](https://www.npmjs.com/package/cr): Strip windows carriage returns, or convert carriage returns to newlines. | [homepage](https://github.com/jonschlinkert/cr "Strip windows carriage returns, or convert carriage returns to newlines.") +* [has-bom](https://www.npmjs.com/package/has-bom): Returns true if a buffer or string has a byte order mark (BOM) | [homepage](https://github.com/jonschlinkert/has-bom "Returns true if a buffer or string has a byte order mark (BOM)") +* [read-file](https://www.npmjs.com/package/read-file): Thin wrapper around fs.readFile and fs.readFileSync that also strips byte order marks when `utf8` encoding… [more](https://github.com/jonschlinkert/read-file) | [homepage](https://github.com/jonschlinkert/read-file "Thin wrapper around fs.readFile and fs.readFileSync that also strips byte order marks when `utf8` encoding is chosen. Also optionally replaces windows newlines with unix newlines.") +* [strip-bom-buffer](https://www.npmjs.com/package/strip-bom-buffer): Strip a byte order mark (BOM) from a buffer. | [homepage](https://github.com/jonschlinkert/strip-bom-buffer "Strip a byte order mark (BOM) from a buffer.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.4.3, on March 29, 2017._ \ No newline at end of file diff --git a/node_modules/strip-bom-string/index.js b/node_modules/strip-bom-string/index.js new file mode 100644 index 00000000..4caff84d --- /dev/null +++ b/node_modules/strip-bom-string/index.js @@ -0,0 +1,15 @@ +/*! + * strip-bom-string + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +module.exports = function(str) { + if (typeof str === 'string' && str.charAt(0) === '\ufeff') { + return str.slice(1); + } + return str; +}; diff --git a/node_modules/strip-bom-string/package.json b/node_modules/strip-bom-string/package.json new file mode 100644 index 00000000..b0c80fa2 --- /dev/null +++ b/node_modules/strip-bom-string/package.json @@ -0,0 +1,60 @@ +{ + "name": "strip-bom-string", + "description": "Strip a byte order mark (BOM) from a string.", + "version": "1.0.0", + "homepage": "https://github.com/jonschlinkert/strip-bom-string", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/strip-bom-string", + "bugs": { + "url": "https://github.com/jonschlinkert/strip-bom-string/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "gulp-format-md": "^0.1.11", + "mocha": "^3.2.0" + }, + "keywords": [ + "bom", + "byte", + "byte-order-mark", + "file", + "fs", + "mark", + "nl", + "normalize", + "order", + "string", + "strip" + ], + "verb": { + "related": { + "list": [ + "cr", + "has-bom", + "read-file", + "strip-bom-buffer" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/strip-bom/index.js b/node_modules/strip-bom/index.js new file mode 100644 index 00000000..5695c5c7 --- /dev/null +++ b/node_modules/strip-bom/index.js @@ -0,0 +1,17 @@ +'use strict'; +var isUtf8 = require('is-utf8'); + +module.exports = function (x) { + // Catches EFBBBF (UTF-8 BOM) because the buffer-to-string + // conversion translates it to FEFF (UTF-16 BOM) + if (typeof x === 'string' && x.charCodeAt(0) === 0xFEFF) { + return x.slice(1); + } + + if (Buffer.isBuffer(x) && isUtf8(x) && + x[0] === 0xEF && x[1] === 0xBB && x[2] === 0xBF) { + return x.slice(3); + } + + return x; +}; diff --git a/node_modules/strip-bom/license b/node_modules/strip-bom/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/strip-bom/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/strip-bom/package.json b/node_modules/strip-bom/package.json new file mode 100644 index 00000000..8fe93ea5 --- /dev/null +++ b/node_modules/strip-bom/package.json @@ -0,0 +1,42 @@ +{ + "name": "strip-bom", + "version": "2.0.0", + "description": "Strip UTF-8 byte order mark (BOM) from a string/buffer", + "license": "MIT", + "repository": "sindresorhus/strip-bom", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "files": [ + "index.js" + ], + "keywords": [ + "bom", + "strip", + "byte", + "mark", + "unicode", + "utf8", + "utf-8", + "remove", + "delete", + "trim", + "text", + "buffer", + "string" + ], + "dependencies": { + "is-utf8": "^0.2.0" + }, + "devDependencies": { + "mocha": "*" + } +} diff --git a/node_modules/strip-bom/readme.md b/node_modules/strip-bom/readme.md new file mode 100644 index 00000000..8ecf258b --- /dev/null +++ b/node_modules/strip-bom/readme.md @@ -0,0 +1,39 @@ +# strip-bom [![Build Status](https://travis-ci.org/sindresorhus/strip-bom.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-bom) + +> Strip UTF-8 [byte order mark](http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8) (BOM) from a string/buffer + +From Wikipedia: + +> The Unicode Standard permits the BOM in UTF-8, but does not require nor recommend its use. Byte order has no meaning in UTF-8. + + +## Install + +``` +$ npm install --save strip-bom +``` + + +## Usage + +```js +var fs = require('fs'); +var stripBom = require('strip-bom'); + +stripBom('\uFEFFunicorn'); +//=> 'unicorn' + +stripBom(fs.readFileSync('unicorn.txt')); +//=> 'unicorn' +``` + + +## Related + +- [strip-bom-cli](https://github.com/sindresorhus/strip-bom-cli) - CLI for this module +- [strip-bom-stream](https://github.com/sindresorhus/strip-bom-stream) - Stream version of this module + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/strip-indent/cli.js b/node_modules/strip-indent/cli.js new file mode 100755 index 00000000..bcd5f8d1 --- /dev/null +++ b/node_modules/strip-indent/cli.js @@ -0,0 +1,49 @@ +#!/usr/bin/env node +'use strict'; +var fs = require('fs'); +var stdin = require('get-stdin'); +var pkg = require('./package.json'); +var stripIndent = require('./'); +var argv = process.argv.slice(2); +var input = argv[0]; + +function help() { + console.log([ + '', + ' ' + pkg.description, + '', + ' Usage', + ' strip-indent ', + ' echo | strip-indent', + '', + ' Example', + ' echo \'\\tunicorn\\n\\t\\tcake\' | strip-indent', + ' unicorn', + ' \tcake' + ].join('\n')); +} + +function init(data) { + console.log(stripIndent(data)); +} + +if (argv.indexOf('--help') !== -1) { + help(); + return; +} + +if (argv.indexOf('--version') !== -1) { + console.log(pkg.version); + return; +} + +if (process.stdin.isTTY) { + if (!input) { + help(); + return; + } + + init(fs.readFileSync(input, 'utf8')); +} else { + stdin(init); +} diff --git a/node_modules/strip-indent/index.js b/node_modules/strip-indent/index.js new file mode 100644 index 00000000..8f8f4f44 --- /dev/null +++ b/node_modules/strip-indent/index.js @@ -0,0 +1,16 @@ +'use strict'; +module.exports = function (str) { + var match = str.match(/^[ \t]*(?=\S)/gm); + + if (!match) { + return str; + } + + var indent = Math.min.apply(Math, match.map(function (el) { + return el.length; + })); + + var re = new RegExp('^[ \\t]{' + indent + '}', 'gm'); + + return indent > 0 ? str.replace(re, '') : str; +}; diff --git a/node_modules/strip-indent/license b/node_modules/strip-indent/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/strip-indent/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/strip-indent/package.json b/node_modules/strip-indent/package.json new file mode 100644 index 00000000..941ad7d7 --- /dev/null +++ b/node_modules/strip-indent/package.json @@ -0,0 +1,46 @@ +{ + "name": "strip-indent", + "version": "1.0.1", + "description": "Strip leading whitespace from every line in a string", + "license": "MIT", + "repository": "sindresorhus/strip-indent", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "files": [ + "index.js", + "cli.js" + ], + "keywords": [ + "cli", + "bin", + "browser", + "strip", + "normalize", + "remove", + "indent", + "indentation", + "whitespace", + "space", + "tab", + "string", + "str" + ], + "devDependencies": { + "mocha": "*" + }, + "dependencies": { + "get-stdin": "^4.0.1" + } +} diff --git a/node_modules/strip-indent/readme.md b/node_modules/strip-indent/readme.md new file mode 100644 index 00000000..d622f03b --- /dev/null +++ b/node_modules/strip-indent/readme.md @@ -0,0 +1,61 @@ +# strip-indent [![Build Status](https://travis-ci.org/sindresorhus/strip-indent.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-indent) + +> Strip leading whitespace from every line in a string + +The line with the least number of leading whitespace, ignoring empty lines, determines the number to remove. + +Useful for removing redundant indentation. + + +## Install + +```sh +$ npm install --save strip-indent +``` + + +## Usage + +```js +var str = '\tunicorn\n\t\tcake'; +/* + unicorn + cake +*/ + +stripIndent('\tunicorn\n\t\tcake'); +/* +unicorn + cake +*/ +``` + + +## CLI + +```sh +$ npm install --global strip-indent +``` + +```sh +$ strip-indent --help + + Usage + strip-indent + echo | strip-indent + + Example + echo '\tunicorn\n\t\tcake' | strip-indent + unicorn + cake +``` + + +## Related + +- [indent-string](https://github.com/sindresorhus/indent-string) - Indent each line in a string + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/supports-color/browser.js b/node_modules/supports-color/browser.js new file mode 100644 index 00000000..62afa3a7 --- /dev/null +++ b/node_modules/supports-color/browser.js @@ -0,0 +1,5 @@ +'use strict'; +module.exports = { + stdout: false, + stderr: false +}; diff --git a/node_modules/supports-color/index.js b/node_modules/supports-color/index.js new file mode 100644 index 00000000..1704131b --- /dev/null +++ b/node_modules/supports-color/index.js @@ -0,0 +1,131 @@ +'use strict'; +const os = require('os'); +const hasFlag = require('has-flag'); + +const env = process.env; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} + +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} + +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } + + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } + + const min = forceColor ? 1 : 0; + + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + + return 1; + } + + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; + } + + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + + if (env.COLORTERM === 'truecolor') { + return 3; + } + + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + + if ('COLORTERM' in env) { + return 1; + } + + if (env.TERM === 'dumb') { + return min; + } + + return min; +} + +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); +} + +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; diff --git a/node_modules/supports-color/license b/node_modules/supports-color/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/supports-color/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/supports-color/package.json b/node_modules/supports-color/package.json new file mode 100644 index 00000000..ad199f5c --- /dev/null +++ b/node_modules/supports-color/package.json @@ -0,0 +1,53 @@ +{ + "name": "supports-color", + "version": "5.5.0", + "description": "Detect whether a terminal supports color", + "license": "MIT", + "repository": "chalk/supports-color", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js", + "browser.js" + ], + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "ansi", + "styles", + "tty", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "support", + "supports", + "capability", + "detect", + "truecolor", + "16m" + ], + "dependencies": { + "has-flag": "^3.0.0" + }, + "devDependencies": { + "ava": "^0.25.0", + "import-fresh": "^2.0.0", + "xo": "^0.20.0" + }, + "browser": "browser.js" +} diff --git a/node_modules/supports-color/readme.md b/node_modules/supports-color/readme.md new file mode 100644 index 00000000..f6e40195 --- /dev/null +++ b/node_modules/supports-color/readme.md @@ -0,0 +1,66 @@ +# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color) + +> Detect whether a terminal supports color + + +## Install + +``` +$ npm install supports-color +``` + + +## Usage + +```js +const supportsColor = require('supports-color'); + +if (supportsColor.stdout) { + console.log('Terminal stdout supports color'); +} + +if (supportsColor.stdout.has256) { + console.log('Terminal stdout supports 256 colors'); +} + +if (supportsColor.stderr.has16m) { + console.log('Terminal stderr supports 16 million colors (truecolor)'); +} +``` + + +## API + +Returns an `Object` with a `stdout` and `stderr` property for testing either streams. Each property is an `Object`, or `false` if color is not supported. + +The `stdout`/`stderr` objects specifies a level of support for color through a `.level` property and a corresponding flag: + +- `.level = 1` and `.hasBasic = true`: Basic color support (16 colors) +- `.level = 2` and `.has256 = true`: 256 color support +- `.level = 3` and `.has16m = true`: Truecolor support (16 million colors) + + +## Info + +It obeys the `--color` and `--no-color` CLI flags. + +Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add the environment variable `FORCE_COLOR=1` to forcefully enable color or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks. + +Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively. + + +## Related + +- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/sver-compat/.npmignore b/node_modules/sver-compat/.npmignore new file mode 100644 index 00000000..4cb5bb4f --- /dev/null +++ b/node_modules/sver-compat/.npmignore @@ -0,0 +1,2 @@ +package-lock.json +test diff --git a/node_modules/sver-compat/.travis.yml b/node_modules/sver-compat/.travis.yml new file mode 100644 index 00000000..4f9cfd47 --- /dev/null +++ b/node_modules/sver-compat/.travis.yml @@ -0,0 +1,9 @@ +sudo: false +language: node_js +node_js: + - '8' + - '6' + - '5' + - '4' + - '0.12' + - '0.10' diff --git a/node_modules/sver-compat/LICENSE b/node_modules/sver-compat/LICENSE new file mode 100644 index 00000000..43ca4f64 --- /dev/null +++ b/node_modules/sver-compat/LICENSE @@ -0,0 +1,10 @@ +MIT License +----------- + +Copyright (C) 2017 Guy Bedford + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/sver-compat/README.md b/node_modules/sver-compat/README.md new file mode 100644 index 00000000..64a9f1de --- /dev/null +++ b/node_modules/sver-compat/README.md @@ -0,0 +1,160 @@ +# sver-compat + +[![Build Status](https://travis-ci.org/phated/sver-compat.svg?branch=master)](https://travis-ci.org/phated/sver-compat) + +Fork of @guybedford's [Sver](https://github.com/guybedford/sver) library. Adds compatibility for node <6. + +``` +npm install sver-compat +``` + +```js +var Semver = require('sver-compat').Semver; +var SemverRange = require('sver-compat').SemverRange; + +// Static usage: +SemverRange.match('^1.2.3', '1.2.4'); // true + +// Class usage: +var range = new SemverRange('^1.2.3'); +var version = new Semver('1.2.4'); +version.matches(range); // true +range.has(version); // true +``` + +### Range support + +Restricts version ranges to the simplified cases: +* `*`: Wildcard range +* `MAJOR`: Match exact major +* `MAJOR.MINOR` Match exact major and minor +* `MAJOR.MINOR.PATCH[-PRE]` Match exact semver +* `~MAJOR.MINOR.PATCH[-PRE]`: Match patch bumps +* `^MAJOR.MINOR.PATCH[-PRE]`: Match minor and patch bumps + +Invalid ranges will fallback to being detected as exact string matches. + +### Prerelease Matching + +By default, as per convention, ranges like `^1.2.3-alpha` only match prerelease ranges on the same patch (`1.2.3-alpha.4`), but +not prerelease ranges from further patches (`1.3.4-alpha`). + +To alter this matching, a third boolean argument can be provided to the match function to support these unstable matches: + +```js +SemverRange.match('^1.2.3', '1.5.6-beta'); // false +SemverRange.match('^1.2.3', '1.5.6-beta', true); // true +``` + +### Best Version Match + +```js +var versions = ['1.2.3', '1.3.4-alpha', '1.3.4-alpha.1', '1.3.4-beta']; +var range = new SemverRange('*'); + +var bestStableMatch = range.bestMatch(versions); +bestStableMatch.toString(); // 1.2.3 + +var bestUnstableMatch = range.bestMatch(versions, true); +bestUnstableMatch.toString(); // 1.3.4-beta +``` + +### Version and Range Sorting + +```js +var versions = ['2.4.5', '2.3.4-alpha', '1.2.3', '2.3.4-alpha.2']; +var ranges = ['^1.2.3', '1.2', '2.3.4']; + +versions.sort(Semver.compare); // [1.2.3, 2.3.4-alpha, 2.3.4-alpha.2, 2.4.5] +ranges.sort(SemverRange.compare) // [1.2, ^1.2.3, 2.3.4] +``` + +### Conversion from Node Semver Ranges + +A utility function is included to convert Node Semver ranges into Semver ranges. + +This requires `semver` to be installed in the application running this process. + +_Note this conversion is lossy by definition._ + +```js +var convertRange = require('sver-compat/convert-range'); + +convertRange('>=2.3.4 <3.0.0').toString(); // ^2.3.4 +convertRange('1 || 2 || 3').toString(); // ^3.0.0 +``` + +### Semver and Semver Range Validation + +When a version string fails semver validation it falls back to being treated as a tag, still as a `Semver` instance. + +For example: + +```js +var version = new Semver('x.y.z'); +version.tag === 'x.y.z'; // true + +version = new Semver('^1.2.3'); +version.major === undefined; // true +version.tag === '^1.2.3'; // true +``` + +For validation, rather use `Semver.isValid` and `SemverRange.isValid`: + +```js +Semver.isValid('x.y.z'); // false +Semver.isValid('^1.2.3'); // false +SemverRange.isValid('^1.2.3'); // true +``` + +## API + +### Semver + +Static methods: + +* `Semver.isValid(version: string): boolean`: Whether the given string is a valid semver. +* `Semver.compare(v1: Semver|string, v2: Semver|string): number`: 1 if v1 > v2, -1 if v1 < v2, 0 if equal. + +For a given Semver instance `version = new Semver('X.Y.Z')`, + +* `version.major`: The major version number. +* `version.minor`: The minor version number. +* `version.patch`: The patch version number. +* `version.pre`: The prerelease identifer, as an array of strings (`.`-separated). +* `version.build`: The build identifier, as a string. +* `version.tag`: If not a valid semver, the full tag string. +* `version.gt(otherVersion: Semver|string): bool`: Whether this version is greater than the other version. +* `version.lt(otherVersion: Semver|string): bool`: Whether this version is less than the other version. +* `version.eq(otherVerion: Semver|string): bool`: Whether this version equals the other version. +* `version.matches(range: SemverRange|string, unstable?: bool): bool`: Whether this version matches the given version range. +* `version.toString(): string`: Convert the version back to a string. + +### SemverRange + +Static methods: + +* `SemverRange.match(range: SemverRange|string, version: Semver|string, unstable = false): bool`: Whether the version matches the range. +* `SemverRange.isValid(range: string): bool`: Whether the given range string is a valid semver range (in this simplified grammar). +* `SemverRange.compare(r1: SemverRange|string, r2: SemverRange|string): number`: 1 if r1 > r2, -1 if r1 < r2, 0 if equal. + +For a given SemverRange instance `range = new SemverRange('^X.Y.Z')`, + +* `range.type: string`: Returns `'wildcard'`, `'major'`, `'stable'` or `'exact'`. +* `range.version: Smever`: Returns the `Semver` instance corresponding to the range. +* `range.isExact: string`: Returns true if the range is an exact version only. +* `range.isStable: string`: Returns true if the range is a stable version range. +* `range.isMajor: string`: Returns true if the range is a major version range. +* `range.isWildcard: string`: Returns true if the range is the wildcard version range. +* `range.gt(otherRange: SemverRange|string): bool`: Whether the range is greater than the other range. +* `range.lt(otherRange: SemverRange|string): bool`: Whether the range is less than the other range. +* `range.eq(otherRange: SemverRange|string): bool`: Whether the range is exactly the same as the other range. +* `range.has(version: Semver|string, unstable = false): bool`: Whether the range includes the given version. +* `range.contains(otherRange: SemverRange|string): bool`: Whether the range fully contains the other range. +* `range.intersect(otherRange: SemverRange|string): SemverRange|undefined`: The intersection range, if any. +* `range.bestMatch(versions: (Semver|string)[], unstable = false): Semver|undefined`: The intersection range, if any. +* `range.toString()`: Convert the range back to a string. + +## License + +MIT diff --git a/node_modules/sver-compat/convert-range.js b/node_modules/sver-compat/convert-range.js new file mode 100644 index 00000000..c08af5e8 --- /dev/null +++ b/node_modules/sver-compat/convert-range.js @@ -0,0 +1,132 @@ +var nodeSemver = require('semver'); +var sver = require('./sver'); +var Semver = sver.Semver; +var SemverRange = sver.SemverRange; +var forOf = require('es6-iterator/for-of'); + +module.exports = function nodeRangeToSemverRange (range) { + var parsed = nodeSemver.validRange(range); + + // tag version + if (!parsed) + return new SemverRange(range); + + if (parsed === '*') + return new SemverRange(parsed); + + try { + var semverRange = new SemverRange(range); + if (!semverRange.version.tag) + return semverRange; + } + catch (e) { + if (e.code !== 'ENOTSEMVER') + throw e; + } + + var outRange; + forOf(parsed.split('||'), function(union) { + + // compute the intersection into a lowest upper bound and a highest lower bound + var upperBound, lowerBound, upperEq, lowerEq; + forOf(union.split(' '), function(intersection, doBreak) { + var lt = intersection[0] === '<'; + var gt = intersection[0] === '>'; + if (!lt && !gt) { + upperBound = intersection; + upperEq = true; + return doBreak(); + } + var eq = intersection[1] === '='; + if (!gt) { + var version = new Semver(intersection.substr(1 + eq)); + if (!upperBound || upperBound.gt(version)) { + upperBound = version; + upperEq = eq; + } + } + else if (!lt) { + var eq = intersection[1] === '='; + var version = new Semver(intersection.substr(1 + eq)); + if (!lowerBound || lowerBound.lt(version)) { + lowerBound = version; + lowerEq = eq; + } + } + }); + + // if the lower bound is greater than the upper bound then just return the lower bound exactly + if (lowerBound && upperBound && lowerBound.gt(upperBound)) { + var curRange = new SemverRange(lowerBound.toString()); + // the largest or highest union range wins + if (!outRange || !outRange.contains(curRange) && (curRange.gt(outRange) || curRange.contains(outRange))) + outRange = curRange; + return; + } + + // determine the largest semver range satisfying the upper bound + var upperRange; + if (upperBound) { + // if the upper bound has an equality then we return it directly + if (upperEq) { + var curRange = new SemverRange(upperBound.toString()); + // the largest or highest union range wins + if (!outRange || !outRange.contains(curRange) && (curRange.gt(outRange) || curRange.contains(outRange))) + outRange = curRange; + return; + } + + // prerelease ignored in upper bound + var major = 0, minor = 0, patch = 0, rangeType = ''; + + // <2.0.0 -> ^1.0.0 + if (upperBound.patch === 0) { + if (upperBound.minor === 0) { + if (upperBound.major > 0) { + major = upperBound.major - 1; + rangeType = '^'; + } + } + // <1.2.0 -> ~1.1.0 + else { + major = upperBound.major; + minor = upperBound.minor - 1; + rangeType = '~'; + } + } + // <1.2.3 -> ~1.2.0 + else { + major = upperBound.major; + minor = upperBound.minor; + patch = 0; + rangeType = '~'; + } + + if (major === 0 && rangeType === '^') + upperRange = new SemverRange('0'); + else + upperRange = new SemverRange(rangeType + major + '.' + minor + '.' + patch); + } + + // determine the lower range semver range + var lowerRange; + if (!lowerEq) { + if (lowerBound.pre) + lowerRange = new SemverRange('^' + lowerBound.major + '.' + lowerBound.minor + '.' + lowerBound.patch + '-' + lowerBound.pre.join('.') + '.1'); + else + lowerRange = new SemverRange('^' + lowerBound.major + '.' + lowerBound.minor + '.' + (lowerBound.patch + 1)); + } + else { + lowerRange = new SemverRange('^' + lowerBound.toString()); + } + + // we then intersect the upper semver range with the lower semver range + // if the intersection is empty, we return the upper range only + var curRange = upperRange ? lowerRange.intersect(upperRange) || upperRange : lowerRange; + + // the largest or highest union range wins + if (!outRange || !outRange.contains(curRange) && (curRange.gt(outRange) || curRange.contains(outRange))) + outRange = curRange; + }); + return outRange; +} diff --git a/node_modules/sver-compat/package.json b/node_modules/sver-compat/package.json new file mode 100644 index 00000000..4445ba08 --- /dev/null +++ b/node_modules/sver-compat/package.json @@ -0,0 +1,30 @@ +{ + "name": "sver-compat", + "version": "1.5.0", + "description": "Simple Semver and SemverRange classes", + "main": "sver.js", + "scripts": { + "test": "mocha -u tdd -R dot" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/phated/sver-compat.git" + }, + "keywords": [ + "semver" + ], + "author": "Guy Bedford", + "license": "MIT", + "bugs": { + "url": "https://github.com/phated/sver-compat/issues" + }, + "homepage": "https://github.com/phated/sver-compat#readme", + "devDependencies": { + "mocha": "^3.4.2", + "semver": "^5.3.0" + }, + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } +} diff --git a/node_modules/sver-compat/sver.js b/node_modules/sver-compat/sver.js new file mode 100644 index 00000000..883dfb64 --- /dev/null +++ b/node_modules/sver-compat/sver.js @@ -0,0 +1,400 @@ +'use strict'; + +var shortSemverRegEx = /^([~\^])?(0|[1-9]\d*)(?:\.(0|[1-9]\d*))?$/; +var semverRegEx = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([\da-z-]+(?:\.[\da-z-]+)*))?(\+[\da-z-]+)?$/i; +exports.semverRegEx = semverRegEx; +exports.shortSemverRegEx = shortSemverRegEx; + +var Symbol = require('es6-symbol'); + +var MAJOR = Symbol('major'); +var MINOR = Symbol('minor'); +var PATCH = Symbol('patch'); +var PRE = Symbol('pre'); +var BUILD = Symbol('build'); +var TAG = Symbol('tag'); + +var numRegEx = /^\d+$/; +function Semver(version) { + var semver = version.match(semverRegEx); + if (!semver) { + this[TAG] = version; + return; + } + this[MAJOR] = parseInt(semver[1], 10); + this[MINOR] = parseInt(semver[2], 10); + this[PATCH] = parseInt(semver[3], 10); + this[PRE] = semver[4] && semver[4].split('.'); + this[BUILD] = semver[5]; +} +Object.defineProperty(Semver.prototype, 'major', { + get: function major () { + return this[MAJOR]; + } +}); +Object.defineProperty(Semver.prototype, 'minor', { + get: function minor () { + return this[MINOR]; + } +}); +Object.defineProperty(Semver.prototype, 'patch', { + get: function patch () { + return this[PATCH]; + } +}); +Object.defineProperty(Semver.prototype, 'pre', { + get: function pre () { + return this[PRE]; + } +}); +Object.defineProperty(Semver.prototype, 'build', { + get: function build () { + return this[BUILD]; + } +}); +Object.defineProperty(Semver.prototype, 'tag', { + get: function tag () { + return this[TAG]; + } +}); + +Semver.prototype.gt = function gt(version) { + return Semver.compare(this, version) === 1; +} +Semver.prototype.lt = function lt (version) { + return Semver.compare(this, version) === -1; +} +Semver.prototype.eq = function eq (version) { + if (!(version instanceof Semver)) + version = new Semver(version); + + if (this[TAG] && version[TAG]) + return this[TAG] === version[TAG]; + if (this[TAG] || version[TAG]) + return false; + if (this[MAJOR] !== version[MAJOR]) + return false; + if (this[MINOR] !== version[MINOR]) + return false; + if (this[PATCH] !== version[PATCH]) + return false; + if (this[PRE] === undefined && version[PRE] === undefined) + return true; + if (this[PRE] === undefined || version[PRE] === undefined) + return false; + if (this[PRE].length !== version[PRE].length) + return false; + for (var i = 0; i < this[PRE].length; i++) { + if (this[PRE][i] !== version[PRE][i]) + return false; + } + return this[BUILD] === version[BUILD]; +} +Semver.prototype.matches = function matches (range, unstable) { + unstable = unstable || false; + if (!(range instanceof SemverRange)) + range = new SemverRange(range); + return range.has(this, unstable); +} +Semver.prototype.toString = function toString () { + if (this[TAG]) + return this[TAG]; + return this[MAJOR] + '.' + this[MINOR] + '.' + this[PATCH] + (this[PRE] ? '-' + this[PRE].join('.') : '') + (this[BUILD] ? this[BUILD] : ''); +} +Semver.isValid = function isValid (version) { + var semver = version.match(semverRegEx); + return semver && semver[2] !== undefined && semver[3] !== undefined; +} +Semver.compare = function compare (v1, v2) { + if (!(v1 instanceof Semver)) + v1 = new Semver(v1); + if (!(v2 instanceof Semver)) + v2 = new Semver(v2); + + // not semvers - tags have equal precedence + if (v1[TAG] && v2[TAG]) + return 0; + // semver beats tag version + if (v1[TAG]) + return -1; + if (v2[TAG]) + return 1; + // compare version numbers + if (v1[MAJOR] !== v2[MAJOR]) + return v1[MAJOR] > v2[MAJOR] ? 1 : -1; + if (v1[MINOR] !== v2[MINOR]) + return v1[MINOR] > v2[MINOR] ? 1 : -1; + if (v1[PATCH] !== v2[PATCH]) + return v1[PATCH] > v2[PATCH] ? 1 : -1; + if (!v1[PRE] && !v2[PRE]) + return 0; + if (!v1[PRE]) + return 1; + if (!v2[PRE]) + return -1; + // prerelease comparison + for (var i = 0, l = Math.min(v1[PRE].length, v2[PRE].length); i < l; i++) { + if (v1[PRE][i] !== v2[PRE][i]) { + var isNum1 = v1[PRE][i].match(numRegEx); + var isNum2 = v2[PRE][i].match(numRegEx); + // numeric has lower precedence + if (isNum1 && !isNum2) + return -1; + if (isNum2 && !isNum1) + return 1; + // compare parts + if (isNum1 && isNum2) + return parseInt(v1[PRE][i], 10) > parseInt(v2[PRE][i], 10) ? 1 : -1; + else + return v1[PRE][i] > v2[PRE][i] ? 1 : -1; + } + } + if (v1[PRE].length === v2[PRE].length) + return 0; + // more pre-release fields win if equal + return v1[PRE].length > v2[PRE].length ? 1 : -1; +} +exports.Semver = Semver; + +var WILDCARD_RANGE = 0; +var MAJOR_RANGE = 1; +var STABLE_RANGE = 2; +var EXACT_RANGE = 3; + +var TYPE = Symbol('type'); +var VERSION = Symbol('version'); + +function SemverRange(versionRange) { + if (versionRange === '*' || versionRange === '') { + this[TYPE] = WILDCARD_RANGE; + return; + } + var shortSemver = versionRange.match(shortSemverRegEx); + if (shortSemver) { + if (shortSemver[1]) + versionRange = versionRange.substr(1); + if (shortSemver[3] === undefined) { + // ^, ~ mean the same thing for a single major + this[VERSION] = new Semver(versionRange + '.0.0'); + this[TYPE] = MAJOR_RANGE; + } + else { + this[VERSION] = new Semver(versionRange + '.0'); + // ^ only becomes major range for major > 0 + if (shortSemver[1] === '^' && shortSemver[2] !== '0') + this[TYPE] = MAJOR_RANGE; + else + this[TYPE] = STABLE_RANGE; + } + // empty pre array === support prerelease ranges + this[VERSION][PRE] = this[VERSION][PRE] || []; + } + else if (versionRange[0] === '^') { + this[VERSION] = new Semver(versionRange.substr(1)); + if (this[VERSION][MAJOR] === 0) { + if (this[VERSION][MINOR] === 0) + this[TYPE] = EXACT_RANGE; + else + this[TYPE] = STABLE_RANGE; + } + else { + this[TYPE] = MAJOR_RANGE; + } + } + else if (versionRange[0] === '~') { + this[VERSION] = new Semver(versionRange.substr(1)); + this[TYPE] = STABLE_RANGE; + } + else { + this[VERSION] = new Semver(versionRange); + this[TYPE] = EXACT_RANGE; + } + if (this[VERSION][TAG] && this[TYPE] !== EXACT_RANGE) + this[TYPE] = EXACT_RANGE; +} +Object.defineProperty(SemverRange.prototype, 'isExact', { + get: function isExact () { + return this[TYPE] === EXACT_RANGE; + } +}); +Object.defineProperty(SemverRange.prototype, 'isStable', { + get: function isStable () { + return this[TYPE] === STABLE_RANGE; + } +}); +Object.defineProperty(SemverRange.prototype, 'isMajor', { + get: function isMajor () { + return this[TYPE] === MAJOR_RANGE; + } +}); +Object.defineProperty(SemverRange.prototype, 'isWildcard', { + get: function isWildcard () { + return this[TYPE] === WILDCARD_RANGE; + } +}); +Object.defineProperty(SemverRange.prototype, 'type', { + get: function type () { + switch (this[TYPE]) { + case WILDCARD_RANGE: + return 'wildcard'; + case MAJOR_RANGE: + return 'major'; + case STABLE_RANGE: + return 'stable'; + case EXACT_RANGE: + return 'exact'; + } + } +}); +Object.defineProperty(SemverRange.prototype, 'version', { + get: function version () { + return this[VERSION]; + } +}); + +SemverRange.prototype.gt = function gt (range) { + return SemverRange.compare(this, range) === 1; +} +SemverRange.prototype.lt = function lt (range) { + return SemverRange.compare(this, range) === -1; +} +SemverRange.prototype.eq = function eq (range) { + return SemverRange.compare(this, range) === 0; +} +SemverRange.prototype.has = function has (version, unstable) { + unstable = unstable || false; + if (!(version instanceof Semver)) + version = new Semver(version); + if (this[TYPE] === WILDCARD_RANGE) + return true; + if (this[TYPE] === EXACT_RANGE) + return this[VERSION].eq(version); + if (version[TAG]) + return false; + if (version.lt(this[VERSION])) + return false; + if (version[PRE] && !unstable) + return this[VERSION][MAJOR] === version[MAJOR] && this[VERSION][MINOR] === version[MINOR] && this[VERSION][PATCH] === version[PATCH]; + if (this[TYPE] === MAJOR_RANGE) + return this[VERSION][MAJOR] === version[MAJOR]; + return this[VERSION][MAJOR] === version[MAJOR] && this[VERSION][MINOR] === version[MINOR]; +} +SemverRange.prototype.contains = function contains (range) { + if (!(range instanceof SemverRange)) + range = new SemverRange(range); + if (this[TYPE] === WILDCARD_RANGE) + return true; + if (range[TYPE] === WILDCARD_RANGE) + return false; + return range[TYPE] >= this[TYPE] && this.has(range[VERSION], true); +} +SemverRange.prototype.intersect = function intersect (range) { + if (!(range instanceof SemverRange)) + range = new SemverRange(range); + + if (this[TYPE] === WILDCARD_RANGE && range[TYPE] === WILDCARD_RANGE) + return this; + if (this[TYPE] === WILDCARD_RANGE) + return range; + if (range[TYPE] === WILDCARD_RANGE) + return this; + + if (this[TYPE] === EXACT_RANGE) + return range.has(this[VERSION], true) ? this : undefined; + if (range[TYPE] === EXACT_RANGE) + return this.has(range[VERSION], true) ? range : undefined; + + var higherRange, lowerRange, polarity; + if (range[VERSION].gt(this[VERSION])) { + higherRange = range; + lowerRange = this; + polarity = true; + } + else { + higherRange = this; + lowerRange = range; + polarity = false; + } + + if (!lowerRange.has(higherRange[VERSION], true)) + return; + + if (lowerRange[TYPE] === MAJOR_RANGE) + return polarity ? range : this; + + var intersection = new SemverRange(higherRange[VERSION].toString()); + intersection[TYPE] = STABLE_RANGE; + return intersection; +} +SemverRange.prototype.bestMatch = function bestMatch (versions, unstable) { + unstable = unstable || false; + var self = this; + var maxSemver; + versions.forEach(function(version) { + if (!(version instanceof Semver)) + version = new Semver(version); + if (!self.has(version, unstable)) + return; + if (!unstable && version[PRE]) { + if (self[TYPE] === WILDCARD_RANGE || !self[VERSION][PRE] || self[VERSION][MAJOR] !== version[MAJOR] || + self[VERSION][MINOR] !== version[MINOR] || self[VERSION][PATCH] !== version[PATCH]) + return; + } + if (!maxSemver) { + maxSemver = version; + } + else if (Semver.compare(version, maxSemver) === 1) { + maxSemver = version; + } + }); + return maxSemver; +} +SemverRange.prototype.toString = function toString () { + var version = this[VERSION]; + switch (this[TYPE]) { + case WILDCARD_RANGE: + return '*'; + case MAJOR_RANGE: + if (version[MAJOR] === 0 && version[MINOR] === 0 && version[PATCH] === 0) + return '0'; + if (version[PRE] && version[PRE].length === 0 && version[PATCH] === 0) + return '^' + version[MAJOR] + '.' + version[MINOR]; + return '^' + version.toString(); + case STABLE_RANGE: + if (version[PRE] && version[PRE].length === 0 && version[PATCH] === 0) + return version[MAJOR] + '.' + version[MINOR]; + return '~' + version.toString(); + case EXACT_RANGE: + return version.toString(); + } +} +SemverRange.match = function match (range, version, unstable) { + unstable = unstable || false; + if (!(version instanceof Semver)) + version = new Semver(version); + return version.matches(range, unstable); +} +SemverRange.isValid = function isValid (range) { + var semverRange = new SemverRange(range); + return semverRange[TYPE] !== EXACT_RANGE || semverRange[VERSION][TAG] === undefined; +} +SemverRange.compare = function compare (r1, r2) { + if (!(r1 instanceof SemverRange)) + r1 = new SemverRange(r1); + if (!(r2 instanceof SemverRange)) + r2 = new SemverRange(r2); + if (r1[TYPE] === WILDCARD_RANGE && r2[TYPE] === WILDCARD_RANGE) + return 0; + if (r1[TYPE] === WILDCARD_RANGE) + return 1; + if (r2[TYPE] === WILDCARD_RANGE) + return -1; + var cmp = Semver.compare(r1[VERSION], r2[VERSION]); + if (cmp !== 0) { + return cmp; + } + if (r1[TYPE] === r2[TYPE]) + return 0; + return r1[TYPE] > r2[TYPE] ? 1 : -1; +} +exports.SemverRange = SemverRange; diff --git a/node_modules/tar/.nyc_output/0471d9cf-687f-4ae8-84a5-ce7468becd03.json b/node_modules/tar/.nyc_output/0471d9cf-687f-4ae8-84a5-ce7468becd03.json new file mode 100644 index 00000000..2a57d9fe --- /dev/null +++ b/node_modules/tar/.nyc_output/0471d9cf-687f-4ae8-84a5-ce7468becd03.json @@ -0,0 +1 @@ +{"/Users/isaacs/dev/js/tar/lib/pack.js":{"path":"/Users/isaacs/dev/js/tar/lib/pack.js","statementMap":{"0":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}},"1":{"start":{"line":6,"column":18},"end":{"line":6,"column":46}},"2":{"start":{"line":7,"column":13},"end":{"line":7,"column":37}},"3":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"4":{"start":{"line":9,"column":15},"end":{"line":9,"column":34}},"5":{"start":{"line":10,"column":25},"end":{"line":10,"column":61}},"6":{"start":{"line":11,"column":14},"end":{"line":11,"column":40}},"7":{"start":{"line":12,"column":10},"end":{"line":12,"column":25}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"9":{"start":{"line":14,"column":13},"end":{"line":14,"column":14}},"10":{"start":{"line":14,"column":31},"end":{"line":14,"column":41}},"11":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"12":{"start":{"line":20,"column":11},"end":{"line":20,"column":15}},"13":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"14":{"start":{"line":21,"column":29},"end":{"line":21,"column":51}},"15":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"16":{"start":{"line":23,"column":13},"end":{"line":23,"column":52}},"17":{"start":{"line":24,"column":7},"end":{"line":24,"column":32}},"18":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"19":{"start":{"line":28,"column":2},"end":{"line":28,"column":20}},"20":{"start":{"line":29,"column":2},"end":{"line":29,"column":20}},"21":{"start":{"line":30,"column":2},"end":{"line":30,"column":17}},"22":{"start":{"line":32,"column":2},"end":{"line":32,"column":25}},"23":{"start":{"line":33,"column":2},"end":{"line":33,"column":24}},"24":{"start":{"line":35,"column":2},"end":{"line":35,"column":21}},"25":{"start":{"line":36,"column":2},"end":{"line":43,"column":4}},"26":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"27":{"start":{"line":37,"column":35},"end":{"line":37,"column":41}},"28":{"start":{"line":38,"column":4},"end":{"line":38,"column":22}},"29":{"start":{"line":39,"column":4},"end":{"line":41,"column":6}},"30":{"start":{"line":40,"column":6},"end":{"line":40,"column":25}},"31":{"start":{"line":42,"column":4},"end":{"line":42,"column":15}},"32":{"start":{"line":46,"column":0},"end":{"line":57,"column":1}},"33":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"34":{"start":{"line":48,"column":23},"end":{"line":48,"column":29}},"35":{"start":{"line":49,"column":2},"end":{"line":49,"column":24}},"36":{"start":{"line":51,"column":11},"end":{"line":51,"column":15}},"37":{"start":{"line":52,"column":2},"end":{"line":56,"column":10}},"38":{"start":{"line":54,"column":6},"end":{"line":54,"column":24}},"39":{"start":{"line":59,"column":0},"end":{"line":69,"column":1}},"40":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"41":{"start":{"line":60,"column":40},"end":{"line":60,"column":68}},"42":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"43":{"start":{"line":62,"column":19},"end":{"line":62,"column":72}},"44":{"start":{"line":64,"column":2},"end":{"line":64,"column":17}},"45":{"start":{"line":65,"column":2},"end":{"line":65,"column":27}},"46":{"start":{"line":66,"column":2},"end":{"line":66,"column":17}},"47":{"start":{"line":67,"column":2},"end":{"line":67,"column":43}},"48":{"start":{"line":68,"column":2},"end":{"line":68,"column":25}},"49":{"start":{"line":71,"column":0},"end":{"line":75,"column":1}},"50":{"start":{"line":72,"column":2},"end":{"line":72,"column":21}},"51":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"52":{"start":{"line":73,"column":26},"end":{"line":73,"column":52}},"53":{"start":{"line":74,"column":2},"end":{"line":74,"column":20}},"54":{"start":{"line":77,"column":0},"end":{"line":82,"column":1}},"55":{"start":{"line":78,"column":2},"end":{"line":78,"column":22}},"56":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"57":{"start":{"line":79,"column":26},"end":{"line":79,"column":53}},"58":{"start":{"line":80,"column":2},"end":{"line":80,"column":21}},"59":{"start":{"line":81,"column":2},"end":{"line":81,"column":17}},"60":{"start":{"line":84,"column":0},"end":{"line":88,"column":1}},"61":{"start":{"line":85,"column":2},"end":{"line":85,"column":20}},"62":{"start":{"line":86,"column":2},"end":{"line":86,"column":24}},"63":{"start":{"line":87,"column":2},"end":{"line":87,"column":17}},"64":{"start":{"line":90,"column":0},"end":{"line":233,"column":1}},"65":{"start":{"line":91,"column":11},"end":{"line":91,"column":15}},"66":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"67":{"start":{"line":93,"column":4},"end":{"line":93,"column":10}},"68":{"start":{"line":96,"column":14},"end":{"line":96,"column":32}},"69":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"70":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"71":{"start":{"line":100,"column":6},"end":{"line":100,"column":22}},"72":{"start":{"line":102,"column":4},"end":{"line":102,"column":10}},"73":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"74":{"start":{"line":107,"column":4},"end":{"line":107,"column":29}},"75":{"start":{"line":108,"column":4},"end":{"line":111,"column":6}},"76":{"start":{"line":110,"column":6},"end":{"line":110,"column":19}},"77":{"start":{"line":112,"column":4},"end":{"line":112,"column":10}},"78":{"start":{"line":115,"column":2},"end":{"line":115,"column":23}},"79":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"80":{"start":{"line":119,"column":4},"end":{"line":119,"column":24}},"81":{"start":{"line":120,"column":4},"end":{"line":120,"column":24}},"82":{"start":{"line":121,"column":4},"end":{"line":121,"column":18}},"83":{"start":{"line":122,"column":4},"end":{"line":122,"column":20}},"84":{"start":{"line":123,"column":4},"end":{"line":123,"column":10}},"85":{"start":{"line":134,"column":13},"end":{"line":134,"column":53}},"86":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"87":{"start":{"line":137,"column":4},"end":{"line":137,"column":27}},"88":{"start":{"line":140,"column":15},"end":{"line":140,"column":17}},"89":{"start":{"line":142,"column":2},"end":{"line":144,"column":4}},"90":{"start":{"line":143,"column":4},"end":{"line":143,"column":30}},"91":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"92":{"start":{"line":146,"column":25},"end":{"line":146,"column":52}},"93":{"start":{"line":148,"column":2},"end":{"line":148,"column":53}},"94":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"95":{"start":{"line":152,"column":4},"end":{"line":152,"column":49}},"96":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"97":{"start":{"line":156,"column":4},"end":{"line":156,"column":29}},"98":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"99":{"start":{"line":161,"column":6},"end":{"line":161,"column":12}},"100":{"start":{"line":164,"column":6},"end":{"line":164,"column":24}},"101":{"start":{"line":165,"column":6},"end":{"line":165,"column":21}},"102":{"start":{"line":166,"column":6},"end":{"line":166,"column":11}},"103":{"start":{"line":169,"column":15},"end":{"line":169,"column":69}},"104":{"start":{"line":170,"column":6},"end":{"line":170,"column":54}},"105":{"start":{"line":171,"column":6},"end":{"line":171,"column":21}},"106":{"start":{"line":172,"column":6},"end":{"line":172,"column":11}},"107":{"start":{"line":175,"column":15},"end":{"line":175,"column":69}},"108":{"start":{"line":176,"column":6},"end":{"line":176,"column":74}},"109":{"start":{"line":177,"column":6},"end":{"line":177,"column":21}},"110":{"start":{"line":178,"column":6},"end":{"line":178,"column":11}},"111":{"start":{"line":187,"column":15},"end":{"line":187,"column":53}},"112":{"start":{"line":189,"column":2},"end":{"line":189,"column":20}},"113":{"start":{"line":195,"column":2},"end":{"line":197,"column":4}},"114":{"start":{"line":196,"column":4},"end":{"line":196,"column":22}},"115":{"start":{"line":199,"column":2},"end":{"line":205,"column":4}},"116":{"start":{"line":200,"column":4},"end":{"line":202,"column":5}},"117":{"start":{"line":201,"column":6},"end":{"line":201,"column":50}},"118":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"119":{"start":{"line":204,"column":33},"end":{"line":204,"column":44}},"120":{"start":{"line":206,"column":2},"end":{"line":206,"column":31}},"121":{"start":{"line":208,"column":14},"end":{"line":208,"column":19}},"122":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"123":{"start":{"line":210,"column":15},"end":{"line":210,"column":21}},"124":{"start":{"line":211,"column":4},"end":{"line":211,"column":16}},"125":{"start":{"line":215,"column":4},"end":{"line":215,"column":27}},"126":{"start":{"line":216,"column":4},"end":{"line":216,"column":26}},"127":{"start":{"line":217,"column":4},"end":{"line":217,"column":17}},"128":{"start":{"line":220,"column":2},"end":{"line":223,"column":4}},"129":{"start":{"line":222,"column":4},"end":{"line":222,"column":24}},"130":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"131":{"start":{"line":229,"column":4},"end":{"line":229,"column":21}},"132":{"start":{"line":232,"column":2},"end":{"line":232,"column":20}},"133":{"start":{"line":235,"column":0},"end":{"line":235,"column":39}},"134":{"start":{"line":236,"column":0},"end":{"line":236,"column":37}}},"fnMap":{"0":{"name":"Pack","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":13}},"loc":{"start":{"line":18,"column":22},"end":{"line":44,"column":1}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":36,"column":16},"end":{"line":36,"column":17}},"loc":{"start":{"line":36,"column":31},"end":{"line":43,"column":3}},"line":36},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":18},"end":{"line":39,"column":19}},"loc":{"start":{"line":39,"column":30},"end":{"line":41,"column":5}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":27},"end":{"line":46,"column":28}},"loc":{"start":{"line":46,"column":44},"end":{"line":57,"column":1}},"line":46},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":29},"end":{"line":55,"column":5}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":21},"end":{"line":59,"column":22}},"loc":{"start":{"line":59,"column":39},"end":{"line":69,"column":1}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":71,"column":23},"end":{"line":71,"column":24}},"loc":{"start":{"line":71,"column":35},"end":{"line":75,"column":1}},"line":71},"7":{"name":"(anonymous_7)","decl":{"start":{"line":77,"column":24},"end":{"line":77,"column":25}},"loc":{"start":{"line":77,"column":36},"end":{"line":82,"column":1}},"line":77},"8":{"name":"(anonymous_8)","decl":{"start":{"line":84,"column":21},"end":{"line":84,"column":22}},"loc":{"start":{"line":84,"column":33},"end":{"line":88,"column":1}},"line":84},"9":{"name":"(anonymous_9)","decl":{"start":{"line":90,"column":26},"end":{"line":90,"column":27}},"loc":{"start":{"line":90,"column":38},"end":{"line":233,"column":1}},"line":90},"10":{"name":"(anonymous_10)","decl":{"start":{"line":108,"column":22},"end":{"line":108,"column":23}},"loc":{"start":{"line":108,"column":34},"end":{"line":111,"column":5}},"line":108},"11":{"name":"(anonymous_11)","decl":{"start":{"line":142,"column":41},"end":{"line":142,"column":42}},"loc":{"start":{"line":142,"column":54},"end":{"line":144,"column":3}},"line":142},"12":{"name":"(anonymous_12)","decl":{"start":{"line":195,"column":20},"end":{"line":195,"column":21}},"loc":{"start":{"line":195,"column":33},"end":{"line":197,"column":3}},"line":195},"13":{"name":"(anonymous_13)","decl":{"start":{"line":199,"column":22},"end":{"line":199,"column":23}},"loc":{"start":{"line":199,"column":34},"end":{"line":205,"column":3}},"line":199},"14":{"name":"(anonymous_14)","decl":{"start":{"line":200,"column":30},"end":{"line":200,"column":31}},"loc":{"start":{"line":200,"column":42},"end":{"line":202,"column":5}},"line":200},"15":{"name":"nextEntry","decl":{"start":{"line":209,"column":11},"end":{"line":209,"column":20}},"loc":{"start":{"line":209,"column":24},"end":{"line":218,"column":3}},"line":209},"16":{"name":"(anonymous_16)","decl":{"start":{"line":220,"column":21},"end":{"line":220,"column":22}},"loc":{"start":{"line":220,"column":35},"end":{"line":223,"column":3}},"line":220},"17":{"name":"(anonymous_17)","decl":{"start":{"line":235,"column":25},"end":{"line":235,"column":26}},"loc":{"start":{"line":235,"column":37},"end":{"line":235,"column":39}},"line":235},"18":{"name":"(anonymous_18)","decl":{"start":{"line":236,"column":23},"end":{"line":236,"column":24}},"loc":{"start":{"line":236,"column":35},"end":{"line":236,"column":37}},"line":236}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},{"start":{"line":21,"column":2},"end":{"line":21,"column":51}}],"line":21},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},{"start":{"line":23,"column":2},"end":{"line":24,"column":32}}],"line":23},"2":{"loc":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},{"start":{"line":37,"column":4},"end":{"line":37,"column":41}}],"line":37},"3":{"loc":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},{"start":{"line":48,"column":2},"end":{"line":48,"column":29}}],"line":48},"4":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},{"start":{"line":60,"column":2},"end":{"line":60,"column":68}}],"line":60},"5":{"loc":{"start":{"line":60,"column":6},"end":{"line":60,"column":38}},"type":"binary-expr","locations":[{"start":{"line":60,"column":6},"end":{"line":60,"column":18}},{"start":{"line":60,"column":22},"end":{"line":60,"column":38}}],"line":60},"6":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},{"start":{"line":62,"column":2},"end":{"line":62,"column":72}}],"line":62},"7":{"loc":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},{"start":{"line":73,"column":2},"end":{"line":73,"column":52}}],"line":73},"8":{"loc":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},{"start":{"line":79,"column":2},"end":{"line":79,"column":53}}],"line":79},"9":{"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},{"start":{"line":92,"column":2},"end":{"line":94,"column":3}}],"line":92},"10":{"loc":{"start":{"line":92,"column":6},"end":{"line":92,"column":34}},"type":"binary-expr","locations":[{"start":{"line":92,"column":6},"end":{"line":92,"column":16}},{"start":{"line":92,"column":20},"end":{"line":92,"column":34}}],"line":92},"11":{"loc":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},{"start":{"line":98,"column":2},"end":{"line":103,"column":3}}],"line":98},"12":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},{"start":{"line":99,"column":4},"end":{"line":101,"column":5}}],"line":99},"13":{"loc":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},{"start":{"line":105,"column":2},"end":{"line":113,"column":3}}],"line":105},"14":{"loc":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},{"start":{"line":117,"column":2},"end":{"line":124,"column":3}}],"line":117},"15":{"loc":{"start":{"line":134,"column":27},"end":{"line":134,"column":46}},"type":"binary-expr","locations":[{"start":{"line":134,"column":27},"end":{"line":134,"column":37}},{"start":{"line":134,"column":41},"end":{"line":134,"column":46}}],"line":134},"16":{"loc":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},{"start":{"line":135,"column":2},"end":{"line":138,"column":3}}],"line":135},"17":{"loc":{"start":{"line":135,"column":6},"end":{"line":135,"column":72}},"type":"binary-expr","locations":[{"start":{"line":135,"column":6},"end":{"line":135,"column":16}},{"start":{"line":135,"column":20},"end":{"line":135,"column":39}},{"start":{"line":135,"column":43},"end":{"line":135,"column":53}},{"start":{"line":135,"column":57},"end":{"line":135,"column":72}}],"line":135},"18":{"loc":{"start":{"line":142,"column":14},"end":{"line":142,"column":31}},"type":"binary-expr","locations":[{"start":{"line":142,"column":14},"end":{"line":142,"column":25}},{"start":{"line":142,"column":29},"end":{"line":142,"column":31}}],"line":142},"19":{"loc":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"type":"if","locations":[{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},{"start":{"line":146,"column":2},"end":{"line":146,"column":52}}],"line":146},"20":{"loc":{"start":{"line":148,"column":36},"end":{"line":148,"column":52}},"type":"binary-expr","locations":[{"start":{"line":148,"column":36},"end":{"line":148,"column":46}},{"start":{"line":148,"column":50},"end":{"line":148,"column":52}}],"line":148},"21":{"loc":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},{"start":{"line":151,"column":2},"end":{"line":153,"column":3}}],"line":151},"22":{"loc":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"type":"if","locations":[{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},{"start":{"line":155,"column":2},"end":{"line":156,"column":29}}],"line":155},"23":{"loc":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"type":"switch","locations":[{"start":{"line":160,"column":4},"end":{"line":161,"column":12}},{"start":{"line":163,"column":4},"end":{"line":166,"column":11}},{"start":{"line":168,"column":4},"end":{"line":172,"column":11}},{"start":{"line":174,"column":4},"end":{"line":178,"column":11}}],"line":158},"24":{"loc":{"start":{"line":170,"column":24},"end":{"line":170,"column":54}},"type":"binary-expr","locations":[{"start":{"line":170,"column":24},"end":{"line":170,"column":47}},{"start":{"line":170,"column":51},"end":{"line":170,"column":54}}],"line":170},"25":{"loc":{"start":{"line":176,"column":24},"end":{"line":176,"column":74}},"type":"binary-expr","locations":[{"start":{"line":176,"column":24},"end":{"line":176,"column":67}},{"start":{"line":176,"column":71},"end":{"line":176,"column":74}}],"line":176},"26":{"loc":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"type":"if","locations":[{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},{"start":{"line":204,"column":4},"end":{"line":204,"column":44}}],"line":204},"27":{"loc":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"type":"if","locations":[{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},{"start":{"line":210,"column":4},"end":{"line":210,"column":21}}],"line":210},"28":{"loc":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},{"start":{"line":227,"column":2},"end":{"line":230,"column":3}}],"line":227}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":512,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":1,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":1,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1,"50":0,"51":0,"52":0,"53":0,"54":1,"55":0,"56":0,"57":0,"58":0,"59":0,"60":1,"61":0,"62":0,"63":0,"64":1,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":1,"134":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0,0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0,0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"8beb16ccde52e484aa1dd87f5ece33d696c808ab","contentHash":"7bb2b7ebe1111c0deefbf9a61d17bf9d2dbe951adb585db96f9d89663ce5909d"},"/Users/isaacs/dev/js/tar/lib/entry-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}},"1":{"start":{"line":3,"column":10},"end":{"line":3,"column":30}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":38}},"3":{"start":{"line":5,"column":12},"end":{"line":5,"column":33}},"4":{"start":{"line":6,"column":15},"end":{"line":6,"column":34}},"5":{"start":{"line":7,"column":18},"end":{"line":7,"column":41}},"6":{"start":{"line":9,"column":13},"end":{"line":9,"column":37}},"7":{"start":{"line":10,"column":10},"end":{"line":10,"column":12}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":29}},"9":{"start":{"line":15,"column":11},"end":{"line":15,"column":15}},"10":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"11":{"start":{"line":18,"column":4},"end":{"line":18,"column":33}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":20}},"13":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"14":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":35}},"16":{"start":{"line":28,"column":2},"end":{"line":30,"column":4}},"17":{"start":{"line":29,"column":4},"end":{"line":29,"column":22}},"18":{"start":{"line":32,"column":2},"end":{"line":34,"column":4}},"19":{"start":{"line":33,"column":4},"end":{"line":33,"column":20}},"20":{"start":{"line":36,"column":2},"end":{"line":39,"column":4}},"21":{"start":{"line":37,"column":4},"end":{"line":37,"column":18}},"22":{"start":{"line":38,"column":4},"end":{"line":38,"column":20}},"23":{"start":{"line":41,"column":2},"end":{"line":41,"column":18}},"24":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"25":{"start":{"line":43,"column":4},"end":{"line":43,"column":18}},"26":{"start":{"line":45,"column":2},"end":{"line":45,"column":25}},"27":{"start":{"line":46,"column":2},"end":{"line":46,"column":23}},"28":{"start":{"line":47,"column":2},"end":{"line":47,"column":22}},"29":{"start":{"line":49,"column":2},"end":{"line":49,"column":17}},"30":{"start":{"line":50,"column":2},"end":{"line":50,"column":23}},"31":{"start":{"line":51,"column":2},"end":{"line":51,"column":18}},"32":{"start":{"line":53,"column":2},"end":{"line":55,"column":4}},"33":{"start":{"line":54,"column":4},"end":{"line":54,"column":17}},"34":{"start":{"line":58,"column":0},"end":{"line":65,"column":1}},"35":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"36":{"start":{"line":60,"column":19},"end":{"line":60,"column":74}},"37":{"start":{"line":61,"column":2},"end":{"line":61,"column":22}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":17}},"39":{"start":{"line":63,"column":2},"end":{"line":63,"column":43}},"40":{"start":{"line":64,"column":2},"end":{"line":64,"column":25}},"41":{"start":{"line":67,"column":0},"end":{"line":74,"column":1}},"42":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"43":{"start":{"line":69,"column":9},"end":{"line":69,"column":29}},"44":{"start":{"line":70,"column":2},"end":{"line":70,"column":24}},"45":{"start":{"line":71,"column":2},"end":{"line":71,"column":20}},"46":{"start":{"line":72,"column":2},"end":{"line":72,"column":17}},"47":{"start":{"line":73,"column":2},"end":{"line":73,"column":43}},"48":{"start":{"line":76,"column":0},"end":{"line":80,"column":1}},"49":{"start":{"line":78,"column":2},"end":{"line":78,"column":21}},"50":{"start":{"line":79,"column":2},"end":{"line":79,"column":20}},"51":{"start":{"line":82,"column":0},"end":{"line":87,"column":1}},"52":{"start":{"line":84,"column":2},"end":{"line":84,"column":22}},"53":{"start":{"line":85,"column":2},"end":{"line":85,"column":21}},"54":{"start":{"line":86,"column":2},"end":{"line":86,"column":17}},"55":{"start":{"line":89,"column":0},"end":{"line":98,"column":1}},"56":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"57":{"start":{"line":91,"column":20},"end":{"line":91,"column":69}},"58":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"59":{"start":{"line":95,"column":20},"end":{"line":95,"column":30}},"60":{"start":{"line":97,"column":2},"end":{"line":97,"column":31}},"61":{"start":{"line":100,"column":0},"end":{"line":126,"column":1}},"62":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"63":{"start":{"line":102,"column":23},"end":{"line":102,"column":29}},"64":{"start":{"line":103,"column":2},"end":{"line":103,"column":24}},"65":{"start":{"line":105,"column":20},"end":{"line":105,"column":48}},"66":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"67":{"start":{"line":108,"column":13},"end":{"line":108,"column":17}},"68":{"start":{"line":110,"column":4},"end":{"line":111,"column":44}},"69":{"start":{"line":113,"column":4},"end":{"line":120,"column":12}},"70":{"start":{"line":115,"column":8},"end":{"line":115,"column":26}},"71":{"start":{"line":118,"column":8},"end":{"line":118,"column":28}},"72":{"start":{"line":124,"column":2},"end":{"line":124,"column":32}},"73":{"start":{"line":125,"column":2},"end":{"line":125,"column":21}},"74":{"start":{"line":128,"column":0},"end":{"line":167,"column":1}},"75":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"76":{"start":{"line":131,"column":4},"end":{"line":131,"column":18}},"77":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"78":{"start":{"line":136,"column":4},"end":{"line":136,"column":10}},"79":{"start":{"line":139,"column":2},"end":{"line":139,"column":25}},"80":{"start":{"line":141,"column":12},"end":{"line":141,"column":24}},"81":{"start":{"line":142,"column":2},"end":{"line":159,"column":3}},"82":{"start":{"line":142,"column":15},"end":{"line":142,"column":16}},"83":{"start":{"line":145,"column":12},"end":{"line":145,"column":18}},"84":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"85":{"start":{"line":147,"column":19},"end":{"line":147,"column":37}},"86":{"start":{"line":148,"column":9},"end":{"line":148,"column":30}},"87":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"88":{"start":{"line":152,"column":6},"end":{"line":152,"column":30}},"89":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"90":{"start":{"line":154,"column":8},"end":{"line":154,"column":30}},"91":{"start":{"line":155,"column":8},"end":{"line":155,"column":39}},"92":{"start":{"line":157,"column":6},"end":{"line":157,"column":12}},"93":{"start":{"line":162,"column":2},"end":{"line":162,"column":25}},"94":{"start":{"line":163,"column":2},"end":{"line":163,"column":26}},"95":{"start":{"line":166,"column":2},"end":{"line":166,"column":20}},"96":{"start":{"line":169,"column":0},"end":{"line":169,"column":46}}},"fnMap":{"0":{"name":"EntryWriter","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":20}},"loc":{"start":{"line":14,"column":29},"end":{"line":56,"column":1}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":25}},"loc":{"start":{"line":28,"column":37},"end":{"line":30,"column":3}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":25},"end":{"line":32,"column":26}},"loc":{"start":{"line":32,"column":37},"end":{"line":34,"column":3}},"line":32},"3":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":23},"end":{"line":36,"column":24}},"loc":{"start":{"line":36,"column":35},"end":{"line":39,"column":3}},"line":36},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":28},"end":{"line":55,"column":3}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":30},"end":{"line":58,"column":31}},"loc":{"start":{"line":58,"column":43},"end":{"line":65,"column":1}},"line":58},"6":{"name":"(anonymous_6)","decl":{"start":{"line":67,"column":28},"end":{"line":67,"column":29}},"loc":{"start":{"line":67,"column":41},"end":{"line":74,"column":1}},"line":67},"7":{"name":"(anonymous_7)","decl":{"start":{"line":76,"column":30},"end":{"line":76,"column":31}},"loc":{"start":{"line":76,"column":42},"end":{"line":80,"column":1}},"line":76},"8":{"name":"(anonymous_8)","decl":{"start":{"line":82,"column":31},"end":{"line":82,"column":32}},"loc":{"start":{"line":82,"column":43},"end":{"line":87,"column":1}},"line":82},"9":{"name":"(anonymous_9)","decl":{"start":{"line":89,"column":28},"end":{"line":89,"column":29}},"loc":{"start":{"line":89,"column":45},"end":{"line":98,"column":1}},"line":89},"10":{"name":"(anonymous_10)","decl":{"start":{"line":100,"column":32},"end":{"line":100,"column":33}},"loc":{"start":{"line":100,"column":44},"end":{"line":126,"column":1}},"line":100},"11":{"name":"(anonymous_11)","decl":{"start":{"line":114,"column":18},"end":{"line":114,"column":19}},"loc":{"start":{"line":114,"column":31},"end":{"line":116,"column":7}},"line":114},"12":{"name":"(anonymous_12)","decl":{"start":{"line":117,"column":19},"end":{"line":117,"column":20}},"loc":{"start":{"line":117,"column":33},"end":{"line":119,"column":7}},"line":117},"13":{"name":"(anonymous_13)","decl":{"start":{"line":128,"column":33},"end":{"line":128,"column":34}},"loc":{"start":{"line":128,"column":45},"end":{"line":167,"column":1}},"line":128},"14":{"name":"(anonymous_14)","decl":{"start":{"line":169,"column":32},"end":{"line":169,"column":33}},"loc":{"start":{"line":169,"column":44},"end":{"line":169,"column":46}},"line":169}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"1":{"loc":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},{"start":{"line":42,"column":2},"end":{"line":44,"column":3}}],"line":42},"2":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},{"start":{"line":60,"column":2},"end":{"line":60,"column":74}}],"line":60},"3":{"loc":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},{"start":{"line":69,"column":2},"end":{"line":69,"column":29}}],"line":69},"4":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},{"start":{"line":91,"column":2},"end":{"line":91,"column":69}}],"line":91},"5":{"loc":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},{"start":{"line":95,"column":2},"end":{"line":95,"column":30}}],"line":95},"6":{"loc":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"type":"if","locations":[{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},{"start":{"line":102,"column":2},"end":{"line":102,"column":29}}],"line":102},"7":{"loc":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},{"start":{"line":107,"column":2},"end":{"line":121,"column":3}}],"line":107},"8":{"loc":{"start":{"line":107,"column":6},"end":{"line":107,"column":44}},"type":"binary-expr","locations":[{"start":{"line":107,"column":6},"end":{"line":107,"column":29}},{"start":{"line":107,"column":33},"end":{"line":107,"column":44}}],"line":107},"9":{"loc":{"start":{"line":110,"column":27},"end":{"line":111,"column":44}},"type":"binary-expr","locations":[{"start":{"line":110,"column":27},"end":{"line":110,"column":47}},{"start":{"line":111,"column":6},"end":{"line":111,"column":44}}],"line":110},"10":{"loc":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},{"start":{"line":130,"column":2},"end":{"line":132,"column":3}}],"line":130},"11":{"loc":{"start":{"line":130,"column":6},"end":{"line":130,"column":37}},"type":"binary-expr","locations":[{"start":{"line":130,"column":6},"end":{"line":130,"column":22}},{"start":{"line":130,"column":26},"end":{"line":130,"column":37}}],"line":130},"12":{"loc":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"type":"if","locations":[{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},{"start":{"line":134,"column":2},"end":{"line":137,"column":3}}],"line":134},"13":{"loc":{"start":{"line":134,"column":6},"end":{"line":134,"column":38}},"type":"binary-expr","locations":[{"start":{"line":134,"column":6},"end":{"line":134,"column":18}},{"start":{"line":134,"column":22},"end":{"line":134,"column":38}}],"line":134},"14":{"loc":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"type":"if","locations":[{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},{"start":{"line":147,"column":4},"end":{"line":148,"column":30}}],"line":147},"15":{"loc":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},{"start":{"line":150,"column":4},"end":{"line":158,"column":5}}],"line":150},"16":{"loc":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"type":"if","locations":[{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},{"start":{"line":153,"column":6},"end":{"line":156,"column":7}}],"line":153}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":1,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":1,"49":0,"50":0,"51":1,"52":0,"53":0,"54":0,"55":1,"56":0,"57":0,"58":0,"59":0,"60":0,"61":1,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":1,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3e169418508e031df78186ff63b5fa5aa2484ab8","contentHash":"84191ed4732b6763ae8701256051735aebbe5e95c932c15bef34da01b33ba1a0"},"/Users/isaacs/dev/js/tar/lib/entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry.js","statementMap":{"0":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"1":{"start":{"line":9,"column":16},"end":{"line":9,"column":38}},"2":{"start":{"line":10,"column":10},"end":{"line":10,"column":27}},"3":{"start":{"line":11,"column":13},"end":{"line":11,"column":33}},"4":{"start":{"line":12,"column":13},"end":{"line":12,"column":37}},"5":{"start":{"line":13,"column":15},"end":{"line":13,"column":34}},"6":{"start":{"line":14,"column":14},"end":{"line":14,"column":41}},"7":{"start":{"line":17,"column":2},"end":{"line":17,"column":19}},"8":{"start":{"line":18,"column":2},"end":{"line":18,"column":22}},"9":{"start":{"line":19,"column":2},"end":{"line":19,"column":22}},"10":{"start":{"line":21,"column":2},"end":{"line":21,"column":25}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":22}},"12":{"start":{"line":23,"column":2},"end":{"line":23,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":22}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":21}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":21}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":21}},"17":{"start":{"line":28,"column":2},"end":{"line":28,"column":18}},"18":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"19":{"start":{"line":30,"column":2},"end":{"line":30,"column":20}},"20":{"start":{"line":32,"column":2},"end":{"line":32,"column":36}},"21":{"start":{"line":34,"column":2},"end":{"line":34,"column":17}},"22":{"start":{"line":35,"column":2},"end":{"line":35,"column":23}},"23":{"start":{"line":36,"column":2},"end":{"line":36,"column":33}},"24":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"25":{"start":{"line":41,"column":11},"end":{"line":41,"column":15}},"26":{"start":{"line":42,"column":2},"end":{"line":44,"column":4}},"27":{"start":{"line":43,"column":4},"end":{"line":43,"column":29}},"28":{"start":{"line":46,"column":2},"end":{"line":46,"column":18}},"29":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"30":{"start":{"line":51,"column":0},"end":{"line":78,"column":1}},"31":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"32":{"start":{"line":52,"column":20},"end":{"line":52,"column":65}},"33":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"34":{"start":{"line":54,"column":4},"end":{"line":54,"column":40}},"35":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"36":{"start":{"line":60,"column":4},"end":{"line":60,"column":35}},"37":{"start":{"line":62,"column":2},"end":{"line":62,"column":29}},"38":{"start":{"line":65,"column":11},"end":{"line":65,"column":25}},"39":{"start":{"line":66,"column":2},"end":{"line":66,"column":21}},"40":{"start":{"line":67,"column":2},"end":{"line":67,"column":19}},"41":{"start":{"line":69,"column":2},"end":{"line":69,"column":14}},"42":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"43":{"start":{"line":73,"column":4},"end":{"line":73,"column":26}},"44":{"start":{"line":74,"column":4},"end":{"line":74,"column":16}},"45":{"start":{"line":77,"column":2},"end":{"line":77,"column":13}},"46":{"start":{"line":80,"column":0},"end":{"line":84,"column":1}},"47":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"48":{"start":{"line":81,"column":9},"end":{"line":81,"column":22}},"49":{"start":{"line":82,"column":2},"end":{"line":82,"column":21}},"50":{"start":{"line":83,"column":2},"end":{"line":83,"column":14}},"51":{"start":{"line":86,"column":0},"end":{"line":89,"column":1}},"52":{"start":{"line":87,"column":2},"end":{"line":87,"column":21}},"53":{"start":{"line":88,"column":2},"end":{"line":88,"column":20}},"54":{"start":{"line":91,"column":0},"end":{"line":97,"column":1}},"55":{"start":{"line":93,"column":2},"end":{"line":93,"column":21}},"56":{"start":{"line":94,"column":2},"end":{"line":94,"column":22}},"57":{"start":{"line":95,"column":2},"end":{"line":95,"column":14}},"58":{"start":{"line":96,"column":2},"end":{"line":96,"column":41}},"59":{"start":{"line":100,"column":0},"end":{"line":139,"column":1}},"60":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"61":{"start":{"line":103,"column":52},"end":{"line":103,"column":58}},"62":{"start":{"line":107,"column":2},"end":{"line":107,"column":22}},"63":{"start":{"line":110,"column":2},"end":{"line":113,"column":3}},"64":{"start":{"line":111,"column":16},"end":{"line":111,"column":43}},"65":{"start":{"line":112,"column":4},"end":{"line":112,"column":28}},"66":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"67":{"start":{"line":117,"column":4},"end":{"line":117,"column":57}},"68":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"69":{"start":{"line":119,"column":6},"end":{"line":119,"column":29}},"70":{"start":{"line":120,"column":6},"end":{"line":120,"column":24}},"71":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"72":{"start":{"line":123,"column":6},"end":{"line":123,"column":24}},"73":{"start":{"line":124,"column":6},"end":{"line":124,"column":22}},"74":{"start":{"line":130,"column":12},"end":{"line":130,"column":29}},"75":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"76":{"start":{"line":132,"column":4},"end":{"line":132,"column":36}},"77":{"start":{"line":133,"column":4},"end":{"line":133,"column":22}},"78":{"start":{"line":134,"column":4},"end":{"line":134,"column":25}},"79":{"start":{"line":135,"column":4},"end":{"line":135,"column":40}},"80":{"start":{"line":138,"column":2},"end":{"line":138,"column":23}},"81":{"start":{"line":141,"column":0},"end":{"line":211,"column":1}},"82":{"start":{"line":143,"column":15},"end":{"line":143,"column":27}},"83":{"start":{"line":144,"column":17},"end":{"line":144,"column":31}},"84":{"start":{"line":145,"column":15},"end":{"line":145,"column":27}},"85":{"start":{"line":146,"column":14},"end":{"line":146,"column":24}},"86":{"start":{"line":149,"column":15},"end":{"line":149,"column":25}},"87":{"start":{"line":150,"column":2},"end":{"line":154,"column":3}},"88":{"start":{"line":150,"column":15},"end":{"line":150,"column":16}},"89":{"start":{"line":151,"column":16},"end":{"line":151,"column":25}},"90":{"start":{"line":152,"column":14},"end":{"line":152,"column":27}},"91":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"92":{"start":{"line":153,"column":36},"end":{"line":153,"column":54}},"93":{"start":{"line":158,"column":3},"end":{"line":165,"column":3}},"94":{"start":{"line":159,"column":4},"end":{"line":161,"column":6}},"95":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"96":{"start":{"line":160,"column":39},"end":{"line":160,"column":54}},"97":{"start":{"line":165,"column":3},"end":{"line":173,"column":3}},"98":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"99":{"start":{"line":167,"column":6},"end":{"line":167,"column":40}},"100":{"start":{"line":173,"column":3},"end":{"line":177,"column":4}},"101":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"102":{"start":{"line":175,"column":6},"end":{"line":175,"column":42}},"103":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"104":{"start":{"line":184,"column":6},"end":{"line":184,"column":19}},"105":{"start":{"line":185,"column":6},"end":{"line":185,"column":11}},"106":{"start":{"line":188,"column":6},"end":{"line":188,"column":24}},"107":{"start":{"line":189,"column":6},"end":{"line":189,"column":11}},"108":{"start":{"line":192,"column":6},"end":{"line":192,"column":22}},"109":{"start":{"line":193,"column":6},"end":{"line":193,"column":11}},"110":{"start":{"line":202,"column":6},"end":{"line":202,"column":34}},"111":{"start":{"line":205,"column":2},"end":{"line":205,"column":18}},"112":{"start":{"line":206,"column":2},"end":{"line":206,"column":24}},"113":{"start":{"line":207,"column":2},"end":{"line":207,"column":24}},"114":{"start":{"line":210,"column":2},"end":{"line":210,"column":30}},"115":{"start":{"line":215,"column":0},"end":{"line":217,"column":1}},"116":{"start":{"line":216,"column":2},"end":{"line":216,"column":20}},"117":{"start":{"line":219,"column":0},"end":{"line":219,"column":35}},"118":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}}},"fnMap":{"0":{"name":"Entry","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":14}},"loc":{"start":{"line":16,"column":42},"end":{"line":47,"column":1}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":36},"end":{"line":42,"column":37}},"loc":{"start":{"line":42,"column":49},"end":{"line":44,"column":3}},"line":42},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":24},"end":{"line":51,"column":25}},"loc":{"start":{"line":51,"column":37},"end":{"line":78,"column":1}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":80,"column":22},"end":{"line":80,"column":23}},"loc":{"start":{"line":80,"column":35},"end":{"line":84,"column":1}},"line":80},"4":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":24},"end":{"line":86,"column":25}},"loc":{"start":{"line":86,"column":36},"end":{"line":89,"column":1}},"line":86},"5":{"name":"(anonymous_5)","decl":{"start":{"line":91,"column":25},"end":{"line":91,"column":26}},"loc":{"start":{"line":91,"column":37},"end":{"line":97,"column":1}},"line":91},"6":{"name":"(anonymous_6)","decl":{"start":{"line":100,"column":24},"end":{"line":100,"column":25}},"loc":{"start":{"line":100,"column":36},"end":{"line":139,"column":1}},"line":100},"7":{"name":"(anonymous_7)","decl":{"start":{"line":141,"column":28},"end":{"line":141,"column":29}},"loc":{"start":{"line":141,"column":40},"end":{"line":211,"column":1}},"line":141},"8":{"name":"(anonymous_8)","decl":{"start":{"line":158,"column":30},"end":{"line":158,"column":31}},"loc":{"start":{"line":158,"column":43},"end":{"line":162,"column":3}},"line":158},"9":{"name":"(anonymous_9)","decl":{"start":{"line":159,"column":27},"end":{"line":159,"column":28}},"loc":{"start":{"line":159,"column":40},"end":{"line":161,"column":5}},"line":159},"10":{"name":"(anonymous_10)","decl":{"start":{"line":165,"column":32},"end":{"line":165,"column":33}},"loc":{"start":{"line":165,"column":45},"end":{"line":169,"column":3}},"line":165},"11":{"name":"(anonymous_11)","decl":{"start":{"line":173,"column":39},"end":{"line":173,"column":40}},"loc":{"start":{"line":173,"column":52},"end":{"line":177,"column":3}},"line":173},"12":{"name":"(anonymous_12)","decl":{"start":{"line":215,"column":24},"end":{"line":215,"column":25}},"loc":{"start":{"line":215,"column":34},"end":{"line":217,"column":1}},"line":215}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":19},"end":{"line":36,"column":33}},"type":"binary-expr","locations":[{"start":{"line":36,"column":19},"end":{"line":36,"column":27}},{"start":{"line":36,"column":31},"end":{"line":36,"column":33}}],"line":36},"1":{"loc":{"start":{"line":42,"column":14},"end":{"line":42,"column":26}},"type":"binary-expr","locations":[{"start":{"line":42,"column":14},"end":{"line":42,"column":20}},{"start":{"line":42,"column":24},"end":{"line":42,"column":26}}],"line":42},"2":{"loc":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},{"start":{"line":52,"column":2},"end":{"line":52,"column":65}}],"line":52},"3":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},{"start":{"line":53,"column":2},"end":{"line":55,"column":3}}],"line":53},"4":{"loc":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},{"start":{"line":59,"column":2},"end":{"line":61,"column":3}}],"line":59},"5":{"loc":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},{"start":{"line":72,"column":2},"end":{"line":75,"column":3}}],"line":72},"6":{"loc":{"start":{"line":72,"column":6},"end":{"line":72,"column":28}},"type":"binary-expr","locations":[{"start":{"line":72,"column":6},"end":{"line":72,"column":18}},{"start":{"line":72,"column":22},"end":{"line":72,"column":28}}],"line":72},"7":{"loc":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},{"start":{"line":81,"column":2},"end":{"line":81,"column":22}}],"line":81},"8":{"loc":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},{"start":{"line":103,"column":2},"end":{"line":103,"column":58}}],"line":103},"9":{"loc":{"start":{"line":103,"column":6},"end":{"line":103,"column":50}},"type":"binary-expr","locations":[{"start":{"line":103,"column":6},"end":{"line":103,"column":18}},{"start":{"line":103,"column":22},"end":{"line":103,"column":35}},{"start":{"line":103,"column":39},"end":{"line":103,"column":50}}],"line":103},"10":{"loc":{"start":{"line":110,"column":9},"end":{"line":110,"column":54}},"type":"binary-expr","locations":[{"start":{"line":110,"column":9},"end":{"line":110,"column":37}},{"start":{"line":110,"column":41},"end":{"line":110,"column":54}}],"line":110},"11":{"loc":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},{"start":{"line":116,"column":2},"end":{"line":126,"column":3}}],"line":116},"12":{"loc":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},{"start":{"line":118,"column":4},"end":{"line":121,"column":5}}],"line":118},"13":{"loc":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"type":"if","locations":[{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},{"start":{"line":122,"column":4},"end":{"line":125,"column":5}}],"line":122},"14":{"loc":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},{"start":{"line":131,"column":2},"end":{"line":136,"column":3}}],"line":131},"15":{"loc":{"start":{"line":131,"column":6},"end":{"line":131,"column":45}},"type":"binary-expr","locations":[{"start":{"line":131,"column":6},"end":{"line":131,"column":26}},{"start":{"line":131,"column":30},"end":{"line":131,"column":45}}],"line":131},"16":{"loc":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"type":"if","locations":[{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},{"start":{"line":153,"column":4},"end":{"line":153,"column":54}}],"line":153},"17":{"loc":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"type":"if","locations":[{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},{"start":{"line":160,"column":6},"end":{"line":160,"column":54}}],"line":160},"18":{"loc":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"type":"if","locations":[{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},{"start":{"line":166,"column":4},"end":{"line":168,"column":5}}],"line":166},"19":{"loc":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"type":"if","locations":[{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},{"start":{"line":174,"column":4},"end":{"line":176,"column":5}}],"line":174},"20":{"loc":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"type":"switch","locations":[{"start":{"line":182,"column":4},"end":{"line":182,"column":19}},{"start":{"line":183,"column":4},"end":{"line":185,"column":11}},{"start":{"line":187,"column":4},"end":{"line":189,"column":11}},{"start":{"line":191,"column":4},"end":{"line":193,"column":11}},{"start":{"line":195,"column":4},"end":{"line":195,"column":16}},{"start":{"line":196,"column":4},"end":{"line":196,"column":24}},{"start":{"line":197,"column":4},"end":{"line":197,"column":27}},{"start":{"line":198,"column":4},"end":{"line":198,"column":23}},{"start":{"line":199,"column":4},"end":{"line":199,"column":21}},{"start":{"line":200,"column":4},"end":{"line":200,"column":16}},{"start":{"line":201,"column":4},"end":{"line":202,"column":34}}],"line":181}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":17,"8":17,"9":17,"10":17,"11":17,"12":17,"13":17,"14":17,"15":17,"16":17,"17":17,"18":17,"19":17,"20":17,"21":17,"22":17,"23":17,"24":17,"25":17,"26":17,"27":0,"28":17,"29":1,"30":1,"31":15,"32":0,"33":15,"34":0,"35":15,"36":14,"37":15,"38":15,"39":15,"40":15,"41":15,"42":15,"43":0,"44":0,"45":15,"46":1,"47":17,"48":0,"49":17,"50":17,"51":1,"52":0,"53":0,"54":1,"55":0,"56":0,"57":0,"58":0,"59":1,"60":32,"61":0,"62":32,"63":32,"64":15,"65":15,"66":32,"67":32,"68":32,"69":0,"70":0,"71":32,"72":17,"73":17,"74":32,"75":32,"76":0,"77":0,"78":0,"79":0,"80":32,"81":1,"82":17,"83":17,"84":17,"85":17,"86":17,"87":17,"88":17,"89":289,"90":289,"91":289,"92":242,"93":17,"94":34,"95":29,"96":29,"97":17,"98":34,"99":34,"100":17,"101":51,"102":25,"103":17,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":17,"111":17,"112":17,"113":17,"114":17,"115":1,"116":1,"117":1,"118":1},"f":{"0":17,"1":0,"2":15,"3":17,"4":0,"5":0,"6":32,"7":17,"8":34,"9":29,"10":34,"11":51,"12":1},"b":{"0":[17,11],"1":[17,17],"2":[0,15],"3":[0,15],"4":[14,1],"5":[0,15],"6":[15,15],"7":[0,17],"8":[0,32],"9":[32,32,32],"10":[47,15],"11":[32,0],"12":[0,32],"13":[17,15],"14":[0,32],"15":[32,0],"16":[242,47],"17":[29,0],"18":[34,0],"19":[25,26],"20":[0,0,0,0,1,2,2,2,2,2,17]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"2cc4f925db2a60e89bf0743124faec4e8996dfdb","contentHash":"245d5cb2b23d975dc5b9a0ed2553c93c587727d50a7961242f50cec333c04ba9"},"/Users/isaacs/dev/js/tar/lib/global-header-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/global-header-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"1":{"start":{"line":3,"column":27},"end":{"line":3,"column":65}},"2":{"start":{"line":4,"column":15},"end":{"line":4,"column":34}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":50}},"4":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":40}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":40}},"7":{"start":{"line":13,"column":2},"end":{"line":13,"column":23}}},"fnMap":{"0":{"name":"GlobalHeaderWriter","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":27}},"loc":{"start":{"line":8,"column":36},"end":{"line":14,"column":1}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},{"start":{"line":9,"column":2},"end":{"line":11,"column":3}}],"line":9}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0},"f":{"0":0},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3d0c8589f62a5c8ccec606d52d3abd98e5627d57","contentHash":"a2570ca840cf3e44d77e15af0aee52f7c145da39b76366006f3672b9708def3e"},"/Users/isaacs/dev/js/tar/lib/parse.js":{"path":"/Users/isaacs/dev/js/tar/lib/parse.js","statementMap":{"0":{"start":{"line":6,"column":0},"end":{"line":6,"column":37}},"1":{"start":{"line":8,"column":13},"end":{"line":8,"column":30}},"2":{"start":{"line":9,"column":13},"end":{"line":9,"column":26}},"3":{"start":{"line":10,"column":18},"end":{"line":10,"column":41}},"4":{"start":{"line":11,"column":10},"end":{"line":11,"column":30}},"5":{"start":{"line":12,"column":16},"end":{"line":12,"column":38}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":46}},"8":{"start":{"line":15,"column":21},"end":{"line":15,"column":52}},"9":{"start":{"line":16,"column":13},"end":{"line":16,"column":33}},"10":{"start":{"line":17,"column":15},"end":{"line":17,"column":34}},"11":{"start":{"line":18,"column":14},"end":{"line":18,"column":32}},"12":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"13":{"start":{"line":28,"column":11},"end":{"line":28,"column":15}},"14":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"15":{"start":{"line":29,"column":30},"end":{"line":29,"column":48}},"16":{"start":{"line":34,"column":2},"end":{"line":34,"column":18}},"17":{"start":{"line":36,"column":2},"end":{"line":36,"column":20}},"18":{"start":{"line":37,"column":2},"end":{"line":37,"column":20}},"19":{"start":{"line":38,"column":2},"end":{"line":38,"column":35}},"20":{"start":{"line":39,"column":2},"end":{"line":39,"column":17}},"21":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"22":{"start":{"line":41,"column":2},"end":{"line":41,"column":20}},"23":{"start":{"line":43,"column":2},"end":{"line":45,"column":4}},"24":{"start":{"line":44,"column":4},"end":{"line":44,"column":23}},"25":{"start":{"line":47,"column":2},"end":{"line":49,"column":4}},"26":{"start":{"line":48,"column":4},"end":{"line":48,"column":18}},"27":{"start":{"line":51,"column":2},"end":{"line":53,"column":4}},"28":{"start":{"line":52,"column":4},"end":{"line":52,"column":19}},"29":{"start":{"line":55,"column":2},"end":{"line":57,"column":4}},"30":{"start":{"line":56,"column":4},"end":{"line":56,"column":20}},"31":{"start":{"line":63,"column":0},"end":{"line":67,"column":1}},"32":{"start":{"line":64,"column":11},"end":{"line":64,"column":15}},"33":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"34":{"start":{"line":65,"column":31},"end":{"line":65,"column":57}},"35":{"start":{"line":66,"column":2},"end":{"line":66,"column":16}},"36":{"start":{"line":72,"column":0},"end":{"line":83,"column":1}},"37":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"38":{"start":{"line":77,"column":4},"end":{"line":79,"column":5}},"39":{"start":{"line":77,"column":17},"end":{"line":77,"column":18}},"40":{"start":{"line":77,"column":24},"end":{"line":77,"column":32}},"41":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"42":{"start":{"line":78,"column":22},"end":{"line":78,"column":62}},"43":{"start":{"line":80,"column":4},"end":{"line":80,"column":10}},"44":{"start":{"line":82,"column":2},"end":{"line":82,"column":30}},"45":{"start":{"line":85,"column":0},"end":{"line":88,"column":1}},"46":{"start":{"line":86,"column":2},"end":{"line":86,"column":20}},"47":{"start":{"line":87,"column":2},"end":{"line":87,"column":28}},"48":{"start":{"line":94,"column":0},"end":{"line":94,"column":38}},"49":{"start":{"line":96,"column":0},"end":{"line":137,"column":1}},"50":{"start":{"line":97,"column":2},"end":{"line":97,"column":59}},"51":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"52":{"start":{"line":105,"column":16},"end":{"line":105,"column":27}},"53":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"54":{"start":{"line":106,"column":22},"end":{"line":106,"column":36}},"55":{"start":{"line":108,"column":6},"end":{"line":108,"column":34}},"56":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"57":{"start":{"line":109,"column":31},"end":{"line":109,"column":51}},"58":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"59":{"start":{"line":112,"column":6},"end":{"line":112,"column":17}},"60":{"start":{"line":113,"column":6},"end":{"line":113,"column":24}},"61":{"start":{"line":117,"column":15},"end":{"line":117,"column":19}},"62":{"start":{"line":118,"column":4},"end":{"line":120,"column":5}},"63":{"start":{"line":118,"column":17},"end":{"line":118,"column":18}},"64":{"start":{"line":119,"column":6},"end":{"line":119,"column":23}},"65":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"66":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"67":{"start":{"line":128,"column":8},"end":{"line":128,"column":26}},"68":{"start":{"line":129,"column":6},"end":{"line":129,"column":29}},"69":{"start":{"line":131,"column":6},"end":{"line":131,"column":30}},"70":{"start":{"line":132,"column":6},"end":{"line":132,"column":25}},"71":{"start":{"line":136,"column":2},"end":{"line":136,"column":22}},"72":{"start":{"line":140,"column":0},"end":{"line":285,"column":1}},"73":{"start":{"line":141,"column":15},"end":{"line":141,"column":31}},"74":{"start":{"line":142,"column":13},"end":{"line":142,"column":17}},"75":{"start":{"line":147,"column":13},"end":{"line":147,"column":18}},"76":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"77":{"start":{"line":150,"column":12},"end":{"line":150,"column":41}},"78":{"start":{"line":151,"column":4},"end":{"line":151,"column":21}},"79":{"start":{"line":152,"column":4},"end":{"line":152,"column":37}},"80":{"start":{"line":153,"column":4},"end":{"line":153,"column":37}},"81":{"start":{"line":154,"column":4},"end":{"line":154,"column":32}},"82":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"83":{"start":{"line":171,"column":6},"end":{"line":171,"column":23}},"84":{"start":{"line":172,"column":6},"end":{"line":172,"column":18}},"85":{"start":{"line":173,"column":6},"end":{"line":173,"column":11}},"86":{"start":{"line":177,"column":6},"end":{"line":177,"column":32}},"87":{"start":{"line":178,"column":6},"end":{"line":183,"column":7}},"88":{"start":{"line":179,"column":8},"end":{"line":179,"column":41}},"89":{"start":{"line":180,"column":8},"end":{"line":182,"column":10}},"90":{"start":{"line":181,"column":10},"end":{"line":181,"column":43}},"91":{"start":{"line":184,"column":6},"end":{"line":184,"column":33}},"92":{"start":{"line":185,"column":6},"end":{"line":185,"column":17}},"93":{"start":{"line":186,"column":6},"end":{"line":186,"column":11}},"94":{"start":{"line":191,"column":6},"end":{"line":191,"column":32}},"95":{"start":{"line":192,"column":6},"end":{"line":194,"column":7}},"96":{"start":{"line":193,"column":8},"end":{"line":193,"column":37}},"97":{"start":{"line":195,"column":6},"end":{"line":195,"column":27}},"98":{"start":{"line":196,"column":6},"end":{"line":196,"column":17}},"99":{"start":{"line":197,"column":6},"end":{"line":197,"column":11}},"100":{"start":{"line":201,"column":6},"end":{"line":201,"column":29}},"101":{"start":{"line":202,"column":6},"end":{"line":205,"column":7}},"102":{"start":{"line":203,"column":8},"end":{"line":203,"column":45}},"103":{"start":{"line":204,"column":8},"end":{"line":204,"column":44}},"104":{"start":{"line":206,"column":6},"end":{"line":206,"column":25}},"105":{"start":{"line":207,"column":6},"end":{"line":207,"column":17}},"106":{"start":{"line":208,"column":6},"end":{"line":208,"column":11}},"107":{"start":{"line":213,"column":6},"end":{"line":213,"column":29}},"108":{"start":{"line":214,"column":6},"end":{"line":217,"column":7}},"109":{"start":{"line":215,"column":8},"end":{"line":215,"column":45}},"110":{"start":{"line":216,"column":8},"end":{"line":216,"column":40}},"111":{"start":{"line":218,"column":6},"end":{"line":218,"column":21}},"112":{"start":{"line":219,"column":6},"end":{"line":219,"column":17}},"113":{"start":{"line":220,"column":6},"end":{"line":220,"column":11}},"114":{"start":{"line":226,"column":6},"end":{"line":226,"column":23}},"115":{"start":{"line":227,"column":6},"end":{"line":227,"column":25}},"116":{"start":{"line":228,"column":6},"end":{"line":228,"column":11}},"117":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"118":{"start":{"line":233,"column":4},"end":{"line":233,"column":28}},"119":{"start":{"line":235,"column":17},"end":{"line":235,"column":29}},"120":{"start":{"line":236,"column":19},"end":{"line":236,"column":33}},"121":{"start":{"line":240,"column":4},"end":{"line":240,"column":25}},"122":{"start":{"line":242,"column":2},"end":{"line":242,"column":49}},"123":{"start":{"line":243,"column":2},"end":{"line":243,"column":19}},"124":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"125":{"start":{"line":247,"column":4},"end":{"line":249,"column":6}},"126":{"start":{"line":248,"column":6},"end":{"line":248,"column":24}},"127":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"128":{"start":{"line":252,"column":13},"end":{"line":252,"column":35}},"129":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"130":{"start":{"line":255,"column":4},"end":{"line":255,"column":23}},"131":{"start":{"line":258,"column":2},"end":{"line":258,"column":21}},"132":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"133":{"start":{"line":261,"column":4},"end":{"line":261,"column":39}},"134":{"start":{"line":264,"column":11},"end":{"line":264,"column":15}},"135":{"start":{"line":266,"column":2},"end":{"line":268,"column":4}},"136":{"start":{"line":267,"column":4},"end":{"line":267,"column":14}},"137":{"start":{"line":270,"column":2},"end":{"line":272,"column":4}},"138":{"start":{"line":271,"column":4},"end":{"line":271,"column":15}},"139":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"140":{"start":{"line":275,"column":4},"end":{"line":275,"column":29}},"141":{"start":{"line":278,"column":2},"end":{"line":278,"column":22}},"142":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"143":{"start":{"line":282,"column":4},"end":{"line":282,"column":15}},"144":{"start":{"line":283,"column":4},"end":{"line":283,"column":22}}},"fnMap":{"0":{"name":"Parse","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":14}},"loc":{"start":{"line":27,"column":18},"end":{"line":58,"column":1}},"line":27},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":25},"end":{"line":43,"column":26}},"loc":{"start":{"line":43,"column":38},"end":{"line":45,"column":3}},"line":43},"2":{"name":"(anonymous_2)","decl":{"start":{"line":47,"column":24},"end":{"line":47,"column":25}},"loc":{"start":{"line":47,"column":37},"end":{"line":49,"column":3}},"line":47},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":23},"end":{"line":51,"column":24}},"loc":{"start":{"line":51,"column":35},"end":{"line":53,"column":3}},"line":51},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":25},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":37},"end":{"line":57,"column":3}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":63,"column":29},"end":{"line":63,"column":30}},"loc":{"start":{"line":63,"column":41},"end":{"line":67,"column":1}},"line":63},"6":{"name":"(anonymous_6)","decl":{"start":{"line":72,"column":24},"end":{"line":72,"column":25}},"loc":{"start":{"line":72,"column":37},"end":{"line":83,"column":1}},"line":72},"7":{"name":"(anonymous_7)","decl":{"start":{"line":85,"column":22},"end":{"line":85,"column":23}},"loc":{"start":{"line":85,"column":35},"end":{"line":88,"column":1}},"line":85},"8":{"name":"(anonymous_8)","decl":{"start":{"line":94,"column":24},"end":{"line":94,"column":25}},"loc":{"start":{"line":94,"column":36},"end":{"line":94,"column":38}},"line":94},"9":{"name":"(anonymous_9)","decl":{"start":{"line":96,"column":27},"end":{"line":96,"column":28}},"loc":{"start":{"line":96,"column":40},"end":{"line":137,"column":1}},"line":96},"10":{"name":"(anonymous_10)","decl":{"start":{"line":140,"column":30},"end":{"line":140,"column":31}},"loc":{"start":{"line":140,"column":43},"end":{"line":285,"column":1}},"line":140},"11":{"name":"(anonymous_11)","decl":{"start":{"line":178,"column":14},"end":{"line":178,"column":15}},"loc":{"start":{"line":178,"column":26},"end":{"line":183,"column":7}},"line":178},"12":{"name":"(anonymous_12)","decl":{"start":{"line":180,"column":42},"end":{"line":180,"column":43}},"loc":{"start":{"line":180,"column":55},"end":{"line":182,"column":9}},"line":180},"13":{"name":"(anonymous_13)","decl":{"start":{"line":192,"column":14},"end":{"line":192,"column":15}},"loc":{"start":{"line":192,"column":26},"end":{"line":194,"column":7}},"line":192},"14":{"name":"(anonymous_14)","decl":{"start":{"line":202,"column":14},"end":{"line":202,"column":15}},"loc":{"start":{"line":202,"column":26},"end":{"line":205,"column":7}},"line":202},"15":{"name":"(anonymous_15)","decl":{"start":{"line":214,"column":14},"end":{"line":214,"column":15}},"loc":{"start":{"line":214,"column":26},"end":{"line":217,"column":7}},"line":214},"16":{"name":"(anonymous_16)","decl":{"start":{"line":247,"column":21},"end":{"line":247,"column":22}},"loc":{"start":{"line":247,"column":34},"end":{"line":249,"column":5}},"line":247},"17":{"name":"(anonymous_17)","decl":{"start":{"line":266,"column":20},"end":{"line":266,"column":21}},"loc":{"start":{"line":266,"column":32},"end":{"line":268,"column":3}},"line":266},"18":{"name":"(anonymous_18)","decl":{"start":{"line":270,"column":21},"end":{"line":270,"column":22}},"loc":{"start":{"line":270,"column":33},"end":{"line":272,"column":3}},"line":270}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},{"start":{"line":29,"column":2},"end":{"line":29,"column":48}}],"line":29},"1":{"loc":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},{"start":{"line":65,"column":2},"end":{"line":65,"column":57}}],"line":65},"2":{"loc":{"start":{"line":65,"column":6},"end":{"line":65,"column":29}},"type":"binary-expr","locations":[{"start":{"line":65,"column":6},"end":{"line":65,"column":16}},{"start":{"line":65,"column":20},"end":{"line":65,"column":29}}],"line":65},"3":{"loc":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},{"start":{"line":73,"column":2},"end":{"line":81,"column":3}}],"line":73},"4":{"loc":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"type":"if","locations":[{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},{"start":{"line":78,"column":6},"end":{"line":78,"column":62}}],"line":78},"5":{"loc":{"start":{"line":97,"column":9},"end":{"line":97,"column":30}},"type":"binary-expr","locations":[{"start":{"line":97,"column":9},"end":{"line":97,"column":10}},{"start":{"line":97,"column":14},"end":{"line":97,"column":30}}],"line":97},"6":{"loc":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},{"start":{"line":104,"column":2},"end":{"line":134,"column":3}}],"line":104},"7":{"loc":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"type":"if","locations":[{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},{"start":{"line":106,"column":4},"end":{"line":110,"column":5}}],"line":106},"8":{"loc":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"type":"if","locations":[{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},{"start":{"line":109,"column":6},"end":{"line":109,"column":51}}],"line":109},"9":{"loc":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},{"start":{"line":111,"column":4},"end":{"line":114,"column":5}}],"line":111},"10":{"loc":{"start":{"line":118,"column":20},"end":{"line":118,"column":35}},"type":"binary-expr","locations":[{"start":{"line":118,"column":20},"end":{"line":118,"column":27}},{"start":{"line":118,"column":31},"end":{"line":118,"column":35}}],"line":118},"11":{"loc":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"type":"if","locations":[{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},{"start":{"line":126,"column":4},"end":{"line":133,"column":5}}],"line":126},"12":{"loc":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"type":"if","locations":[{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},{"start":{"line":127,"column":6},"end":{"line":128,"column":26}}],"line":127},"13":{"loc":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},{"start":{"line":149,"column":2},"end":{"line":155,"column":3}}],"line":149},"14":{"loc":{"start":{"line":149,"column":6},"end":{"line":149,"column":48}},"type":"binary-expr","locations":[{"start":{"line":149,"column":6},"end":{"line":149,"column":26}},{"start":{"line":149,"column":30},"end":{"line":149,"column":48}}],"line":149},"15":{"loc":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"type":"switch","locations":[{"start":{"line":158,"column":4},"end":{"line":158,"column":16}},{"start":{"line":159,"column":4},"end":{"line":159,"column":19}},{"start":{"line":160,"column":4},"end":{"line":160,"column":16}},{"start":{"line":161,"column":4},"end":{"line":161,"column":24}},{"start":{"line":162,"column":4},"end":{"line":162,"column":27}},{"start":{"line":163,"column":4},"end":{"line":163,"column":23}},{"start":{"line":164,"column":4},"end":{"line":164,"column":21}},{"start":{"line":165,"column":4},"end":{"line":165,"column":16}},{"start":{"line":166,"column":4},"end":{"line":166,"column":26}},{"start":{"line":167,"column":4},"end":{"line":173,"column":11}},{"start":{"line":175,"column":4},"end":{"line":186,"column":11}},{"start":{"line":188,"column":4},"end":{"line":188,"column":26}},{"start":{"line":189,"column":4},"end":{"line":197,"column":11}},{"start":{"line":199,"column":4},"end":{"line":208,"column":11}},{"start":{"line":210,"column":4},"end":{"line":210,"column":31}},{"start":{"line":211,"column":4},"end":{"line":220,"column":11}},{"start":{"line":222,"column":4},"end":{"line":228,"column":11}}],"line":157},"16":{"loc":{"start":{"line":179,"column":23},"end":{"line":179,"column":41}},"type":"binary-expr","locations":[{"start":{"line":179,"column":23},"end":{"line":179,"column":35}},{"start":{"line":179,"column":39},"end":{"line":179,"column":41}}],"line":179},"17":{"loc":{"start":{"line":203,"column":25},"end":{"line":203,"column":45}},"type":"binary-expr","locations":[{"start":{"line":203,"column":25},"end":{"line":203,"column":39}},{"start":{"line":203,"column":43},"end":{"line":203,"column":45}}],"line":203},"18":{"loc":{"start":{"line":215,"column":25},"end":{"line":215,"column":45}},"type":"binary-expr","locations":[{"start":{"line":215,"column":25},"end":{"line":215,"column":39}},{"start":{"line":215,"column":43},"end":{"line":215,"column":45}}],"line":215},"19":{"loc":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},{"start":{"line":232,"column":2},"end":{"line":241,"column":3}}],"line":232},"20":{"loc":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},{"start":{"line":246,"column":2},"end":{"line":250,"column":3}}],"line":246},"21":{"loc":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"type":"if","locations":[{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},{"start":{"line":252,"column":2},"end":{"line":252,"column":35}}],"line":252},"22":{"loc":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},{"start":{"line":254,"column":2},"end":{"line":256,"column":3}}],"line":254},"23":{"loc":{"start":{"line":254,"column":6},"end":{"line":254,"column":58}},"type":"binary-expr","locations":[{"start":{"line":254,"column":6},"end":{"line":254,"column":27}},{"start":{"line":254,"column":31},"end":{"line":254,"column":58}}],"line":254},"24":{"loc":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},{"start":{"line":260,"column":2},"end":{"line":262,"column":3}}],"line":260},"25":{"loc":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"type":"if","locations":[{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},{"start":{"line":274,"column":2},"end":{"line":276,"column":3}}],"line":274},"26":{"loc":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"type":"if","locations":[{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},{"start":{"line":281,"column":2},"end":{"line":284,"column":3}}],"line":281}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":2,"14":2,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":0,"25":1,"26":36,"27":1,"28":1,"29":1,"30":0,"31":1,"32":1,"33":1,"34":0,"35":1,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":36,"51":36,"52":17,"53":17,"54":15,"55":2,"56":2,"57":1,"58":17,"59":15,"60":15,"61":19,"62":19,"63":19,"64":1041,"65":19,"66":2,"67":1,"68":2,"69":17,"70":17,"71":36,"72":1,"73":17,"74":17,"75":17,"76":17,"77":0,"78":0,"79":0,"80":0,"81":0,"82":17,"83":10,"84":10,"85":10,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":0,"115":0,"116":0,"117":17,"118":7,"119":10,"120":10,"121":10,"122":17,"123":17,"124":17,"125":10,"126":8,"127":17,"128":7,"129":17,"130":0,"131":17,"132":17,"133":1,"134":17,"135":17,"136":0,"137":17,"138":0,"139":17,"140":0,"141":17,"142":17,"143":2,"144":2},"f":{"0":2,"1":0,"2":36,"3":1,"4":0,"5":1,"6":1,"7":1,"8":0,"9":36,"10":17,"11":0,"12":0,"13":4,"14":1,"15":2,"16":8,"17":0,"18":0},"b":{"0":[1,1],"1":[0,1],"2":[1,1],"3":[0,1],"4":[0,0],"5":[36,36],"6":[17,19],"7":[15,2],"8":[1,1],"9":[15,2],"10":[1060,1058],"11":[2,17],"12":[1,1],"13":[0,17],"14":[17,17],"15":[8,8,9,10,10,10,10,10,10,10,0,4,4,1,2,2,0],"16":[0,0],"17":[1,1],"18":[2,1],"19":[7,10],"20":[10,7],"21":[7,10],"22":[0,17],"23":[17,8],"24":[1,16],"25":[0,17],"26":[2,15]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"4a8f51a3a12b59eb69694618530032a813fbf8cb","contentHash":"d347e73abcd3109143efee20401d9f0bfc6d68a4a6323bd4559ada44c741786a"},"/Users/isaacs/dev/js/tar/lib/buffer-entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/buffer-entry.js","statementMap":{"0":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"1":{"start":{"line":10,"column":15},"end":{"line":10,"column":34}},"2":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"3":{"start":{"line":14,"column":2},"end":{"line":14,"column":30}},"4":{"start":{"line":15,"column":2},"end":{"line":15,"column":44}},"5":{"start":{"line":16,"column":2},"end":{"line":16,"column":18}},"6":{"start":{"line":17,"column":2},"end":{"line":17,"column":16}},"7":{"start":{"line":18,"column":2},"end":{"line":20,"column":4}},"8":{"start":{"line":19,"column":4},"end":{"line":19,"column":52}},"9":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"10":{"start":{"line":26,"column":0},"end":{"line":30,"column":1}},"11":{"start":{"line":27,"column":2},"end":{"line":27,"column":36}},"12":{"start":{"line":28,"column":2},"end":{"line":28,"column":26}},"13":{"start":{"line":29,"column":2},"end":{"line":29,"column":37}}},"fnMap":{"0":{"name":"BufferEntry","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":24},"end":{"line":21,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":17},"end":{"line":18,"column":18}},"loc":{"start":{"line":18,"column":29},"end":{"line":20,"column":3}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":30},"end":{"line":26,"column":31}},"loc":{"start":{"line":26,"column":43},"end":{"line":30,"column":1}},"line":26}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":1,"10":1,"11":3,"12":3,"13":3},"f":{"0":3,"1":3,"2":3},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"d8ad66df900443c9c9d8aefe5fc126a55ba268ec","contentHash":"25e5b3c51e476fcffac7affa191a0ed0f54d64d3d3b760e887bd45ba08fffa65"},"/Users/isaacs/dev/js/tar/lib/extended-header.js":{"path":"/Users/isaacs/dev/js/tar/lib/extended-header.js","statementMap":{"0":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"1":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"2":{"start":{"line":12,"column":15},"end":{"line":12,"column":34}},"3":{"start":{"line":13,"column":10},"end":{"line":13,"column":30}},"4":{"start":{"line":14,"column":14},"end":{"line":14,"column":25}},"5":{"start":{"line":15,"column":15},"end":{"line":17,"column":42}},"6":{"start":{"line":20,"column":2},"end":{"line":20,"column":30}},"7":{"start":{"line":21,"column":2},"end":{"line":21,"column":30}},"8":{"start":{"line":22,"column":2},"end":{"line":22,"column":18}},"9":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"10":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":20}},"12":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"13":{"start":{"line":27,"column":2},"end":{"line":27,"column":19}},"14":{"start":{"line":28,"column":2},"end":{"line":28,"column":19}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"16":{"start":{"line":30,"column":2},"end":{"line":30,"column":16}},"17":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"18":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"19":{"start":{"line":36,"column":8},"end":{"line":36,"column":9}},"20":{"start":{"line":37,"column":13},"end":{"line":37,"column":39}},"21":{"start":{"line":38,"column":11},"end":{"line":38,"column":28}},"22":{"start":{"line":39,"column":11},"end":{"line":39,"column":28}},"23":{"start":{"line":40,"column":11},"end":{"line":40,"column":28}},"24":{"start":{"line":41,"column":11},"end":{"line":41,"column":28}},"25":{"start":{"line":43,"column":0},"end":{"line":45,"column":2}},"26":{"start":{"line":44,"column":2},"end":{"line":44,"column":31}},"27":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"28":{"start":{"line":50,"column":9},"end":{"line":50,"column":26}},"29":{"start":{"line":51,"column":9},"end":{"line":51,"column":26}},"30":{"start":{"line":52,"column":12},"end":{"line":52,"column":29}},"31":{"start":{"line":53,"column":8},"end":{"line":53,"column":25}},"32":{"start":{"line":54,"column":8},"end":{"line":54,"column":25}},"33":{"start":{"line":55,"column":8},"end":{"line":55,"column":25}},"34":{"start":{"line":56,"column":8},"end":{"line":56,"column":25}},"35":{"start":{"line":57,"column":12},"end":{"line":57,"column":29}},"36":{"start":{"line":58,"column":9},"end":{"line":58,"column":26}},"37":{"start":{"line":59,"column":9},"end":{"line":59,"column":27}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"39":{"start":{"line":62,"column":27},"end":{"line":62,"column":33}},"40":{"start":{"line":64,"column":2},"end":{"line":130,"column":3}},"41":{"start":{"line":64,"column":16},"end":{"line":64,"column":17}},"42":{"start":{"line":64,"column":23},"end":{"line":64,"column":31}},"43":{"start":{"line":69,"column":12},"end":{"line":69,"column":16}},"44":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"45":{"start":{"line":72,"column":6},"end":{"line":72,"column":53}},"46":{"start":{"line":73,"column":6},"end":{"line":73,"column":12}},"47":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"48":{"start":{"line":77,"column":16},"end":{"line":77,"column":22}},"49":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"50":{"start":{"line":82,"column":10},"end":{"line":82,"column":27}},"51":{"start":{"line":84,"column":10},"end":{"line":84,"column":73}},"52":{"start":{"line":85,"column":10},"end":{"line":85,"column":34}},"53":{"start":{"line":86,"column":10},"end":{"line":86,"column":18}},"54":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"55":{"start":{"line":89,"column":10},"end":{"line":89,"column":68}},"56":{"start":{"line":90,"column":10},"end":{"line":90,"column":16}},"57":{"start":{"line":92,"column":8},"end":{"line":92,"column":29}},"58":{"start":{"line":93,"column":8},"end":{"line":93,"column":16}},"59":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"60":{"start":{"line":98,"column":10},"end":{"line":98,"column":27}},"61":{"start":{"line":99,"column":10},"end":{"line":99,"column":57}},"62":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"63":{"start":{"line":100,"column":35},"end":{"line":100,"column":66}},"64":{"start":{"line":101,"column":10},"end":{"line":101,"column":33}},"65":{"start":{"line":102,"column":10},"end":{"line":102,"column":18}},"66":{"start":{"line":104,"column":8},"end":{"line":104,"column":28}},"67":{"start":{"line":105,"column":8},"end":{"line":105,"column":16}},"68":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"69":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"70":{"start":{"line":112,"column":12},"end":{"line":112,"column":55}},"71":{"start":{"line":113,"column":12},"end":{"line":113,"column":18}},"72":{"start":{"line":115,"column":20},"end":{"line":115,"column":55}},"73":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"74":{"start":{"line":117,"column":12},"end":{"line":117,"column":33}},"75":{"start":{"line":119,"column":10},"end":{"line":119,"column":38}},"76":{"start":{"line":121,"column":10},"end":{"line":121,"column":33}},"77":{"start":{"line":122,"column":10},"end":{"line":122,"column":28}},"78":{"start":{"line":123,"column":10},"end":{"line":123,"column":25}},"79":{"start":{"line":124,"column":10},"end":{"line":124,"column":29}},"80":{"start":{"line":125,"column":10},"end":{"line":125,"column":18}},"81":{"start":{"line":127,"column":8},"end":{"line":127,"column":28}},"82":{"start":{"line":128,"column":8},"end":{"line":128,"column":16}},"83":{"start":{"line":134,"column":2},"end":{"line":136,"column":42}},"84":{"start":{"line":138,"column":2},"end":{"line":138,"column":15}},"85":{"start":{"line":139,"column":2},"end":{"line":139,"column":16}}},"fnMap":{"0":{"name":"ExtendedHeader","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":23}},"loc":{"start":{"line":19,"column":27},"end":{"line":31,"column":1}},"line":19},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":28},"end":{"line":43,"column":29}},"loc":{"start":{"line":43,"column":41},"end":{"line":45,"column":1}},"line":43},"2":{"name":"parse","decl":{"start":{"line":61,"column":9},"end":{"line":61,"column":14}},"loc":{"start":{"line":61,"column":19},"end":{"line":131,"column":1}},"line":61},"3":{"name":"error","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":14}},"loc":{"start":{"line":133,"column":25},"end":{"line":140,"column":1}},"line":133}},"branchMap":{"0":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},{"start":{"line":62,"column":2},"end":{"line":62,"column":33}}],"line":62},"1":{"loc":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},{"start":{"line":71,"column":4},"end":{"line":74,"column":5}}],"line":71},"2":{"loc":{"start":{"line":71,"column":8},"end":{"line":71,"column":54}},"type":"binary-expr","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":23}},{"start":{"line":71,"column":27},"end":{"line":71,"column":54}}],"line":71},"3":{"loc":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"type":"switch","locations":[{"start":{"line":77,"column":6},"end":{"line":77,"column":22}},{"start":{"line":79,"column":6},"end":{"line":93,"column":16}},{"start":{"line":95,"column":6},"end":{"line":105,"column":16}},{"start":{"line":107,"column":6},"end":{"line":128,"column":16}}],"line":76},"4":{"loc":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},{"start":{"line":81,"column":8},"end":{"line":87,"column":9}}],"line":81},"5":{"loc":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},{"start":{"line":88,"column":8},"end":{"line":91,"column":9}}],"line":88},"6":{"loc":{"start":{"line":88,"column":12},"end":{"line":88,"column":28}},"type":"binary-expr","locations":[{"start":{"line":88,"column":12},"end":{"line":88,"column":18}},{"start":{"line":88,"column":22},"end":{"line":88,"column":28}}],"line":88},"7":{"loc":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"type":"if","locations":[{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},{"start":{"line":97,"column":8},"end":{"line":103,"column":9}}],"line":97},"8":{"loc":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"type":"if","locations":[{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},{"start":{"line":100,"column":10},"end":{"line":100,"column":66}}],"line":100},"9":{"loc":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},{"start":{"line":109,"column":8},"end":{"line":126,"column":9}}],"line":109},"10":{"loc":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"type":"if","locations":[{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},{"start":{"line":111,"column":10},"end":{"line":114,"column":11}}],"line":111},"11":{"loc":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"type":"if","locations":[{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},{"start":{"line":116,"column":10},"end":{"line":118,"column":11}}],"line":116}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":4,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":4,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":4,"39":0,"40":4,"41":4,"42":4,"43":969,"44":969,"45":0,"46":0,"47":969,"48":0,"49":80,"50":26,"51":26,"52":26,"53":26,"54":54,"55":0,"56":0,"57":54,"58":54,"59":275,"60":26,"61":26,"62":26,"63":12,"64":26,"65":26,"66":249,"67":249,"68":614,"69":26,"70":0,"71":0,"72":26,"73":26,"74":20,"75":26,"76":26,"77":26,"78":26,"79":26,"80":26,"81":588,"82":588,"83":0,"84":0,"85":0},"f":{"0":4,"1":4,"2":4,"3":0},"b":{"0":[0,4],"1":[0,969],"2":[969,889],"3":[0,80,275,614],"4":[26,54],"5":[0,54],"6":[54,54],"7":[26,249],"8":[12,14],"9":[26,588],"10":[0,26],"11":[20,6]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"77cb382c69a46833a08275dbc55bf34db0dcd796","contentHash":"78a790af1726a774425fb478f1423068fe64414b747d89b597baf45139e7ae3d"},"/Users/isaacs/dev/js/tar/lib/extract.js":{"path":"/Users/isaacs/dev/js/tar/lib/extract.js","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":24}},"1":{"start":{"line":5,"column":10},"end":{"line":5,"column":30}},"2":{"start":{"line":6,"column":14},"end":{"line":6,"column":32}},"3":{"start":{"line":7,"column":15},"end":{"line":7,"column":34}},"4":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"5":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"6":{"start":{"line":11,"column":34},"end":{"line":11,"column":58}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":23}},"8":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"9":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"10":{"start":{"line":19,"column":2},"end":{"line":19,"column":59}},"11":{"start":{"line":20,"column":2},"end":{"line":20,"column":25}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":26}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"15":{"start":{"line":25,"column":38},"end":{"line":25,"column":52}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":34}},"17":{"start":{"line":29,"column":2},"end":{"line":29,"column":14}},"18":{"start":{"line":30,"column":11},"end":{"line":30,"column":15}},"19":{"start":{"line":35,"column":2},"end":{"line":60,"column":4}},"20":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"21":{"start":{"line":39,"column":14},"end":{"line":39,"column":63}},"22":{"start":{"line":40,"column":6},"end":{"line":40,"column":39}},"23":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"24":{"start":{"line":42,"column":17},"end":{"line":42,"column":70}},"25":{"start":{"line":43,"column":8},"end":{"line":43,"column":50}},"26":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"27":{"start":{"line":47,"column":6},"end":{"line":48,"column":66}},"28":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"29":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"30":{"start":{"line":53,"column":21},"end":{"line":53,"column":41}},"31":{"start":{"line":54,"column":19},"end":{"line":54,"column":56}},"32":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"33":{"start":{"line":56,"column":8},"end":{"line":56,"column":65}},"34":{"start":{"line":58,"column":6},"end":{"line":58,"column":54}},"35":{"start":{"line":62,"column":2},"end":{"line":65,"column":4}},"36":{"start":{"line":63,"column":4},"end":{"line":63,"column":36}},"37":{"start":{"line":64,"column":4},"end":{"line":64,"column":15}},"38":{"start":{"line":67,"column":2},"end":{"line":69,"column":4}},"39":{"start":{"line":68,"column":4},"end":{"line":68,"column":25}},"40":{"start":{"line":71,"column":2},"end":{"line":73,"column":4}},"41":{"start":{"line":72,"column":4},"end":{"line":72,"column":20}},"42":{"start":{"line":79,"column":2},"end":{"line":84,"column":4}},"43":{"start":{"line":81,"column":4},"end":{"line":81,"column":21}},"44":{"start":{"line":82,"column":4},"end":{"line":82,"column":18}},"45":{"start":{"line":83,"column":4},"end":{"line":83,"column":20}},"46":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"47":{"start":{"line":89,"column":0},"end":{"line":94,"column":1}},"48":{"start":{"line":90,"column":11},"end":{"line":90,"column":15}},"49":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"50":{"start":{"line":91,"column":31},"end":{"line":91,"column":57}},"51":{"start":{"line":92,"column":2},"end":{"line":92,"column":15}}},"fnMap":{"0":{"name":"Extract","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":16}},"loc":{"start":{"line":10,"column":24},"end":{"line":85,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":17},"end":{"line":35,"column":18}},"loc":{"start":{"line":35,"column":34},"end":{"line":60,"column":3}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":36},"end":{"line":65,"column":3}},"line":62},"3":{"name":"(anonymous_3)","decl":{"start":{"line":67,"column":24},"end":{"line":67,"column":25}},"loc":{"start":{"line":67,"column":38},"end":{"line":69,"column":3}},"line":67},"4":{"name":"(anonymous_4)","decl":{"start":{"line":71,"column":24},"end":{"line":71,"column":25}},"loc":{"start":{"line":71,"column":35},"end":{"line":73,"column":3}},"line":71},"5":{"name":"(anonymous_5)","decl":{"start":{"line":79,"column":24},"end":{"line":79,"column":25}},"loc":{"start":{"line":79,"column":36},"end":{"line":84,"column":3}},"line":79},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":31},"end":{"line":89,"column":32}},"loc":{"start":{"line":89,"column":43},"end":{"line":94,"column":1}},"line":89}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},{"start":{"line":11,"column":2},"end":{"line":11,"column":58}}],"line":11},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},{"start":{"line":14,"column":2},"end":{"line":16,"column":3}}],"line":14},"2":{"loc":{"start":{"line":19,"column":14},"end":{"line":19,"column":59}},"type":"binary-expr","locations":[{"start":{"line":19,"column":14},"end":{"line":19,"column":23}},{"start":{"line":19,"column":27},"end":{"line":19,"column":59}}],"line":19},"3":{"loc":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"type":"if","locations":[{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},{"start":{"line":25,"column":2},"end":{"line":25,"column":52}}],"line":25},"4":{"loc":{"start":{"line":25,"column":6},"end":{"line":25,"column":36}},"type":"binary-expr","locations":[{"start":{"line":25,"column":6},"end":{"line":25,"column":17}},{"start":{"line":25,"column":21},"end":{"line":25,"column":36}}],"line":25},"5":{"loc":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},{"start":{"line":38,"column":4},"end":{"line":45,"column":5}}],"line":38},"6":{"loc":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},{"start":{"line":41,"column":6},"end":{"line":44,"column":7}}],"line":41},"7":{"loc":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},{"start":{"line":46,"column":4},"end":{"line":49,"column":5}}],"line":46},"8":{"loc":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},{"start":{"line":51,"column":4},"end":{"line":59,"column":5}}],"line":51},"9":{"loc":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"type":"binary-expr","locations":[{"start":{"line":52,"column":15},"end":{"line":52,"column":39}},{"start":{"line":52,"column":43},"end":{"line":52,"column":45}}],"line":52},"10":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},{"start":{"line":55,"column":6},"end":{"line":57,"column":7}}],"line":55},"11":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},{"start":{"line":91,"column":2},"end":{"line":91,"column":57}}],"line":91},"12":{"loc":{"start":{"line":91,"column":6},"end":{"line":91,"column":29}},"type":"binary-expr","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":16}},{"start":{"line":91,"column":20},"end":{"line":91,"column":29}}],"line":91}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":1,"47":1,"48":0,"49":0,"50":0,"51":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3fb9f60facc409fe944dc36bd2e14fc6153e403d","contentHash":"3d9485ca58c6c768b022a39d276296b53647ccf39986885459406e933921c962"}} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/12bca2bc-6a2b-4f45-abc7-8483922a524d.json b/node_modules/tar/.nyc_output/12bca2bc-6a2b-4f45-abc7-8483922a524d.json new file mode 100644 index 00000000..099d5b1d --- /dev/null +++ b/node_modules/tar/.nyc_output/12bca2bc-6a2b-4f45-abc7-8483922a524d.json @@ -0,0 +1 @@ +{"/Users/isaacs/dev/js/tar/lib/pack.js":{"path":"/Users/isaacs/dev/js/tar/lib/pack.js","statementMap":{"0":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}},"1":{"start":{"line":6,"column":18},"end":{"line":6,"column":46}},"2":{"start":{"line":7,"column":13},"end":{"line":7,"column":37}},"3":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"4":{"start":{"line":9,"column":15},"end":{"line":9,"column":34}},"5":{"start":{"line":10,"column":25},"end":{"line":10,"column":61}},"6":{"start":{"line":11,"column":14},"end":{"line":11,"column":40}},"7":{"start":{"line":12,"column":10},"end":{"line":12,"column":25}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"9":{"start":{"line":14,"column":13},"end":{"line":14,"column":14}},"10":{"start":{"line":14,"column":31},"end":{"line":14,"column":41}},"11":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"12":{"start":{"line":20,"column":11},"end":{"line":20,"column":15}},"13":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"14":{"start":{"line":21,"column":29},"end":{"line":21,"column":51}},"15":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"16":{"start":{"line":23,"column":13},"end":{"line":23,"column":52}},"17":{"start":{"line":24,"column":7},"end":{"line":24,"column":32}},"18":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"19":{"start":{"line":28,"column":2},"end":{"line":28,"column":20}},"20":{"start":{"line":29,"column":2},"end":{"line":29,"column":20}},"21":{"start":{"line":30,"column":2},"end":{"line":30,"column":17}},"22":{"start":{"line":32,"column":2},"end":{"line":32,"column":25}},"23":{"start":{"line":33,"column":2},"end":{"line":33,"column":24}},"24":{"start":{"line":35,"column":2},"end":{"line":35,"column":21}},"25":{"start":{"line":36,"column":2},"end":{"line":43,"column":4}},"26":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"27":{"start":{"line":37,"column":35},"end":{"line":37,"column":41}},"28":{"start":{"line":38,"column":4},"end":{"line":38,"column":22}},"29":{"start":{"line":39,"column":4},"end":{"line":41,"column":6}},"30":{"start":{"line":40,"column":6},"end":{"line":40,"column":25}},"31":{"start":{"line":42,"column":4},"end":{"line":42,"column":15}},"32":{"start":{"line":46,"column":0},"end":{"line":57,"column":1}},"33":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"34":{"start":{"line":48,"column":23},"end":{"line":48,"column":29}},"35":{"start":{"line":49,"column":2},"end":{"line":49,"column":24}},"36":{"start":{"line":51,"column":11},"end":{"line":51,"column":15}},"37":{"start":{"line":52,"column":2},"end":{"line":56,"column":10}},"38":{"start":{"line":54,"column":6},"end":{"line":54,"column":24}},"39":{"start":{"line":59,"column":0},"end":{"line":69,"column":1}},"40":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"41":{"start":{"line":60,"column":40},"end":{"line":60,"column":68}},"42":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"43":{"start":{"line":62,"column":19},"end":{"line":62,"column":72}},"44":{"start":{"line":64,"column":2},"end":{"line":64,"column":17}},"45":{"start":{"line":65,"column":2},"end":{"line":65,"column":27}},"46":{"start":{"line":66,"column":2},"end":{"line":66,"column":17}},"47":{"start":{"line":67,"column":2},"end":{"line":67,"column":43}},"48":{"start":{"line":68,"column":2},"end":{"line":68,"column":25}},"49":{"start":{"line":71,"column":0},"end":{"line":75,"column":1}},"50":{"start":{"line":72,"column":2},"end":{"line":72,"column":21}},"51":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"52":{"start":{"line":73,"column":26},"end":{"line":73,"column":52}},"53":{"start":{"line":74,"column":2},"end":{"line":74,"column":20}},"54":{"start":{"line":77,"column":0},"end":{"line":82,"column":1}},"55":{"start":{"line":78,"column":2},"end":{"line":78,"column":22}},"56":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"57":{"start":{"line":79,"column":26},"end":{"line":79,"column":53}},"58":{"start":{"line":80,"column":2},"end":{"line":80,"column":21}},"59":{"start":{"line":81,"column":2},"end":{"line":81,"column":17}},"60":{"start":{"line":84,"column":0},"end":{"line":88,"column":1}},"61":{"start":{"line":85,"column":2},"end":{"line":85,"column":20}},"62":{"start":{"line":86,"column":2},"end":{"line":86,"column":24}},"63":{"start":{"line":87,"column":2},"end":{"line":87,"column":17}},"64":{"start":{"line":90,"column":0},"end":{"line":233,"column":1}},"65":{"start":{"line":91,"column":11},"end":{"line":91,"column":15}},"66":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"67":{"start":{"line":93,"column":4},"end":{"line":93,"column":10}},"68":{"start":{"line":96,"column":14},"end":{"line":96,"column":32}},"69":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"70":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"71":{"start":{"line":100,"column":6},"end":{"line":100,"column":22}},"72":{"start":{"line":102,"column":4},"end":{"line":102,"column":10}},"73":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"74":{"start":{"line":107,"column":4},"end":{"line":107,"column":29}},"75":{"start":{"line":108,"column":4},"end":{"line":111,"column":6}},"76":{"start":{"line":110,"column":6},"end":{"line":110,"column":19}},"77":{"start":{"line":112,"column":4},"end":{"line":112,"column":10}},"78":{"start":{"line":115,"column":2},"end":{"line":115,"column":23}},"79":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"80":{"start":{"line":119,"column":4},"end":{"line":119,"column":24}},"81":{"start":{"line":120,"column":4},"end":{"line":120,"column":24}},"82":{"start":{"line":121,"column":4},"end":{"line":121,"column":18}},"83":{"start":{"line":122,"column":4},"end":{"line":122,"column":20}},"84":{"start":{"line":123,"column":4},"end":{"line":123,"column":10}},"85":{"start":{"line":134,"column":13},"end":{"line":134,"column":53}},"86":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"87":{"start":{"line":137,"column":4},"end":{"line":137,"column":27}},"88":{"start":{"line":140,"column":15},"end":{"line":140,"column":17}},"89":{"start":{"line":142,"column":2},"end":{"line":144,"column":4}},"90":{"start":{"line":143,"column":4},"end":{"line":143,"column":30}},"91":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"92":{"start":{"line":146,"column":25},"end":{"line":146,"column":52}},"93":{"start":{"line":148,"column":2},"end":{"line":148,"column":53}},"94":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"95":{"start":{"line":152,"column":4},"end":{"line":152,"column":49}},"96":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"97":{"start":{"line":156,"column":4},"end":{"line":156,"column":29}},"98":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"99":{"start":{"line":161,"column":6},"end":{"line":161,"column":12}},"100":{"start":{"line":164,"column":6},"end":{"line":164,"column":24}},"101":{"start":{"line":165,"column":6},"end":{"line":165,"column":21}},"102":{"start":{"line":166,"column":6},"end":{"line":166,"column":11}},"103":{"start":{"line":169,"column":15},"end":{"line":169,"column":69}},"104":{"start":{"line":170,"column":6},"end":{"line":170,"column":54}},"105":{"start":{"line":171,"column":6},"end":{"line":171,"column":21}},"106":{"start":{"line":172,"column":6},"end":{"line":172,"column":11}},"107":{"start":{"line":175,"column":15},"end":{"line":175,"column":69}},"108":{"start":{"line":176,"column":6},"end":{"line":176,"column":74}},"109":{"start":{"line":177,"column":6},"end":{"line":177,"column":21}},"110":{"start":{"line":178,"column":6},"end":{"line":178,"column":11}},"111":{"start":{"line":187,"column":15},"end":{"line":187,"column":53}},"112":{"start":{"line":189,"column":2},"end":{"line":189,"column":20}},"113":{"start":{"line":195,"column":2},"end":{"line":197,"column":4}},"114":{"start":{"line":196,"column":4},"end":{"line":196,"column":22}},"115":{"start":{"line":199,"column":2},"end":{"line":205,"column":4}},"116":{"start":{"line":200,"column":4},"end":{"line":202,"column":5}},"117":{"start":{"line":201,"column":6},"end":{"line":201,"column":50}},"118":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"119":{"start":{"line":204,"column":33},"end":{"line":204,"column":44}},"120":{"start":{"line":206,"column":2},"end":{"line":206,"column":31}},"121":{"start":{"line":208,"column":14},"end":{"line":208,"column":19}},"122":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"123":{"start":{"line":210,"column":15},"end":{"line":210,"column":21}},"124":{"start":{"line":211,"column":4},"end":{"line":211,"column":16}},"125":{"start":{"line":215,"column":4},"end":{"line":215,"column":27}},"126":{"start":{"line":216,"column":4},"end":{"line":216,"column":26}},"127":{"start":{"line":217,"column":4},"end":{"line":217,"column":17}},"128":{"start":{"line":220,"column":2},"end":{"line":223,"column":4}},"129":{"start":{"line":222,"column":4},"end":{"line":222,"column":24}},"130":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"131":{"start":{"line":229,"column":4},"end":{"line":229,"column":21}},"132":{"start":{"line":232,"column":2},"end":{"line":232,"column":20}},"133":{"start":{"line":235,"column":0},"end":{"line":235,"column":39}},"134":{"start":{"line":236,"column":0},"end":{"line":236,"column":37}}},"fnMap":{"0":{"name":"Pack","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":13}},"loc":{"start":{"line":18,"column":22},"end":{"line":44,"column":1}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":36,"column":16},"end":{"line":36,"column":17}},"loc":{"start":{"line":36,"column":31},"end":{"line":43,"column":3}},"line":36},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":18},"end":{"line":39,"column":19}},"loc":{"start":{"line":39,"column":30},"end":{"line":41,"column":5}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":27},"end":{"line":46,"column":28}},"loc":{"start":{"line":46,"column":44},"end":{"line":57,"column":1}},"line":46},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":29},"end":{"line":55,"column":5}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":21},"end":{"line":59,"column":22}},"loc":{"start":{"line":59,"column":39},"end":{"line":69,"column":1}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":71,"column":23},"end":{"line":71,"column":24}},"loc":{"start":{"line":71,"column":35},"end":{"line":75,"column":1}},"line":71},"7":{"name":"(anonymous_7)","decl":{"start":{"line":77,"column":24},"end":{"line":77,"column":25}},"loc":{"start":{"line":77,"column":36},"end":{"line":82,"column":1}},"line":77},"8":{"name":"(anonymous_8)","decl":{"start":{"line":84,"column":21},"end":{"line":84,"column":22}},"loc":{"start":{"line":84,"column":33},"end":{"line":88,"column":1}},"line":84},"9":{"name":"(anonymous_9)","decl":{"start":{"line":90,"column":26},"end":{"line":90,"column":27}},"loc":{"start":{"line":90,"column":38},"end":{"line":233,"column":1}},"line":90},"10":{"name":"(anonymous_10)","decl":{"start":{"line":108,"column":22},"end":{"line":108,"column":23}},"loc":{"start":{"line":108,"column":34},"end":{"line":111,"column":5}},"line":108},"11":{"name":"(anonymous_11)","decl":{"start":{"line":142,"column":41},"end":{"line":142,"column":42}},"loc":{"start":{"line":142,"column":54},"end":{"line":144,"column":3}},"line":142},"12":{"name":"(anonymous_12)","decl":{"start":{"line":195,"column":20},"end":{"line":195,"column":21}},"loc":{"start":{"line":195,"column":33},"end":{"line":197,"column":3}},"line":195},"13":{"name":"(anonymous_13)","decl":{"start":{"line":199,"column":22},"end":{"line":199,"column":23}},"loc":{"start":{"line":199,"column":34},"end":{"line":205,"column":3}},"line":199},"14":{"name":"(anonymous_14)","decl":{"start":{"line":200,"column":30},"end":{"line":200,"column":31}},"loc":{"start":{"line":200,"column":42},"end":{"line":202,"column":5}},"line":200},"15":{"name":"nextEntry","decl":{"start":{"line":209,"column":11},"end":{"line":209,"column":20}},"loc":{"start":{"line":209,"column":24},"end":{"line":218,"column":3}},"line":209},"16":{"name":"(anonymous_16)","decl":{"start":{"line":220,"column":21},"end":{"line":220,"column":22}},"loc":{"start":{"line":220,"column":35},"end":{"line":223,"column":3}},"line":220},"17":{"name":"(anonymous_17)","decl":{"start":{"line":235,"column":25},"end":{"line":235,"column":26}},"loc":{"start":{"line":235,"column":37},"end":{"line":235,"column":39}},"line":235},"18":{"name":"(anonymous_18)","decl":{"start":{"line":236,"column":23},"end":{"line":236,"column":24}},"loc":{"start":{"line":236,"column":35},"end":{"line":236,"column":37}},"line":236}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},{"start":{"line":21,"column":2},"end":{"line":21,"column":51}}],"line":21},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},{"start":{"line":23,"column":2},"end":{"line":24,"column":32}}],"line":23},"2":{"loc":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},{"start":{"line":37,"column":4},"end":{"line":37,"column":41}}],"line":37},"3":{"loc":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},{"start":{"line":48,"column":2},"end":{"line":48,"column":29}}],"line":48},"4":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},{"start":{"line":60,"column":2},"end":{"line":60,"column":68}}],"line":60},"5":{"loc":{"start":{"line":60,"column":6},"end":{"line":60,"column":38}},"type":"binary-expr","locations":[{"start":{"line":60,"column":6},"end":{"line":60,"column":18}},{"start":{"line":60,"column":22},"end":{"line":60,"column":38}}],"line":60},"6":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},{"start":{"line":62,"column":2},"end":{"line":62,"column":72}}],"line":62},"7":{"loc":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},{"start":{"line":73,"column":2},"end":{"line":73,"column":52}}],"line":73},"8":{"loc":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},{"start":{"line":79,"column":2},"end":{"line":79,"column":53}}],"line":79},"9":{"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},{"start":{"line":92,"column":2},"end":{"line":94,"column":3}}],"line":92},"10":{"loc":{"start":{"line":92,"column":6},"end":{"line":92,"column":34}},"type":"binary-expr","locations":[{"start":{"line":92,"column":6},"end":{"line":92,"column":16}},{"start":{"line":92,"column":20},"end":{"line":92,"column":34}}],"line":92},"11":{"loc":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},{"start":{"line":98,"column":2},"end":{"line":103,"column":3}}],"line":98},"12":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},{"start":{"line":99,"column":4},"end":{"line":101,"column":5}}],"line":99},"13":{"loc":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},{"start":{"line":105,"column":2},"end":{"line":113,"column":3}}],"line":105},"14":{"loc":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},{"start":{"line":117,"column":2},"end":{"line":124,"column":3}}],"line":117},"15":{"loc":{"start":{"line":134,"column":27},"end":{"line":134,"column":46}},"type":"binary-expr","locations":[{"start":{"line":134,"column":27},"end":{"line":134,"column":37}},{"start":{"line":134,"column":41},"end":{"line":134,"column":46}}],"line":134},"16":{"loc":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},{"start":{"line":135,"column":2},"end":{"line":138,"column":3}}],"line":135},"17":{"loc":{"start":{"line":135,"column":6},"end":{"line":135,"column":72}},"type":"binary-expr","locations":[{"start":{"line":135,"column":6},"end":{"line":135,"column":16}},{"start":{"line":135,"column":20},"end":{"line":135,"column":39}},{"start":{"line":135,"column":43},"end":{"line":135,"column":53}},{"start":{"line":135,"column":57},"end":{"line":135,"column":72}}],"line":135},"18":{"loc":{"start":{"line":142,"column":14},"end":{"line":142,"column":31}},"type":"binary-expr","locations":[{"start":{"line":142,"column":14},"end":{"line":142,"column":25}},{"start":{"line":142,"column":29},"end":{"line":142,"column":31}}],"line":142},"19":{"loc":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"type":"if","locations":[{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},{"start":{"line":146,"column":2},"end":{"line":146,"column":52}}],"line":146},"20":{"loc":{"start":{"line":148,"column":36},"end":{"line":148,"column":52}},"type":"binary-expr","locations":[{"start":{"line":148,"column":36},"end":{"line":148,"column":46}},{"start":{"line":148,"column":50},"end":{"line":148,"column":52}}],"line":148},"21":{"loc":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},{"start":{"line":151,"column":2},"end":{"line":153,"column":3}}],"line":151},"22":{"loc":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"type":"if","locations":[{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},{"start":{"line":155,"column":2},"end":{"line":156,"column":29}}],"line":155},"23":{"loc":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"type":"switch","locations":[{"start":{"line":160,"column":4},"end":{"line":161,"column":12}},{"start":{"line":163,"column":4},"end":{"line":166,"column":11}},{"start":{"line":168,"column":4},"end":{"line":172,"column":11}},{"start":{"line":174,"column":4},"end":{"line":178,"column":11}}],"line":158},"24":{"loc":{"start":{"line":170,"column":24},"end":{"line":170,"column":54}},"type":"binary-expr","locations":[{"start":{"line":170,"column":24},"end":{"line":170,"column":47}},{"start":{"line":170,"column":51},"end":{"line":170,"column":54}}],"line":170},"25":{"loc":{"start":{"line":176,"column":24},"end":{"line":176,"column":74}},"type":"binary-expr","locations":[{"start":{"line":176,"column":24},"end":{"line":176,"column":67}},{"start":{"line":176,"column":71},"end":{"line":176,"column":74}}],"line":176},"26":{"loc":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"type":"if","locations":[{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},{"start":{"line":204,"column":4},"end":{"line":204,"column":44}}],"line":204},"27":{"loc":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"type":"if","locations":[{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},{"start":{"line":210,"column":4},"end":{"line":210,"column":21}}],"line":210},"28":{"loc":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},{"start":{"line":227,"column":2},"end":{"line":230,"column":3}}],"line":227}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":512,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":1,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":1,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1,"50":0,"51":0,"52":0,"53":0,"54":1,"55":0,"56":0,"57":0,"58":0,"59":0,"60":1,"61":0,"62":0,"63":0,"64":1,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":1,"134":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0,0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0,0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"8beb16ccde52e484aa1dd87f5ece33d696c808ab","contentHash":"7bb2b7ebe1111c0deefbf9a61d17bf9d2dbe951adb585db96f9d89663ce5909d"},"/Users/isaacs/dev/js/tar/lib/entry-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}},"1":{"start":{"line":3,"column":10},"end":{"line":3,"column":30}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":38}},"3":{"start":{"line":5,"column":12},"end":{"line":5,"column":33}},"4":{"start":{"line":6,"column":15},"end":{"line":6,"column":34}},"5":{"start":{"line":7,"column":18},"end":{"line":7,"column":41}},"6":{"start":{"line":9,"column":13},"end":{"line":9,"column":37}},"7":{"start":{"line":10,"column":10},"end":{"line":10,"column":12}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":29}},"9":{"start":{"line":15,"column":11},"end":{"line":15,"column":15}},"10":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"11":{"start":{"line":18,"column":4},"end":{"line":18,"column":33}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":20}},"13":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"14":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":35}},"16":{"start":{"line":28,"column":2},"end":{"line":30,"column":4}},"17":{"start":{"line":29,"column":4},"end":{"line":29,"column":22}},"18":{"start":{"line":32,"column":2},"end":{"line":34,"column":4}},"19":{"start":{"line":33,"column":4},"end":{"line":33,"column":20}},"20":{"start":{"line":36,"column":2},"end":{"line":39,"column":4}},"21":{"start":{"line":37,"column":4},"end":{"line":37,"column":18}},"22":{"start":{"line":38,"column":4},"end":{"line":38,"column":20}},"23":{"start":{"line":41,"column":2},"end":{"line":41,"column":18}},"24":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"25":{"start":{"line":43,"column":4},"end":{"line":43,"column":18}},"26":{"start":{"line":45,"column":2},"end":{"line":45,"column":25}},"27":{"start":{"line":46,"column":2},"end":{"line":46,"column":23}},"28":{"start":{"line":47,"column":2},"end":{"line":47,"column":22}},"29":{"start":{"line":49,"column":2},"end":{"line":49,"column":17}},"30":{"start":{"line":50,"column":2},"end":{"line":50,"column":23}},"31":{"start":{"line":51,"column":2},"end":{"line":51,"column":18}},"32":{"start":{"line":53,"column":2},"end":{"line":55,"column":4}},"33":{"start":{"line":54,"column":4},"end":{"line":54,"column":17}},"34":{"start":{"line":58,"column":0},"end":{"line":65,"column":1}},"35":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"36":{"start":{"line":60,"column":19},"end":{"line":60,"column":74}},"37":{"start":{"line":61,"column":2},"end":{"line":61,"column":22}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":17}},"39":{"start":{"line":63,"column":2},"end":{"line":63,"column":43}},"40":{"start":{"line":64,"column":2},"end":{"line":64,"column":25}},"41":{"start":{"line":67,"column":0},"end":{"line":74,"column":1}},"42":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"43":{"start":{"line":69,"column":9},"end":{"line":69,"column":29}},"44":{"start":{"line":70,"column":2},"end":{"line":70,"column":24}},"45":{"start":{"line":71,"column":2},"end":{"line":71,"column":20}},"46":{"start":{"line":72,"column":2},"end":{"line":72,"column":17}},"47":{"start":{"line":73,"column":2},"end":{"line":73,"column":43}},"48":{"start":{"line":76,"column":0},"end":{"line":80,"column":1}},"49":{"start":{"line":78,"column":2},"end":{"line":78,"column":21}},"50":{"start":{"line":79,"column":2},"end":{"line":79,"column":20}},"51":{"start":{"line":82,"column":0},"end":{"line":87,"column":1}},"52":{"start":{"line":84,"column":2},"end":{"line":84,"column":22}},"53":{"start":{"line":85,"column":2},"end":{"line":85,"column":21}},"54":{"start":{"line":86,"column":2},"end":{"line":86,"column":17}},"55":{"start":{"line":89,"column":0},"end":{"line":98,"column":1}},"56":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"57":{"start":{"line":91,"column":20},"end":{"line":91,"column":69}},"58":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"59":{"start":{"line":95,"column":20},"end":{"line":95,"column":30}},"60":{"start":{"line":97,"column":2},"end":{"line":97,"column":31}},"61":{"start":{"line":100,"column":0},"end":{"line":126,"column":1}},"62":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"63":{"start":{"line":102,"column":23},"end":{"line":102,"column":29}},"64":{"start":{"line":103,"column":2},"end":{"line":103,"column":24}},"65":{"start":{"line":105,"column":20},"end":{"line":105,"column":48}},"66":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"67":{"start":{"line":108,"column":13},"end":{"line":108,"column":17}},"68":{"start":{"line":110,"column":4},"end":{"line":111,"column":44}},"69":{"start":{"line":113,"column":4},"end":{"line":120,"column":12}},"70":{"start":{"line":115,"column":8},"end":{"line":115,"column":26}},"71":{"start":{"line":118,"column":8},"end":{"line":118,"column":28}},"72":{"start":{"line":124,"column":2},"end":{"line":124,"column":32}},"73":{"start":{"line":125,"column":2},"end":{"line":125,"column":21}},"74":{"start":{"line":128,"column":0},"end":{"line":167,"column":1}},"75":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"76":{"start":{"line":131,"column":4},"end":{"line":131,"column":18}},"77":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"78":{"start":{"line":136,"column":4},"end":{"line":136,"column":10}},"79":{"start":{"line":139,"column":2},"end":{"line":139,"column":25}},"80":{"start":{"line":141,"column":12},"end":{"line":141,"column":24}},"81":{"start":{"line":142,"column":2},"end":{"line":159,"column":3}},"82":{"start":{"line":142,"column":15},"end":{"line":142,"column":16}},"83":{"start":{"line":145,"column":12},"end":{"line":145,"column":18}},"84":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"85":{"start":{"line":147,"column":19},"end":{"line":147,"column":37}},"86":{"start":{"line":148,"column":9},"end":{"line":148,"column":30}},"87":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"88":{"start":{"line":152,"column":6},"end":{"line":152,"column":30}},"89":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"90":{"start":{"line":154,"column":8},"end":{"line":154,"column":30}},"91":{"start":{"line":155,"column":8},"end":{"line":155,"column":39}},"92":{"start":{"line":157,"column":6},"end":{"line":157,"column":12}},"93":{"start":{"line":162,"column":2},"end":{"line":162,"column":25}},"94":{"start":{"line":163,"column":2},"end":{"line":163,"column":26}},"95":{"start":{"line":166,"column":2},"end":{"line":166,"column":20}},"96":{"start":{"line":169,"column":0},"end":{"line":169,"column":46}}},"fnMap":{"0":{"name":"EntryWriter","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":20}},"loc":{"start":{"line":14,"column":29},"end":{"line":56,"column":1}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":25}},"loc":{"start":{"line":28,"column":37},"end":{"line":30,"column":3}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":25},"end":{"line":32,"column":26}},"loc":{"start":{"line":32,"column":37},"end":{"line":34,"column":3}},"line":32},"3":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":23},"end":{"line":36,"column":24}},"loc":{"start":{"line":36,"column":35},"end":{"line":39,"column":3}},"line":36},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":28},"end":{"line":55,"column":3}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":30},"end":{"line":58,"column":31}},"loc":{"start":{"line":58,"column":43},"end":{"line":65,"column":1}},"line":58},"6":{"name":"(anonymous_6)","decl":{"start":{"line":67,"column":28},"end":{"line":67,"column":29}},"loc":{"start":{"line":67,"column":41},"end":{"line":74,"column":1}},"line":67},"7":{"name":"(anonymous_7)","decl":{"start":{"line":76,"column":30},"end":{"line":76,"column":31}},"loc":{"start":{"line":76,"column":42},"end":{"line":80,"column":1}},"line":76},"8":{"name":"(anonymous_8)","decl":{"start":{"line":82,"column":31},"end":{"line":82,"column":32}},"loc":{"start":{"line":82,"column":43},"end":{"line":87,"column":1}},"line":82},"9":{"name":"(anonymous_9)","decl":{"start":{"line":89,"column":28},"end":{"line":89,"column":29}},"loc":{"start":{"line":89,"column":45},"end":{"line":98,"column":1}},"line":89},"10":{"name":"(anonymous_10)","decl":{"start":{"line":100,"column":32},"end":{"line":100,"column":33}},"loc":{"start":{"line":100,"column":44},"end":{"line":126,"column":1}},"line":100},"11":{"name":"(anonymous_11)","decl":{"start":{"line":114,"column":18},"end":{"line":114,"column":19}},"loc":{"start":{"line":114,"column":31},"end":{"line":116,"column":7}},"line":114},"12":{"name":"(anonymous_12)","decl":{"start":{"line":117,"column":19},"end":{"line":117,"column":20}},"loc":{"start":{"line":117,"column":33},"end":{"line":119,"column":7}},"line":117},"13":{"name":"(anonymous_13)","decl":{"start":{"line":128,"column":33},"end":{"line":128,"column":34}},"loc":{"start":{"line":128,"column":45},"end":{"line":167,"column":1}},"line":128},"14":{"name":"(anonymous_14)","decl":{"start":{"line":169,"column":32},"end":{"line":169,"column":33}},"loc":{"start":{"line":169,"column":44},"end":{"line":169,"column":46}},"line":169}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"1":{"loc":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},{"start":{"line":42,"column":2},"end":{"line":44,"column":3}}],"line":42},"2":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},{"start":{"line":60,"column":2},"end":{"line":60,"column":74}}],"line":60},"3":{"loc":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},{"start":{"line":69,"column":2},"end":{"line":69,"column":29}}],"line":69},"4":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},{"start":{"line":91,"column":2},"end":{"line":91,"column":69}}],"line":91},"5":{"loc":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},{"start":{"line":95,"column":2},"end":{"line":95,"column":30}}],"line":95},"6":{"loc":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"type":"if","locations":[{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},{"start":{"line":102,"column":2},"end":{"line":102,"column":29}}],"line":102},"7":{"loc":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},{"start":{"line":107,"column":2},"end":{"line":121,"column":3}}],"line":107},"8":{"loc":{"start":{"line":107,"column":6},"end":{"line":107,"column":44}},"type":"binary-expr","locations":[{"start":{"line":107,"column":6},"end":{"line":107,"column":29}},{"start":{"line":107,"column":33},"end":{"line":107,"column":44}}],"line":107},"9":{"loc":{"start":{"line":110,"column":27},"end":{"line":111,"column":44}},"type":"binary-expr","locations":[{"start":{"line":110,"column":27},"end":{"line":110,"column":47}},{"start":{"line":111,"column":6},"end":{"line":111,"column":44}}],"line":110},"10":{"loc":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},{"start":{"line":130,"column":2},"end":{"line":132,"column":3}}],"line":130},"11":{"loc":{"start":{"line":130,"column":6},"end":{"line":130,"column":37}},"type":"binary-expr","locations":[{"start":{"line":130,"column":6},"end":{"line":130,"column":22}},{"start":{"line":130,"column":26},"end":{"line":130,"column":37}}],"line":130},"12":{"loc":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"type":"if","locations":[{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},{"start":{"line":134,"column":2},"end":{"line":137,"column":3}}],"line":134},"13":{"loc":{"start":{"line":134,"column":6},"end":{"line":134,"column":38}},"type":"binary-expr","locations":[{"start":{"line":134,"column":6},"end":{"line":134,"column":18}},{"start":{"line":134,"column":22},"end":{"line":134,"column":38}}],"line":134},"14":{"loc":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"type":"if","locations":[{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},{"start":{"line":147,"column":4},"end":{"line":148,"column":30}}],"line":147},"15":{"loc":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},{"start":{"line":150,"column":4},"end":{"line":158,"column":5}}],"line":150},"16":{"loc":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"type":"if","locations":[{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},{"start":{"line":153,"column":6},"end":{"line":156,"column":7}}],"line":153}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":1,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":1,"49":0,"50":0,"51":1,"52":0,"53":0,"54":0,"55":1,"56":0,"57":0,"58":0,"59":0,"60":0,"61":1,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":1,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3e169418508e031df78186ff63b5fa5aa2484ab8","contentHash":"84191ed4732b6763ae8701256051735aebbe5e95c932c15bef34da01b33ba1a0"},"/Users/isaacs/dev/js/tar/lib/entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry.js","statementMap":{"0":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"1":{"start":{"line":9,"column":16},"end":{"line":9,"column":38}},"2":{"start":{"line":10,"column":10},"end":{"line":10,"column":27}},"3":{"start":{"line":11,"column":13},"end":{"line":11,"column":33}},"4":{"start":{"line":12,"column":13},"end":{"line":12,"column":37}},"5":{"start":{"line":13,"column":15},"end":{"line":13,"column":34}},"6":{"start":{"line":14,"column":14},"end":{"line":14,"column":41}},"7":{"start":{"line":17,"column":2},"end":{"line":17,"column":19}},"8":{"start":{"line":18,"column":2},"end":{"line":18,"column":22}},"9":{"start":{"line":19,"column":2},"end":{"line":19,"column":22}},"10":{"start":{"line":21,"column":2},"end":{"line":21,"column":25}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":22}},"12":{"start":{"line":23,"column":2},"end":{"line":23,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":22}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":21}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":21}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":21}},"17":{"start":{"line":28,"column":2},"end":{"line":28,"column":18}},"18":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"19":{"start":{"line":30,"column":2},"end":{"line":30,"column":20}},"20":{"start":{"line":32,"column":2},"end":{"line":32,"column":36}},"21":{"start":{"line":34,"column":2},"end":{"line":34,"column":17}},"22":{"start":{"line":35,"column":2},"end":{"line":35,"column":23}},"23":{"start":{"line":36,"column":2},"end":{"line":36,"column":33}},"24":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"25":{"start":{"line":41,"column":11},"end":{"line":41,"column":15}},"26":{"start":{"line":42,"column":2},"end":{"line":44,"column":4}},"27":{"start":{"line":43,"column":4},"end":{"line":43,"column":29}},"28":{"start":{"line":46,"column":2},"end":{"line":46,"column":18}},"29":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"30":{"start":{"line":51,"column":0},"end":{"line":78,"column":1}},"31":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"32":{"start":{"line":52,"column":20},"end":{"line":52,"column":65}},"33":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"34":{"start":{"line":54,"column":4},"end":{"line":54,"column":40}},"35":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"36":{"start":{"line":60,"column":4},"end":{"line":60,"column":35}},"37":{"start":{"line":62,"column":2},"end":{"line":62,"column":29}},"38":{"start":{"line":65,"column":11},"end":{"line":65,"column":25}},"39":{"start":{"line":66,"column":2},"end":{"line":66,"column":21}},"40":{"start":{"line":67,"column":2},"end":{"line":67,"column":19}},"41":{"start":{"line":69,"column":2},"end":{"line":69,"column":14}},"42":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"43":{"start":{"line":73,"column":4},"end":{"line":73,"column":26}},"44":{"start":{"line":74,"column":4},"end":{"line":74,"column":16}},"45":{"start":{"line":77,"column":2},"end":{"line":77,"column":13}},"46":{"start":{"line":80,"column":0},"end":{"line":84,"column":1}},"47":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"48":{"start":{"line":81,"column":9},"end":{"line":81,"column":22}},"49":{"start":{"line":82,"column":2},"end":{"line":82,"column":21}},"50":{"start":{"line":83,"column":2},"end":{"line":83,"column":14}},"51":{"start":{"line":86,"column":0},"end":{"line":89,"column":1}},"52":{"start":{"line":87,"column":2},"end":{"line":87,"column":21}},"53":{"start":{"line":88,"column":2},"end":{"line":88,"column":20}},"54":{"start":{"line":91,"column":0},"end":{"line":97,"column":1}},"55":{"start":{"line":93,"column":2},"end":{"line":93,"column":21}},"56":{"start":{"line":94,"column":2},"end":{"line":94,"column":22}},"57":{"start":{"line":95,"column":2},"end":{"line":95,"column":14}},"58":{"start":{"line":96,"column":2},"end":{"line":96,"column":41}},"59":{"start":{"line":100,"column":0},"end":{"line":139,"column":1}},"60":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"61":{"start":{"line":103,"column":52},"end":{"line":103,"column":58}},"62":{"start":{"line":107,"column":2},"end":{"line":107,"column":22}},"63":{"start":{"line":110,"column":2},"end":{"line":113,"column":3}},"64":{"start":{"line":111,"column":16},"end":{"line":111,"column":43}},"65":{"start":{"line":112,"column":4},"end":{"line":112,"column":28}},"66":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"67":{"start":{"line":117,"column":4},"end":{"line":117,"column":57}},"68":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"69":{"start":{"line":119,"column":6},"end":{"line":119,"column":29}},"70":{"start":{"line":120,"column":6},"end":{"line":120,"column":24}},"71":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"72":{"start":{"line":123,"column":6},"end":{"line":123,"column":24}},"73":{"start":{"line":124,"column":6},"end":{"line":124,"column":22}},"74":{"start":{"line":130,"column":12},"end":{"line":130,"column":29}},"75":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"76":{"start":{"line":132,"column":4},"end":{"line":132,"column":36}},"77":{"start":{"line":133,"column":4},"end":{"line":133,"column":22}},"78":{"start":{"line":134,"column":4},"end":{"line":134,"column":25}},"79":{"start":{"line":135,"column":4},"end":{"line":135,"column":40}},"80":{"start":{"line":138,"column":2},"end":{"line":138,"column":23}},"81":{"start":{"line":141,"column":0},"end":{"line":211,"column":1}},"82":{"start":{"line":143,"column":15},"end":{"line":143,"column":27}},"83":{"start":{"line":144,"column":17},"end":{"line":144,"column":31}},"84":{"start":{"line":145,"column":15},"end":{"line":145,"column":27}},"85":{"start":{"line":146,"column":14},"end":{"line":146,"column":24}},"86":{"start":{"line":149,"column":15},"end":{"line":149,"column":25}},"87":{"start":{"line":150,"column":2},"end":{"line":154,"column":3}},"88":{"start":{"line":150,"column":15},"end":{"line":150,"column":16}},"89":{"start":{"line":151,"column":16},"end":{"line":151,"column":25}},"90":{"start":{"line":152,"column":14},"end":{"line":152,"column":27}},"91":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"92":{"start":{"line":153,"column":36},"end":{"line":153,"column":54}},"93":{"start":{"line":158,"column":3},"end":{"line":165,"column":3}},"94":{"start":{"line":159,"column":4},"end":{"line":161,"column":6}},"95":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"96":{"start":{"line":160,"column":39},"end":{"line":160,"column":54}},"97":{"start":{"line":165,"column":3},"end":{"line":173,"column":3}},"98":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"99":{"start":{"line":167,"column":6},"end":{"line":167,"column":40}},"100":{"start":{"line":173,"column":3},"end":{"line":177,"column":4}},"101":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"102":{"start":{"line":175,"column":6},"end":{"line":175,"column":42}},"103":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"104":{"start":{"line":184,"column":6},"end":{"line":184,"column":19}},"105":{"start":{"line":185,"column":6},"end":{"line":185,"column":11}},"106":{"start":{"line":188,"column":6},"end":{"line":188,"column":24}},"107":{"start":{"line":189,"column":6},"end":{"line":189,"column":11}},"108":{"start":{"line":192,"column":6},"end":{"line":192,"column":22}},"109":{"start":{"line":193,"column":6},"end":{"line":193,"column":11}},"110":{"start":{"line":202,"column":6},"end":{"line":202,"column":34}},"111":{"start":{"line":205,"column":2},"end":{"line":205,"column":18}},"112":{"start":{"line":206,"column":2},"end":{"line":206,"column":24}},"113":{"start":{"line":207,"column":2},"end":{"line":207,"column":24}},"114":{"start":{"line":210,"column":2},"end":{"line":210,"column":30}},"115":{"start":{"line":215,"column":0},"end":{"line":217,"column":1}},"116":{"start":{"line":216,"column":2},"end":{"line":216,"column":20}},"117":{"start":{"line":219,"column":0},"end":{"line":219,"column":35}},"118":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}}},"fnMap":{"0":{"name":"Entry","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":14}},"loc":{"start":{"line":16,"column":42},"end":{"line":47,"column":1}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":36},"end":{"line":42,"column":37}},"loc":{"start":{"line":42,"column":49},"end":{"line":44,"column":3}},"line":42},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":24},"end":{"line":51,"column":25}},"loc":{"start":{"line":51,"column":37},"end":{"line":78,"column":1}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":80,"column":22},"end":{"line":80,"column":23}},"loc":{"start":{"line":80,"column":35},"end":{"line":84,"column":1}},"line":80},"4":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":24},"end":{"line":86,"column":25}},"loc":{"start":{"line":86,"column":36},"end":{"line":89,"column":1}},"line":86},"5":{"name":"(anonymous_5)","decl":{"start":{"line":91,"column":25},"end":{"line":91,"column":26}},"loc":{"start":{"line":91,"column":37},"end":{"line":97,"column":1}},"line":91},"6":{"name":"(anonymous_6)","decl":{"start":{"line":100,"column":24},"end":{"line":100,"column":25}},"loc":{"start":{"line":100,"column":36},"end":{"line":139,"column":1}},"line":100},"7":{"name":"(anonymous_7)","decl":{"start":{"line":141,"column":28},"end":{"line":141,"column":29}},"loc":{"start":{"line":141,"column":40},"end":{"line":211,"column":1}},"line":141},"8":{"name":"(anonymous_8)","decl":{"start":{"line":158,"column":30},"end":{"line":158,"column":31}},"loc":{"start":{"line":158,"column":43},"end":{"line":162,"column":3}},"line":158},"9":{"name":"(anonymous_9)","decl":{"start":{"line":159,"column":27},"end":{"line":159,"column":28}},"loc":{"start":{"line":159,"column":40},"end":{"line":161,"column":5}},"line":159},"10":{"name":"(anonymous_10)","decl":{"start":{"line":165,"column":32},"end":{"line":165,"column":33}},"loc":{"start":{"line":165,"column":45},"end":{"line":169,"column":3}},"line":165},"11":{"name":"(anonymous_11)","decl":{"start":{"line":173,"column":39},"end":{"line":173,"column":40}},"loc":{"start":{"line":173,"column":52},"end":{"line":177,"column":3}},"line":173},"12":{"name":"(anonymous_12)","decl":{"start":{"line":215,"column":24},"end":{"line":215,"column":25}},"loc":{"start":{"line":215,"column":34},"end":{"line":217,"column":1}},"line":215}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":19},"end":{"line":36,"column":33}},"type":"binary-expr","locations":[{"start":{"line":36,"column":19},"end":{"line":36,"column":27}},{"start":{"line":36,"column":31},"end":{"line":36,"column":33}}],"line":36},"1":{"loc":{"start":{"line":42,"column":14},"end":{"line":42,"column":26}},"type":"binary-expr","locations":[{"start":{"line":42,"column":14},"end":{"line":42,"column":20}},{"start":{"line":42,"column":24},"end":{"line":42,"column":26}}],"line":42},"2":{"loc":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},{"start":{"line":52,"column":2},"end":{"line":52,"column":65}}],"line":52},"3":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},{"start":{"line":53,"column":2},"end":{"line":55,"column":3}}],"line":53},"4":{"loc":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},{"start":{"line":59,"column":2},"end":{"line":61,"column":3}}],"line":59},"5":{"loc":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},{"start":{"line":72,"column":2},"end":{"line":75,"column":3}}],"line":72},"6":{"loc":{"start":{"line":72,"column":6},"end":{"line":72,"column":28}},"type":"binary-expr","locations":[{"start":{"line":72,"column":6},"end":{"line":72,"column":18}},{"start":{"line":72,"column":22},"end":{"line":72,"column":28}}],"line":72},"7":{"loc":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},{"start":{"line":81,"column":2},"end":{"line":81,"column":22}}],"line":81},"8":{"loc":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},{"start":{"line":103,"column":2},"end":{"line":103,"column":58}}],"line":103},"9":{"loc":{"start":{"line":103,"column":6},"end":{"line":103,"column":50}},"type":"binary-expr","locations":[{"start":{"line":103,"column":6},"end":{"line":103,"column":18}},{"start":{"line":103,"column":22},"end":{"line":103,"column":35}},{"start":{"line":103,"column":39},"end":{"line":103,"column":50}}],"line":103},"10":{"loc":{"start":{"line":110,"column":9},"end":{"line":110,"column":54}},"type":"binary-expr","locations":[{"start":{"line":110,"column":9},"end":{"line":110,"column":37}},{"start":{"line":110,"column":41},"end":{"line":110,"column":54}}],"line":110},"11":{"loc":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},{"start":{"line":116,"column":2},"end":{"line":126,"column":3}}],"line":116},"12":{"loc":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},{"start":{"line":118,"column":4},"end":{"line":121,"column":5}}],"line":118},"13":{"loc":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"type":"if","locations":[{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},{"start":{"line":122,"column":4},"end":{"line":125,"column":5}}],"line":122},"14":{"loc":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},{"start":{"line":131,"column":2},"end":{"line":136,"column":3}}],"line":131},"15":{"loc":{"start":{"line":131,"column":6},"end":{"line":131,"column":45}},"type":"binary-expr","locations":[{"start":{"line":131,"column":6},"end":{"line":131,"column":26}},{"start":{"line":131,"column":30},"end":{"line":131,"column":45}}],"line":131},"16":{"loc":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"type":"if","locations":[{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},{"start":{"line":153,"column":4},"end":{"line":153,"column":54}}],"line":153},"17":{"loc":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"type":"if","locations":[{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},{"start":{"line":160,"column":6},"end":{"line":160,"column":54}}],"line":160},"18":{"loc":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"type":"if","locations":[{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},{"start":{"line":166,"column":4},"end":{"line":168,"column":5}}],"line":166},"19":{"loc":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"type":"if","locations":[{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},{"start":{"line":174,"column":4},"end":{"line":176,"column":5}}],"line":174},"20":{"loc":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"type":"switch","locations":[{"start":{"line":182,"column":4},"end":{"line":182,"column":19}},{"start":{"line":183,"column":4},"end":{"line":185,"column":11}},{"start":{"line":187,"column":4},"end":{"line":189,"column":11}},{"start":{"line":191,"column":4},"end":{"line":193,"column":11}},{"start":{"line":195,"column":4},"end":{"line":195,"column":16}},{"start":{"line":196,"column":4},"end":{"line":196,"column":24}},{"start":{"line":197,"column":4},"end":{"line":197,"column":27}},{"start":{"line":198,"column":4},"end":{"line":198,"column":23}},{"start":{"line":199,"column":4},"end":{"line":199,"column":21}},{"start":{"line":200,"column":4},"end":{"line":200,"column":16}},{"start":{"line":201,"column":4},"end":{"line":202,"column":34}}],"line":181}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":7,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":7,"20":7,"21":7,"22":7,"23":7,"24":7,"25":7,"26":7,"27":0,"28":7,"29":1,"30":1,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":1,"47":7,"48":0,"49":7,"50":7,"51":1,"52":7,"53":7,"54":1,"55":18,"56":18,"57":18,"58":18,"59":1,"60":25,"61":18,"62":7,"63":7,"64":0,"65":0,"66":7,"67":7,"68":7,"69":0,"70":0,"71":7,"72":7,"73":7,"74":7,"75":7,"76":0,"77":0,"78":0,"79":0,"80":7,"81":1,"82":7,"83":7,"84":7,"85":7,"86":7,"87":7,"88":7,"89":119,"90":119,"91":119,"92":112,"93":7,"94":14,"95":0,"96":0,"97":7,"98":14,"99":14,"100":7,"101":21,"102":7,"103":7,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":7,"111":7,"112":7,"113":7,"114":7,"115":1,"116":0,"117":1,"118":1},"f":{"0":7,"1":0,"2":0,"3":7,"4":7,"5":18,"6":25,"7":7,"8":14,"9":0,"10":14,"11":21,"12":0},"b":{"0":[7,7],"1":[7,7],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,7],"8":[18,7],"9":[25,18,14],"10":[7,0],"11":[7,0],"12":[0,7],"13":[7,0],"14":[0,7],"15":[7,0],"16":[112,7],"17":[0,0],"18":[14,0],"19":[7,14],"20":[0,0,0,0,0,2,2,2,6,6,7]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"2cc4f925db2a60e89bf0743124faec4e8996dfdb","contentHash":"245d5cb2b23d975dc5b9a0ed2553c93c587727d50a7961242f50cec333c04ba9"},"/Users/isaacs/dev/js/tar/lib/global-header-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/global-header-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"1":{"start":{"line":3,"column":27},"end":{"line":3,"column":65}},"2":{"start":{"line":4,"column":15},"end":{"line":4,"column":34}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":50}},"4":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":40}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":40}},"7":{"start":{"line":13,"column":2},"end":{"line":13,"column":23}}},"fnMap":{"0":{"name":"GlobalHeaderWriter","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":27}},"loc":{"start":{"line":8,"column":36},"end":{"line":14,"column":1}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},{"start":{"line":9,"column":2},"end":{"line":11,"column":3}}],"line":9}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0},"f":{"0":0},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3d0c8589f62a5c8ccec606d52d3abd98e5627d57","contentHash":"a2570ca840cf3e44d77e15af0aee52f7c145da39b76366006f3672b9708def3e"},"/Users/isaacs/dev/js/tar/lib/parse.js":{"path":"/Users/isaacs/dev/js/tar/lib/parse.js","statementMap":{"0":{"start":{"line":6,"column":0},"end":{"line":6,"column":37}},"1":{"start":{"line":8,"column":13},"end":{"line":8,"column":30}},"2":{"start":{"line":9,"column":13},"end":{"line":9,"column":26}},"3":{"start":{"line":10,"column":18},"end":{"line":10,"column":41}},"4":{"start":{"line":11,"column":10},"end":{"line":11,"column":30}},"5":{"start":{"line":12,"column":16},"end":{"line":12,"column":38}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":46}},"8":{"start":{"line":15,"column":21},"end":{"line":15,"column":52}},"9":{"start":{"line":16,"column":13},"end":{"line":16,"column":33}},"10":{"start":{"line":17,"column":15},"end":{"line":17,"column":34}},"11":{"start":{"line":18,"column":14},"end":{"line":18,"column":32}},"12":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"13":{"start":{"line":28,"column":11},"end":{"line":28,"column":15}},"14":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"15":{"start":{"line":29,"column":30},"end":{"line":29,"column":48}},"16":{"start":{"line":34,"column":2},"end":{"line":34,"column":18}},"17":{"start":{"line":36,"column":2},"end":{"line":36,"column":20}},"18":{"start":{"line":37,"column":2},"end":{"line":37,"column":20}},"19":{"start":{"line":38,"column":2},"end":{"line":38,"column":35}},"20":{"start":{"line":39,"column":2},"end":{"line":39,"column":17}},"21":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"22":{"start":{"line":41,"column":2},"end":{"line":41,"column":20}},"23":{"start":{"line":43,"column":2},"end":{"line":45,"column":4}},"24":{"start":{"line":44,"column":4},"end":{"line":44,"column":23}},"25":{"start":{"line":47,"column":2},"end":{"line":49,"column":4}},"26":{"start":{"line":48,"column":4},"end":{"line":48,"column":18}},"27":{"start":{"line":51,"column":2},"end":{"line":53,"column":4}},"28":{"start":{"line":52,"column":4},"end":{"line":52,"column":19}},"29":{"start":{"line":55,"column":2},"end":{"line":57,"column":4}},"30":{"start":{"line":56,"column":4},"end":{"line":56,"column":20}},"31":{"start":{"line":63,"column":0},"end":{"line":67,"column":1}},"32":{"start":{"line":64,"column":11},"end":{"line":64,"column":15}},"33":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"34":{"start":{"line":65,"column":31},"end":{"line":65,"column":57}},"35":{"start":{"line":66,"column":2},"end":{"line":66,"column":16}},"36":{"start":{"line":72,"column":0},"end":{"line":83,"column":1}},"37":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"38":{"start":{"line":77,"column":4},"end":{"line":79,"column":5}},"39":{"start":{"line":77,"column":17},"end":{"line":77,"column":18}},"40":{"start":{"line":77,"column":24},"end":{"line":77,"column":32}},"41":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"42":{"start":{"line":78,"column":22},"end":{"line":78,"column":62}},"43":{"start":{"line":80,"column":4},"end":{"line":80,"column":10}},"44":{"start":{"line":82,"column":2},"end":{"line":82,"column":30}},"45":{"start":{"line":85,"column":0},"end":{"line":88,"column":1}},"46":{"start":{"line":86,"column":2},"end":{"line":86,"column":20}},"47":{"start":{"line":87,"column":2},"end":{"line":87,"column":28}},"48":{"start":{"line":94,"column":0},"end":{"line":94,"column":38}},"49":{"start":{"line":96,"column":0},"end":{"line":137,"column":1}},"50":{"start":{"line":97,"column":2},"end":{"line":97,"column":59}},"51":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"52":{"start":{"line":105,"column":16},"end":{"line":105,"column":27}},"53":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"54":{"start":{"line":106,"column":22},"end":{"line":106,"column":36}},"55":{"start":{"line":108,"column":6},"end":{"line":108,"column":34}},"56":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"57":{"start":{"line":109,"column":31},"end":{"line":109,"column":51}},"58":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"59":{"start":{"line":112,"column":6},"end":{"line":112,"column":17}},"60":{"start":{"line":113,"column":6},"end":{"line":113,"column":24}},"61":{"start":{"line":117,"column":15},"end":{"line":117,"column":19}},"62":{"start":{"line":118,"column":4},"end":{"line":120,"column":5}},"63":{"start":{"line":118,"column":17},"end":{"line":118,"column":18}},"64":{"start":{"line":119,"column":6},"end":{"line":119,"column":23}},"65":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"66":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"67":{"start":{"line":128,"column":8},"end":{"line":128,"column":26}},"68":{"start":{"line":129,"column":6},"end":{"line":129,"column":29}},"69":{"start":{"line":131,"column":6},"end":{"line":131,"column":30}},"70":{"start":{"line":132,"column":6},"end":{"line":132,"column":25}},"71":{"start":{"line":136,"column":2},"end":{"line":136,"column":22}},"72":{"start":{"line":140,"column":0},"end":{"line":285,"column":1}},"73":{"start":{"line":141,"column":15},"end":{"line":141,"column":31}},"74":{"start":{"line":142,"column":13},"end":{"line":142,"column":17}},"75":{"start":{"line":147,"column":13},"end":{"line":147,"column":18}},"76":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"77":{"start":{"line":150,"column":12},"end":{"line":150,"column":41}},"78":{"start":{"line":151,"column":4},"end":{"line":151,"column":21}},"79":{"start":{"line":152,"column":4},"end":{"line":152,"column":37}},"80":{"start":{"line":153,"column":4},"end":{"line":153,"column":37}},"81":{"start":{"line":154,"column":4},"end":{"line":154,"column":32}},"82":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"83":{"start":{"line":171,"column":6},"end":{"line":171,"column":23}},"84":{"start":{"line":172,"column":6},"end":{"line":172,"column":18}},"85":{"start":{"line":173,"column":6},"end":{"line":173,"column":11}},"86":{"start":{"line":177,"column":6},"end":{"line":177,"column":32}},"87":{"start":{"line":178,"column":6},"end":{"line":183,"column":7}},"88":{"start":{"line":179,"column":8},"end":{"line":179,"column":41}},"89":{"start":{"line":180,"column":8},"end":{"line":182,"column":10}},"90":{"start":{"line":181,"column":10},"end":{"line":181,"column":43}},"91":{"start":{"line":184,"column":6},"end":{"line":184,"column":33}},"92":{"start":{"line":185,"column":6},"end":{"line":185,"column":17}},"93":{"start":{"line":186,"column":6},"end":{"line":186,"column":11}},"94":{"start":{"line":191,"column":6},"end":{"line":191,"column":32}},"95":{"start":{"line":192,"column":6},"end":{"line":194,"column":7}},"96":{"start":{"line":193,"column":8},"end":{"line":193,"column":37}},"97":{"start":{"line":195,"column":6},"end":{"line":195,"column":27}},"98":{"start":{"line":196,"column":6},"end":{"line":196,"column":17}},"99":{"start":{"line":197,"column":6},"end":{"line":197,"column":11}},"100":{"start":{"line":201,"column":6},"end":{"line":201,"column":29}},"101":{"start":{"line":202,"column":6},"end":{"line":205,"column":7}},"102":{"start":{"line":203,"column":8},"end":{"line":203,"column":45}},"103":{"start":{"line":204,"column":8},"end":{"line":204,"column":44}},"104":{"start":{"line":206,"column":6},"end":{"line":206,"column":25}},"105":{"start":{"line":207,"column":6},"end":{"line":207,"column":17}},"106":{"start":{"line":208,"column":6},"end":{"line":208,"column":11}},"107":{"start":{"line":213,"column":6},"end":{"line":213,"column":29}},"108":{"start":{"line":214,"column":6},"end":{"line":217,"column":7}},"109":{"start":{"line":215,"column":8},"end":{"line":215,"column":45}},"110":{"start":{"line":216,"column":8},"end":{"line":216,"column":40}},"111":{"start":{"line":218,"column":6},"end":{"line":218,"column":21}},"112":{"start":{"line":219,"column":6},"end":{"line":219,"column":17}},"113":{"start":{"line":220,"column":6},"end":{"line":220,"column":11}},"114":{"start":{"line":226,"column":6},"end":{"line":226,"column":23}},"115":{"start":{"line":227,"column":6},"end":{"line":227,"column":25}},"116":{"start":{"line":228,"column":6},"end":{"line":228,"column":11}},"117":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"118":{"start":{"line":233,"column":4},"end":{"line":233,"column":28}},"119":{"start":{"line":235,"column":17},"end":{"line":235,"column":29}},"120":{"start":{"line":236,"column":19},"end":{"line":236,"column":33}},"121":{"start":{"line":240,"column":4},"end":{"line":240,"column":25}},"122":{"start":{"line":242,"column":2},"end":{"line":242,"column":49}},"123":{"start":{"line":243,"column":2},"end":{"line":243,"column":19}},"124":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"125":{"start":{"line":247,"column":4},"end":{"line":249,"column":6}},"126":{"start":{"line":248,"column":6},"end":{"line":248,"column":24}},"127":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"128":{"start":{"line":252,"column":13},"end":{"line":252,"column":35}},"129":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"130":{"start":{"line":255,"column":4},"end":{"line":255,"column":23}},"131":{"start":{"line":258,"column":2},"end":{"line":258,"column":21}},"132":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"133":{"start":{"line":261,"column":4},"end":{"line":261,"column":39}},"134":{"start":{"line":264,"column":11},"end":{"line":264,"column":15}},"135":{"start":{"line":266,"column":2},"end":{"line":268,"column":4}},"136":{"start":{"line":267,"column":4},"end":{"line":267,"column":14}},"137":{"start":{"line":270,"column":2},"end":{"line":272,"column":4}},"138":{"start":{"line":271,"column":4},"end":{"line":271,"column":15}},"139":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"140":{"start":{"line":275,"column":4},"end":{"line":275,"column":29}},"141":{"start":{"line":278,"column":2},"end":{"line":278,"column":22}},"142":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"143":{"start":{"line":282,"column":4},"end":{"line":282,"column":15}},"144":{"start":{"line":283,"column":4},"end":{"line":283,"column":22}}},"fnMap":{"0":{"name":"Parse","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":14}},"loc":{"start":{"line":27,"column":18},"end":{"line":58,"column":1}},"line":27},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":25},"end":{"line":43,"column":26}},"loc":{"start":{"line":43,"column":38},"end":{"line":45,"column":3}},"line":43},"2":{"name":"(anonymous_2)","decl":{"start":{"line":47,"column":24},"end":{"line":47,"column":25}},"loc":{"start":{"line":47,"column":37},"end":{"line":49,"column":3}},"line":47},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":23},"end":{"line":51,"column":24}},"loc":{"start":{"line":51,"column":35},"end":{"line":53,"column":3}},"line":51},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":25},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":37},"end":{"line":57,"column":3}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":63,"column":29},"end":{"line":63,"column":30}},"loc":{"start":{"line":63,"column":41},"end":{"line":67,"column":1}},"line":63},"6":{"name":"(anonymous_6)","decl":{"start":{"line":72,"column":24},"end":{"line":72,"column":25}},"loc":{"start":{"line":72,"column":37},"end":{"line":83,"column":1}},"line":72},"7":{"name":"(anonymous_7)","decl":{"start":{"line":85,"column":22},"end":{"line":85,"column":23}},"loc":{"start":{"line":85,"column":35},"end":{"line":88,"column":1}},"line":85},"8":{"name":"(anonymous_8)","decl":{"start":{"line":94,"column":24},"end":{"line":94,"column":25}},"loc":{"start":{"line":94,"column":36},"end":{"line":94,"column":38}},"line":94},"9":{"name":"(anonymous_9)","decl":{"start":{"line":96,"column":27},"end":{"line":96,"column":28}},"loc":{"start":{"line":96,"column":40},"end":{"line":137,"column":1}},"line":96},"10":{"name":"(anonymous_10)","decl":{"start":{"line":140,"column":30},"end":{"line":140,"column":31}},"loc":{"start":{"line":140,"column":43},"end":{"line":285,"column":1}},"line":140},"11":{"name":"(anonymous_11)","decl":{"start":{"line":178,"column":14},"end":{"line":178,"column":15}},"loc":{"start":{"line":178,"column":26},"end":{"line":183,"column":7}},"line":178},"12":{"name":"(anonymous_12)","decl":{"start":{"line":180,"column":42},"end":{"line":180,"column":43}},"loc":{"start":{"line":180,"column":55},"end":{"line":182,"column":9}},"line":180},"13":{"name":"(anonymous_13)","decl":{"start":{"line":192,"column":14},"end":{"line":192,"column":15}},"loc":{"start":{"line":192,"column":26},"end":{"line":194,"column":7}},"line":192},"14":{"name":"(anonymous_14)","decl":{"start":{"line":202,"column":14},"end":{"line":202,"column":15}},"loc":{"start":{"line":202,"column":26},"end":{"line":205,"column":7}},"line":202},"15":{"name":"(anonymous_15)","decl":{"start":{"line":214,"column":14},"end":{"line":214,"column":15}},"loc":{"start":{"line":214,"column":26},"end":{"line":217,"column":7}},"line":214},"16":{"name":"(anonymous_16)","decl":{"start":{"line":247,"column":21},"end":{"line":247,"column":22}},"loc":{"start":{"line":247,"column":34},"end":{"line":249,"column":5}},"line":247},"17":{"name":"(anonymous_17)","decl":{"start":{"line":266,"column":20},"end":{"line":266,"column":21}},"loc":{"start":{"line":266,"column":32},"end":{"line":268,"column":3}},"line":266},"18":{"name":"(anonymous_18)","decl":{"start":{"line":270,"column":21},"end":{"line":270,"column":22}},"loc":{"start":{"line":270,"column":33},"end":{"line":272,"column":3}},"line":270}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},{"start":{"line":29,"column":2},"end":{"line":29,"column":48}}],"line":29},"1":{"loc":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},{"start":{"line":65,"column":2},"end":{"line":65,"column":57}}],"line":65},"2":{"loc":{"start":{"line":65,"column":6},"end":{"line":65,"column":29}},"type":"binary-expr","locations":[{"start":{"line":65,"column":6},"end":{"line":65,"column":16}},{"start":{"line":65,"column":20},"end":{"line":65,"column":29}}],"line":65},"3":{"loc":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},{"start":{"line":73,"column":2},"end":{"line":81,"column":3}}],"line":73},"4":{"loc":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"type":"if","locations":[{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},{"start":{"line":78,"column":6},"end":{"line":78,"column":62}}],"line":78},"5":{"loc":{"start":{"line":97,"column":9},"end":{"line":97,"column":30}},"type":"binary-expr","locations":[{"start":{"line":97,"column":9},"end":{"line":97,"column":10}},{"start":{"line":97,"column":14},"end":{"line":97,"column":30}}],"line":97},"6":{"loc":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},{"start":{"line":104,"column":2},"end":{"line":134,"column":3}}],"line":104},"7":{"loc":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"type":"if","locations":[{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},{"start":{"line":106,"column":4},"end":{"line":110,"column":5}}],"line":106},"8":{"loc":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"type":"if","locations":[{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},{"start":{"line":109,"column":6},"end":{"line":109,"column":51}}],"line":109},"9":{"loc":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},{"start":{"line":111,"column":4},"end":{"line":114,"column":5}}],"line":111},"10":{"loc":{"start":{"line":118,"column":20},"end":{"line":118,"column":35}},"type":"binary-expr","locations":[{"start":{"line":118,"column":20},"end":{"line":118,"column":27}},{"start":{"line":118,"column":31},"end":{"line":118,"column":35}}],"line":118},"11":{"loc":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"type":"if","locations":[{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},{"start":{"line":126,"column":4},"end":{"line":133,"column":5}}],"line":126},"12":{"loc":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"type":"if","locations":[{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},{"start":{"line":127,"column":6},"end":{"line":128,"column":26}}],"line":127},"13":{"loc":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},{"start":{"line":149,"column":2},"end":{"line":155,"column":3}}],"line":149},"14":{"loc":{"start":{"line":149,"column":6},"end":{"line":149,"column":48}},"type":"binary-expr","locations":[{"start":{"line":149,"column":6},"end":{"line":149,"column":26}},{"start":{"line":149,"column":30},"end":{"line":149,"column":48}}],"line":149},"15":{"loc":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"type":"switch","locations":[{"start":{"line":158,"column":4},"end":{"line":158,"column":16}},{"start":{"line":159,"column":4},"end":{"line":159,"column":19}},{"start":{"line":160,"column":4},"end":{"line":160,"column":16}},{"start":{"line":161,"column":4},"end":{"line":161,"column":24}},{"start":{"line":162,"column":4},"end":{"line":162,"column":27}},{"start":{"line":163,"column":4},"end":{"line":163,"column":23}},{"start":{"line":164,"column":4},"end":{"line":164,"column":21}},{"start":{"line":165,"column":4},"end":{"line":165,"column":16}},{"start":{"line":166,"column":4},"end":{"line":166,"column":26}},{"start":{"line":167,"column":4},"end":{"line":173,"column":11}},{"start":{"line":175,"column":4},"end":{"line":186,"column":11}},{"start":{"line":188,"column":4},"end":{"line":188,"column":26}},{"start":{"line":189,"column":4},"end":{"line":197,"column":11}},{"start":{"line":199,"column":4},"end":{"line":208,"column":11}},{"start":{"line":210,"column":4},"end":{"line":210,"column":31}},{"start":{"line":211,"column":4},"end":{"line":220,"column":11}},{"start":{"line":222,"column":4},"end":{"line":228,"column":11}}],"line":157},"16":{"loc":{"start":{"line":179,"column":23},"end":{"line":179,"column":41}},"type":"binary-expr","locations":[{"start":{"line":179,"column":23},"end":{"line":179,"column":35}},{"start":{"line":179,"column":39},"end":{"line":179,"column":41}}],"line":179},"17":{"loc":{"start":{"line":203,"column":25},"end":{"line":203,"column":45}},"type":"binary-expr","locations":[{"start":{"line":203,"column":25},"end":{"line":203,"column":39}},{"start":{"line":203,"column":43},"end":{"line":203,"column":45}}],"line":203},"18":{"loc":{"start":{"line":215,"column":25},"end":{"line":215,"column":45}},"type":"binary-expr","locations":[{"start":{"line":215,"column":25},"end":{"line":215,"column":39}},{"start":{"line":215,"column":43},"end":{"line":215,"column":45}}],"line":215},"19":{"loc":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},{"start":{"line":232,"column":2},"end":{"line":241,"column":3}}],"line":232},"20":{"loc":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},{"start":{"line":246,"column":2},"end":{"line":250,"column":3}}],"line":246},"21":{"loc":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"type":"if","locations":[{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},{"start":{"line":252,"column":2},"end":{"line":252,"column":35}}],"line":252},"22":{"loc":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},{"start":{"line":254,"column":2},"end":{"line":256,"column":3}}],"line":254},"23":{"loc":{"start":{"line":254,"column":6},"end":{"line":254,"column":58}},"type":"binary-expr","locations":[{"start":{"line":254,"column":6},"end":{"line":254,"column":27}},{"start":{"line":254,"column":31},"end":{"line":254,"column":58}}],"line":254},"24":{"loc":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},{"start":{"line":260,"column":2},"end":{"line":262,"column":3}}],"line":260},"25":{"loc":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"type":"if","locations":[{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},{"start":{"line":274,"column":2},"end":{"line":276,"column":3}}],"line":274},"26":{"loc":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"type":"if","locations":[{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},{"start":{"line":281,"column":2},"end":{"line":284,"column":3}}],"line":281}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":0,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":0,"25":1,"26":9,"27":1,"28":1,"29":1,"30":1,"31":1,"32":0,"33":0,"34":0,"35":0,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":9,"51":9,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":9,"62":9,"63":9,"64":1031,"65":9,"66":2,"67":1,"68":2,"69":7,"70":7,"71":9,"72":1,"73":7,"74":7,"75":7,"76":7,"77":0,"78":0,"79":0,"80":0,"81":0,"82":7,"83":7,"84":7,"85":7,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":7,"118":0,"119":7,"120":7,"121":7,"122":7,"123":7,"124":7,"125":7,"126":0,"127":7,"128":0,"129":7,"130":0,"131":7,"132":7,"133":0,"134":7,"135":7,"136":7,"137":7,"138":18,"139":7,"140":0,"141":7,"142":7,"143":7,"144":7},"f":{"0":1,"1":0,"2":9,"3":1,"4":1,"5":0,"6":1,"7":1,"8":20,"9":9,"10":7,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":7,"18":18},"b":{"0":[0,1],"1":[0,0],"2":[0,0],"3":[0,1],"4":[0,0],"5":[9,9],"6":[0,9],"7":[0,0],"8":[0,0],"9":[0,0],"10":[1040,1038],"11":[2,7],"12":[1,1],"13":[0,7],"14":[7,7],"15":[1,1,1,3,3,3,7,7,7,7,0,0,0,0,0,0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,7],"20":[7,0],"21":[0,7],"22":[0,7],"23":[7,1],"24":[0,7],"25":[0,7],"26":[7,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"4a8f51a3a12b59eb69694618530032a813fbf8cb","contentHash":"d347e73abcd3109143efee20401d9f0bfc6d68a4a6323bd4559ada44c741786a"},"/Users/isaacs/dev/js/tar/lib/buffer-entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/buffer-entry.js","statementMap":{"0":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"1":{"start":{"line":10,"column":15},"end":{"line":10,"column":34}},"2":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"3":{"start":{"line":14,"column":2},"end":{"line":14,"column":30}},"4":{"start":{"line":15,"column":2},"end":{"line":15,"column":44}},"5":{"start":{"line":16,"column":2},"end":{"line":16,"column":18}},"6":{"start":{"line":17,"column":2},"end":{"line":17,"column":16}},"7":{"start":{"line":18,"column":2},"end":{"line":20,"column":4}},"8":{"start":{"line":19,"column":4},"end":{"line":19,"column":52}},"9":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"10":{"start":{"line":26,"column":0},"end":{"line":30,"column":1}},"11":{"start":{"line":27,"column":2},"end":{"line":27,"column":36}},"12":{"start":{"line":28,"column":2},"end":{"line":28,"column":26}},"13":{"start":{"line":29,"column":2},"end":{"line":29,"column":37}}},"fnMap":{"0":{"name":"BufferEntry","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":24},"end":{"line":21,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":17},"end":{"line":18,"column":18}},"loc":{"start":{"line":18,"column":29},"end":{"line":20,"column":3}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":30},"end":{"line":26,"column":31}},"loc":{"start":{"line":26,"column":43},"end":{"line":30,"column":1}},"line":26}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":1,"10":1,"11":0,"12":0,"13":0},"f":{"0":0,"1":0,"2":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"d8ad66df900443c9c9d8aefe5fc126a55ba268ec","contentHash":"25e5b3c51e476fcffac7affa191a0ed0f54d64d3d3b760e887bd45ba08fffa65"},"/Users/isaacs/dev/js/tar/lib/extended-header.js":{"path":"/Users/isaacs/dev/js/tar/lib/extended-header.js","statementMap":{"0":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"1":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"2":{"start":{"line":12,"column":15},"end":{"line":12,"column":34}},"3":{"start":{"line":13,"column":10},"end":{"line":13,"column":30}},"4":{"start":{"line":14,"column":14},"end":{"line":14,"column":25}},"5":{"start":{"line":15,"column":15},"end":{"line":17,"column":42}},"6":{"start":{"line":20,"column":2},"end":{"line":20,"column":30}},"7":{"start":{"line":21,"column":2},"end":{"line":21,"column":30}},"8":{"start":{"line":22,"column":2},"end":{"line":22,"column":18}},"9":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"10":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":20}},"12":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"13":{"start":{"line":27,"column":2},"end":{"line":27,"column":19}},"14":{"start":{"line":28,"column":2},"end":{"line":28,"column":19}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"16":{"start":{"line":30,"column":2},"end":{"line":30,"column":16}},"17":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"18":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"19":{"start":{"line":36,"column":8},"end":{"line":36,"column":9}},"20":{"start":{"line":37,"column":13},"end":{"line":37,"column":39}},"21":{"start":{"line":38,"column":11},"end":{"line":38,"column":28}},"22":{"start":{"line":39,"column":11},"end":{"line":39,"column":28}},"23":{"start":{"line":40,"column":11},"end":{"line":40,"column":28}},"24":{"start":{"line":41,"column":11},"end":{"line":41,"column":28}},"25":{"start":{"line":43,"column":0},"end":{"line":45,"column":2}},"26":{"start":{"line":44,"column":2},"end":{"line":44,"column":31}},"27":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"28":{"start":{"line":50,"column":9},"end":{"line":50,"column":26}},"29":{"start":{"line":51,"column":9},"end":{"line":51,"column":26}},"30":{"start":{"line":52,"column":12},"end":{"line":52,"column":29}},"31":{"start":{"line":53,"column":8},"end":{"line":53,"column":25}},"32":{"start":{"line":54,"column":8},"end":{"line":54,"column":25}},"33":{"start":{"line":55,"column":8},"end":{"line":55,"column":25}},"34":{"start":{"line":56,"column":8},"end":{"line":56,"column":25}},"35":{"start":{"line":57,"column":12},"end":{"line":57,"column":29}},"36":{"start":{"line":58,"column":9},"end":{"line":58,"column":26}},"37":{"start":{"line":59,"column":9},"end":{"line":59,"column":27}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"39":{"start":{"line":62,"column":27},"end":{"line":62,"column":33}},"40":{"start":{"line":64,"column":2},"end":{"line":130,"column":3}},"41":{"start":{"line":64,"column":16},"end":{"line":64,"column":17}},"42":{"start":{"line":64,"column":23},"end":{"line":64,"column":31}},"43":{"start":{"line":69,"column":12},"end":{"line":69,"column":16}},"44":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"45":{"start":{"line":72,"column":6},"end":{"line":72,"column":53}},"46":{"start":{"line":73,"column":6},"end":{"line":73,"column":12}},"47":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"48":{"start":{"line":77,"column":16},"end":{"line":77,"column":22}},"49":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"50":{"start":{"line":82,"column":10},"end":{"line":82,"column":27}},"51":{"start":{"line":84,"column":10},"end":{"line":84,"column":73}},"52":{"start":{"line":85,"column":10},"end":{"line":85,"column":34}},"53":{"start":{"line":86,"column":10},"end":{"line":86,"column":18}},"54":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"55":{"start":{"line":89,"column":10},"end":{"line":89,"column":68}},"56":{"start":{"line":90,"column":10},"end":{"line":90,"column":16}},"57":{"start":{"line":92,"column":8},"end":{"line":92,"column":29}},"58":{"start":{"line":93,"column":8},"end":{"line":93,"column":16}},"59":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"60":{"start":{"line":98,"column":10},"end":{"line":98,"column":27}},"61":{"start":{"line":99,"column":10},"end":{"line":99,"column":57}},"62":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"63":{"start":{"line":100,"column":35},"end":{"line":100,"column":66}},"64":{"start":{"line":101,"column":10},"end":{"line":101,"column":33}},"65":{"start":{"line":102,"column":10},"end":{"line":102,"column":18}},"66":{"start":{"line":104,"column":8},"end":{"line":104,"column":28}},"67":{"start":{"line":105,"column":8},"end":{"line":105,"column":16}},"68":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"69":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"70":{"start":{"line":112,"column":12},"end":{"line":112,"column":55}},"71":{"start":{"line":113,"column":12},"end":{"line":113,"column":18}},"72":{"start":{"line":115,"column":20},"end":{"line":115,"column":55}},"73":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"74":{"start":{"line":117,"column":12},"end":{"line":117,"column":33}},"75":{"start":{"line":119,"column":10},"end":{"line":119,"column":38}},"76":{"start":{"line":121,"column":10},"end":{"line":121,"column":33}},"77":{"start":{"line":122,"column":10},"end":{"line":122,"column":28}},"78":{"start":{"line":123,"column":10},"end":{"line":123,"column":25}},"79":{"start":{"line":124,"column":10},"end":{"line":124,"column":29}},"80":{"start":{"line":125,"column":10},"end":{"line":125,"column":18}},"81":{"start":{"line":127,"column":8},"end":{"line":127,"column":28}},"82":{"start":{"line":128,"column":8},"end":{"line":128,"column":16}},"83":{"start":{"line":134,"column":2},"end":{"line":136,"column":42}},"84":{"start":{"line":138,"column":2},"end":{"line":138,"column":15}},"85":{"start":{"line":139,"column":2},"end":{"line":139,"column":16}}},"fnMap":{"0":{"name":"ExtendedHeader","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":23}},"loc":{"start":{"line":19,"column":27},"end":{"line":31,"column":1}},"line":19},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":28},"end":{"line":43,"column":29}},"loc":{"start":{"line":43,"column":41},"end":{"line":45,"column":1}},"line":43},"2":{"name":"parse","decl":{"start":{"line":61,"column":9},"end":{"line":61,"column":14}},"loc":{"start":{"line":61,"column":19},"end":{"line":131,"column":1}},"line":61},"3":{"name":"error","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":14}},"loc":{"start":{"line":133,"column":25},"end":{"line":140,"column":1}},"line":133}},"branchMap":{"0":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},{"start":{"line":62,"column":2},"end":{"line":62,"column":33}}],"line":62},"1":{"loc":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},{"start":{"line":71,"column":4},"end":{"line":74,"column":5}}],"line":71},"2":{"loc":{"start":{"line":71,"column":8},"end":{"line":71,"column":54}},"type":"binary-expr","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":23}},{"start":{"line":71,"column":27},"end":{"line":71,"column":54}}],"line":71},"3":{"loc":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"type":"switch","locations":[{"start":{"line":77,"column":6},"end":{"line":77,"column":22}},{"start":{"line":79,"column":6},"end":{"line":93,"column":16}},{"start":{"line":95,"column":6},"end":{"line":105,"column":16}},{"start":{"line":107,"column":6},"end":{"line":128,"column":16}}],"line":76},"4":{"loc":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},{"start":{"line":81,"column":8},"end":{"line":87,"column":9}}],"line":81},"5":{"loc":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},{"start":{"line":88,"column":8},"end":{"line":91,"column":9}}],"line":88},"6":{"loc":{"start":{"line":88,"column":12},"end":{"line":88,"column":28}},"type":"binary-expr","locations":[{"start":{"line":88,"column":12},"end":{"line":88,"column":18}},{"start":{"line":88,"column":22},"end":{"line":88,"column":28}}],"line":88},"7":{"loc":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"type":"if","locations":[{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},{"start":{"line":97,"column":8},"end":{"line":103,"column":9}}],"line":97},"8":{"loc":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"type":"if","locations":[{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},{"start":{"line":100,"column":10},"end":{"line":100,"column":66}}],"line":100},"9":{"loc":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},{"start":{"line":109,"column":8},"end":{"line":126,"column":9}}],"line":109},"10":{"loc":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"type":"if","locations":[{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},{"start":{"line":111,"column":10},"end":{"line":114,"column":11}}],"line":111},"11":{"loc":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"type":"if","locations":[{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},{"start":{"line":116,"column":10},"end":{"line":118,"column":11}}],"line":116}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":4,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0},"f":{"0":0,"1":4,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0,0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"77cb382c69a46833a08275dbc55bf34db0dcd796","contentHash":"78a790af1726a774425fb478f1423068fe64414b747d89b597baf45139e7ae3d"},"/Users/isaacs/dev/js/tar/lib/extract.js":{"path":"/Users/isaacs/dev/js/tar/lib/extract.js","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":24}},"1":{"start":{"line":5,"column":10},"end":{"line":5,"column":30}},"2":{"start":{"line":6,"column":14},"end":{"line":6,"column":32}},"3":{"start":{"line":7,"column":15},"end":{"line":7,"column":34}},"4":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"5":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"6":{"start":{"line":11,"column":34},"end":{"line":11,"column":58}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":23}},"8":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"9":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"10":{"start":{"line":19,"column":2},"end":{"line":19,"column":59}},"11":{"start":{"line":20,"column":2},"end":{"line":20,"column":25}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":26}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"15":{"start":{"line":25,"column":38},"end":{"line":25,"column":52}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":34}},"17":{"start":{"line":29,"column":2},"end":{"line":29,"column":14}},"18":{"start":{"line":30,"column":11},"end":{"line":30,"column":15}},"19":{"start":{"line":35,"column":2},"end":{"line":60,"column":4}},"20":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"21":{"start":{"line":39,"column":14},"end":{"line":39,"column":63}},"22":{"start":{"line":40,"column":6},"end":{"line":40,"column":39}},"23":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"24":{"start":{"line":42,"column":17},"end":{"line":42,"column":70}},"25":{"start":{"line":43,"column":8},"end":{"line":43,"column":50}},"26":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"27":{"start":{"line":47,"column":6},"end":{"line":48,"column":66}},"28":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"29":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"30":{"start":{"line":53,"column":21},"end":{"line":53,"column":41}},"31":{"start":{"line":54,"column":19},"end":{"line":54,"column":56}},"32":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"33":{"start":{"line":56,"column":8},"end":{"line":56,"column":65}},"34":{"start":{"line":58,"column":6},"end":{"line":58,"column":54}},"35":{"start":{"line":62,"column":2},"end":{"line":65,"column":4}},"36":{"start":{"line":63,"column":4},"end":{"line":63,"column":36}},"37":{"start":{"line":64,"column":4},"end":{"line":64,"column":15}},"38":{"start":{"line":67,"column":2},"end":{"line":69,"column":4}},"39":{"start":{"line":68,"column":4},"end":{"line":68,"column":25}},"40":{"start":{"line":71,"column":2},"end":{"line":73,"column":4}},"41":{"start":{"line":72,"column":4},"end":{"line":72,"column":20}},"42":{"start":{"line":79,"column":2},"end":{"line":84,"column":4}},"43":{"start":{"line":81,"column":4},"end":{"line":81,"column":21}},"44":{"start":{"line":82,"column":4},"end":{"line":82,"column":18}},"45":{"start":{"line":83,"column":4},"end":{"line":83,"column":20}},"46":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"47":{"start":{"line":89,"column":0},"end":{"line":94,"column":1}},"48":{"start":{"line":90,"column":11},"end":{"line":90,"column":15}},"49":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"50":{"start":{"line":91,"column":31},"end":{"line":91,"column":57}},"51":{"start":{"line":92,"column":2},"end":{"line":92,"column":15}}},"fnMap":{"0":{"name":"Extract","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":16}},"loc":{"start":{"line":10,"column":24},"end":{"line":85,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":17},"end":{"line":35,"column":18}},"loc":{"start":{"line":35,"column":34},"end":{"line":60,"column":3}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":36},"end":{"line":65,"column":3}},"line":62},"3":{"name":"(anonymous_3)","decl":{"start":{"line":67,"column":24},"end":{"line":67,"column":25}},"loc":{"start":{"line":67,"column":38},"end":{"line":69,"column":3}},"line":67},"4":{"name":"(anonymous_4)","decl":{"start":{"line":71,"column":24},"end":{"line":71,"column":25}},"loc":{"start":{"line":71,"column":35},"end":{"line":73,"column":3}},"line":71},"5":{"name":"(anonymous_5)","decl":{"start":{"line":79,"column":24},"end":{"line":79,"column":25}},"loc":{"start":{"line":79,"column":36},"end":{"line":84,"column":3}},"line":79},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":31},"end":{"line":89,"column":32}},"loc":{"start":{"line":89,"column":43},"end":{"line":94,"column":1}},"line":89}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},{"start":{"line":11,"column":2},"end":{"line":11,"column":58}}],"line":11},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},{"start":{"line":14,"column":2},"end":{"line":16,"column":3}}],"line":14},"2":{"loc":{"start":{"line":19,"column":14},"end":{"line":19,"column":59}},"type":"binary-expr","locations":[{"start":{"line":19,"column":14},"end":{"line":19,"column":23}},{"start":{"line":19,"column":27},"end":{"line":19,"column":59}}],"line":19},"3":{"loc":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"type":"if","locations":[{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},{"start":{"line":25,"column":2},"end":{"line":25,"column":52}}],"line":25},"4":{"loc":{"start":{"line":25,"column":6},"end":{"line":25,"column":36}},"type":"binary-expr","locations":[{"start":{"line":25,"column":6},"end":{"line":25,"column":17}},{"start":{"line":25,"column":21},"end":{"line":25,"column":36}}],"line":25},"5":{"loc":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},{"start":{"line":38,"column":4},"end":{"line":45,"column":5}}],"line":38},"6":{"loc":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},{"start":{"line":41,"column":6},"end":{"line":44,"column":7}}],"line":41},"7":{"loc":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},{"start":{"line":46,"column":4},"end":{"line":49,"column":5}}],"line":46},"8":{"loc":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},{"start":{"line":51,"column":4},"end":{"line":59,"column":5}}],"line":51},"9":{"loc":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"type":"binary-expr","locations":[{"start":{"line":52,"column":15},"end":{"line":52,"column":39}},{"start":{"line":52,"column":43},"end":{"line":52,"column":45}}],"line":52},"10":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},{"start":{"line":55,"column":6},"end":{"line":57,"column":7}}],"line":55},"11":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},{"start":{"line":91,"column":2},"end":{"line":91,"column":57}}],"line":91},"12":{"loc":{"start":{"line":91,"column":6},"end":{"line":91,"column":29}},"type":"binary-expr","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":16}},{"start":{"line":91,"column":20},"end":{"line":91,"column":29}}],"line":91}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":2,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":7,"21":0,"22":0,"23":0,"24":0,"25":0,"26":7,"27":0,"28":7,"29":2,"30":2,"31":2,"32":2,"33":1,"34":2,"35":1,"36":1,"37":1,"38":1,"39":0,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":0,"51":1},"f":{"0":2,"1":7,"2":1,"3":0,"4":1,"5":1,"6":1},"b":{"0":[1,1],"1":[1,0],"2":[1,0],"3":[1,0],"4":[1,0],"5":[0,7],"6":[0,0],"7":[0,7],"8":[2,5],"9":[2,0],"10":[1,1],"11":[0,1],"12":[1,1]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3fb9f60facc409fe944dc36bd2e14fc6153e403d","contentHash":"3d9485ca58c6c768b022a39d276296b53647ccf39986885459406e933921c962"}} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/37d58de4-deea-4808-bb77-d27685bd1501.json b/node_modules/tar/.nyc_output/37d58de4-deea-4808-bb77-d27685bd1501.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/node_modules/tar/.nyc_output/37d58de4-deea-4808-bb77-d27685bd1501.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json b/node_modules/tar/.nyc_output/5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/node_modules/tar/.nyc_output/5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json b/node_modules/tar/.nyc_output/5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json new file mode 100644 index 00000000..268ab6ef --- /dev/null +++ b/node_modules/tar/.nyc_output/5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json @@ -0,0 +1 @@ +{"/Users/isaacs/dev/js/tar/lib/pack.js":{"path":"/Users/isaacs/dev/js/tar/lib/pack.js","statementMap":{"0":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}},"1":{"start":{"line":6,"column":18},"end":{"line":6,"column":46}},"2":{"start":{"line":7,"column":13},"end":{"line":7,"column":37}},"3":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"4":{"start":{"line":9,"column":15},"end":{"line":9,"column":34}},"5":{"start":{"line":10,"column":25},"end":{"line":10,"column":61}},"6":{"start":{"line":11,"column":14},"end":{"line":11,"column":40}},"7":{"start":{"line":12,"column":10},"end":{"line":12,"column":25}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"9":{"start":{"line":14,"column":13},"end":{"line":14,"column":14}},"10":{"start":{"line":14,"column":31},"end":{"line":14,"column":41}},"11":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"12":{"start":{"line":20,"column":11},"end":{"line":20,"column":15}},"13":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"14":{"start":{"line":21,"column":29},"end":{"line":21,"column":51}},"15":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"16":{"start":{"line":23,"column":13},"end":{"line":23,"column":52}},"17":{"start":{"line":24,"column":7},"end":{"line":24,"column":32}},"18":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"19":{"start":{"line":28,"column":2},"end":{"line":28,"column":20}},"20":{"start":{"line":29,"column":2},"end":{"line":29,"column":20}},"21":{"start":{"line":30,"column":2},"end":{"line":30,"column":17}},"22":{"start":{"line":32,"column":2},"end":{"line":32,"column":25}},"23":{"start":{"line":33,"column":2},"end":{"line":33,"column":24}},"24":{"start":{"line":35,"column":2},"end":{"line":35,"column":21}},"25":{"start":{"line":36,"column":2},"end":{"line":43,"column":4}},"26":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"27":{"start":{"line":37,"column":35},"end":{"line":37,"column":41}},"28":{"start":{"line":38,"column":4},"end":{"line":38,"column":22}},"29":{"start":{"line":39,"column":4},"end":{"line":41,"column":6}},"30":{"start":{"line":40,"column":6},"end":{"line":40,"column":25}},"31":{"start":{"line":42,"column":4},"end":{"line":42,"column":15}},"32":{"start":{"line":46,"column":0},"end":{"line":57,"column":1}},"33":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"34":{"start":{"line":48,"column":23},"end":{"line":48,"column":29}},"35":{"start":{"line":49,"column":2},"end":{"line":49,"column":24}},"36":{"start":{"line":51,"column":11},"end":{"line":51,"column":15}},"37":{"start":{"line":52,"column":2},"end":{"line":56,"column":10}},"38":{"start":{"line":54,"column":6},"end":{"line":54,"column":24}},"39":{"start":{"line":59,"column":0},"end":{"line":69,"column":1}},"40":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"41":{"start":{"line":60,"column":40},"end":{"line":60,"column":68}},"42":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"43":{"start":{"line":62,"column":19},"end":{"line":62,"column":72}},"44":{"start":{"line":64,"column":2},"end":{"line":64,"column":17}},"45":{"start":{"line":65,"column":2},"end":{"line":65,"column":27}},"46":{"start":{"line":66,"column":2},"end":{"line":66,"column":17}},"47":{"start":{"line":67,"column":2},"end":{"line":67,"column":43}},"48":{"start":{"line":68,"column":2},"end":{"line":68,"column":25}},"49":{"start":{"line":71,"column":0},"end":{"line":75,"column":1}},"50":{"start":{"line":72,"column":2},"end":{"line":72,"column":21}},"51":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"52":{"start":{"line":73,"column":26},"end":{"line":73,"column":52}},"53":{"start":{"line":74,"column":2},"end":{"line":74,"column":20}},"54":{"start":{"line":77,"column":0},"end":{"line":82,"column":1}},"55":{"start":{"line":78,"column":2},"end":{"line":78,"column":22}},"56":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"57":{"start":{"line":79,"column":26},"end":{"line":79,"column":53}},"58":{"start":{"line":80,"column":2},"end":{"line":80,"column":21}},"59":{"start":{"line":81,"column":2},"end":{"line":81,"column":17}},"60":{"start":{"line":84,"column":0},"end":{"line":88,"column":1}},"61":{"start":{"line":85,"column":2},"end":{"line":85,"column":20}},"62":{"start":{"line":86,"column":2},"end":{"line":86,"column":24}},"63":{"start":{"line":87,"column":2},"end":{"line":87,"column":17}},"64":{"start":{"line":90,"column":0},"end":{"line":233,"column":1}},"65":{"start":{"line":91,"column":11},"end":{"line":91,"column":15}},"66":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"67":{"start":{"line":93,"column":4},"end":{"line":93,"column":10}},"68":{"start":{"line":96,"column":14},"end":{"line":96,"column":32}},"69":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"70":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"71":{"start":{"line":100,"column":6},"end":{"line":100,"column":22}},"72":{"start":{"line":102,"column":4},"end":{"line":102,"column":10}},"73":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"74":{"start":{"line":107,"column":4},"end":{"line":107,"column":29}},"75":{"start":{"line":108,"column":4},"end":{"line":111,"column":6}},"76":{"start":{"line":110,"column":6},"end":{"line":110,"column":19}},"77":{"start":{"line":112,"column":4},"end":{"line":112,"column":10}},"78":{"start":{"line":115,"column":2},"end":{"line":115,"column":23}},"79":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"80":{"start":{"line":119,"column":4},"end":{"line":119,"column":24}},"81":{"start":{"line":120,"column":4},"end":{"line":120,"column":24}},"82":{"start":{"line":121,"column":4},"end":{"line":121,"column":18}},"83":{"start":{"line":122,"column":4},"end":{"line":122,"column":20}},"84":{"start":{"line":123,"column":4},"end":{"line":123,"column":10}},"85":{"start":{"line":134,"column":13},"end":{"line":134,"column":53}},"86":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"87":{"start":{"line":137,"column":4},"end":{"line":137,"column":27}},"88":{"start":{"line":140,"column":15},"end":{"line":140,"column":17}},"89":{"start":{"line":142,"column":2},"end":{"line":144,"column":4}},"90":{"start":{"line":143,"column":4},"end":{"line":143,"column":30}},"91":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"92":{"start":{"line":146,"column":25},"end":{"line":146,"column":52}},"93":{"start":{"line":148,"column":2},"end":{"line":148,"column":53}},"94":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"95":{"start":{"line":152,"column":4},"end":{"line":152,"column":49}},"96":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"97":{"start":{"line":156,"column":4},"end":{"line":156,"column":29}},"98":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"99":{"start":{"line":161,"column":6},"end":{"line":161,"column":12}},"100":{"start":{"line":164,"column":6},"end":{"line":164,"column":24}},"101":{"start":{"line":165,"column":6},"end":{"line":165,"column":21}},"102":{"start":{"line":166,"column":6},"end":{"line":166,"column":11}},"103":{"start":{"line":169,"column":15},"end":{"line":169,"column":69}},"104":{"start":{"line":170,"column":6},"end":{"line":170,"column":54}},"105":{"start":{"line":171,"column":6},"end":{"line":171,"column":21}},"106":{"start":{"line":172,"column":6},"end":{"line":172,"column":11}},"107":{"start":{"line":175,"column":15},"end":{"line":175,"column":69}},"108":{"start":{"line":176,"column":6},"end":{"line":176,"column":74}},"109":{"start":{"line":177,"column":6},"end":{"line":177,"column":21}},"110":{"start":{"line":178,"column":6},"end":{"line":178,"column":11}},"111":{"start":{"line":187,"column":15},"end":{"line":187,"column":53}},"112":{"start":{"line":189,"column":2},"end":{"line":189,"column":20}},"113":{"start":{"line":195,"column":2},"end":{"line":197,"column":4}},"114":{"start":{"line":196,"column":4},"end":{"line":196,"column":22}},"115":{"start":{"line":199,"column":2},"end":{"line":205,"column":4}},"116":{"start":{"line":200,"column":4},"end":{"line":202,"column":5}},"117":{"start":{"line":201,"column":6},"end":{"line":201,"column":50}},"118":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"119":{"start":{"line":204,"column":33},"end":{"line":204,"column":44}},"120":{"start":{"line":206,"column":2},"end":{"line":206,"column":31}},"121":{"start":{"line":208,"column":14},"end":{"line":208,"column":19}},"122":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"123":{"start":{"line":210,"column":15},"end":{"line":210,"column":21}},"124":{"start":{"line":211,"column":4},"end":{"line":211,"column":16}},"125":{"start":{"line":215,"column":4},"end":{"line":215,"column":27}},"126":{"start":{"line":216,"column":4},"end":{"line":216,"column":26}},"127":{"start":{"line":217,"column":4},"end":{"line":217,"column":17}},"128":{"start":{"line":220,"column":2},"end":{"line":223,"column":4}},"129":{"start":{"line":222,"column":4},"end":{"line":222,"column":24}},"130":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"131":{"start":{"line":229,"column":4},"end":{"line":229,"column":21}},"132":{"start":{"line":232,"column":2},"end":{"line":232,"column":20}},"133":{"start":{"line":235,"column":0},"end":{"line":235,"column":39}},"134":{"start":{"line":236,"column":0},"end":{"line":236,"column":37}}},"fnMap":{"0":{"name":"Pack","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":13}},"loc":{"start":{"line":18,"column":22},"end":{"line":44,"column":1}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":36,"column":16},"end":{"line":36,"column":17}},"loc":{"start":{"line":36,"column":31},"end":{"line":43,"column":3}},"line":36},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":18},"end":{"line":39,"column":19}},"loc":{"start":{"line":39,"column":30},"end":{"line":41,"column":5}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":27},"end":{"line":46,"column":28}},"loc":{"start":{"line":46,"column":44},"end":{"line":57,"column":1}},"line":46},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":29},"end":{"line":55,"column":5}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":21},"end":{"line":59,"column":22}},"loc":{"start":{"line":59,"column":39},"end":{"line":69,"column":1}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":71,"column":23},"end":{"line":71,"column":24}},"loc":{"start":{"line":71,"column":35},"end":{"line":75,"column":1}},"line":71},"7":{"name":"(anonymous_7)","decl":{"start":{"line":77,"column":24},"end":{"line":77,"column":25}},"loc":{"start":{"line":77,"column":36},"end":{"line":82,"column":1}},"line":77},"8":{"name":"(anonymous_8)","decl":{"start":{"line":84,"column":21},"end":{"line":84,"column":22}},"loc":{"start":{"line":84,"column":33},"end":{"line":88,"column":1}},"line":84},"9":{"name":"(anonymous_9)","decl":{"start":{"line":90,"column":26},"end":{"line":90,"column":27}},"loc":{"start":{"line":90,"column":38},"end":{"line":233,"column":1}},"line":90},"10":{"name":"(anonymous_10)","decl":{"start":{"line":108,"column":22},"end":{"line":108,"column":23}},"loc":{"start":{"line":108,"column":34},"end":{"line":111,"column":5}},"line":108},"11":{"name":"(anonymous_11)","decl":{"start":{"line":142,"column":41},"end":{"line":142,"column":42}},"loc":{"start":{"line":142,"column":54},"end":{"line":144,"column":3}},"line":142},"12":{"name":"(anonymous_12)","decl":{"start":{"line":195,"column":20},"end":{"line":195,"column":21}},"loc":{"start":{"line":195,"column":33},"end":{"line":197,"column":3}},"line":195},"13":{"name":"(anonymous_13)","decl":{"start":{"line":199,"column":22},"end":{"line":199,"column":23}},"loc":{"start":{"line":199,"column":34},"end":{"line":205,"column":3}},"line":199},"14":{"name":"(anonymous_14)","decl":{"start":{"line":200,"column":30},"end":{"line":200,"column":31}},"loc":{"start":{"line":200,"column":42},"end":{"line":202,"column":5}},"line":200},"15":{"name":"nextEntry","decl":{"start":{"line":209,"column":11},"end":{"line":209,"column":20}},"loc":{"start":{"line":209,"column":24},"end":{"line":218,"column":3}},"line":209},"16":{"name":"(anonymous_16)","decl":{"start":{"line":220,"column":21},"end":{"line":220,"column":22}},"loc":{"start":{"line":220,"column":35},"end":{"line":223,"column":3}},"line":220},"17":{"name":"(anonymous_17)","decl":{"start":{"line":235,"column":25},"end":{"line":235,"column":26}},"loc":{"start":{"line":235,"column":37},"end":{"line":235,"column":39}},"line":235},"18":{"name":"(anonymous_18)","decl":{"start":{"line":236,"column":23},"end":{"line":236,"column":24}},"loc":{"start":{"line":236,"column":35},"end":{"line":236,"column":37}},"line":236}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},{"start":{"line":21,"column":2},"end":{"line":21,"column":51}}],"line":21},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},{"start":{"line":23,"column":2},"end":{"line":24,"column":32}}],"line":23},"2":{"loc":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},{"start":{"line":37,"column":4},"end":{"line":37,"column":41}}],"line":37},"3":{"loc":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},{"start":{"line":48,"column":2},"end":{"line":48,"column":29}}],"line":48},"4":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},{"start":{"line":60,"column":2},"end":{"line":60,"column":68}}],"line":60},"5":{"loc":{"start":{"line":60,"column":6},"end":{"line":60,"column":38}},"type":"binary-expr","locations":[{"start":{"line":60,"column":6},"end":{"line":60,"column":18}},{"start":{"line":60,"column":22},"end":{"line":60,"column":38}}],"line":60},"6":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},{"start":{"line":62,"column":2},"end":{"line":62,"column":72}}],"line":62},"7":{"loc":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},{"start":{"line":73,"column":2},"end":{"line":73,"column":52}}],"line":73},"8":{"loc":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},{"start":{"line":79,"column":2},"end":{"line":79,"column":53}}],"line":79},"9":{"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},{"start":{"line":92,"column":2},"end":{"line":94,"column":3}}],"line":92},"10":{"loc":{"start":{"line":92,"column":6},"end":{"line":92,"column":34}},"type":"binary-expr","locations":[{"start":{"line":92,"column":6},"end":{"line":92,"column":16}},{"start":{"line":92,"column":20},"end":{"line":92,"column":34}}],"line":92},"11":{"loc":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},{"start":{"line":98,"column":2},"end":{"line":103,"column":3}}],"line":98},"12":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},{"start":{"line":99,"column":4},"end":{"line":101,"column":5}}],"line":99},"13":{"loc":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},{"start":{"line":105,"column":2},"end":{"line":113,"column":3}}],"line":105},"14":{"loc":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},{"start":{"line":117,"column":2},"end":{"line":124,"column":3}}],"line":117},"15":{"loc":{"start":{"line":134,"column":27},"end":{"line":134,"column":46}},"type":"binary-expr","locations":[{"start":{"line":134,"column":27},"end":{"line":134,"column":37}},{"start":{"line":134,"column":41},"end":{"line":134,"column":46}}],"line":134},"16":{"loc":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},{"start":{"line":135,"column":2},"end":{"line":138,"column":3}}],"line":135},"17":{"loc":{"start":{"line":135,"column":6},"end":{"line":135,"column":72}},"type":"binary-expr","locations":[{"start":{"line":135,"column":6},"end":{"line":135,"column":16}},{"start":{"line":135,"column":20},"end":{"line":135,"column":39}},{"start":{"line":135,"column":43},"end":{"line":135,"column":53}},{"start":{"line":135,"column":57},"end":{"line":135,"column":72}}],"line":135},"18":{"loc":{"start":{"line":142,"column":14},"end":{"line":142,"column":31}},"type":"binary-expr","locations":[{"start":{"line":142,"column":14},"end":{"line":142,"column":25}},{"start":{"line":142,"column":29},"end":{"line":142,"column":31}}],"line":142},"19":{"loc":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"type":"if","locations":[{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},{"start":{"line":146,"column":2},"end":{"line":146,"column":52}}],"line":146},"20":{"loc":{"start":{"line":148,"column":36},"end":{"line":148,"column":52}},"type":"binary-expr","locations":[{"start":{"line":148,"column":36},"end":{"line":148,"column":46}},{"start":{"line":148,"column":50},"end":{"line":148,"column":52}}],"line":148},"21":{"loc":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},{"start":{"line":151,"column":2},"end":{"line":153,"column":3}}],"line":151},"22":{"loc":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"type":"if","locations":[{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},{"start":{"line":155,"column":2},"end":{"line":156,"column":29}}],"line":155},"23":{"loc":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"type":"switch","locations":[{"start":{"line":160,"column":4},"end":{"line":161,"column":12}},{"start":{"line":163,"column":4},"end":{"line":166,"column":11}},{"start":{"line":168,"column":4},"end":{"line":172,"column":11}},{"start":{"line":174,"column":4},"end":{"line":178,"column":11}}],"line":158},"24":{"loc":{"start":{"line":170,"column":24},"end":{"line":170,"column":54}},"type":"binary-expr","locations":[{"start":{"line":170,"column":24},"end":{"line":170,"column":47}},{"start":{"line":170,"column":51},"end":{"line":170,"column":54}}],"line":170},"25":{"loc":{"start":{"line":176,"column":24},"end":{"line":176,"column":74}},"type":"binary-expr","locations":[{"start":{"line":176,"column":24},"end":{"line":176,"column":67}},{"start":{"line":176,"column":71},"end":{"line":176,"column":74}}],"line":176},"26":{"loc":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"type":"if","locations":[{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},{"start":{"line":204,"column":4},"end":{"line":204,"column":44}}],"line":204},"27":{"loc":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"type":"if","locations":[{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},{"start":{"line":210,"column":4},"end":{"line":210,"column":21}}],"line":210},"28":{"loc":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},{"start":{"line":227,"column":2},"end":{"line":230,"column":3}}],"line":227}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":512,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":1,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":1,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1,"50":0,"51":0,"52":0,"53":0,"54":1,"55":0,"56":0,"57":0,"58":0,"59":0,"60":1,"61":0,"62":0,"63":0,"64":1,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":1,"134":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0,0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0,0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"8beb16ccde52e484aa1dd87f5ece33d696c808ab","contentHash":"7bb2b7ebe1111c0deefbf9a61d17bf9d2dbe951adb585db96f9d89663ce5909d"},"/Users/isaacs/dev/js/tar/lib/entry-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}},"1":{"start":{"line":3,"column":10},"end":{"line":3,"column":30}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":38}},"3":{"start":{"line":5,"column":12},"end":{"line":5,"column":33}},"4":{"start":{"line":6,"column":15},"end":{"line":6,"column":34}},"5":{"start":{"line":7,"column":18},"end":{"line":7,"column":41}},"6":{"start":{"line":9,"column":13},"end":{"line":9,"column":37}},"7":{"start":{"line":10,"column":10},"end":{"line":10,"column":12}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":29}},"9":{"start":{"line":15,"column":11},"end":{"line":15,"column":15}},"10":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"11":{"start":{"line":18,"column":4},"end":{"line":18,"column":33}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":20}},"13":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"14":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":35}},"16":{"start":{"line":28,"column":2},"end":{"line":30,"column":4}},"17":{"start":{"line":29,"column":4},"end":{"line":29,"column":22}},"18":{"start":{"line":32,"column":2},"end":{"line":34,"column":4}},"19":{"start":{"line":33,"column":4},"end":{"line":33,"column":20}},"20":{"start":{"line":36,"column":2},"end":{"line":39,"column":4}},"21":{"start":{"line":37,"column":4},"end":{"line":37,"column":18}},"22":{"start":{"line":38,"column":4},"end":{"line":38,"column":20}},"23":{"start":{"line":41,"column":2},"end":{"line":41,"column":18}},"24":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"25":{"start":{"line":43,"column":4},"end":{"line":43,"column":18}},"26":{"start":{"line":45,"column":2},"end":{"line":45,"column":25}},"27":{"start":{"line":46,"column":2},"end":{"line":46,"column":23}},"28":{"start":{"line":47,"column":2},"end":{"line":47,"column":22}},"29":{"start":{"line":49,"column":2},"end":{"line":49,"column":17}},"30":{"start":{"line":50,"column":2},"end":{"line":50,"column":23}},"31":{"start":{"line":51,"column":2},"end":{"line":51,"column":18}},"32":{"start":{"line":53,"column":2},"end":{"line":55,"column":4}},"33":{"start":{"line":54,"column":4},"end":{"line":54,"column":17}},"34":{"start":{"line":58,"column":0},"end":{"line":65,"column":1}},"35":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"36":{"start":{"line":60,"column":19},"end":{"line":60,"column":74}},"37":{"start":{"line":61,"column":2},"end":{"line":61,"column":22}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":17}},"39":{"start":{"line":63,"column":2},"end":{"line":63,"column":43}},"40":{"start":{"line":64,"column":2},"end":{"line":64,"column":25}},"41":{"start":{"line":67,"column":0},"end":{"line":74,"column":1}},"42":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"43":{"start":{"line":69,"column":9},"end":{"line":69,"column":29}},"44":{"start":{"line":70,"column":2},"end":{"line":70,"column":24}},"45":{"start":{"line":71,"column":2},"end":{"line":71,"column":20}},"46":{"start":{"line":72,"column":2},"end":{"line":72,"column":17}},"47":{"start":{"line":73,"column":2},"end":{"line":73,"column":43}},"48":{"start":{"line":76,"column":0},"end":{"line":80,"column":1}},"49":{"start":{"line":78,"column":2},"end":{"line":78,"column":21}},"50":{"start":{"line":79,"column":2},"end":{"line":79,"column":20}},"51":{"start":{"line":82,"column":0},"end":{"line":87,"column":1}},"52":{"start":{"line":84,"column":2},"end":{"line":84,"column":22}},"53":{"start":{"line":85,"column":2},"end":{"line":85,"column":21}},"54":{"start":{"line":86,"column":2},"end":{"line":86,"column":17}},"55":{"start":{"line":89,"column":0},"end":{"line":98,"column":1}},"56":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"57":{"start":{"line":91,"column":20},"end":{"line":91,"column":69}},"58":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"59":{"start":{"line":95,"column":20},"end":{"line":95,"column":30}},"60":{"start":{"line":97,"column":2},"end":{"line":97,"column":31}},"61":{"start":{"line":100,"column":0},"end":{"line":126,"column":1}},"62":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"63":{"start":{"line":102,"column":23},"end":{"line":102,"column":29}},"64":{"start":{"line":103,"column":2},"end":{"line":103,"column":24}},"65":{"start":{"line":105,"column":20},"end":{"line":105,"column":48}},"66":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"67":{"start":{"line":108,"column":13},"end":{"line":108,"column":17}},"68":{"start":{"line":110,"column":4},"end":{"line":111,"column":44}},"69":{"start":{"line":113,"column":4},"end":{"line":120,"column":12}},"70":{"start":{"line":115,"column":8},"end":{"line":115,"column":26}},"71":{"start":{"line":118,"column":8},"end":{"line":118,"column":28}},"72":{"start":{"line":124,"column":2},"end":{"line":124,"column":32}},"73":{"start":{"line":125,"column":2},"end":{"line":125,"column":21}},"74":{"start":{"line":128,"column":0},"end":{"line":167,"column":1}},"75":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"76":{"start":{"line":131,"column":4},"end":{"line":131,"column":18}},"77":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"78":{"start":{"line":136,"column":4},"end":{"line":136,"column":10}},"79":{"start":{"line":139,"column":2},"end":{"line":139,"column":25}},"80":{"start":{"line":141,"column":12},"end":{"line":141,"column":24}},"81":{"start":{"line":142,"column":2},"end":{"line":159,"column":3}},"82":{"start":{"line":142,"column":15},"end":{"line":142,"column":16}},"83":{"start":{"line":145,"column":12},"end":{"line":145,"column":18}},"84":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"85":{"start":{"line":147,"column":19},"end":{"line":147,"column":37}},"86":{"start":{"line":148,"column":9},"end":{"line":148,"column":30}},"87":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"88":{"start":{"line":152,"column":6},"end":{"line":152,"column":30}},"89":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"90":{"start":{"line":154,"column":8},"end":{"line":154,"column":30}},"91":{"start":{"line":155,"column":8},"end":{"line":155,"column":39}},"92":{"start":{"line":157,"column":6},"end":{"line":157,"column":12}},"93":{"start":{"line":162,"column":2},"end":{"line":162,"column":25}},"94":{"start":{"line":163,"column":2},"end":{"line":163,"column":26}},"95":{"start":{"line":166,"column":2},"end":{"line":166,"column":20}},"96":{"start":{"line":169,"column":0},"end":{"line":169,"column":46}}},"fnMap":{"0":{"name":"EntryWriter","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":20}},"loc":{"start":{"line":14,"column":29},"end":{"line":56,"column":1}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":25}},"loc":{"start":{"line":28,"column":37},"end":{"line":30,"column":3}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":25},"end":{"line":32,"column":26}},"loc":{"start":{"line":32,"column":37},"end":{"line":34,"column":3}},"line":32},"3":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":23},"end":{"line":36,"column":24}},"loc":{"start":{"line":36,"column":35},"end":{"line":39,"column":3}},"line":36},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":28},"end":{"line":55,"column":3}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":30},"end":{"line":58,"column":31}},"loc":{"start":{"line":58,"column":43},"end":{"line":65,"column":1}},"line":58},"6":{"name":"(anonymous_6)","decl":{"start":{"line":67,"column":28},"end":{"line":67,"column":29}},"loc":{"start":{"line":67,"column":41},"end":{"line":74,"column":1}},"line":67},"7":{"name":"(anonymous_7)","decl":{"start":{"line":76,"column":30},"end":{"line":76,"column":31}},"loc":{"start":{"line":76,"column":42},"end":{"line":80,"column":1}},"line":76},"8":{"name":"(anonymous_8)","decl":{"start":{"line":82,"column":31},"end":{"line":82,"column":32}},"loc":{"start":{"line":82,"column":43},"end":{"line":87,"column":1}},"line":82},"9":{"name":"(anonymous_9)","decl":{"start":{"line":89,"column":28},"end":{"line":89,"column":29}},"loc":{"start":{"line":89,"column":45},"end":{"line":98,"column":1}},"line":89},"10":{"name":"(anonymous_10)","decl":{"start":{"line":100,"column":32},"end":{"line":100,"column":33}},"loc":{"start":{"line":100,"column":44},"end":{"line":126,"column":1}},"line":100},"11":{"name":"(anonymous_11)","decl":{"start":{"line":114,"column":18},"end":{"line":114,"column":19}},"loc":{"start":{"line":114,"column":31},"end":{"line":116,"column":7}},"line":114},"12":{"name":"(anonymous_12)","decl":{"start":{"line":117,"column":19},"end":{"line":117,"column":20}},"loc":{"start":{"line":117,"column":33},"end":{"line":119,"column":7}},"line":117},"13":{"name":"(anonymous_13)","decl":{"start":{"line":128,"column":33},"end":{"line":128,"column":34}},"loc":{"start":{"line":128,"column":45},"end":{"line":167,"column":1}},"line":128},"14":{"name":"(anonymous_14)","decl":{"start":{"line":169,"column":32},"end":{"line":169,"column":33}},"loc":{"start":{"line":169,"column":44},"end":{"line":169,"column":46}},"line":169}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"1":{"loc":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},{"start":{"line":42,"column":2},"end":{"line":44,"column":3}}],"line":42},"2":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},{"start":{"line":60,"column":2},"end":{"line":60,"column":74}}],"line":60},"3":{"loc":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},{"start":{"line":69,"column":2},"end":{"line":69,"column":29}}],"line":69},"4":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},{"start":{"line":91,"column":2},"end":{"line":91,"column":69}}],"line":91},"5":{"loc":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},{"start":{"line":95,"column":2},"end":{"line":95,"column":30}}],"line":95},"6":{"loc":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"type":"if","locations":[{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},{"start":{"line":102,"column":2},"end":{"line":102,"column":29}}],"line":102},"7":{"loc":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},{"start":{"line":107,"column":2},"end":{"line":121,"column":3}}],"line":107},"8":{"loc":{"start":{"line":107,"column":6},"end":{"line":107,"column":44}},"type":"binary-expr","locations":[{"start":{"line":107,"column":6},"end":{"line":107,"column":29}},{"start":{"line":107,"column":33},"end":{"line":107,"column":44}}],"line":107},"9":{"loc":{"start":{"line":110,"column":27},"end":{"line":111,"column":44}},"type":"binary-expr","locations":[{"start":{"line":110,"column":27},"end":{"line":110,"column":47}},{"start":{"line":111,"column":6},"end":{"line":111,"column":44}}],"line":110},"10":{"loc":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},{"start":{"line":130,"column":2},"end":{"line":132,"column":3}}],"line":130},"11":{"loc":{"start":{"line":130,"column":6},"end":{"line":130,"column":37}},"type":"binary-expr","locations":[{"start":{"line":130,"column":6},"end":{"line":130,"column":22}},{"start":{"line":130,"column":26},"end":{"line":130,"column":37}}],"line":130},"12":{"loc":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"type":"if","locations":[{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},{"start":{"line":134,"column":2},"end":{"line":137,"column":3}}],"line":134},"13":{"loc":{"start":{"line":134,"column":6},"end":{"line":134,"column":38}},"type":"binary-expr","locations":[{"start":{"line":134,"column":6},"end":{"line":134,"column":18}},{"start":{"line":134,"column":22},"end":{"line":134,"column":38}}],"line":134},"14":{"loc":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"type":"if","locations":[{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},{"start":{"line":147,"column":4},"end":{"line":148,"column":30}}],"line":147},"15":{"loc":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},{"start":{"line":150,"column":4},"end":{"line":158,"column":5}}],"line":150},"16":{"loc":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"type":"if","locations":[{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},{"start":{"line":153,"column":6},"end":{"line":156,"column":7}}],"line":153}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":1,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":1,"49":0,"50":0,"51":1,"52":0,"53":0,"54":0,"55":1,"56":0,"57":0,"58":0,"59":0,"60":0,"61":1,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":1,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3e169418508e031df78186ff63b5fa5aa2484ab8","contentHash":"84191ed4732b6763ae8701256051735aebbe5e95c932c15bef34da01b33ba1a0"},"/Users/isaacs/dev/js/tar/lib/entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry.js","statementMap":{"0":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"1":{"start":{"line":9,"column":16},"end":{"line":9,"column":38}},"2":{"start":{"line":10,"column":10},"end":{"line":10,"column":27}},"3":{"start":{"line":11,"column":13},"end":{"line":11,"column":33}},"4":{"start":{"line":12,"column":13},"end":{"line":12,"column":37}},"5":{"start":{"line":13,"column":15},"end":{"line":13,"column":34}},"6":{"start":{"line":14,"column":14},"end":{"line":14,"column":41}},"7":{"start":{"line":17,"column":2},"end":{"line":17,"column":19}},"8":{"start":{"line":18,"column":2},"end":{"line":18,"column":22}},"9":{"start":{"line":19,"column":2},"end":{"line":19,"column":22}},"10":{"start":{"line":21,"column":2},"end":{"line":21,"column":25}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":22}},"12":{"start":{"line":23,"column":2},"end":{"line":23,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":22}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":21}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":21}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":21}},"17":{"start":{"line":28,"column":2},"end":{"line":28,"column":18}},"18":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"19":{"start":{"line":30,"column":2},"end":{"line":30,"column":20}},"20":{"start":{"line":32,"column":2},"end":{"line":32,"column":36}},"21":{"start":{"line":34,"column":2},"end":{"line":34,"column":17}},"22":{"start":{"line":35,"column":2},"end":{"line":35,"column":23}},"23":{"start":{"line":36,"column":2},"end":{"line":36,"column":33}},"24":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"25":{"start":{"line":41,"column":11},"end":{"line":41,"column":15}},"26":{"start":{"line":42,"column":2},"end":{"line":44,"column":4}},"27":{"start":{"line":43,"column":4},"end":{"line":43,"column":29}},"28":{"start":{"line":46,"column":2},"end":{"line":46,"column":18}},"29":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"30":{"start":{"line":51,"column":0},"end":{"line":78,"column":1}},"31":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"32":{"start":{"line":52,"column":20},"end":{"line":52,"column":65}},"33":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"34":{"start":{"line":54,"column":4},"end":{"line":54,"column":40}},"35":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"36":{"start":{"line":60,"column":4},"end":{"line":60,"column":35}},"37":{"start":{"line":62,"column":2},"end":{"line":62,"column":29}},"38":{"start":{"line":65,"column":11},"end":{"line":65,"column":25}},"39":{"start":{"line":66,"column":2},"end":{"line":66,"column":21}},"40":{"start":{"line":67,"column":2},"end":{"line":67,"column":19}},"41":{"start":{"line":69,"column":2},"end":{"line":69,"column":14}},"42":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"43":{"start":{"line":73,"column":4},"end":{"line":73,"column":26}},"44":{"start":{"line":74,"column":4},"end":{"line":74,"column":16}},"45":{"start":{"line":77,"column":2},"end":{"line":77,"column":13}},"46":{"start":{"line":80,"column":0},"end":{"line":84,"column":1}},"47":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"48":{"start":{"line":81,"column":9},"end":{"line":81,"column":22}},"49":{"start":{"line":82,"column":2},"end":{"line":82,"column":21}},"50":{"start":{"line":83,"column":2},"end":{"line":83,"column":14}},"51":{"start":{"line":86,"column":0},"end":{"line":89,"column":1}},"52":{"start":{"line":87,"column":2},"end":{"line":87,"column":21}},"53":{"start":{"line":88,"column":2},"end":{"line":88,"column":20}},"54":{"start":{"line":91,"column":0},"end":{"line":97,"column":1}},"55":{"start":{"line":93,"column":2},"end":{"line":93,"column":21}},"56":{"start":{"line":94,"column":2},"end":{"line":94,"column":22}},"57":{"start":{"line":95,"column":2},"end":{"line":95,"column":14}},"58":{"start":{"line":96,"column":2},"end":{"line":96,"column":41}},"59":{"start":{"line":100,"column":0},"end":{"line":139,"column":1}},"60":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"61":{"start":{"line":103,"column":52},"end":{"line":103,"column":58}},"62":{"start":{"line":107,"column":2},"end":{"line":107,"column":22}},"63":{"start":{"line":110,"column":2},"end":{"line":113,"column":3}},"64":{"start":{"line":111,"column":16},"end":{"line":111,"column":43}},"65":{"start":{"line":112,"column":4},"end":{"line":112,"column":28}},"66":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"67":{"start":{"line":117,"column":4},"end":{"line":117,"column":57}},"68":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"69":{"start":{"line":119,"column":6},"end":{"line":119,"column":29}},"70":{"start":{"line":120,"column":6},"end":{"line":120,"column":24}},"71":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"72":{"start":{"line":123,"column":6},"end":{"line":123,"column":24}},"73":{"start":{"line":124,"column":6},"end":{"line":124,"column":22}},"74":{"start":{"line":130,"column":12},"end":{"line":130,"column":29}},"75":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"76":{"start":{"line":132,"column":4},"end":{"line":132,"column":36}},"77":{"start":{"line":133,"column":4},"end":{"line":133,"column":22}},"78":{"start":{"line":134,"column":4},"end":{"line":134,"column":25}},"79":{"start":{"line":135,"column":4},"end":{"line":135,"column":40}},"80":{"start":{"line":138,"column":2},"end":{"line":138,"column":23}},"81":{"start":{"line":141,"column":0},"end":{"line":211,"column":1}},"82":{"start":{"line":143,"column":15},"end":{"line":143,"column":27}},"83":{"start":{"line":144,"column":17},"end":{"line":144,"column":31}},"84":{"start":{"line":145,"column":15},"end":{"line":145,"column":27}},"85":{"start":{"line":146,"column":14},"end":{"line":146,"column":24}},"86":{"start":{"line":149,"column":15},"end":{"line":149,"column":25}},"87":{"start":{"line":150,"column":2},"end":{"line":154,"column":3}},"88":{"start":{"line":150,"column":15},"end":{"line":150,"column":16}},"89":{"start":{"line":151,"column":16},"end":{"line":151,"column":25}},"90":{"start":{"line":152,"column":14},"end":{"line":152,"column":27}},"91":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"92":{"start":{"line":153,"column":36},"end":{"line":153,"column":54}},"93":{"start":{"line":158,"column":3},"end":{"line":165,"column":3}},"94":{"start":{"line":159,"column":4},"end":{"line":161,"column":6}},"95":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"96":{"start":{"line":160,"column":39},"end":{"line":160,"column":54}},"97":{"start":{"line":165,"column":3},"end":{"line":173,"column":3}},"98":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"99":{"start":{"line":167,"column":6},"end":{"line":167,"column":40}},"100":{"start":{"line":173,"column":3},"end":{"line":177,"column":4}},"101":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"102":{"start":{"line":175,"column":6},"end":{"line":175,"column":42}},"103":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"104":{"start":{"line":184,"column":6},"end":{"line":184,"column":19}},"105":{"start":{"line":185,"column":6},"end":{"line":185,"column":11}},"106":{"start":{"line":188,"column":6},"end":{"line":188,"column":24}},"107":{"start":{"line":189,"column":6},"end":{"line":189,"column":11}},"108":{"start":{"line":192,"column":6},"end":{"line":192,"column":22}},"109":{"start":{"line":193,"column":6},"end":{"line":193,"column":11}},"110":{"start":{"line":202,"column":6},"end":{"line":202,"column":34}},"111":{"start":{"line":205,"column":2},"end":{"line":205,"column":18}},"112":{"start":{"line":206,"column":2},"end":{"line":206,"column":24}},"113":{"start":{"line":207,"column":2},"end":{"line":207,"column":24}},"114":{"start":{"line":210,"column":2},"end":{"line":210,"column":30}},"115":{"start":{"line":215,"column":0},"end":{"line":217,"column":1}},"116":{"start":{"line":216,"column":2},"end":{"line":216,"column":20}},"117":{"start":{"line":219,"column":0},"end":{"line":219,"column":35}},"118":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}}},"fnMap":{"0":{"name":"Entry","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":14}},"loc":{"start":{"line":16,"column":42},"end":{"line":47,"column":1}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":36},"end":{"line":42,"column":37}},"loc":{"start":{"line":42,"column":49},"end":{"line":44,"column":3}},"line":42},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":24},"end":{"line":51,"column":25}},"loc":{"start":{"line":51,"column":37},"end":{"line":78,"column":1}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":80,"column":22},"end":{"line":80,"column":23}},"loc":{"start":{"line":80,"column":35},"end":{"line":84,"column":1}},"line":80},"4":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":24},"end":{"line":86,"column":25}},"loc":{"start":{"line":86,"column":36},"end":{"line":89,"column":1}},"line":86},"5":{"name":"(anonymous_5)","decl":{"start":{"line":91,"column":25},"end":{"line":91,"column":26}},"loc":{"start":{"line":91,"column":37},"end":{"line":97,"column":1}},"line":91},"6":{"name":"(anonymous_6)","decl":{"start":{"line":100,"column":24},"end":{"line":100,"column":25}},"loc":{"start":{"line":100,"column":36},"end":{"line":139,"column":1}},"line":100},"7":{"name":"(anonymous_7)","decl":{"start":{"line":141,"column":28},"end":{"line":141,"column":29}},"loc":{"start":{"line":141,"column":40},"end":{"line":211,"column":1}},"line":141},"8":{"name":"(anonymous_8)","decl":{"start":{"line":158,"column":30},"end":{"line":158,"column":31}},"loc":{"start":{"line":158,"column":43},"end":{"line":162,"column":3}},"line":158},"9":{"name":"(anonymous_9)","decl":{"start":{"line":159,"column":27},"end":{"line":159,"column":28}},"loc":{"start":{"line":159,"column":40},"end":{"line":161,"column":5}},"line":159},"10":{"name":"(anonymous_10)","decl":{"start":{"line":165,"column":32},"end":{"line":165,"column":33}},"loc":{"start":{"line":165,"column":45},"end":{"line":169,"column":3}},"line":165},"11":{"name":"(anonymous_11)","decl":{"start":{"line":173,"column":39},"end":{"line":173,"column":40}},"loc":{"start":{"line":173,"column":52},"end":{"line":177,"column":3}},"line":173},"12":{"name":"(anonymous_12)","decl":{"start":{"line":215,"column":24},"end":{"line":215,"column":25}},"loc":{"start":{"line":215,"column":34},"end":{"line":217,"column":1}},"line":215}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":19},"end":{"line":36,"column":33}},"type":"binary-expr","locations":[{"start":{"line":36,"column":19},"end":{"line":36,"column":27}},{"start":{"line":36,"column":31},"end":{"line":36,"column":33}}],"line":36},"1":{"loc":{"start":{"line":42,"column":14},"end":{"line":42,"column":26}},"type":"binary-expr","locations":[{"start":{"line":42,"column":14},"end":{"line":42,"column":20}},{"start":{"line":42,"column":24},"end":{"line":42,"column":26}}],"line":42},"2":{"loc":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},{"start":{"line":52,"column":2},"end":{"line":52,"column":65}}],"line":52},"3":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},{"start":{"line":53,"column":2},"end":{"line":55,"column":3}}],"line":53},"4":{"loc":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},{"start":{"line":59,"column":2},"end":{"line":61,"column":3}}],"line":59},"5":{"loc":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},{"start":{"line":72,"column":2},"end":{"line":75,"column":3}}],"line":72},"6":{"loc":{"start":{"line":72,"column":6},"end":{"line":72,"column":28}},"type":"binary-expr","locations":[{"start":{"line":72,"column":6},"end":{"line":72,"column":18}},{"start":{"line":72,"column":22},"end":{"line":72,"column":28}}],"line":72},"7":{"loc":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},{"start":{"line":81,"column":2},"end":{"line":81,"column":22}}],"line":81},"8":{"loc":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},{"start":{"line":103,"column":2},"end":{"line":103,"column":58}}],"line":103},"9":{"loc":{"start":{"line":103,"column":6},"end":{"line":103,"column":50}},"type":"binary-expr","locations":[{"start":{"line":103,"column":6},"end":{"line":103,"column":18}},{"start":{"line":103,"column":22},"end":{"line":103,"column":35}},{"start":{"line":103,"column":39},"end":{"line":103,"column":50}}],"line":103},"10":{"loc":{"start":{"line":110,"column":9},"end":{"line":110,"column":54}},"type":"binary-expr","locations":[{"start":{"line":110,"column":9},"end":{"line":110,"column":37}},{"start":{"line":110,"column":41},"end":{"line":110,"column":54}}],"line":110},"11":{"loc":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},{"start":{"line":116,"column":2},"end":{"line":126,"column":3}}],"line":116},"12":{"loc":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},{"start":{"line":118,"column":4},"end":{"line":121,"column":5}}],"line":118},"13":{"loc":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"type":"if","locations":[{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},{"start":{"line":122,"column":4},"end":{"line":125,"column":5}}],"line":122},"14":{"loc":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},{"start":{"line":131,"column":2},"end":{"line":136,"column":3}}],"line":131},"15":{"loc":{"start":{"line":131,"column":6},"end":{"line":131,"column":45}},"type":"binary-expr","locations":[{"start":{"line":131,"column":6},"end":{"line":131,"column":26}},{"start":{"line":131,"column":30},"end":{"line":131,"column":45}}],"line":131},"16":{"loc":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"type":"if","locations":[{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},{"start":{"line":153,"column":4},"end":{"line":153,"column":54}}],"line":153},"17":{"loc":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"type":"if","locations":[{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},{"start":{"line":160,"column":6},"end":{"line":160,"column":54}}],"line":160},"18":{"loc":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"type":"if","locations":[{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},{"start":{"line":166,"column":4},"end":{"line":168,"column":5}}],"line":166},"19":{"loc":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"type":"if","locations":[{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},{"start":{"line":174,"column":4},"end":{"line":176,"column":5}}],"line":174},"20":{"loc":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"type":"switch","locations":[{"start":{"line":182,"column":4},"end":{"line":182,"column":19}},{"start":{"line":183,"column":4},"end":{"line":185,"column":11}},{"start":{"line":187,"column":4},"end":{"line":189,"column":11}},{"start":{"line":191,"column":4},"end":{"line":193,"column":11}},{"start":{"line":195,"column":4},"end":{"line":195,"column":16}},{"start":{"line":196,"column":4},"end":{"line":196,"column":24}},{"start":{"line":197,"column":4},"end":{"line":197,"column":27}},{"start":{"line":198,"column":4},"end":{"line":198,"column":23}},{"start":{"line":199,"column":4},"end":{"line":199,"column":21}},{"start":{"line":200,"column":4},"end":{"line":200,"column":16}},{"start":{"line":201,"column":4},"end":{"line":202,"column":34}}],"line":181}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":3,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":3,"15":3,"16":3,"17":3,"18":3,"19":3,"20":3,"21":3,"22":3,"23":3,"24":3,"25":3,"26":3,"27":0,"28":3,"29":1,"30":1,"31":8,"32":0,"33":8,"34":0,"35":8,"36":2,"37":8,"38":8,"39":8,"40":8,"41":8,"42":8,"43":8,"44":8,"45":0,"46":1,"47":2,"48":0,"49":2,"50":2,"51":1,"52":3,"53":3,"54":1,"55":7,"56":7,"57":7,"58":7,"59":1,"60":17,"61":12,"62":5,"63":5,"64":8,"65":8,"66":5,"67":5,"68":5,"69":3,"70":3,"71":5,"72":2,"73":2,"74":5,"75":5,"76":0,"77":0,"78":0,"79":0,"80":5,"81":1,"82":3,"83":3,"84":3,"85":3,"86":3,"87":3,"88":3,"89":51,"90":51,"91":51,"92":48,"93":3,"94":6,"95":0,"96":0,"97":3,"98":6,"99":6,"100":3,"101":9,"102":3,"103":3,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":3,"111":3,"112":3,"113":3,"114":3,"115":1,"116":0,"117":1,"118":1},"f":{"0":3,"1":0,"2":8,"3":2,"4":3,"5":7,"6":17,"7":3,"8":6,"9":0,"10":6,"11":9,"12":0},"b":{"0":[3,3],"1":[3,3],"2":[0,8],"3":[0,8],"4":[2,6],"5":[8,0],"6":[8,0],"7":[0,2],"8":[12,5],"9":[17,7,7],"10":[13,8],"11":[5,0],"12":[3,2],"13":[2,3],"14":[0,5],"15":[5,0],"16":[48,3],"17":[0,0],"18":[6,0],"19":[3,6],"20":[0,0,0,0,0,0,0,0,0,0,3]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"2cc4f925db2a60e89bf0743124faec4e8996dfdb","contentHash":"245d5cb2b23d975dc5b9a0ed2553c93c587727d50a7961242f50cec333c04ba9"},"/Users/isaacs/dev/js/tar/lib/global-header-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/global-header-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"1":{"start":{"line":3,"column":27},"end":{"line":3,"column":65}},"2":{"start":{"line":4,"column":15},"end":{"line":4,"column":34}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":50}},"4":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":40}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":40}},"7":{"start":{"line":13,"column":2},"end":{"line":13,"column":23}}},"fnMap":{"0":{"name":"GlobalHeaderWriter","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":27}},"loc":{"start":{"line":8,"column":36},"end":{"line":14,"column":1}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},{"start":{"line":9,"column":2},"end":{"line":11,"column":3}}],"line":9}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0},"f":{"0":0},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3d0c8589f62a5c8ccec606d52d3abd98e5627d57","contentHash":"a2570ca840cf3e44d77e15af0aee52f7c145da39b76366006f3672b9708def3e"},"/Users/isaacs/dev/js/tar/lib/parse.js":{"path":"/Users/isaacs/dev/js/tar/lib/parse.js","statementMap":{"0":{"start":{"line":6,"column":0},"end":{"line":6,"column":37}},"1":{"start":{"line":8,"column":13},"end":{"line":8,"column":30}},"2":{"start":{"line":9,"column":13},"end":{"line":9,"column":26}},"3":{"start":{"line":10,"column":18},"end":{"line":10,"column":41}},"4":{"start":{"line":11,"column":10},"end":{"line":11,"column":30}},"5":{"start":{"line":12,"column":16},"end":{"line":12,"column":38}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":46}},"8":{"start":{"line":15,"column":21},"end":{"line":15,"column":52}},"9":{"start":{"line":16,"column":13},"end":{"line":16,"column":33}},"10":{"start":{"line":17,"column":15},"end":{"line":17,"column":34}},"11":{"start":{"line":18,"column":14},"end":{"line":18,"column":32}},"12":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"13":{"start":{"line":28,"column":11},"end":{"line":28,"column":15}},"14":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"15":{"start":{"line":29,"column":30},"end":{"line":29,"column":48}},"16":{"start":{"line":34,"column":2},"end":{"line":34,"column":18}},"17":{"start":{"line":36,"column":2},"end":{"line":36,"column":20}},"18":{"start":{"line":37,"column":2},"end":{"line":37,"column":20}},"19":{"start":{"line":38,"column":2},"end":{"line":38,"column":35}},"20":{"start":{"line":39,"column":2},"end":{"line":39,"column":17}},"21":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"22":{"start":{"line":41,"column":2},"end":{"line":41,"column":20}},"23":{"start":{"line":43,"column":2},"end":{"line":45,"column":4}},"24":{"start":{"line":44,"column":4},"end":{"line":44,"column":23}},"25":{"start":{"line":47,"column":2},"end":{"line":49,"column":4}},"26":{"start":{"line":48,"column":4},"end":{"line":48,"column":18}},"27":{"start":{"line":51,"column":2},"end":{"line":53,"column":4}},"28":{"start":{"line":52,"column":4},"end":{"line":52,"column":19}},"29":{"start":{"line":55,"column":2},"end":{"line":57,"column":4}},"30":{"start":{"line":56,"column":4},"end":{"line":56,"column":20}},"31":{"start":{"line":63,"column":0},"end":{"line":67,"column":1}},"32":{"start":{"line":64,"column":11},"end":{"line":64,"column":15}},"33":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"34":{"start":{"line":65,"column":31},"end":{"line":65,"column":57}},"35":{"start":{"line":66,"column":2},"end":{"line":66,"column":16}},"36":{"start":{"line":72,"column":0},"end":{"line":83,"column":1}},"37":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"38":{"start":{"line":77,"column":4},"end":{"line":79,"column":5}},"39":{"start":{"line":77,"column":17},"end":{"line":77,"column":18}},"40":{"start":{"line":77,"column":24},"end":{"line":77,"column":32}},"41":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"42":{"start":{"line":78,"column":22},"end":{"line":78,"column":62}},"43":{"start":{"line":80,"column":4},"end":{"line":80,"column":10}},"44":{"start":{"line":82,"column":2},"end":{"line":82,"column":30}},"45":{"start":{"line":85,"column":0},"end":{"line":88,"column":1}},"46":{"start":{"line":86,"column":2},"end":{"line":86,"column":20}},"47":{"start":{"line":87,"column":2},"end":{"line":87,"column":28}},"48":{"start":{"line":94,"column":0},"end":{"line":94,"column":38}},"49":{"start":{"line":96,"column":0},"end":{"line":137,"column":1}},"50":{"start":{"line":97,"column":2},"end":{"line":97,"column":59}},"51":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"52":{"start":{"line":105,"column":16},"end":{"line":105,"column":27}},"53":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"54":{"start":{"line":106,"column":22},"end":{"line":106,"column":36}},"55":{"start":{"line":108,"column":6},"end":{"line":108,"column":34}},"56":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"57":{"start":{"line":109,"column":31},"end":{"line":109,"column":51}},"58":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"59":{"start":{"line":112,"column":6},"end":{"line":112,"column":17}},"60":{"start":{"line":113,"column":6},"end":{"line":113,"column":24}},"61":{"start":{"line":117,"column":15},"end":{"line":117,"column":19}},"62":{"start":{"line":118,"column":4},"end":{"line":120,"column":5}},"63":{"start":{"line":118,"column":17},"end":{"line":118,"column":18}},"64":{"start":{"line":119,"column":6},"end":{"line":119,"column":23}},"65":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"66":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"67":{"start":{"line":128,"column":8},"end":{"line":128,"column":26}},"68":{"start":{"line":129,"column":6},"end":{"line":129,"column":29}},"69":{"start":{"line":131,"column":6},"end":{"line":131,"column":30}},"70":{"start":{"line":132,"column":6},"end":{"line":132,"column":25}},"71":{"start":{"line":136,"column":2},"end":{"line":136,"column":22}},"72":{"start":{"line":140,"column":0},"end":{"line":285,"column":1}},"73":{"start":{"line":141,"column":15},"end":{"line":141,"column":31}},"74":{"start":{"line":142,"column":13},"end":{"line":142,"column":17}},"75":{"start":{"line":147,"column":13},"end":{"line":147,"column":18}},"76":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"77":{"start":{"line":150,"column":12},"end":{"line":150,"column":41}},"78":{"start":{"line":151,"column":4},"end":{"line":151,"column":21}},"79":{"start":{"line":152,"column":4},"end":{"line":152,"column":37}},"80":{"start":{"line":153,"column":4},"end":{"line":153,"column":37}},"81":{"start":{"line":154,"column":4},"end":{"line":154,"column":32}},"82":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"83":{"start":{"line":171,"column":6},"end":{"line":171,"column":23}},"84":{"start":{"line":172,"column":6},"end":{"line":172,"column":18}},"85":{"start":{"line":173,"column":6},"end":{"line":173,"column":11}},"86":{"start":{"line":177,"column":6},"end":{"line":177,"column":32}},"87":{"start":{"line":178,"column":6},"end":{"line":183,"column":7}},"88":{"start":{"line":179,"column":8},"end":{"line":179,"column":41}},"89":{"start":{"line":180,"column":8},"end":{"line":182,"column":10}},"90":{"start":{"line":181,"column":10},"end":{"line":181,"column":43}},"91":{"start":{"line":184,"column":6},"end":{"line":184,"column":33}},"92":{"start":{"line":185,"column":6},"end":{"line":185,"column":17}},"93":{"start":{"line":186,"column":6},"end":{"line":186,"column":11}},"94":{"start":{"line":191,"column":6},"end":{"line":191,"column":32}},"95":{"start":{"line":192,"column":6},"end":{"line":194,"column":7}},"96":{"start":{"line":193,"column":8},"end":{"line":193,"column":37}},"97":{"start":{"line":195,"column":6},"end":{"line":195,"column":27}},"98":{"start":{"line":196,"column":6},"end":{"line":196,"column":17}},"99":{"start":{"line":197,"column":6},"end":{"line":197,"column":11}},"100":{"start":{"line":201,"column":6},"end":{"line":201,"column":29}},"101":{"start":{"line":202,"column":6},"end":{"line":205,"column":7}},"102":{"start":{"line":203,"column":8},"end":{"line":203,"column":45}},"103":{"start":{"line":204,"column":8},"end":{"line":204,"column":44}},"104":{"start":{"line":206,"column":6},"end":{"line":206,"column":25}},"105":{"start":{"line":207,"column":6},"end":{"line":207,"column":17}},"106":{"start":{"line":208,"column":6},"end":{"line":208,"column":11}},"107":{"start":{"line":213,"column":6},"end":{"line":213,"column":29}},"108":{"start":{"line":214,"column":6},"end":{"line":217,"column":7}},"109":{"start":{"line":215,"column":8},"end":{"line":215,"column":45}},"110":{"start":{"line":216,"column":8},"end":{"line":216,"column":40}},"111":{"start":{"line":218,"column":6},"end":{"line":218,"column":21}},"112":{"start":{"line":219,"column":6},"end":{"line":219,"column":17}},"113":{"start":{"line":220,"column":6},"end":{"line":220,"column":11}},"114":{"start":{"line":226,"column":6},"end":{"line":226,"column":23}},"115":{"start":{"line":227,"column":6},"end":{"line":227,"column":25}},"116":{"start":{"line":228,"column":6},"end":{"line":228,"column":11}},"117":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"118":{"start":{"line":233,"column":4},"end":{"line":233,"column":28}},"119":{"start":{"line":235,"column":17},"end":{"line":235,"column":29}},"120":{"start":{"line":236,"column":19},"end":{"line":236,"column":33}},"121":{"start":{"line":240,"column":4},"end":{"line":240,"column":25}},"122":{"start":{"line":242,"column":2},"end":{"line":242,"column":49}},"123":{"start":{"line":243,"column":2},"end":{"line":243,"column":19}},"124":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"125":{"start":{"line":247,"column":4},"end":{"line":249,"column":6}},"126":{"start":{"line":248,"column":6},"end":{"line":248,"column":24}},"127":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"128":{"start":{"line":252,"column":13},"end":{"line":252,"column":35}},"129":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"130":{"start":{"line":255,"column":4},"end":{"line":255,"column":23}},"131":{"start":{"line":258,"column":2},"end":{"line":258,"column":21}},"132":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"133":{"start":{"line":261,"column":4},"end":{"line":261,"column":39}},"134":{"start":{"line":264,"column":11},"end":{"line":264,"column":15}},"135":{"start":{"line":266,"column":2},"end":{"line":268,"column":4}},"136":{"start":{"line":267,"column":4},"end":{"line":267,"column":14}},"137":{"start":{"line":270,"column":2},"end":{"line":272,"column":4}},"138":{"start":{"line":271,"column":4},"end":{"line":271,"column":15}},"139":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"140":{"start":{"line":275,"column":4},"end":{"line":275,"column":29}},"141":{"start":{"line":278,"column":2},"end":{"line":278,"column":22}},"142":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"143":{"start":{"line":282,"column":4},"end":{"line":282,"column":15}},"144":{"start":{"line":283,"column":4},"end":{"line":283,"column":22}}},"fnMap":{"0":{"name":"Parse","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":14}},"loc":{"start":{"line":27,"column":18},"end":{"line":58,"column":1}},"line":27},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":25},"end":{"line":43,"column":26}},"loc":{"start":{"line":43,"column":38},"end":{"line":45,"column":3}},"line":43},"2":{"name":"(anonymous_2)","decl":{"start":{"line":47,"column":24},"end":{"line":47,"column":25}},"loc":{"start":{"line":47,"column":37},"end":{"line":49,"column":3}},"line":47},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":23},"end":{"line":51,"column":24}},"loc":{"start":{"line":51,"column":35},"end":{"line":53,"column":3}},"line":51},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":25},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":37},"end":{"line":57,"column":3}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":63,"column":29},"end":{"line":63,"column":30}},"loc":{"start":{"line":63,"column":41},"end":{"line":67,"column":1}},"line":63},"6":{"name":"(anonymous_6)","decl":{"start":{"line":72,"column":24},"end":{"line":72,"column":25}},"loc":{"start":{"line":72,"column":37},"end":{"line":83,"column":1}},"line":72},"7":{"name":"(anonymous_7)","decl":{"start":{"line":85,"column":22},"end":{"line":85,"column":23}},"loc":{"start":{"line":85,"column":35},"end":{"line":88,"column":1}},"line":85},"8":{"name":"(anonymous_8)","decl":{"start":{"line":94,"column":24},"end":{"line":94,"column":25}},"loc":{"start":{"line":94,"column":36},"end":{"line":94,"column":38}},"line":94},"9":{"name":"(anonymous_9)","decl":{"start":{"line":96,"column":27},"end":{"line":96,"column":28}},"loc":{"start":{"line":96,"column":40},"end":{"line":137,"column":1}},"line":96},"10":{"name":"(anonymous_10)","decl":{"start":{"line":140,"column":30},"end":{"line":140,"column":31}},"loc":{"start":{"line":140,"column":43},"end":{"line":285,"column":1}},"line":140},"11":{"name":"(anonymous_11)","decl":{"start":{"line":178,"column":14},"end":{"line":178,"column":15}},"loc":{"start":{"line":178,"column":26},"end":{"line":183,"column":7}},"line":178},"12":{"name":"(anonymous_12)","decl":{"start":{"line":180,"column":42},"end":{"line":180,"column":43}},"loc":{"start":{"line":180,"column":55},"end":{"line":182,"column":9}},"line":180},"13":{"name":"(anonymous_13)","decl":{"start":{"line":192,"column":14},"end":{"line":192,"column":15}},"loc":{"start":{"line":192,"column":26},"end":{"line":194,"column":7}},"line":192},"14":{"name":"(anonymous_14)","decl":{"start":{"line":202,"column":14},"end":{"line":202,"column":15}},"loc":{"start":{"line":202,"column":26},"end":{"line":205,"column":7}},"line":202},"15":{"name":"(anonymous_15)","decl":{"start":{"line":214,"column":14},"end":{"line":214,"column":15}},"loc":{"start":{"line":214,"column":26},"end":{"line":217,"column":7}},"line":214},"16":{"name":"(anonymous_16)","decl":{"start":{"line":247,"column":21},"end":{"line":247,"column":22}},"loc":{"start":{"line":247,"column":34},"end":{"line":249,"column":5}},"line":247},"17":{"name":"(anonymous_17)","decl":{"start":{"line":266,"column":20},"end":{"line":266,"column":21}},"loc":{"start":{"line":266,"column":32},"end":{"line":268,"column":3}},"line":266},"18":{"name":"(anonymous_18)","decl":{"start":{"line":270,"column":21},"end":{"line":270,"column":22}},"loc":{"start":{"line":270,"column":33},"end":{"line":272,"column":3}},"line":270}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},{"start":{"line":29,"column":2},"end":{"line":29,"column":48}}],"line":29},"1":{"loc":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},{"start":{"line":65,"column":2},"end":{"line":65,"column":57}}],"line":65},"2":{"loc":{"start":{"line":65,"column":6},"end":{"line":65,"column":29}},"type":"binary-expr","locations":[{"start":{"line":65,"column":6},"end":{"line":65,"column":16}},{"start":{"line":65,"column":20},"end":{"line":65,"column":29}}],"line":65},"3":{"loc":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},{"start":{"line":73,"column":2},"end":{"line":81,"column":3}}],"line":73},"4":{"loc":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"type":"if","locations":[{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},{"start":{"line":78,"column":6},"end":{"line":78,"column":62}}],"line":78},"5":{"loc":{"start":{"line":97,"column":9},"end":{"line":97,"column":30}},"type":"binary-expr","locations":[{"start":{"line":97,"column":9},"end":{"line":97,"column":10}},{"start":{"line":97,"column":14},"end":{"line":97,"column":30}}],"line":97},"6":{"loc":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},{"start":{"line":104,"column":2},"end":{"line":134,"column":3}}],"line":104},"7":{"loc":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"type":"if","locations":[{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},{"start":{"line":106,"column":4},"end":{"line":110,"column":5}}],"line":106},"8":{"loc":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"type":"if","locations":[{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},{"start":{"line":109,"column":6},"end":{"line":109,"column":51}}],"line":109},"9":{"loc":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},{"start":{"line":111,"column":4},"end":{"line":114,"column":5}}],"line":111},"10":{"loc":{"start":{"line":118,"column":20},"end":{"line":118,"column":35}},"type":"binary-expr","locations":[{"start":{"line":118,"column":20},"end":{"line":118,"column":27}},{"start":{"line":118,"column":31},"end":{"line":118,"column":35}}],"line":118},"11":{"loc":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"type":"if","locations":[{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},{"start":{"line":126,"column":4},"end":{"line":133,"column":5}}],"line":126},"12":{"loc":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"type":"if","locations":[{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},{"start":{"line":127,"column":6},"end":{"line":128,"column":26}}],"line":127},"13":{"loc":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},{"start":{"line":149,"column":2},"end":{"line":155,"column":3}}],"line":149},"14":{"loc":{"start":{"line":149,"column":6},"end":{"line":149,"column":48}},"type":"binary-expr","locations":[{"start":{"line":149,"column":6},"end":{"line":149,"column":26}},{"start":{"line":149,"column":30},"end":{"line":149,"column":48}}],"line":149},"15":{"loc":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"type":"switch","locations":[{"start":{"line":158,"column":4},"end":{"line":158,"column":16}},{"start":{"line":159,"column":4},"end":{"line":159,"column":19}},{"start":{"line":160,"column":4},"end":{"line":160,"column":16}},{"start":{"line":161,"column":4},"end":{"line":161,"column":24}},{"start":{"line":162,"column":4},"end":{"line":162,"column":27}},{"start":{"line":163,"column":4},"end":{"line":163,"column":23}},{"start":{"line":164,"column":4},"end":{"line":164,"column":21}},{"start":{"line":165,"column":4},"end":{"line":165,"column":16}},{"start":{"line":166,"column":4},"end":{"line":166,"column":26}},{"start":{"line":167,"column":4},"end":{"line":173,"column":11}},{"start":{"line":175,"column":4},"end":{"line":186,"column":11}},{"start":{"line":188,"column":4},"end":{"line":188,"column":26}},{"start":{"line":189,"column":4},"end":{"line":197,"column":11}},{"start":{"line":199,"column":4},"end":{"line":208,"column":11}},{"start":{"line":210,"column":4},"end":{"line":210,"column":31}},{"start":{"line":211,"column":4},"end":{"line":220,"column":11}},{"start":{"line":222,"column":4},"end":{"line":228,"column":11}}],"line":157},"16":{"loc":{"start":{"line":179,"column":23},"end":{"line":179,"column":41}},"type":"binary-expr","locations":[{"start":{"line":179,"column":23},"end":{"line":179,"column":35}},{"start":{"line":179,"column":39},"end":{"line":179,"column":41}}],"line":179},"17":{"loc":{"start":{"line":203,"column":25},"end":{"line":203,"column":45}},"type":"binary-expr","locations":[{"start":{"line":203,"column":25},"end":{"line":203,"column":39}},{"start":{"line":203,"column":43},"end":{"line":203,"column":45}}],"line":203},"18":{"loc":{"start":{"line":215,"column":25},"end":{"line":215,"column":45}},"type":"binary-expr","locations":[{"start":{"line":215,"column":25},"end":{"line":215,"column":39}},{"start":{"line":215,"column":43},"end":{"line":215,"column":45}}],"line":215},"19":{"loc":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},{"start":{"line":232,"column":2},"end":{"line":241,"column":3}}],"line":232},"20":{"loc":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},{"start":{"line":246,"column":2},"end":{"line":250,"column":3}}],"line":246},"21":{"loc":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"type":"if","locations":[{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},{"start":{"line":252,"column":2},"end":{"line":252,"column":35}}],"line":252},"22":{"loc":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},{"start":{"line":254,"column":2},"end":{"line":256,"column":3}}],"line":254},"23":{"loc":{"start":{"line":254,"column":6},"end":{"line":254,"column":58}},"type":"binary-expr","locations":[{"start":{"line":254,"column":6},"end":{"line":254,"column":27}},{"start":{"line":254,"column":31},"end":{"line":254,"column":58}}],"line":254},"24":{"loc":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},{"start":{"line":260,"column":2},"end":{"line":262,"column":3}}],"line":260},"25":{"loc":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"type":"if","locations":[{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},{"start":{"line":274,"column":2},"end":{"line":276,"column":3}}],"line":274},"26":{"loc":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"type":"if","locations":[{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},{"start":{"line":281,"column":2},"end":{"line":284,"column":3}}],"line":281}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":0,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":0,"25":1,"26":11,"27":1,"28":0,"29":1,"30":1,"31":1,"32":0,"33":0,"34":0,"35":0,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":1,"45":1,"46":0,"47":0,"48":1,"49":1,"50":11,"51":11,"52":8,"53":8,"54":8,"55":0,"56":0,"57":0,"58":8,"59":2,"60":2,"61":3,"62":3,"63":3,"64":3,"65":3,"66":0,"67":0,"68":0,"69":3,"70":3,"71":11,"72":1,"73":3,"74":3,"75":3,"76":3,"77":0,"78":0,"79":0,"80":0,"81":0,"82":3,"83":3,"84":3,"85":3,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":3,"118":0,"119":3,"120":3,"121":3,"122":3,"123":3,"124":3,"125":3,"126":8,"127":3,"128":0,"129":3,"130":0,"131":3,"132":3,"133":0,"134":3,"135":3,"136":3,"137":3,"138":7,"139":3,"140":0,"141":3,"142":3,"143":0,"144":0},"f":{"0":1,"1":0,"2":11,"3":0,"4":1,"5":0,"6":1,"7":0,"8":8,"9":11,"10":3,"11":0,"12":0,"13":0,"14":0,"15":0,"16":8,"17":3,"18":7},"b":{"0":[0,1],"1":[0,0],"2":[0,0],"3":[0,1],"4":[0,0],"5":[11,11],"6":[8,3],"7":[8,0],"8":[0,0],"9":[2,6],"10":[6,6],"11":[0,3],"12":[0,0],"13":[0,3],"14":[3,3],"15":[3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,3],"20":[3,0],"21":[0,3],"22":[0,3],"23":[3,3],"24":[0,3],"25":[0,3],"26":[0,3]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"4a8f51a3a12b59eb69694618530032a813fbf8cb","contentHash":"d347e73abcd3109143efee20401d9f0bfc6d68a4a6323bd4559ada44c741786a"},"/Users/isaacs/dev/js/tar/lib/buffer-entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/buffer-entry.js","statementMap":{"0":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"1":{"start":{"line":10,"column":15},"end":{"line":10,"column":34}},"2":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"3":{"start":{"line":14,"column":2},"end":{"line":14,"column":30}},"4":{"start":{"line":15,"column":2},"end":{"line":15,"column":44}},"5":{"start":{"line":16,"column":2},"end":{"line":16,"column":18}},"6":{"start":{"line":17,"column":2},"end":{"line":17,"column":16}},"7":{"start":{"line":18,"column":2},"end":{"line":20,"column":4}},"8":{"start":{"line":19,"column":4},"end":{"line":19,"column":52}},"9":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"10":{"start":{"line":26,"column":0},"end":{"line":30,"column":1}},"11":{"start":{"line":27,"column":2},"end":{"line":27,"column":36}},"12":{"start":{"line":28,"column":2},"end":{"line":28,"column":26}},"13":{"start":{"line":29,"column":2},"end":{"line":29,"column":37}}},"fnMap":{"0":{"name":"BufferEntry","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":24},"end":{"line":21,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":17},"end":{"line":18,"column":18}},"loc":{"start":{"line":18,"column":29},"end":{"line":20,"column":3}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":30},"end":{"line":26,"column":31}},"loc":{"start":{"line":26,"column":43},"end":{"line":30,"column":1}},"line":26}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":1,"10":1,"11":0,"12":0,"13":0},"f":{"0":0,"1":0,"2":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"d8ad66df900443c9c9d8aefe5fc126a55ba268ec","contentHash":"25e5b3c51e476fcffac7affa191a0ed0f54d64d3d3b760e887bd45ba08fffa65"},"/Users/isaacs/dev/js/tar/lib/extended-header.js":{"path":"/Users/isaacs/dev/js/tar/lib/extended-header.js","statementMap":{"0":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"1":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"2":{"start":{"line":12,"column":15},"end":{"line":12,"column":34}},"3":{"start":{"line":13,"column":10},"end":{"line":13,"column":30}},"4":{"start":{"line":14,"column":14},"end":{"line":14,"column":25}},"5":{"start":{"line":15,"column":15},"end":{"line":17,"column":42}},"6":{"start":{"line":20,"column":2},"end":{"line":20,"column":30}},"7":{"start":{"line":21,"column":2},"end":{"line":21,"column":30}},"8":{"start":{"line":22,"column":2},"end":{"line":22,"column":18}},"9":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"10":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":20}},"12":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"13":{"start":{"line":27,"column":2},"end":{"line":27,"column":19}},"14":{"start":{"line":28,"column":2},"end":{"line":28,"column":19}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"16":{"start":{"line":30,"column":2},"end":{"line":30,"column":16}},"17":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"18":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"19":{"start":{"line":36,"column":8},"end":{"line":36,"column":9}},"20":{"start":{"line":37,"column":13},"end":{"line":37,"column":39}},"21":{"start":{"line":38,"column":11},"end":{"line":38,"column":28}},"22":{"start":{"line":39,"column":11},"end":{"line":39,"column":28}},"23":{"start":{"line":40,"column":11},"end":{"line":40,"column":28}},"24":{"start":{"line":41,"column":11},"end":{"line":41,"column":28}},"25":{"start":{"line":43,"column":0},"end":{"line":45,"column":2}},"26":{"start":{"line":44,"column":2},"end":{"line":44,"column":31}},"27":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"28":{"start":{"line":50,"column":9},"end":{"line":50,"column":26}},"29":{"start":{"line":51,"column":9},"end":{"line":51,"column":26}},"30":{"start":{"line":52,"column":12},"end":{"line":52,"column":29}},"31":{"start":{"line":53,"column":8},"end":{"line":53,"column":25}},"32":{"start":{"line":54,"column":8},"end":{"line":54,"column":25}},"33":{"start":{"line":55,"column":8},"end":{"line":55,"column":25}},"34":{"start":{"line":56,"column":8},"end":{"line":56,"column":25}},"35":{"start":{"line":57,"column":12},"end":{"line":57,"column":29}},"36":{"start":{"line":58,"column":9},"end":{"line":58,"column":26}},"37":{"start":{"line":59,"column":9},"end":{"line":59,"column":27}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"39":{"start":{"line":62,"column":27},"end":{"line":62,"column":33}},"40":{"start":{"line":64,"column":2},"end":{"line":130,"column":3}},"41":{"start":{"line":64,"column":16},"end":{"line":64,"column":17}},"42":{"start":{"line":64,"column":23},"end":{"line":64,"column":31}},"43":{"start":{"line":69,"column":12},"end":{"line":69,"column":16}},"44":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"45":{"start":{"line":72,"column":6},"end":{"line":72,"column":53}},"46":{"start":{"line":73,"column":6},"end":{"line":73,"column":12}},"47":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"48":{"start":{"line":77,"column":16},"end":{"line":77,"column":22}},"49":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"50":{"start":{"line":82,"column":10},"end":{"line":82,"column":27}},"51":{"start":{"line":84,"column":10},"end":{"line":84,"column":73}},"52":{"start":{"line":85,"column":10},"end":{"line":85,"column":34}},"53":{"start":{"line":86,"column":10},"end":{"line":86,"column":18}},"54":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"55":{"start":{"line":89,"column":10},"end":{"line":89,"column":68}},"56":{"start":{"line":90,"column":10},"end":{"line":90,"column":16}},"57":{"start":{"line":92,"column":8},"end":{"line":92,"column":29}},"58":{"start":{"line":93,"column":8},"end":{"line":93,"column":16}},"59":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"60":{"start":{"line":98,"column":10},"end":{"line":98,"column":27}},"61":{"start":{"line":99,"column":10},"end":{"line":99,"column":57}},"62":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"63":{"start":{"line":100,"column":35},"end":{"line":100,"column":66}},"64":{"start":{"line":101,"column":10},"end":{"line":101,"column":33}},"65":{"start":{"line":102,"column":10},"end":{"line":102,"column":18}},"66":{"start":{"line":104,"column":8},"end":{"line":104,"column":28}},"67":{"start":{"line":105,"column":8},"end":{"line":105,"column":16}},"68":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"69":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"70":{"start":{"line":112,"column":12},"end":{"line":112,"column":55}},"71":{"start":{"line":113,"column":12},"end":{"line":113,"column":18}},"72":{"start":{"line":115,"column":20},"end":{"line":115,"column":55}},"73":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"74":{"start":{"line":117,"column":12},"end":{"line":117,"column":33}},"75":{"start":{"line":119,"column":10},"end":{"line":119,"column":38}},"76":{"start":{"line":121,"column":10},"end":{"line":121,"column":33}},"77":{"start":{"line":122,"column":10},"end":{"line":122,"column":28}},"78":{"start":{"line":123,"column":10},"end":{"line":123,"column":25}},"79":{"start":{"line":124,"column":10},"end":{"line":124,"column":29}},"80":{"start":{"line":125,"column":10},"end":{"line":125,"column":18}},"81":{"start":{"line":127,"column":8},"end":{"line":127,"column":28}},"82":{"start":{"line":128,"column":8},"end":{"line":128,"column":16}},"83":{"start":{"line":134,"column":2},"end":{"line":136,"column":42}},"84":{"start":{"line":138,"column":2},"end":{"line":138,"column":15}},"85":{"start":{"line":139,"column":2},"end":{"line":139,"column":16}}},"fnMap":{"0":{"name":"ExtendedHeader","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":23}},"loc":{"start":{"line":19,"column":27},"end":{"line":31,"column":1}},"line":19},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":28},"end":{"line":43,"column":29}},"loc":{"start":{"line":43,"column":41},"end":{"line":45,"column":1}},"line":43},"2":{"name":"parse","decl":{"start":{"line":61,"column":9},"end":{"line":61,"column":14}},"loc":{"start":{"line":61,"column":19},"end":{"line":131,"column":1}},"line":61},"3":{"name":"error","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":14}},"loc":{"start":{"line":133,"column":25},"end":{"line":140,"column":1}},"line":133}},"branchMap":{"0":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},{"start":{"line":62,"column":2},"end":{"line":62,"column":33}}],"line":62},"1":{"loc":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},{"start":{"line":71,"column":4},"end":{"line":74,"column":5}}],"line":71},"2":{"loc":{"start":{"line":71,"column":8},"end":{"line":71,"column":54}},"type":"binary-expr","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":23}},{"start":{"line":71,"column":27},"end":{"line":71,"column":54}}],"line":71},"3":{"loc":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"type":"switch","locations":[{"start":{"line":77,"column":6},"end":{"line":77,"column":22}},{"start":{"line":79,"column":6},"end":{"line":93,"column":16}},{"start":{"line":95,"column":6},"end":{"line":105,"column":16}},{"start":{"line":107,"column":6},"end":{"line":128,"column":16}}],"line":76},"4":{"loc":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},{"start":{"line":81,"column":8},"end":{"line":87,"column":9}}],"line":81},"5":{"loc":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},{"start":{"line":88,"column":8},"end":{"line":91,"column":9}}],"line":88},"6":{"loc":{"start":{"line":88,"column":12},"end":{"line":88,"column":28}},"type":"binary-expr","locations":[{"start":{"line":88,"column":12},"end":{"line":88,"column":18}},{"start":{"line":88,"column":22},"end":{"line":88,"column":28}}],"line":88},"7":{"loc":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"type":"if","locations":[{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},{"start":{"line":97,"column":8},"end":{"line":103,"column":9}}],"line":97},"8":{"loc":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"type":"if","locations":[{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},{"start":{"line":100,"column":10},"end":{"line":100,"column":66}}],"line":100},"9":{"loc":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},{"start":{"line":109,"column":8},"end":{"line":126,"column":9}}],"line":109},"10":{"loc":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"type":"if","locations":[{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},{"start":{"line":111,"column":10},"end":{"line":114,"column":11}}],"line":111},"11":{"loc":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"type":"if","locations":[{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},{"start":{"line":116,"column":10},"end":{"line":118,"column":11}}],"line":116}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":4,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0},"f":{"0":0,"1":4,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0,0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"77cb382c69a46833a08275dbc55bf34db0dcd796","contentHash":"78a790af1726a774425fb478f1423068fe64414b747d89b597baf45139e7ae3d"},"/Users/isaacs/dev/js/tar/lib/extract.js":{"path":"/Users/isaacs/dev/js/tar/lib/extract.js","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":24}},"1":{"start":{"line":5,"column":10},"end":{"line":5,"column":30}},"2":{"start":{"line":6,"column":14},"end":{"line":6,"column":32}},"3":{"start":{"line":7,"column":15},"end":{"line":7,"column":34}},"4":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"5":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"6":{"start":{"line":11,"column":34},"end":{"line":11,"column":58}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":23}},"8":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"9":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"10":{"start":{"line":19,"column":2},"end":{"line":19,"column":59}},"11":{"start":{"line":20,"column":2},"end":{"line":20,"column":25}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":26}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"15":{"start":{"line":25,"column":38},"end":{"line":25,"column":52}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":34}},"17":{"start":{"line":29,"column":2},"end":{"line":29,"column":14}},"18":{"start":{"line":30,"column":11},"end":{"line":30,"column":15}},"19":{"start":{"line":35,"column":2},"end":{"line":60,"column":4}},"20":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"21":{"start":{"line":39,"column":14},"end":{"line":39,"column":63}},"22":{"start":{"line":40,"column":6},"end":{"line":40,"column":39}},"23":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"24":{"start":{"line":42,"column":17},"end":{"line":42,"column":70}},"25":{"start":{"line":43,"column":8},"end":{"line":43,"column":50}},"26":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"27":{"start":{"line":47,"column":6},"end":{"line":48,"column":66}},"28":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"29":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"30":{"start":{"line":53,"column":21},"end":{"line":53,"column":41}},"31":{"start":{"line":54,"column":19},"end":{"line":54,"column":56}},"32":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"33":{"start":{"line":56,"column":8},"end":{"line":56,"column":65}},"34":{"start":{"line":58,"column":6},"end":{"line":58,"column":54}},"35":{"start":{"line":62,"column":2},"end":{"line":65,"column":4}},"36":{"start":{"line":63,"column":4},"end":{"line":63,"column":36}},"37":{"start":{"line":64,"column":4},"end":{"line":64,"column":15}},"38":{"start":{"line":67,"column":2},"end":{"line":69,"column":4}},"39":{"start":{"line":68,"column":4},"end":{"line":68,"column":25}},"40":{"start":{"line":71,"column":2},"end":{"line":73,"column":4}},"41":{"start":{"line":72,"column":4},"end":{"line":72,"column":20}},"42":{"start":{"line":79,"column":2},"end":{"line":84,"column":4}},"43":{"start":{"line":81,"column":4},"end":{"line":81,"column":21}},"44":{"start":{"line":82,"column":4},"end":{"line":82,"column":18}},"45":{"start":{"line":83,"column":4},"end":{"line":83,"column":20}},"46":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"47":{"start":{"line":89,"column":0},"end":{"line":94,"column":1}},"48":{"start":{"line":90,"column":11},"end":{"line":90,"column":15}},"49":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"50":{"start":{"line":91,"column":31},"end":{"line":91,"column":57}},"51":{"start":{"line":92,"column":2},"end":{"line":92,"column":15}}},"fnMap":{"0":{"name":"Extract","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":16}},"loc":{"start":{"line":10,"column":24},"end":{"line":85,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":17},"end":{"line":35,"column":18}},"loc":{"start":{"line":35,"column":34},"end":{"line":60,"column":3}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":36},"end":{"line":65,"column":3}},"line":62},"3":{"name":"(anonymous_3)","decl":{"start":{"line":67,"column":24},"end":{"line":67,"column":25}},"loc":{"start":{"line":67,"column":38},"end":{"line":69,"column":3}},"line":67},"4":{"name":"(anonymous_4)","decl":{"start":{"line":71,"column":24},"end":{"line":71,"column":25}},"loc":{"start":{"line":71,"column":35},"end":{"line":73,"column":3}},"line":71},"5":{"name":"(anonymous_5)","decl":{"start":{"line":79,"column":24},"end":{"line":79,"column":25}},"loc":{"start":{"line":79,"column":36},"end":{"line":84,"column":3}},"line":79},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":31},"end":{"line":89,"column":32}},"loc":{"start":{"line":89,"column":43},"end":{"line":94,"column":1}},"line":89}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},{"start":{"line":11,"column":2},"end":{"line":11,"column":58}}],"line":11},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},{"start":{"line":14,"column":2},"end":{"line":16,"column":3}}],"line":14},"2":{"loc":{"start":{"line":19,"column":14},"end":{"line":19,"column":59}},"type":"binary-expr","locations":[{"start":{"line":19,"column":14},"end":{"line":19,"column":23}},{"start":{"line":19,"column":27},"end":{"line":19,"column":59}}],"line":19},"3":{"loc":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"type":"if","locations":[{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},{"start":{"line":25,"column":2},"end":{"line":25,"column":52}}],"line":25},"4":{"loc":{"start":{"line":25,"column":6},"end":{"line":25,"column":36}},"type":"binary-expr","locations":[{"start":{"line":25,"column":6},"end":{"line":25,"column":17}},{"start":{"line":25,"column":21},"end":{"line":25,"column":36}}],"line":25},"5":{"loc":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},{"start":{"line":38,"column":4},"end":{"line":45,"column":5}}],"line":38},"6":{"loc":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},{"start":{"line":41,"column":6},"end":{"line":44,"column":7}}],"line":41},"7":{"loc":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},{"start":{"line":46,"column":4},"end":{"line":49,"column":5}}],"line":46},"8":{"loc":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},{"start":{"line":51,"column":4},"end":{"line":59,"column":5}}],"line":51},"9":{"loc":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"type":"binary-expr","locations":[{"start":{"line":52,"column":15},"end":{"line":52,"column":39}},{"start":{"line":52,"column":43},"end":{"line":52,"column":45}}],"line":52},"10":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},{"start":{"line":55,"column":6},"end":{"line":57,"column":7}}],"line":55},"11":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},{"start":{"line":91,"column":2},"end":{"line":91,"column":57}}],"line":91},"12":{"loc":{"start":{"line":91,"column":6},"end":{"line":91,"column":29}},"type":"binary-expr","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":16}},{"start":{"line":91,"column":20},"end":{"line":91,"column":29}}],"line":91}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":2,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":3,"21":0,"22":0,"23":0,"24":0,"25":0,"26":3,"27":0,"28":3,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":1,"36":1,"37":1,"38":1,"39":0,"40":1,"41":0,"42":1,"43":0,"44":0,"45":0,"46":1,"47":1,"48":0,"49":0,"50":0,"51":0},"f":{"0":2,"1":3,"2":1,"3":0,"4":0,"5":0,"6":0},"b":{"0":[1,1],"1":[1,0],"2":[1,0],"3":[1,0],"4":[1,0],"5":[0,3],"6":[0,0],"7":[0,3],"8":[0,3],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3fb9f60facc409fe944dc36bd2e14fc6153e403d","contentHash":"3d9485ca58c6c768b022a39d276296b53647ccf39986885459406e933921c962"}} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json b/node_modules/tar/.nyc_output/7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/node_modules/tar/.nyc_output/7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json b/node_modules/tar/.nyc_output/9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/node_modules/tar/.nyc_output/9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json b/node_modules/tar/.nyc_output/c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json new file mode 100644 index 00000000..7f34c456 --- /dev/null +++ b/node_modules/tar/.nyc_output/c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json @@ -0,0 +1 @@ +{"/Users/isaacs/dev/js/tar/lib/pack.js":{"path":"/Users/isaacs/dev/js/tar/lib/pack.js","statementMap":{"0":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}},"1":{"start":{"line":6,"column":18},"end":{"line":6,"column":46}},"2":{"start":{"line":7,"column":13},"end":{"line":7,"column":37}},"3":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"4":{"start":{"line":9,"column":15},"end":{"line":9,"column":34}},"5":{"start":{"line":10,"column":25},"end":{"line":10,"column":61}},"6":{"start":{"line":11,"column":14},"end":{"line":11,"column":40}},"7":{"start":{"line":12,"column":10},"end":{"line":12,"column":25}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"9":{"start":{"line":14,"column":13},"end":{"line":14,"column":14}},"10":{"start":{"line":14,"column":31},"end":{"line":14,"column":41}},"11":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"12":{"start":{"line":20,"column":11},"end":{"line":20,"column":15}},"13":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"14":{"start":{"line":21,"column":29},"end":{"line":21,"column":51}},"15":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"16":{"start":{"line":23,"column":13},"end":{"line":23,"column":52}},"17":{"start":{"line":24,"column":7},"end":{"line":24,"column":32}},"18":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"19":{"start":{"line":28,"column":2},"end":{"line":28,"column":20}},"20":{"start":{"line":29,"column":2},"end":{"line":29,"column":20}},"21":{"start":{"line":30,"column":2},"end":{"line":30,"column":17}},"22":{"start":{"line":32,"column":2},"end":{"line":32,"column":25}},"23":{"start":{"line":33,"column":2},"end":{"line":33,"column":24}},"24":{"start":{"line":35,"column":2},"end":{"line":35,"column":21}},"25":{"start":{"line":36,"column":2},"end":{"line":43,"column":4}},"26":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"27":{"start":{"line":37,"column":35},"end":{"line":37,"column":41}},"28":{"start":{"line":38,"column":4},"end":{"line":38,"column":22}},"29":{"start":{"line":39,"column":4},"end":{"line":41,"column":6}},"30":{"start":{"line":40,"column":6},"end":{"line":40,"column":25}},"31":{"start":{"line":42,"column":4},"end":{"line":42,"column":15}},"32":{"start":{"line":46,"column":0},"end":{"line":57,"column":1}},"33":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"34":{"start":{"line":48,"column":23},"end":{"line":48,"column":29}},"35":{"start":{"line":49,"column":2},"end":{"line":49,"column":24}},"36":{"start":{"line":51,"column":11},"end":{"line":51,"column":15}},"37":{"start":{"line":52,"column":2},"end":{"line":56,"column":10}},"38":{"start":{"line":54,"column":6},"end":{"line":54,"column":24}},"39":{"start":{"line":59,"column":0},"end":{"line":69,"column":1}},"40":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"41":{"start":{"line":60,"column":40},"end":{"line":60,"column":68}},"42":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"43":{"start":{"line":62,"column":19},"end":{"line":62,"column":72}},"44":{"start":{"line":64,"column":2},"end":{"line":64,"column":17}},"45":{"start":{"line":65,"column":2},"end":{"line":65,"column":27}},"46":{"start":{"line":66,"column":2},"end":{"line":66,"column":17}},"47":{"start":{"line":67,"column":2},"end":{"line":67,"column":43}},"48":{"start":{"line":68,"column":2},"end":{"line":68,"column":25}},"49":{"start":{"line":71,"column":0},"end":{"line":75,"column":1}},"50":{"start":{"line":72,"column":2},"end":{"line":72,"column":21}},"51":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"52":{"start":{"line":73,"column":26},"end":{"line":73,"column":52}},"53":{"start":{"line":74,"column":2},"end":{"line":74,"column":20}},"54":{"start":{"line":77,"column":0},"end":{"line":82,"column":1}},"55":{"start":{"line":78,"column":2},"end":{"line":78,"column":22}},"56":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"57":{"start":{"line":79,"column":26},"end":{"line":79,"column":53}},"58":{"start":{"line":80,"column":2},"end":{"line":80,"column":21}},"59":{"start":{"line":81,"column":2},"end":{"line":81,"column":17}},"60":{"start":{"line":84,"column":0},"end":{"line":88,"column":1}},"61":{"start":{"line":85,"column":2},"end":{"line":85,"column":20}},"62":{"start":{"line":86,"column":2},"end":{"line":86,"column":24}},"63":{"start":{"line":87,"column":2},"end":{"line":87,"column":17}},"64":{"start":{"line":90,"column":0},"end":{"line":233,"column":1}},"65":{"start":{"line":91,"column":11},"end":{"line":91,"column":15}},"66":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"67":{"start":{"line":93,"column":4},"end":{"line":93,"column":10}},"68":{"start":{"line":96,"column":14},"end":{"line":96,"column":32}},"69":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"70":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"71":{"start":{"line":100,"column":6},"end":{"line":100,"column":22}},"72":{"start":{"line":102,"column":4},"end":{"line":102,"column":10}},"73":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"74":{"start":{"line":107,"column":4},"end":{"line":107,"column":29}},"75":{"start":{"line":108,"column":4},"end":{"line":111,"column":6}},"76":{"start":{"line":110,"column":6},"end":{"line":110,"column":19}},"77":{"start":{"line":112,"column":4},"end":{"line":112,"column":10}},"78":{"start":{"line":115,"column":2},"end":{"line":115,"column":23}},"79":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"80":{"start":{"line":119,"column":4},"end":{"line":119,"column":24}},"81":{"start":{"line":120,"column":4},"end":{"line":120,"column":24}},"82":{"start":{"line":121,"column":4},"end":{"line":121,"column":18}},"83":{"start":{"line":122,"column":4},"end":{"line":122,"column":20}},"84":{"start":{"line":123,"column":4},"end":{"line":123,"column":10}},"85":{"start":{"line":134,"column":13},"end":{"line":134,"column":53}},"86":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"87":{"start":{"line":137,"column":4},"end":{"line":137,"column":27}},"88":{"start":{"line":140,"column":15},"end":{"line":140,"column":17}},"89":{"start":{"line":142,"column":2},"end":{"line":144,"column":4}},"90":{"start":{"line":143,"column":4},"end":{"line":143,"column":30}},"91":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"92":{"start":{"line":146,"column":25},"end":{"line":146,"column":52}},"93":{"start":{"line":148,"column":2},"end":{"line":148,"column":53}},"94":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"95":{"start":{"line":152,"column":4},"end":{"line":152,"column":49}},"96":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"97":{"start":{"line":156,"column":4},"end":{"line":156,"column":29}},"98":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"99":{"start":{"line":161,"column":6},"end":{"line":161,"column":12}},"100":{"start":{"line":164,"column":6},"end":{"line":164,"column":24}},"101":{"start":{"line":165,"column":6},"end":{"line":165,"column":21}},"102":{"start":{"line":166,"column":6},"end":{"line":166,"column":11}},"103":{"start":{"line":169,"column":15},"end":{"line":169,"column":69}},"104":{"start":{"line":170,"column":6},"end":{"line":170,"column":54}},"105":{"start":{"line":171,"column":6},"end":{"line":171,"column":21}},"106":{"start":{"line":172,"column":6},"end":{"line":172,"column":11}},"107":{"start":{"line":175,"column":15},"end":{"line":175,"column":69}},"108":{"start":{"line":176,"column":6},"end":{"line":176,"column":74}},"109":{"start":{"line":177,"column":6},"end":{"line":177,"column":21}},"110":{"start":{"line":178,"column":6},"end":{"line":178,"column":11}},"111":{"start":{"line":187,"column":15},"end":{"line":187,"column":53}},"112":{"start":{"line":189,"column":2},"end":{"line":189,"column":20}},"113":{"start":{"line":195,"column":2},"end":{"line":197,"column":4}},"114":{"start":{"line":196,"column":4},"end":{"line":196,"column":22}},"115":{"start":{"line":199,"column":2},"end":{"line":205,"column":4}},"116":{"start":{"line":200,"column":4},"end":{"line":202,"column":5}},"117":{"start":{"line":201,"column":6},"end":{"line":201,"column":50}},"118":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"119":{"start":{"line":204,"column":33},"end":{"line":204,"column":44}},"120":{"start":{"line":206,"column":2},"end":{"line":206,"column":31}},"121":{"start":{"line":208,"column":14},"end":{"line":208,"column":19}},"122":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"123":{"start":{"line":210,"column":15},"end":{"line":210,"column":21}},"124":{"start":{"line":211,"column":4},"end":{"line":211,"column":16}},"125":{"start":{"line":215,"column":4},"end":{"line":215,"column":27}},"126":{"start":{"line":216,"column":4},"end":{"line":216,"column":26}},"127":{"start":{"line":217,"column":4},"end":{"line":217,"column":17}},"128":{"start":{"line":220,"column":2},"end":{"line":223,"column":4}},"129":{"start":{"line":222,"column":4},"end":{"line":222,"column":24}},"130":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"131":{"start":{"line":229,"column":4},"end":{"line":229,"column":21}},"132":{"start":{"line":232,"column":2},"end":{"line":232,"column":20}},"133":{"start":{"line":235,"column":0},"end":{"line":235,"column":39}},"134":{"start":{"line":236,"column":0},"end":{"line":236,"column":37}}},"fnMap":{"0":{"name":"Pack","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":13}},"loc":{"start":{"line":18,"column":22},"end":{"line":44,"column":1}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":36,"column":16},"end":{"line":36,"column":17}},"loc":{"start":{"line":36,"column":31},"end":{"line":43,"column":3}},"line":36},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":18},"end":{"line":39,"column":19}},"loc":{"start":{"line":39,"column":30},"end":{"line":41,"column":5}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":27},"end":{"line":46,"column":28}},"loc":{"start":{"line":46,"column":44},"end":{"line":57,"column":1}},"line":46},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":29},"end":{"line":55,"column":5}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":21},"end":{"line":59,"column":22}},"loc":{"start":{"line":59,"column":39},"end":{"line":69,"column":1}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":71,"column":23},"end":{"line":71,"column":24}},"loc":{"start":{"line":71,"column":35},"end":{"line":75,"column":1}},"line":71},"7":{"name":"(anonymous_7)","decl":{"start":{"line":77,"column":24},"end":{"line":77,"column":25}},"loc":{"start":{"line":77,"column":36},"end":{"line":82,"column":1}},"line":77},"8":{"name":"(anonymous_8)","decl":{"start":{"line":84,"column":21},"end":{"line":84,"column":22}},"loc":{"start":{"line":84,"column":33},"end":{"line":88,"column":1}},"line":84},"9":{"name":"(anonymous_9)","decl":{"start":{"line":90,"column":26},"end":{"line":90,"column":27}},"loc":{"start":{"line":90,"column":38},"end":{"line":233,"column":1}},"line":90},"10":{"name":"(anonymous_10)","decl":{"start":{"line":108,"column":22},"end":{"line":108,"column":23}},"loc":{"start":{"line":108,"column":34},"end":{"line":111,"column":5}},"line":108},"11":{"name":"(anonymous_11)","decl":{"start":{"line":142,"column":41},"end":{"line":142,"column":42}},"loc":{"start":{"line":142,"column":54},"end":{"line":144,"column":3}},"line":142},"12":{"name":"(anonymous_12)","decl":{"start":{"line":195,"column":20},"end":{"line":195,"column":21}},"loc":{"start":{"line":195,"column":33},"end":{"line":197,"column":3}},"line":195},"13":{"name":"(anonymous_13)","decl":{"start":{"line":199,"column":22},"end":{"line":199,"column":23}},"loc":{"start":{"line":199,"column":34},"end":{"line":205,"column":3}},"line":199},"14":{"name":"(anonymous_14)","decl":{"start":{"line":200,"column":30},"end":{"line":200,"column":31}},"loc":{"start":{"line":200,"column":42},"end":{"line":202,"column":5}},"line":200},"15":{"name":"nextEntry","decl":{"start":{"line":209,"column":11},"end":{"line":209,"column":20}},"loc":{"start":{"line":209,"column":24},"end":{"line":218,"column":3}},"line":209},"16":{"name":"(anonymous_16)","decl":{"start":{"line":220,"column":21},"end":{"line":220,"column":22}},"loc":{"start":{"line":220,"column":35},"end":{"line":223,"column":3}},"line":220},"17":{"name":"(anonymous_17)","decl":{"start":{"line":235,"column":25},"end":{"line":235,"column":26}},"loc":{"start":{"line":235,"column":37},"end":{"line":235,"column":39}},"line":235},"18":{"name":"(anonymous_18)","decl":{"start":{"line":236,"column":23},"end":{"line":236,"column":24}},"loc":{"start":{"line":236,"column":35},"end":{"line":236,"column":37}},"line":236}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},{"start":{"line":21,"column":2},"end":{"line":21,"column":51}}],"line":21},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},{"start":{"line":23,"column":2},"end":{"line":24,"column":32}}],"line":23},"2":{"loc":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},{"start":{"line":37,"column":4},"end":{"line":37,"column":41}}],"line":37},"3":{"loc":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},{"start":{"line":48,"column":2},"end":{"line":48,"column":29}}],"line":48},"4":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},{"start":{"line":60,"column":2},"end":{"line":60,"column":68}}],"line":60},"5":{"loc":{"start":{"line":60,"column":6},"end":{"line":60,"column":38}},"type":"binary-expr","locations":[{"start":{"line":60,"column":6},"end":{"line":60,"column":18}},{"start":{"line":60,"column":22},"end":{"line":60,"column":38}}],"line":60},"6":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},{"start":{"line":62,"column":2},"end":{"line":62,"column":72}}],"line":62},"7":{"loc":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},{"start":{"line":73,"column":2},"end":{"line":73,"column":52}}],"line":73},"8":{"loc":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},{"start":{"line":79,"column":2},"end":{"line":79,"column":53}}],"line":79},"9":{"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},{"start":{"line":92,"column":2},"end":{"line":94,"column":3}}],"line":92},"10":{"loc":{"start":{"line":92,"column":6},"end":{"line":92,"column":34}},"type":"binary-expr","locations":[{"start":{"line":92,"column":6},"end":{"line":92,"column":16}},{"start":{"line":92,"column":20},"end":{"line":92,"column":34}}],"line":92},"11":{"loc":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},{"start":{"line":98,"column":2},"end":{"line":103,"column":3}}],"line":98},"12":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},{"start":{"line":99,"column":4},"end":{"line":101,"column":5}}],"line":99},"13":{"loc":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},{"start":{"line":105,"column":2},"end":{"line":113,"column":3}}],"line":105},"14":{"loc":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},{"start":{"line":117,"column":2},"end":{"line":124,"column":3}}],"line":117},"15":{"loc":{"start":{"line":134,"column":27},"end":{"line":134,"column":46}},"type":"binary-expr","locations":[{"start":{"line":134,"column":27},"end":{"line":134,"column":37}},{"start":{"line":134,"column":41},"end":{"line":134,"column":46}}],"line":134},"16":{"loc":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},{"start":{"line":135,"column":2},"end":{"line":138,"column":3}}],"line":135},"17":{"loc":{"start":{"line":135,"column":6},"end":{"line":135,"column":72}},"type":"binary-expr","locations":[{"start":{"line":135,"column":6},"end":{"line":135,"column":16}},{"start":{"line":135,"column":20},"end":{"line":135,"column":39}},{"start":{"line":135,"column":43},"end":{"line":135,"column":53}},{"start":{"line":135,"column":57},"end":{"line":135,"column":72}}],"line":135},"18":{"loc":{"start":{"line":142,"column":14},"end":{"line":142,"column":31}},"type":"binary-expr","locations":[{"start":{"line":142,"column":14},"end":{"line":142,"column":25}},{"start":{"line":142,"column":29},"end":{"line":142,"column":31}}],"line":142},"19":{"loc":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"type":"if","locations":[{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},{"start":{"line":146,"column":2},"end":{"line":146,"column":52}}],"line":146},"20":{"loc":{"start":{"line":148,"column":36},"end":{"line":148,"column":52}},"type":"binary-expr","locations":[{"start":{"line":148,"column":36},"end":{"line":148,"column":46}},{"start":{"line":148,"column":50},"end":{"line":148,"column":52}}],"line":148},"21":{"loc":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},{"start":{"line":151,"column":2},"end":{"line":153,"column":3}}],"line":151},"22":{"loc":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"type":"if","locations":[{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},{"start":{"line":155,"column":2},"end":{"line":156,"column":29}}],"line":155},"23":{"loc":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"type":"switch","locations":[{"start":{"line":160,"column":4},"end":{"line":161,"column":12}},{"start":{"line":163,"column":4},"end":{"line":166,"column":11}},{"start":{"line":168,"column":4},"end":{"line":172,"column":11}},{"start":{"line":174,"column":4},"end":{"line":178,"column":11}}],"line":158},"24":{"loc":{"start":{"line":170,"column":24},"end":{"line":170,"column":54}},"type":"binary-expr","locations":[{"start":{"line":170,"column":24},"end":{"line":170,"column":47}},{"start":{"line":170,"column":51},"end":{"line":170,"column":54}}],"line":170},"25":{"loc":{"start":{"line":176,"column":24},"end":{"line":176,"column":74}},"type":"binary-expr","locations":[{"start":{"line":176,"column":24},"end":{"line":176,"column":67}},{"start":{"line":176,"column":71},"end":{"line":176,"column":74}}],"line":176},"26":{"loc":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"type":"if","locations":[{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},{"start":{"line":204,"column":4},"end":{"line":204,"column":44}}],"line":204},"27":{"loc":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"type":"if","locations":[{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},{"start":{"line":210,"column":4},"end":{"line":210,"column":21}}],"line":210},"28":{"loc":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},{"start":{"line":227,"column":2},"end":{"line":230,"column":3}}],"line":227}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":512,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":1,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":1,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1,"50":0,"51":0,"52":0,"53":0,"54":1,"55":0,"56":0,"57":0,"58":0,"59":0,"60":1,"61":0,"62":0,"63":0,"64":1,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":1,"134":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0,0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0,0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"8beb16ccde52e484aa1dd87f5ece33d696c808ab","contentHash":"7bb2b7ebe1111c0deefbf9a61d17bf9d2dbe951adb585db96f9d89663ce5909d"},"/Users/isaacs/dev/js/tar/lib/entry-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}},"1":{"start":{"line":3,"column":10},"end":{"line":3,"column":30}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":38}},"3":{"start":{"line":5,"column":12},"end":{"line":5,"column":33}},"4":{"start":{"line":6,"column":15},"end":{"line":6,"column":34}},"5":{"start":{"line":7,"column":18},"end":{"line":7,"column":41}},"6":{"start":{"line":9,"column":13},"end":{"line":9,"column":37}},"7":{"start":{"line":10,"column":10},"end":{"line":10,"column":12}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":29}},"9":{"start":{"line":15,"column":11},"end":{"line":15,"column":15}},"10":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"11":{"start":{"line":18,"column":4},"end":{"line":18,"column":33}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":20}},"13":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"14":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":35}},"16":{"start":{"line":28,"column":2},"end":{"line":30,"column":4}},"17":{"start":{"line":29,"column":4},"end":{"line":29,"column":22}},"18":{"start":{"line":32,"column":2},"end":{"line":34,"column":4}},"19":{"start":{"line":33,"column":4},"end":{"line":33,"column":20}},"20":{"start":{"line":36,"column":2},"end":{"line":39,"column":4}},"21":{"start":{"line":37,"column":4},"end":{"line":37,"column":18}},"22":{"start":{"line":38,"column":4},"end":{"line":38,"column":20}},"23":{"start":{"line":41,"column":2},"end":{"line":41,"column":18}},"24":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"25":{"start":{"line":43,"column":4},"end":{"line":43,"column":18}},"26":{"start":{"line":45,"column":2},"end":{"line":45,"column":25}},"27":{"start":{"line":46,"column":2},"end":{"line":46,"column":23}},"28":{"start":{"line":47,"column":2},"end":{"line":47,"column":22}},"29":{"start":{"line":49,"column":2},"end":{"line":49,"column":17}},"30":{"start":{"line":50,"column":2},"end":{"line":50,"column":23}},"31":{"start":{"line":51,"column":2},"end":{"line":51,"column":18}},"32":{"start":{"line":53,"column":2},"end":{"line":55,"column":4}},"33":{"start":{"line":54,"column":4},"end":{"line":54,"column":17}},"34":{"start":{"line":58,"column":0},"end":{"line":65,"column":1}},"35":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"36":{"start":{"line":60,"column":19},"end":{"line":60,"column":74}},"37":{"start":{"line":61,"column":2},"end":{"line":61,"column":22}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":17}},"39":{"start":{"line":63,"column":2},"end":{"line":63,"column":43}},"40":{"start":{"line":64,"column":2},"end":{"line":64,"column":25}},"41":{"start":{"line":67,"column":0},"end":{"line":74,"column":1}},"42":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"43":{"start":{"line":69,"column":9},"end":{"line":69,"column":29}},"44":{"start":{"line":70,"column":2},"end":{"line":70,"column":24}},"45":{"start":{"line":71,"column":2},"end":{"line":71,"column":20}},"46":{"start":{"line":72,"column":2},"end":{"line":72,"column":17}},"47":{"start":{"line":73,"column":2},"end":{"line":73,"column":43}},"48":{"start":{"line":76,"column":0},"end":{"line":80,"column":1}},"49":{"start":{"line":78,"column":2},"end":{"line":78,"column":21}},"50":{"start":{"line":79,"column":2},"end":{"line":79,"column":20}},"51":{"start":{"line":82,"column":0},"end":{"line":87,"column":1}},"52":{"start":{"line":84,"column":2},"end":{"line":84,"column":22}},"53":{"start":{"line":85,"column":2},"end":{"line":85,"column":21}},"54":{"start":{"line":86,"column":2},"end":{"line":86,"column":17}},"55":{"start":{"line":89,"column":0},"end":{"line":98,"column":1}},"56":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"57":{"start":{"line":91,"column":20},"end":{"line":91,"column":69}},"58":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"59":{"start":{"line":95,"column":20},"end":{"line":95,"column":30}},"60":{"start":{"line":97,"column":2},"end":{"line":97,"column":31}},"61":{"start":{"line":100,"column":0},"end":{"line":126,"column":1}},"62":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"63":{"start":{"line":102,"column":23},"end":{"line":102,"column":29}},"64":{"start":{"line":103,"column":2},"end":{"line":103,"column":24}},"65":{"start":{"line":105,"column":20},"end":{"line":105,"column":48}},"66":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"67":{"start":{"line":108,"column":13},"end":{"line":108,"column":17}},"68":{"start":{"line":110,"column":4},"end":{"line":111,"column":44}},"69":{"start":{"line":113,"column":4},"end":{"line":120,"column":12}},"70":{"start":{"line":115,"column":8},"end":{"line":115,"column":26}},"71":{"start":{"line":118,"column":8},"end":{"line":118,"column":28}},"72":{"start":{"line":124,"column":2},"end":{"line":124,"column":32}},"73":{"start":{"line":125,"column":2},"end":{"line":125,"column":21}},"74":{"start":{"line":128,"column":0},"end":{"line":167,"column":1}},"75":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"76":{"start":{"line":131,"column":4},"end":{"line":131,"column":18}},"77":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"78":{"start":{"line":136,"column":4},"end":{"line":136,"column":10}},"79":{"start":{"line":139,"column":2},"end":{"line":139,"column":25}},"80":{"start":{"line":141,"column":12},"end":{"line":141,"column":24}},"81":{"start":{"line":142,"column":2},"end":{"line":159,"column":3}},"82":{"start":{"line":142,"column":15},"end":{"line":142,"column":16}},"83":{"start":{"line":145,"column":12},"end":{"line":145,"column":18}},"84":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"85":{"start":{"line":147,"column":19},"end":{"line":147,"column":37}},"86":{"start":{"line":148,"column":9},"end":{"line":148,"column":30}},"87":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"88":{"start":{"line":152,"column":6},"end":{"line":152,"column":30}},"89":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"90":{"start":{"line":154,"column":8},"end":{"line":154,"column":30}},"91":{"start":{"line":155,"column":8},"end":{"line":155,"column":39}},"92":{"start":{"line":157,"column":6},"end":{"line":157,"column":12}},"93":{"start":{"line":162,"column":2},"end":{"line":162,"column":25}},"94":{"start":{"line":163,"column":2},"end":{"line":163,"column":26}},"95":{"start":{"line":166,"column":2},"end":{"line":166,"column":20}},"96":{"start":{"line":169,"column":0},"end":{"line":169,"column":46}}},"fnMap":{"0":{"name":"EntryWriter","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":20}},"loc":{"start":{"line":14,"column":29},"end":{"line":56,"column":1}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":25}},"loc":{"start":{"line":28,"column":37},"end":{"line":30,"column":3}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":25},"end":{"line":32,"column":26}},"loc":{"start":{"line":32,"column":37},"end":{"line":34,"column":3}},"line":32},"3":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":23},"end":{"line":36,"column":24}},"loc":{"start":{"line":36,"column":35},"end":{"line":39,"column":3}},"line":36},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":28},"end":{"line":55,"column":3}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":30},"end":{"line":58,"column":31}},"loc":{"start":{"line":58,"column":43},"end":{"line":65,"column":1}},"line":58},"6":{"name":"(anonymous_6)","decl":{"start":{"line":67,"column":28},"end":{"line":67,"column":29}},"loc":{"start":{"line":67,"column":41},"end":{"line":74,"column":1}},"line":67},"7":{"name":"(anonymous_7)","decl":{"start":{"line":76,"column":30},"end":{"line":76,"column":31}},"loc":{"start":{"line":76,"column":42},"end":{"line":80,"column":1}},"line":76},"8":{"name":"(anonymous_8)","decl":{"start":{"line":82,"column":31},"end":{"line":82,"column":32}},"loc":{"start":{"line":82,"column":43},"end":{"line":87,"column":1}},"line":82},"9":{"name":"(anonymous_9)","decl":{"start":{"line":89,"column":28},"end":{"line":89,"column":29}},"loc":{"start":{"line":89,"column":45},"end":{"line":98,"column":1}},"line":89},"10":{"name":"(anonymous_10)","decl":{"start":{"line":100,"column":32},"end":{"line":100,"column":33}},"loc":{"start":{"line":100,"column":44},"end":{"line":126,"column":1}},"line":100},"11":{"name":"(anonymous_11)","decl":{"start":{"line":114,"column":18},"end":{"line":114,"column":19}},"loc":{"start":{"line":114,"column":31},"end":{"line":116,"column":7}},"line":114},"12":{"name":"(anonymous_12)","decl":{"start":{"line":117,"column":19},"end":{"line":117,"column":20}},"loc":{"start":{"line":117,"column":33},"end":{"line":119,"column":7}},"line":117},"13":{"name":"(anonymous_13)","decl":{"start":{"line":128,"column":33},"end":{"line":128,"column":34}},"loc":{"start":{"line":128,"column":45},"end":{"line":167,"column":1}},"line":128},"14":{"name":"(anonymous_14)","decl":{"start":{"line":169,"column":32},"end":{"line":169,"column":33}},"loc":{"start":{"line":169,"column":44},"end":{"line":169,"column":46}},"line":169}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"1":{"loc":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},{"start":{"line":42,"column":2},"end":{"line":44,"column":3}}],"line":42},"2":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},{"start":{"line":60,"column":2},"end":{"line":60,"column":74}}],"line":60},"3":{"loc":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},{"start":{"line":69,"column":2},"end":{"line":69,"column":29}}],"line":69},"4":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},{"start":{"line":91,"column":2},"end":{"line":91,"column":69}}],"line":91},"5":{"loc":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},{"start":{"line":95,"column":2},"end":{"line":95,"column":30}}],"line":95},"6":{"loc":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"type":"if","locations":[{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},{"start":{"line":102,"column":2},"end":{"line":102,"column":29}}],"line":102},"7":{"loc":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},{"start":{"line":107,"column":2},"end":{"line":121,"column":3}}],"line":107},"8":{"loc":{"start":{"line":107,"column":6},"end":{"line":107,"column":44}},"type":"binary-expr","locations":[{"start":{"line":107,"column":6},"end":{"line":107,"column":29}},{"start":{"line":107,"column":33},"end":{"line":107,"column":44}}],"line":107},"9":{"loc":{"start":{"line":110,"column":27},"end":{"line":111,"column":44}},"type":"binary-expr","locations":[{"start":{"line":110,"column":27},"end":{"line":110,"column":47}},{"start":{"line":111,"column":6},"end":{"line":111,"column":44}}],"line":110},"10":{"loc":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},{"start":{"line":130,"column":2},"end":{"line":132,"column":3}}],"line":130},"11":{"loc":{"start":{"line":130,"column":6},"end":{"line":130,"column":37}},"type":"binary-expr","locations":[{"start":{"line":130,"column":6},"end":{"line":130,"column":22}},{"start":{"line":130,"column":26},"end":{"line":130,"column":37}}],"line":130},"12":{"loc":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"type":"if","locations":[{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},{"start":{"line":134,"column":2},"end":{"line":137,"column":3}}],"line":134},"13":{"loc":{"start":{"line":134,"column":6},"end":{"line":134,"column":38}},"type":"binary-expr","locations":[{"start":{"line":134,"column":6},"end":{"line":134,"column":18}},{"start":{"line":134,"column":22},"end":{"line":134,"column":38}}],"line":134},"14":{"loc":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"type":"if","locations":[{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},{"start":{"line":147,"column":4},"end":{"line":148,"column":30}}],"line":147},"15":{"loc":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},{"start":{"line":150,"column":4},"end":{"line":158,"column":5}}],"line":150},"16":{"loc":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"type":"if","locations":[{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},{"start":{"line":153,"column":6},"end":{"line":156,"column":7}}],"line":153}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":1,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":1,"49":0,"50":0,"51":1,"52":0,"53":0,"54":0,"55":1,"56":0,"57":0,"58":0,"59":0,"60":0,"61":1,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":1,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3e169418508e031df78186ff63b5fa5aa2484ab8","contentHash":"84191ed4732b6763ae8701256051735aebbe5e95c932c15bef34da01b33ba1a0"},"/Users/isaacs/dev/js/tar/lib/entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry.js","statementMap":{"0":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"1":{"start":{"line":9,"column":16},"end":{"line":9,"column":38}},"2":{"start":{"line":10,"column":10},"end":{"line":10,"column":27}},"3":{"start":{"line":11,"column":13},"end":{"line":11,"column":33}},"4":{"start":{"line":12,"column":13},"end":{"line":12,"column":37}},"5":{"start":{"line":13,"column":15},"end":{"line":13,"column":34}},"6":{"start":{"line":14,"column":14},"end":{"line":14,"column":41}},"7":{"start":{"line":17,"column":2},"end":{"line":17,"column":19}},"8":{"start":{"line":18,"column":2},"end":{"line":18,"column":22}},"9":{"start":{"line":19,"column":2},"end":{"line":19,"column":22}},"10":{"start":{"line":21,"column":2},"end":{"line":21,"column":25}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":22}},"12":{"start":{"line":23,"column":2},"end":{"line":23,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":22}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":21}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":21}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":21}},"17":{"start":{"line":28,"column":2},"end":{"line":28,"column":18}},"18":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"19":{"start":{"line":30,"column":2},"end":{"line":30,"column":20}},"20":{"start":{"line":32,"column":2},"end":{"line":32,"column":36}},"21":{"start":{"line":34,"column":2},"end":{"line":34,"column":17}},"22":{"start":{"line":35,"column":2},"end":{"line":35,"column":23}},"23":{"start":{"line":36,"column":2},"end":{"line":36,"column":33}},"24":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"25":{"start":{"line":41,"column":11},"end":{"line":41,"column":15}},"26":{"start":{"line":42,"column":2},"end":{"line":44,"column":4}},"27":{"start":{"line":43,"column":4},"end":{"line":43,"column":29}},"28":{"start":{"line":46,"column":2},"end":{"line":46,"column":18}},"29":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"30":{"start":{"line":51,"column":0},"end":{"line":78,"column":1}},"31":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"32":{"start":{"line":52,"column":20},"end":{"line":52,"column":65}},"33":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"34":{"start":{"line":54,"column":4},"end":{"line":54,"column":40}},"35":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"36":{"start":{"line":60,"column":4},"end":{"line":60,"column":35}},"37":{"start":{"line":62,"column":2},"end":{"line":62,"column":29}},"38":{"start":{"line":65,"column":11},"end":{"line":65,"column":25}},"39":{"start":{"line":66,"column":2},"end":{"line":66,"column":21}},"40":{"start":{"line":67,"column":2},"end":{"line":67,"column":19}},"41":{"start":{"line":69,"column":2},"end":{"line":69,"column":14}},"42":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"43":{"start":{"line":73,"column":4},"end":{"line":73,"column":26}},"44":{"start":{"line":74,"column":4},"end":{"line":74,"column":16}},"45":{"start":{"line":77,"column":2},"end":{"line":77,"column":13}},"46":{"start":{"line":80,"column":0},"end":{"line":84,"column":1}},"47":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"48":{"start":{"line":81,"column":9},"end":{"line":81,"column":22}},"49":{"start":{"line":82,"column":2},"end":{"line":82,"column":21}},"50":{"start":{"line":83,"column":2},"end":{"line":83,"column":14}},"51":{"start":{"line":86,"column":0},"end":{"line":89,"column":1}},"52":{"start":{"line":87,"column":2},"end":{"line":87,"column":21}},"53":{"start":{"line":88,"column":2},"end":{"line":88,"column":20}},"54":{"start":{"line":91,"column":0},"end":{"line":97,"column":1}},"55":{"start":{"line":93,"column":2},"end":{"line":93,"column":21}},"56":{"start":{"line":94,"column":2},"end":{"line":94,"column":22}},"57":{"start":{"line":95,"column":2},"end":{"line":95,"column":14}},"58":{"start":{"line":96,"column":2},"end":{"line":96,"column":41}},"59":{"start":{"line":100,"column":0},"end":{"line":139,"column":1}},"60":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"61":{"start":{"line":103,"column":52},"end":{"line":103,"column":58}},"62":{"start":{"line":107,"column":2},"end":{"line":107,"column":22}},"63":{"start":{"line":110,"column":2},"end":{"line":113,"column":3}},"64":{"start":{"line":111,"column":16},"end":{"line":111,"column":43}},"65":{"start":{"line":112,"column":4},"end":{"line":112,"column":28}},"66":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"67":{"start":{"line":117,"column":4},"end":{"line":117,"column":57}},"68":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"69":{"start":{"line":119,"column":6},"end":{"line":119,"column":29}},"70":{"start":{"line":120,"column":6},"end":{"line":120,"column":24}},"71":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"72":{"start":{"line":123,"column":6},"end":{"line":123,"column":24}},"73":{"start":{"line":124,"column":6},"end":{"line":124,"column":22}},"74":{"start":{"line":130,"column":12},"end":{"line":130,"column":29}},"75":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"76":{"start":{"line":132,"column":4},"end":{"line":132,"column":36}},"77":{"start":{"line":133,"column":4},"end":{"line":133,"column":22}},"78":{"start":{"line":134,"column":4},"end":{"line":134,"column":25}},"79":{"start":{"line":135,"column":4},"end":{"line":135,"column":40}},"80":{"start":{"line":138,"column":2},"end":{"line":138,"column":23}},"81":{"start":{"line":141,"column":0},"end":{"line":211,"column":1}},"82":{"start":{"line":143,"column":15},"end":{"line":143,"column":27}},"83":{"start":{"line":144,"column":17},"end":{"line":144,"column":31}},"84":{"start":{"line":145,"column":15},"end":{"line":145,"column":27}},"85":{"start":{"line":146,"column":14},"end":{"line":146,"column":24}},"86":{"start":{"line":149,"column":15},"end":{"line":149,"column":25}},"87":{"start":{"line":150,"column":2},"end":{"line":154,"column":3}},"88":{"start":{"line":150,"column":15},"end":{"line":150,"column":16}},"89":{"start":{"line":151,"column":16},"end":{"line":151,"column":25}},"90":{"start":{"line":152,"column":14},"end":{"line":152,"column":27}},"91":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"92":{"start":{"line":153,"column":36},"end":{"line":153,"column":54}},"93":{"start":{"line":158,"column":3},"end":{"line":165,"column":3}},"94":{"start":{"line":159,"column":4},"end":{"line":161,"column":6}},"95":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"96":{"start":{"line":160,"column":39},"end":{"line":160,"column":54}},"97":{"start":{"line":165,"column":3},"end":{"line":173,"column":3}},"98":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"99":{"start":{"line":167,"column":6},"end":{"line":167,"column":40}},"100":{"start":{"line":173,"column":3},"end":{"line":177,"column":4}},"101":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"102":{"start":{"line":175,"column":6},"end":{"line":175,"column":42}},"103":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"104":{"start":{"line":184,"column":6},"end":{"line":184,"column":19}},"105":{"start":{"line":185,"column":6},"end":{"line":185,"column":11}},"106":{"start":{"line":188,"column":6},"end":{"line":188,"column":24}},"107":{"start":{"line":189,"column":6},"end":{"line":189,"column":11}},"108":{"start":{"line":192,"column":6},"end":{"line":192,"column":22}},"109":{"start":{"line":193,"column":6},"end":{"line":193,"column":11}},"110":{"start":{"line":202,"column":6},"end":{"line":202,"column":34}},"111":{"start":{"line":205,"column":2},"end":{"line":205,"column":18}},"112":{"start":{"line":206,"column":2},"end":{"line":206,"column":24}},"113":{"start":{"line":207,"column":2},"end":{"line":207,"column":24}},"114":{"start":{"line":210,"column":2},"end":{"line":210,"column":30}},"115":{"start":{"line":215,"column":0},"end":{"line":217,"column":1}},"116":{"start":{"line":216,"column":2},"end":{"line":216,"column":20}},"117":{"start":{"line":219,"column":0},"end":{"line":219,"column":35}},"118":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}}},"fnMap":{"0":{"name":"Entry","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":14}},"loc":{"start":{"line":16,"column":42},"end":{"line":47,"column":1}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":36},"end":{"line":42,"column":37}},"loc":{"start":{"line":42,"column":49},"end":{"line":44,"column":3}},"line":42},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":24},"end":{"line":51,"column":25}},"loc":{"start":{"line":51,"column":37},"end":{"line":78,"column":1}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":80,"column":22},"end":{"line":80,"column":23}},"loc":{"start":{"line":80,"column":35},"end":{"line":84,"column":1}},"line":80},"4":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":24},"end":{"line":86,"column":25}},"loc":{"start":{"line":86,"column":36},"end":{"line":89,"column":1}},"line":86},"5":{"name":"(anonymous_5)","decl":{"start":{"line":91,"column":25},"end":{"line":91,"column":26}},"loc":{"start":{"line":91,"column":37},"end":{"line":97,"column":1}},"line":91},"6":{"name":"(anonymous_6)","decl":{"start":{"line":100,"column":24},"end":{"line":100,"column":25}},"loc":{"start":{"line":100,"column":36},"end":{"line":139,"column":1}},"line":100},"7":{"name":"(anonymous_7)","decl":{"start":{"line":141,"column":28},"end":{"line":141,"column":29}},"loc":{"start":{"line":141,"column":40},"end":{"line":211,"column":1}},"line":141},"8":{"name":"(anonymous_8)","decl":{"start":{"line":158,"column":30},"end":{"line":158,"column":31}},"loc":{"start":{"line":158,"column":43},"end":{"line":162,"column":3}},"line":158},"9":{"name":"(anonymous_9)","decl":{"start":{"line":159,"column":27},"end":{"line":159,"column":28}},"loc":{"start":{"line":159,"column":40},"end":{"line":161,"column":5}},"line":159},"10":{"name":"(anonymous_10)","decl":{"start":{"line":165,"column":32},"end":{"line":165,"column":33}},"loc":{"start":{"line":165,"column":45},"end":{"line":169,"column":3}},"line":165},"11":{"name":"(anonymous_11)","decl":{"start":{"line":173,"column":39},"end":{"line":173,"column":40}},"loc":{"start":{"line":173,"column":52},"end":{"line":177,"column":3}},"line":173},"12":{"name":"(anonymous_12)","decl":{"start":{"line":215,"column":24},"end":{"line":215,"column":25}},"loc":{"start":{"line":215,"column":34},"end":{"line":217,"column":1}},"line":215}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":19},"end":{"line":36,"column":33}},"type":"binary-expr","locations":[{"start":{"line":36,"column":19},"end":{"line":36,"column":27}},{"start":{"line":36,"column":31},"end":{"line":36,"column":33}}],"line":36},"1":{"loc":{"start":{"line":42,"column":14},"end":{"line":42,"column":26}},"type":"binary-expr","locations":[{"start":{"line":42,"column":14},"end":{"line":42,"column":20}},{"start":{"line":42,"column":24},"end":{"line":42,"column":26}}],"line":42},"2":{"loc":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},{"start":{"line":52,"column":2},"end":{"line":52,"column":65}}],"line":52},"3":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},{"start":{"line":53,"column":2},"end":{"line":55,"column":3}}],"line":53},"4":{"loc":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},{"start":{"line":59,"column":2},"end":{"line":61,"column":3}}],"line":59},"5":{"loc":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},{"start":{"line":72,"column":2},"end":{"line":75,"column":3}}],"line":72},"6":{"loc":{"start":{"line":72,"column":6},"end":{"line":72,"column":28}},"type":"binary-expr","locations":[{"start":{"line":72,"column":6},"end":{"line":72,"column":18}},{"start":{"line":72,"column":22},"end":{"line":72,"column":28}}],"line":72},"7":{"loc":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},{"start":{"line":81,"column":2},"end":{"line":81,"column":22}}],"line":81},"8":{"loc":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},{"start":{"line":103,"column":2},"end":{"line":103,"column":58}}],"line":103},"9":{"loc":{"start":{"line":103,"column":6},"end":{"line":103,"column":50}},"type":"binary-expr","locations":[{"start":{"line":103,"column":6},"end":{"line":103,"column":18}},{"start":{"line":103,"column":22},"end":{"line":103,"column":35}},{"start":{"line":103,"column":39},"end":{"line":103,"column":50}}],"line":103},"10":{"loc":{"start":{"line":110,"column":9},"end":{"line":110,"column":54}},"type":"binary-expr","locations":[{"start":{"line":110,"column":9},"end":{"line":110,"column":37}},{"start":{"line":110,"column":41},"end":{"line":110,"column":54}}],"line":110},"11":{"loc":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},{"start":{"line":116,"column":2},"end":{"line":126,"column":3}}],"line":116},"12":{"loc":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},{"start":{"line":118,"column":4},"end":{"line":121,"column":5}}],"line":118},"13":{"loc":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"type":"if","locations":[{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},{"start":{"line":122,"column":4},"end":{"line":125,"column":5}}],"line":122},"14":{"loc":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},{"start":{"line":131,"column":2},"end":{"line":136,"column":3}}],"line":131},"15":{"loc":{"start":{"line":131,"column":6},"end":{"line":131,"column":45}},"type":"binary-expr","locations":[{"start":{"line":131,"column":6},"end":{"line":131,"column":26}},{"start":{"line":131,"column":30},"end":{"line":131,"column":45}}],"line":131},"16":{"loc":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"type":"if","locations":[{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},{"start":{"line":153,"column":4},"end":{"line":153,"column":54}}],"line":153},"17":{"loc":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"type":"if","locations":[{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},{"start":{"line":160,"column":6},"end":{"line":160,"column":54}}],"line":160},"18":{"loc":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"type":"if","locations":[{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},{"start":{"line":166,"column":4},"end":{"line":168,"column":5}}],"line":166},"19":{"loc":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"type":"if","locations":[{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},{"start":{"line":174,"column":4},"end":{"line":176,"column":5}}],"line":174},"20":{"loc":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"type":"switch","locations":[{"start":{"line":182,"column":4},"end":{"line":182,"column":19}},{"start":{"line":183,"column":4},"end":{"line":185,"column":11}},{"start":{"line":187,"column":4},"end":{"line":189,"column":11}},{"start":{"line":191,"column":4},"end":{"line":193,"column":11}},{"start":{"line":195,"column":4},"end":{"line":195,"column":16}},{"start":{"line":196,"column":4},"end":{"line":196,"column":24}},{"start":{"line":197,"column":4},"end":{"line":197,"column":27}},{"start":{"line":198,"column":4},"end":{"line":198,"column":23}},{"start":{"line":199,"column":4},"end":{"line":199,"column":21}},{"start":{"line":200,"column":4},"end":{"line":200,"column":16}},{"start":{"line":201,"column":4},"end":{"line":202,"column":34}}],"line":181}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":17,"8":17,"9":17,"10":17,"11":17,"12":17,"13":17,"14":17,"15":17,"16":17,"17":17,"18":17,"19":17,"20":17,"21":17,"22":17,"23":17,"24":17,"25":17,"26":17,"27":0,"28":17,"29":1,"30":1,"31":17,"32":0,"33":17,"34":0,"35":17,"36":15,"37":17,"38":17,"39":17,"40":17,"41":17,"42":17,"43":10,"44":10,"45":7,"46":1,"47":17,"48":0,"49":17,"50":17,"51":1,"52":10,"53":10,"54":1,"55":20,"56":20,"57":20,"58":20,"59":1,"60":54,"61":30,"62":24,"63":24,"64":17,"65":17,"66":24,"67":24,"68":24,"69":8,"70":8,"71":24,"72":17,"73":17,"74":24,"75":24,"76":0,"77":0,"78":0,"79":0,"80":24,"81":1,"82":17,"83":17,"84":17,"85":17,"86":17,"87":17,"88":17,"89":289,"90":289,"91":289,"92":242,"93":17,"94":34,"95":29,"96":29,"97":17,"98":34,"99":34,"100":17,"101":51,"102":25,"103":17,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":17,"111":17,"112":17,"113":17,"114":17,"115":1,"116":0,"117":1,"118":1},"f":{"0":17,"1":0,"2":17,"3":17,"4":10,"5":20,"6":54,"7":17,"8":34,"9":29,"10":34,"11":51,"12":0},"b":{"0":[17,11],"1":[17,17],"2":[0,17],"3":[0,17],"4":[15,2],"5":[10,7],"6":[17,7],"7":[0,17],"8":[30,24],"9":[54,34,34],"10":[41,17],"11":[24,0],"12":[8,16],"13":[17,7],"14":[0,24],"15":[24,0],"16":[242,47],"17":[29,0],"18":[34,0],"19":[25,26],"20":[0,0,0,0,1,2,2,2,2,2,17]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"2cc4f925db2a60e89bf0743124faec4e8996dfdb","contentHash":"245d5cb2b23d975dc5b9a0ed2553c93c587727d50a7961242f50cec333c04ba9"},"/Users/isaacs/dev/js/tar/lib/global-header-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/global-header-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"1":{"start":{"line":3,"column":27},"end":{"line":3,"column":65}},"2":{"start":{"line":4,"column":15},"end":{"line":4,"column":34}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":50}},"4":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":40}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":40}},"7":{"start":{"line":13,"column":2},"end":{"line":13,"column":23}}},"fnMap":{"0":{"name":"GlobalHeaderWriter","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":27}},"loc":{"start":{"line":8,"column":36},"end":{"line":14,"column":1}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},{"start":{"line":9,"column":2},"end":{"line":11,"column":3}}],"line":9}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0},"f":{"0":0},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3d0c8589f62a5c8ccec606d52d3abd98e5627d57","contentHash":"a2570ca840cf3e44d77e15af0aee52f7c145da39b76366006f3672b9708def3e"},"/Users/isaacs/dev/js/tar/lib/parse.js":{"path":"/Users/isaacs/dev/js/tar/lib/parse.js","statementMap":{"0":{"start":{"line":6,"column":0},"end":{"line":6,"column":37}},"1":{"start":{"line":8,"column":13},"end":{"line":8,"column":30}},"2":{"start":{"line":9,"column":13},"end":{"line":9,"column":26}},"3":{"start":{"line":10,"column":18},"end":{"line":10,"column":41}},"4":{"start":{"line":11,"column":10},"end":{"line":11,"column":30}},"5":{"start":{"line":12,"column":16},"end":{"line":12,"column":38}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":46}},"8":{"start":{"line":15,"column":21},"end":{"line":15,"column":52}},"9":{"start":{"line":16,"column":13},"end":{"line":16,"column":33}},"10":{"start":{"line":17,"column":15},"end":{"line":17,"column":34}},"11":{"start":{"line":18,"column":14},"end":{"line":18,"column":32}},"12":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"13":{"start":{"line":28,"column":11},"end":{"line":28,"column":15}},"14":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"15":{"start":{"line":29,"column":30},"end":{"line":29,"column":48}},"16":{"start":{"line":34,"column":2},"end":{"line":34,"column":18}},"17":{"start":{"line":36,"column":2},"end":{"line":36,"column":20}},"18":{"start":{"line":37,"column":2},"end":{"line":37,"column":20}},"19":{"start":{"line":38,"column":2},"end":{"line":38,"column":35}},"20":{"start":{"line":39,"column":2},"end":{"line":39,"column":17}},"21":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"22":{"start":{"line":41,"column":2},"end":{"line":41,"column":20}},"23":{"start":{"line":43,"column":2},"end":{"line":45,"column":4}},"24":{"start":{"line":44,"column":4},"end":{"line":44,"column":23}},"25":{"start":{"line":47,"column":2},"end":{"line":49,"column":4}},"26":{"start":{"line":48,"column":4},"end":{"line":48,"column":18}},"27":{"start":{"line":51,"column":2},"end":{"line":53,"column":4}},"28":{"start":{"line":52,"column":4},"end":{"line":52,"column":19}},"29":{"start":{"line":55,"column":2},"end":{"line":57,"column":4}},"30":{"start":{"line":56,"column":4},"end":{"line":56,"column":20}},"31":{"start":{"line":63,"column":0},"end":{"line":67,"column":1}},"32":{"start":{"line":64,"column":11},"end":{"line":64,"column":15}},"33":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"34":{"start":{"line":65,"column":31},"end":{"line":65,"column":57}},"35":{"start":{"line":66,"column":2},"end":{"line":66,"column":16}},"36":{"start":{"line":72,"column":0},"end":{"line":83,"column":1}},"37":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"38":{"start":{"line":77,"column":4},"end":{"line":79,"column":5}},"39":{"start":{"line":77,"column":17},"end":{"line":77,"column":18}},"40":{"start":{"line":77,"column":24},"end":{"line":77,"column":32}},"41":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"42":{"start":{"line":78,"column":22},"end":{"line":78,"column":62}},"43":{"start":{"line":80,"column":4},"end":{"line":80,"column":10}},"44":{"start":{"line":82,"column":2},"end":{"line":82,"column":30}},"45":{"start":{"line":85,"column":0},"end":{"line":88,"column":1}},"46":{"start":{"line":86,"column":2},"end":{"line":86,"column":20}},"47":{"start":{"line":87,"column":2},"end":{"line":87,"column":28}},"48":{"start":{"line":94,"column":0},"end":{"line":94,"column":38}},"49":{"start":{"line":96,"column":0},"end":{"line":137,"column":1}},"50":{"start":{"line":97,"column":2},"end":{"line":97,"column":59}},"51":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"52":{"start":{"line":105,"column":16},"end":{"line":105,"column":27}},"53":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"54":{"start":{"line":106,"column":22},"end":{"line":106,"column":36}},"55":{"start":{"line":108,"column":6},"end":{"line":108,"column":34}},"56":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"57":{"start":{"line":109,"column":31},"end":{"line":109,"column":51}},"58":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"59":{"start":{"line":112,"column":6},"end":{"line":112,"column":17}},"60":{"start":{"line":113,"column":6},"end":{"line":113,"column":24}},"61":{"start":{"line":117,"column":15},"end":{"line":117,"column":19}},"62":{"start":{"line":118,"column":4},"end":{"line":120,"column":5}},"63":{"start":{"line":118,"column":17},"end":{"line":118,"column":18}},"64":{"start":{"line":119,"column":6},"end":{"line":119,"column":23}},"65":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"66":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"67":{"start":{"line":128,"column":8},"end":{"line":128,"column":26}},"68":{"start":{"line":129,"column":6},"end":{"line":129,"column":29}},"69":{"start":{"line":131,"column":6},"end":{"line":131,"column":30}},"70":{"start":{"line":132,"column":6},"end":{"line":132,"column":25}},"71":{"start":{"line":136,"column":2},"end":{"line":136,"column":22}},"72":{"start":{"line":140,"column":0},"end":{"line":285,"column":1}},"73":{"start":{"line":141,"column":15},"end":{"line":141,"column":31}},"74":{"start":{"line":142,"column":13},"end":{"line":142,"column":17}},"75":{"start":{"line":147,"column":13},"end":{"line":147,"column":18}},"76":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"77":{"start":{"line":150,"column":12},"end":{"line":150,"column":41}},"78":{"start":{"line":151,"column":4},"end":{"line":151,"column":21}},"79":{"start":{"line":152,"column":4},"end":{"line":152,"column":37}},"80":{"start":{"line":153,"column":4},"end":{"line":153,"column":37}},"81":{"start":{"line":154,"column":4},"end":{"line":154,"column":32}},"82":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"83":{"start":{"line":171,"column":6},"end":{"line":171,"column":23}},"84":{"start":{"line":172,"column":6},"end":{"line":172,"column":18}},"85":{"start":{"line":173,"column":6},"end":{"line":173,"column":11}},"86":{"start":{"line":177,"column":6},"end":{"line":177,"column":32}},"87":{"start":{"line":178,"column":6},"end":{"line":183,"column":7}},"88":{"start":{"line":179,"column":8},"end":{"line":179,"column":41}},"89":{"start":{"line":180,"column":8},"end":{"line":182,"column":10}},"90":{"start":{"line":181,"column":10},"end":{"line":181,"column":43}},"91":{"start":{"line":184,"column":6},"end":{"line":184,"column":33}},"92":{"start":{"line":185,"column":6},"end":{"line":185,"column":17}},"93":{"start":{"line":186,"column":6},"end":{"line":186,"column":11}},"94":{"start":{"line":191,"column":6},"end":{"line":191,"column":32}},"95":{"start":{"line":192,"column":6},"end":{"line":194,"column":7}},"96":{"start":{"line":193,"column":8},"end":{"line":193,"column":37}},"97":{"start":{"line":195,"column":6},"end":{"line":195,"column":27}},"98":{"start":{"line":196,"column":6},"end":{"line":196,"column":17}},"99":{"start":{"line":197,"column":6},"end":{"line":197,"column":11}},"100":{"start":{"line":201,"column":6},"end":{"line":201,"column":29}},"101":{"start":{"line":202,"column":6},"end":{"line":205,"column":7}},"102":{"start":{"line":203,"column":8},"end":{"line":203,"column":45}},"103":{"start":{"line":204,"column":8},"end":{"line":204,"column":44}},"104":{"start":{"line":206,"column":6},"end":{"line":206,"column":25}},"105":{"start":{"line":207,"column":6},"end":{"line":207,"column":17}},"106":{"start":{"line":208,"column":6},"end":{"line":208,"column":11}},"107":{"start":{"line":213,"column":6},"end":{"line":213,"column":29}},"108":{"start":{"line":214,"column":6},"end":{"line":217,"column":7}},"109":{"start":{"line":215,"column":8},"end":{"line":215,"column":45}},"110":{"start":{"line":216,"column":8},"end":{"line":216,"column":40}},"111":{"start":{"line":218,"column":6},"end":{"line":218,"column":21}},"112":{"start":{"line":219,"column":6},"end":{"line":219,"column":17}},"113":{"start":{"line":220,"column":6},"end":{"line":220,"column":11}},"114":{"start":{"line":226,"column":6},"end":{"line":226,"column":23}},"115":{"start":{"line":227,"column":6},"end":{"line":227,"column":25}},"116":{"start":{"line":228,"column":6},"end":{"line":228,"column":11}},"117":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"118":{"start":{"line":233,"column":4},"end":{"line":233,"column":28}},"119":{"start":{"line":235,"column":17},"end":{"line":235,"column":29}},"120":{"start":{"line":236,"column":19},"end":{"line":236,"column":33}},"121":{"start":{"line":240,"column":4},"end":{"line":240,"column":25}},"122":{"start":{"line":242,"column":2},"end":{"line":242,"column":49}},"123":{"start":{"line":243,"column":2},"end":{"line":243,"column":19}},"124":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"125":{"start":{"line":247,"column":4},"end":{"line":249,"column":6}},"126":{"start":{"line":248,"column":6},"end":{"line":248,"column":24}},"127":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"128":{"start":{"line":252,"column":13},"end":{"line":252,"column":35}},"129":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"130":{"start":{"line":255,"column":4},"end":{"line":255,"column":23}},"131":{"start":{"line":258,"column":2},"end":{"line":258,"column":21}},"132":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"133":{"start":{"line":261,"column":4},"end":{"line":261,"column":39}},"134":{"start":{"line":264,"column":11},"end":{"line":264,"column":15}},"135":{"start":{"line":266,"column":2},"end":{"line":268,"column":4}},"136":{"start":{"line":267,"column":4},"end":{"line":267,"column":14}},"137":{"start":{"line":270,"column":2},"end":{"line":272,"column":4}},"138":{"start":{"line":271,"column":4},"end":{"line":271,"column":15}},"139":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"140":{"start":{"line":275,"column":4},"end":{"line":275,"column":29}},"141":{"start":{"line":278,"column":2},"end":{"line":278,"column":22}},"142":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"143":{"start":{"line":282,"column":4},"end":{"line":282,"column":15}},"144":{"start":{"line":283,"column":4},"end":{"line":283,"column":22}}},"fnMap":{"0":{"name":"Parse","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":14}},"loc":{"start":{"line":27,"column":18},"end":{"line":58,"column":1}},"line":27},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":25},"end":{"line":43,"column":26}},"loc":{"start":{"line":43,"column":38},"end":{"line":45,"column":3}},"line":43},"2":{"name":"(anonymous_2)","decl":{"start":{"line":47,"column":24},"end":{"line":47,"column":25}},"loc":{"start":{"line":47,"column":37},"end":{"line":49,"column":3}},"line":47},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":23},"end":{"line":51,"column":24}},"loc":{"start":{"line":51,"column":35},"end":{"line":53,"column":3}},"line":51},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":25},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":37},"end":{"line":57,"column":3}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":63,"column":29},"end":{"line":63,"column":30}},"loc":{"start":{"line":63,"column":41},"end":{"line":67,"column":1}},"line":63},"6":{"name":"(anonymous_6)","decl":{"start":{"line":72,"column":24},"end":{"line":72,"column":25}},"loc":{"start":{"line":72,"column":37},"end":{"line":83,"column":1}},"line":72},"7":{"name":"(anonymous_7)","decl":{"start":{"line":85,"column":22},"end":{"line":85,"column":23}},"loc":{"start":{"line":85,"column":35},"end":{"line":88,"column":1}},"line":85},"8":{"name":"(anonymous_8)","decl":{"start":{"line":94,"column":24},"end":{"line":94,"column":25}},"loc":{"start":{"line":94,"column":36},"end":{"line":94,"column":38}},"line":94},"9":{"name":"(anonymous_9)","decl":{"start":{"line":96,"column":27},"end":{"line":96,"column":28}},"loc":{"start":{"line":96,"column":40},"end":{"line":137,"column":1}},"line":96},"10":{"name":"(anonymous_10)","decl":{"start":{"line":140,"column":30},"end":{"line":140,"column":31}},"loc":{"start":{"line":140,"column":43},"end":{"line":285,"column":1}},"line":140},"11":{"name":"(anonymous_11)","decl":{"start":{"line":178,"column":14},"end":{"line":178,"column":15}},"loc":{"start":{"line":178,"column":26},"end":{"line":183,"column":7}},"line":178},"12":{"name":"(anonymous_12)","decl":{"start":{"line":180,"column":42},"end":{"line":180,"column":43}},"loc":{"start":{"line":180,"column":55},"end":{"line":182,"column":9}},"line":180},"13":{"name":"(anonymous_13)","decl":{"start":{"line":192,"column":14},"end":{"line":192,"column":15}},"loc":{"start":{"line":192,"column":26},"end":{"line":194,"column":7}},"line":192},"14":{"name":"(anonymous_14)","decl":{"start":{"line":202,"column":14},"end":{"line":202,"column":15}},"loc":{"start":{"line":202,"column":26},"end":{"line":205,"column":7}},"line":202},"15":{"name":"(anonymous_15)","decl":{"start":{"line":214,"column":14},"end":{"line":214,"column":15}},"loc":{"start":{"line":214,"column":26},"end":{"line":217,"column":7}},"line":214},"16":{"name":"(anonymous_16)","decl":{"start":{"line":247,"column":21},"end":{"line":247,"column":22}},"loc":{"start":{"line":247,"column":34},"end":{"line":249,"column":5}},"line":247},"17":{"name":"(anonymous_17)","decl":{"start":{"line":266,"column":20},"end":{"line":266,"column":21}},"loc":{"start":{"line":266,"column":32},"end":{"line":268,"column":3}},"line":266},"18":{"name":"(anonymous_18)","decl":{"start":{"line":270,"column":21},"end":{"line":270,"column":22}},"loc":{"start":{"line":270,"column":33},"end":{"line":272,"column":3}},"line":270}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},{"start":{"line":29,"column":2},"end":{"line":29,"column":48}}],"line":29},"1":{"loc":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},{"start":{"line":65,"column":2},"end":{"line":65,"column":57}}],"line":65},"2":{"loc":{"start":{"line":65,"column":6},"end":{"line":65,"column":29}},"type":"binary-expr","locations":[{"start":{"line":65,"column":6},"end":{"line":65,"column":16}},{"start":{"line":65,"column":20},"end":{"line":65,"column":29}}],"line":65},"3":{"loc":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},{"start":{"line":73,"column":2},"end":{"line":81,"column":3}}],"line":73},"4":{"loc":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"type":"if","locations":[{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},{"start":{"line":78,"column":6},"end":{"line":78,"column":62}}],"line":78},"5":{"loc":{"start":{"line":97,"column":9},"end":{"line":97,"column":30}},"type":"binary-expr","locations":[{"start":{"line":97,"column":9},"end":{"line":97,"column":10}},{"start":{"line":97,"column":14},"end":{"line":97,"column":30}}],"line":97},"6":{"loc":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},{"start":{"line":104,"column":2},"end":{"line":134,"column":3}}],"line":104},"7":{"loc":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"type":"if","locations":[{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},{"start":{"line":106,"column":4},"end":{"line":110,"column":5}}],"line":106},"8":{"loc":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"type":"if","locations":[{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},{"start":{"line":109,"column":6},"end":{"line":109,"column":51}}],"line":109},"9":{"loc":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},{"start":{"line":111,"column":4},"end":{"line":114,"column":5}}],"line":111},"10":{"loc":{"start":{"line":118,"column":20},"end":{"line":118,"column":35}},"type":"binary-expr","locations":[{"start":{"line":118,"column":20},"end":{"line":118,"column":27}},{"start":{"line":118,"column":31},"end":{"line":118,"column":35}}],"line":118},"11":{"loc":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"type":"if","locations":[{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},{"start":{"line":126,"column":4},"end":{"line":133,"column":5}}],"line":126},"12":{"loc":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"type":"if","locations":[{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},{"start":{"line":127,"column":6},"end":{"line":128,"column":26}}],"line":127},"13":{"loc":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},{"start":{"line":149,"column":2},"end":{"line":155,"column":3}}],"line":149},"14":{"loc":{"start":{"line":149,"column":6},"end":{"line":149,"column":48}},"type":"binary-expr","locations":[{"start":{"line":149,"column":6},"end":{"line":149,"column":26}},{"start":{"line":149,"column":30},"end":{"line":149,"column":48}}],"line":149},"15":{"loc":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"type":"switch","locations":[{"start":{"line":158,"column":4},"end":{"line":158,"column":16}},{"start":{"line":159,"column":4},"end":{"line":159,"column":19}},{"start":{"line":160,"column":4},"end":{"line":160,"column":16}},{"start":{"line":161,"column":4},"end":{"line":161,"column":24}},{"start":{"line":162,"column":4},"end":{"line":162,"column":27}},{"start":{"line":163,"column":4},"end":{"line":163,"column":23}},{"start":{"line":164,"column":4},"end":{"line":164,"column":21}},{"start":{"line":165,"column":4},"end":{"line":165,"column":16}},{"start":{"line":166,"column":4},"end":{"line":166,"column":26}},{"start":{"line":167,"column":4},"end":{"line":173,"column":11}},{"start":{"line":175,"column":4},"end":{"line":186,"column":11}},{"start":{"line":188,"column":4},"end":{"line":188,"column":26}},{"start":{"line":189,"column":4},"end":{"line":197,"column":11}},{"start":{"line":199,"column":4},"end":{"line":208,"column":11}},{"start":{"line":210,"column":4},"end":{"line":210,"column":31}},{"start":{"line":211,"column":4},"end":{"line":220,"column":11}},{"start":{"line":222,"column":4},"end":{"line":228,"column":11}}],"line":157},"16":{"loc":{"start":{"line":179,"column":23},"end":{"line":179,"column":41}},"type":"binary-expr","locations":[{"start":{"line":179,"column":23},"end":{"line":179,"column":35}},{"start":{"line":179,"column":39},"end":{"line":179,"column":41}}],"line":179},"17":{"loc":{"start":{"line":203,"column":25},"end":{"line":203,"column":45}},"type":"binary-expr","locations":[{"start":{"line":203,"column":25},"end":{"line":203,"column":39}},{"start":{"line":203,"column":43},"end":{"line":203,"column":45}}],"line":203},"18":{"loc":{"start":{"line":215,"column":25},"end":{"line":215,"column":45}},"type":"binary-expr","locations":[{"start":{"line":215,"column":25},"end":{"line":215,"column":39}},{"start":{"line":215,"column":43},"end":{"line":215,"column":45}}],"line":215},"19":{"loc":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},{"start":{"line":232,"column":2},"end":{"line":241,"column":3}}],"line":232},"20":{"loc":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},{"start":{"line":246,"column":2},"end":{"line":250,"column":3}}],"line":246},"21":{"loc":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"type":"if","locations":[{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},{"start":{"line":252,"column":2},"end":{"line":252,"column":35}}],"line":252},"22":{"loc":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},{"start":{"line":254,"column":2},"end":{"line":256,"column":3}}],"line":254},"23":{"loc":{"start":{"line":254,"column":6},"end":{"line":254,"column":58}},"type":"binary-expr","locations":[{"start":{"line":254,"column":6},"end":{"line":254,"column":27}},{"start":{"line":254,"column":31},"end":{"line":254,"column":58}}],"line":254},"24":{"loc":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},{"start":{"line":260,"column":2},"end":{"line":262,"column":3}}],"line":260},"25":{"loc":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"type":"if","locations":[{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},{"start":{"line":274,"column":2},"end":{"line":276,"column":3}}],"line":274},"26":{"loc":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"type":"if","locations":[{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},{"start":{"line":281,"column":2},"end":{"line":284,"column":3}}],"line":281}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":0,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":0,"25":1,"26":36,"27":1,"28":1,"29":1,"30":1,"31":1,"32":0,"33":0,"34":0,"35":0,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":36,"51":36,"52":17,"53":17,"54":17,"55":0,"56":0,"57":0,"58":17,"59":15,"60":15,"61":19,"62":19,"63":19,"64":1041,"65":19,"66":2,"67":1,"68":2,"69":17,"70":17,"71":36,"72":1,"73":17,"74":17,"75":17,"76":17,"77":0,"78":0,"79":0,"80":0,"81":0,"82":17,"83":10,"84":10,"85":10,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":0,"115":0,"116":0,"117":17,"118":7,"119":10,"120":10,"121":10,"122":17,"123":17,"124":17,"125":10,"126":10,"127":17,"128":7,"129":17,"130":0,"131":17,"132":17,"133":1,"134":17,"135":17,"136":10,"137":17,"138":20,"139":17,"140":0,"141":17,"142":17,"143":2,"144":2},"f":{"0":1,"1":0,"2":36,"3":1,"4":1,"5":0,"6":1,"7":1,"8":22,"9":36,"10":17,"11":0,"12":0,"13":4,"14":1,"15":2,"16":10,"17":10,"18":20},"b":{"0":[0,1],"1":[0,0],"2":[0,0],"3":[0,1],"4":[0,0],"5":[36,36],"6":[17,19],"7":[17,0],"8":[0,0],"9":[15,2],"10":[1060,1058],"11":[2,17],"12":[1,1],"13":[0,17],"14":[17,17],"15":[8,8,9,10,10,10,10,10,10,10,0,4,4,1,2,2,0],"16":[0,0],"17":[1,1],"18":[2,1],"19":[7,10],"20":[10,7],"21":[7,10],"22":[0,17],"23":[17,8],"24":[1,16],"25":[0,17],"26":[2,15]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"4a8f51a3a12b59eb69694618530032a813fbf8cb","contentHash":"d347e73abcd3109143efee20401d9f0bfc6d68a4a6323bd4559ada44c741786a"},"/Users/isaacs/dev/js/tar/lib/buffer-entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/buffer-entry.js","statementMap":{"0":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"1":{"start":{"line":10,"column":15},"end":{"line":10,"column":34}},"2":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"3":{"start":{"line":14,"column":2},"end":{"line":14,"column":30}},"4":{"start":{"line":15,"column":2},"end":{"line":15,"column":44}},"5":{"start":{"line":16,"column":2},"end":{"line":16,"column":18}},"6":{"start":{"line":17,"column":2},"end":{"line":17,"column":16}},"7":{"start":{"line":18,"column":2},"end":{"line":20,"column":4}},"8":{"start":{"line":19,"column":4},"end":{"line":19,"column":52}},"9":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"10":{"start":{"line":26,"column":0},"end":{"line":30,"column":1}},"11":{"start":{"line":27,"column":2},"end":{"line":27,"column":36}},"12":{"start":{"line":28,"column":2},"end":{"line":28,"column":26}},"13":{"start":{"line":29,"column":2},"end":{"line":29,"column":37}}},"fnMap":{"0":{"name":"BufferEntry","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":24},"end":{"line":21,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":17},"end":{"line":18,"column":18}},"loc":{"start":{"line":18,"column":29},"end":{"line":20,"column":3}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":30},"end":{"line":26,"column":31}},"loc":{"start":{"line":26,"column":43},"end":{"line":30,"column":1}},"line":26}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":1,"10":1,"11":3,"12":3,"13":3},"f":{"0":3,"1":3,"2":3},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"d8ad66df900443c9c9d8aefe5fc126a55ba268ec","contentHash":"25e5b3c51e476fcffac7affa191a0ed0f54d64d3d3b760e887bd45ba08fffa65"},"/Users/isaacs/dev/js/tar/lib/extended-header.js":{"path":"/Users/isaacs/dev/js/tar/lib/extended-header.js","statementMap":{"0":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"1":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"2":{"start":{"line":12,"column":15},"end":{"line":12,"column":34}},"3":{"start":{"line":13,"column":10},"end":{"line":13,"column":30}},"4":{"start":{"line":14,"column":14},"end":{"line":14,"column":25}},"5":{"start":{"line":15,"column":15},"end":{"line":17,"column":42}},"6":{"start":{"line":20,"column":2},"end":{"line":20,"column":30}},"7":{"start":{"line":21,"column":2},"end":{"line":21,"column":30}},"8":{"start":{"line":22,"column":2},"end":{"line":22,"column":18}},"9":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"10":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":20}},"12":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"13":{"start":{"line":27,"column":2},"end":{"line":27,"column":19}},"14":{"start":{"line":28,"column":2},"end":{"line":28,"column":19}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"16":{"start":{"line":30,"column":2},"end":{"line":30,"column":16}},"17":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"18":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"19":{"start":{"line":36,"column":8},"end":{"line":36,"column":9}},"20":{"start":{"line":37,"column":13},"end":{"line":37,"column":39}},"21":{"start":{"line":38,"column":11},"end":{"line":38,"column":28}},"22":{"start":{"line":39,"column":11},"end":{"line":39,"column":28}},"23":{"start":{"line":40,"column":11},"end":{"line":40,"column":28}},"24":{"start":{"line":41,"column":11},"end":{"line":41,"column":28}},"25":{"start":{"line":43,"column":0},"end":{"line":45,"column":2}},"26":{"start":{"line":44,"column":2},"end":{"line":44,"column":31}},"27":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"28":{"start":{"line":50,"column":9},"end":{"line":50,"column":26}},"29":{"start":{"line":51,"column":9},"end":{"line":51,"column":26}},"30":{"start":{"line":52,"column":12},"end":{"line":52,"column":29}},"31":{"start":{"line":53,"column":8},"end":{"line":53,"column":25}},"32":{"start":{"line":54,"column":8},"end":{"line":54,"column":25}},"33":{"start":{"line":55,"column":8},"end":{"line":55,"column":25}},"34":{"start":{"line":56,"column":8},"end":{"line":56,"column":25}},"35":{"start":{"line":57,"column":12},"end":{"line":57,"column":29}},"36":{"start":{"line":58,"column":9},"end":{"line":58,"column":26}},"37":{"start":{"line":59,"column":9},"end":{"line":59,"column":27}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"39":{"start":{"line":62,"column":27},"end":{"line":62,"column":33}},"40":{"start":{"line":64,"column":2},"end":{"line":130,"column":3}},"41":{"start":{"line":64,"column":16},"end":{"line":64,"column":17}},"42":{"start":{"line":64,"column":23},"end":{"line":64,"column":31}},"43":{"start":{"line":69,"column":12},"end":{"line":69,"column":16}},"44":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"45":{"start":{"line":72,"column":6},"end":{"line":72,"column":53}},"46":{"start":{"line":73,"column":6},"end":{"line":73,"column":12}},"47":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"48":{"start":{"line":77,"column":16},"end":{"line":77,"column":22}},"49":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"50":{"start":{"line":82,"column":10},"end":{"line":82,"column":27}},"51":{"start":{"line":84,"column":10},"end":{"line":84,"column":73}},"52":{"start":{"line":85,"column":10},"end":{"line":85,"column":34}},"53":{"start":{"line":86,"column":10},"end":{"line":86,"column":18}},"54":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"55":{"start":{"line":89,"column":10},"end":{"line":89,"column":68}},"56":{"start":{"line":90,"column":10},"end":{"line":90,"column":16}},"57":{"start":{"line":92,"column":8},"end":{"line":92,"column":29}},"58":{"start":{"line":93,"column":8},"end":{"line":93,"column":16}},"59":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"60":{"start":{"line":98,"column":10},"end":{"line":98,"column":27}},"61":{"start":{"line":99,"column":10},"end":{"line":99,"column":57}},"62":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"63":{"start":{"line":100,"column":35},"end":{"line":100,"column":66}},"64":{"start":{"line":101,"column":10},"end":{"line":101,"column":33}},"65":{"start":{"line":102,"column":10},"end":{"line":102,"column":18}},"66":{"start":{"line":104,"column":8},"end":{"line":104,"column":28}},"67":{"start":{"line":105,"column":8},"end":{"line":105,"column":16}},"68":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"69":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"70":{"start":{"line":112,"column":12},"end":{"line":112,"column":55}},"71":{"start":{"line":113,"column":12},"end":{"line":113,"column":18}},"72":{"start":{"line":115,"column":20},"end":{"line":115,"column":55}},"73":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"74":{"start":{"line":117,"column":12},"end":{"line":117,"column":33}},"75":{"start":{"line":119,"column":10},"end":{"line":119,"column":38}},"76":{"start":{"line":121,"column":10},"end":{"line":121,"column":33}},"77":{"start":{"line":122,"column":10},"end":{"line":122,"column":28}},"78":{"start":{"line":123,"column":10},"end":{"line":123,"column":25}},"79":{"start":{"line":124,"column":10},"end":{"line":124,"column":29}},"80":{"start":{"line":125,"column":10},"end":{"line":125,"column":18}},"81":{"start":{"line":127,"column":8},"end":{"line":127,"column":28}},"82":{"start":{"line":128,"column":8},"end":{"line":128,"column":16}},"83":{"start":{"line":134,"column":2},"end":{"line":136,"column":42}},"84":{"start":{"line":138,"column":2},"end":{"line":138,"column":15}},"85":{"start":{"line":139,"column":2},"end":{"line":139,"column":16}}},"fnMap":{"0":{"name":"ExtendedHeader","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":23}},"loc":{"start":{"line":19,"column":27},"end":{"line":31,"column":1}},"line":19},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":28},"end":{"line":43,"column":29}},"loc":{"start":{"line":43,"column":41},"end":{"line":45,"column":1}},"line":43},"2":{"name":"parse","decl":{"start":{"line":61,"column":9},"end":{"line":61,"column":14}},"loc":{"start":{"line":61,"column":19},"end":{"line":131,"column":1}},"line":61},"3":{"name":"error","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":14}},"loc":{"start":{"line":133,"column":25},"end":{"line":140,"column":1}},"line":133}},"branchMap":{"0":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},{"start":{"line":62,"column":2},"end":{"line":62,"column":33}}],"line":62},"1":{"loc":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},{"start":{"line":71,"column":4},"end":{"line":74,"column":5}}],"line":71},"2":{"loc":{"start":{"line":71,"column":8},"end":{"line":71,"column":54}},"type":"binary-expr","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":23}},{"start":{"line":71,"column":27},"end":{"line":71,"column":54}}],"line":71},"3":{"loc":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"type":"switch","locations":[{"start":{"line":77,"column":6},"end":{"line":77,"column":22}},{"start":{"line":79,"column":6},"end":{"line":93,"column":16}},{"start":{"line":95,"column":6},"end":{"line":105,"column":16}},{"start":{"line":107,"column":6},"end":{"line":128,"column":16}}],"line":76},"4":{"loc":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},{"start":{"line":81,"column":8},"end":{"line":87,"column":9}}],"line":81},"5":{"loc":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},{"start":{"line":88,"column":8},"end":{"line":91,"column":9}}],"line":88},"6":{"loc":{"start":{"line":88,"column":12},"end":{"line":88,"column":28}},"type":"binary-expr","locations":[{"start":{"line":88,"column":12},"end":{"line":88,"column":18}},{"start":{"line":88,"column":22},"end":{"line":88,"column":28}}],"line":88},"7":{"loc":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"type":"if","locations":[{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},{"start":{"line":97,"column":8},"end":{"line":103,"column":9}}],"line":97},"8":{"loc":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"type":"if","locations":[{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},{"start":{"line":100,"column":10},"end":{"line":100,"column":66}}],"line":100},"9":{"loc":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},{"start":{"line":109,"column":8},"end":{"line":126,"column":9}}],"line":109},"10":{"loc":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"type":"if","locations":[{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},{"start":{"line":111,"column":10},"end":{"line":114,"column":11}}],"line":111},"11":{"loc":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"type":"if","locations":[{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},{"start":{"line":116,"column":10},"end":{"line":118,"column":11}}],"line":116}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":4,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":4,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":4,"39":0,"40":4,"41":4,"42":4,"43":969,"44":969,"45":0,"46":0,"47":969,"48":0,"49":80,"50":26,"51":26,"52":26,"53":26,"54":54,"55":0,"56":0,"57":54,"58":54,"59":275,"60":26,"61":26,"62":26,"63":12,"64":26,"65":26,"66":249,"67":249,"68":614,"69":26,"70":0,"71":0,"72":26,"73":26,"74":20,"75":26,"76":26,"77":26,"78":26,"79":26,"80":26,"81":588,"82":588,"83":0,"84":0,"85":0},"f":{"0":4,"1":4,"2":4,"3":0},"b":{"0":[0,4],"1":[0,969],"2":[969,889],"3":[0,80,275,614],"4":[26,54],"5":[0,54],"6":[54,54],"7":[26,249],"8":[12,14],"9":[26,588],"10":[0,26],"11":[20,6]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"77cb382c69a46833a08275dbc55bf34db0dcd796","contentHash":"78a790af1726a774425fb478f1423068fe64414b747d89b597baf45139e7ae3d"},"/Users/isaacs/dev/js/tar/lib/extract.js":{"path":"/Users/isaacs/dev/js/tar/lib/extract.js","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":24}},"1":{"start":{"line":5,"column":10},"end":{"line":5,"column":30}},"2":{"start":{"line":6,"column":14},"end":{"line":6,"column":32}},"3":{"start":{"line":7,"column":15},"end":{"line":7,"column":34}},"4":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"5":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"6":{"start":{"line":11,"column":34},"end":{"line":11,"column":58}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":23}},"8":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"9":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"10":{"start":{"line":19,"column":2},"end":{"line":19,"column":59}},"11":{"start":{"line":20,"column":2},"end":{"line":20,"column":25}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":26}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"15":{"start":{"line":25,"column":38},"end":{"line":25,"column":52}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":34}},"17":{"start":{"line":29,"column":2},"end":{"line":29,"column":14}},"18":{"start":{"line":30,"column":11},"end":{"line":30,"column":15}},"19":{"start":{"line":35,"column":2},"end":{"line":60,"column":4}},"20":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"21":{"start":{"line":39,"column":14},"end":{"line":39,"column":63}},"22":{"start":{"line":40,"column":6},"end":{"line":40,"column":39}},"23":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"24":{"start":{"line":42,"column":17},"end":{"line":42,"column":70}},"25":{"start":{"line":43,"column":8},"end":{"line":43,"column":50}},"26":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"27":{"start":{"line":47,"column":6},"end":{"line":48,"column":66}},"28":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"29":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"30":{"start":{"line":53,"column":21},"end":{"line":53,"column":41}},"31":{"start":{"line":54,"column":19},"end":{"line":54,"column":56}},"32":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"33":{"start":{"line":56,"column":8},"end":{"line":56,"column":65}},"34":{"start":{"line":58,"column":6},"end":{"line":58,"column":54}},"35":{"start":{"line":62,"column":2},"end":{"line":65,"column":4}},"36":{"start":{"line":63,"column":4},"end":{"line":63,"column":36}},"37":{"start":{"line":64,"column":4},"end":{"line":64,"column":15}},"38":{"start":{"line":67,"column":2},"end":{"line":69,"column":4}},"39":{"start":{"line":68,"column":4},"end":{"line":68,"column":25}},"40":{"start":{"line":71,"column":2},"end":{"line":73,"column":4}},"41":{"start":{"line":72,"column":4},"end":{"line":72,"column":20}},"42":{"start":{"line":79,"column":2},"end":{"line":84,"column":4}},"43":{"start":{"line":81,"column":4},"end":{"line":81,"column":21}},"44":{"start":{"line":82,"column":4},"end":{"line":82,"column":18}},"45":{"start":{"line":83,"column":4},"end":{"line":83,"column":20}},"46":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"47":{"start":{"line":89,"column":0},"end":{"line":94,"column":1}},"48":{"start":{"line":90,"column":11},"end":{"line":90,"column":15}},"49":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"50":{"start":{"line":91,"column":31},"end":{"line":91,"column":57}},"51":{"start":{"line":92,"column":2},"end":{"line":92,"column":15}}},"fnMap":{"0":{"name":"Extract","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":16}},"loc":{"start":{"line":10,"column":24},"end":{"line":85,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":17},"end":{"line":35,"column":18}},"loc":{"start":{"line":35,"column":34},"end":{"line":60,"column":3}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":36},"end":{"line":65,"column":3}},"line":62},"3":{"name":"(anonymous_3)","decl":{"start":{"line":67,"column":24},"end":{"line":67,"column":25}},"loc":{"start":{"line":67,"column":38},"end":{"line":69,"column":3}},"line":67},"4":{"name":"(anonymous_4)","decl":{"start":{"line":71,"column":24},"end":{"line":71,"column":25}},"loc":{"start":{"line":71,"column":35},"end":{"line":73,"column":3}},"line":71},"5":{"name":"(anonymous_5)","decl":{"start":{"line":79,"column":24},"end":{"line":79,"column":25}},"loc":{"start":{"line":79,"column":36},"end":{"line":84,"column":3}},"line":79},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":31},"end":{"line":89,"column":32}},"loc":{"start":{"line":89,"column":43},"end":{"line":94,"column":1}},"line":89}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},{"start":{"line":11,"column":2},"end":{"line":11,"column":58}}],"line":11},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},{"start":{"line":14,"column":2},"end":{"line":16,"column":3}}],"line":14},"2":{"loc":{"start":{"line":19,"column":14},"end":{"line":19,"column":59}},"type":"binary-expr","locations":[{"start":{"line":19,"column":14},"end":{"line":19,"column":23}},{"start":{"line":19,"column":27},"end":{"line":19,"column":59}}],"line":19},"3":{"loc":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"type":"if","locations":[{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},{"start":{"line":25,"column":2},"end":{"line":25,"column":52}}],"line":25},"4":{"loc":{"start":{"line":25,"column":6},"end":{"line":25,"column":36}},"type":"binary-expr","locations":[{"start":{"line":25,"column":6},"end":{"line":25,"column":17}},{"start":{"line":25,"column":21},"end":{"line":25,"column":36}}],"line":25},"5":{"loc":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},{"start":{"line":38,"column":4},"end":{"line":45,"column":5}}],"line":38},"6":{"loc":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},{"start":{"line":41,"column":6},"end":{"line":44,"column":7}}],"line":41},"7":{"loc":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},{"start":{"line":46,"column":4},"end":{"line":49,"column":5}}],"line":46},"8":{"loc":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},{"start":{"line":51,"column":4},"end":{"line":59,"column":5}}],"line":51},"9":{"loc":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"type":"binary-expr","locations":[{"start":{"line":52,"column":15},"end":{"line":52,"column":39}},{"start":{"line":52,"column":43},"end":{"line":52,"column":45}}],"line":52},"10":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},{"start":{"line":55,"column":6},"end":{"line":57,"column":7}}],"line":55},"11":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},{"start":{"line":91,"column":2},"end":{"line":91,"column":57}}],"line":91},"12":{"loc":{"start":{"line":91,"column":6},"end":{"line":91,"column":29}},"type":"binary-expr","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":16}},{"start":{"line":91,"column":20},"end":{"line":91,"column":29}}],"line":91}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":2,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":10,"21":0,"22":0,"23":0,"24":0,"25":0,"26":10,"27":1,"28":10,"29":1,"30":1,"31":1,"32":1,"33":0,"34":1,"35":1,"36":1,"37":1,"38":1,"39":0,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":0,"51":1},"f":{"0":2,"1":10,"2":1,"3":0,"4":1,"5":1,"6":1},"b":{"0":[1,1],"1":[1,0],"2":[1,0],"3":[1,0],"4":[1,0],"5":[0,10],"6":[0,0],"7":[1,9],"8":[1,9],"9":[1,0],"10":[0,1],"11":[0,1],"12":[1,1]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3fb9f60facc409fe944dc36bd2e14fc6153e403d","contentHash":"3d9485ca58c6c768b022a39d276296b53647ccf39986885459406e933921c962"}} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/ea0194cb-f599-402f-8876-84fb8251e8db.json b/node_modules/tar/.nyc_output/ea0194cb-f599-402f-8876-84fb8251e8db.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/node_modules/tar/.nyc_output/ea0194cb-f599-402f-8876-84fb8251e8db.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/eda6b7a3-5e15-440f-8619-e11a15a07f77.json b/node_modules/tar/.nyc_output/eda6b7a3-5e15-440f-8619-e11a15a07f77.json new file mode 100644 index 00000000..750861fe --- /dev/null +++ b/node_modules/tar/.nyc_output/eda6b7a3-5e15-440f-8619-e11a15a07f77.json @@ -0,0 +1 @@ +{"/Users/isaacs/dev/js/tar/lib/pack.js":{"path":"/Users/isaacs/dev/js/tar/lib/pack.js","statementMap":{"0":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}},"1":{"start":{"line":6,"column":18},"end":{"line":6,"column":46}},"2":{"start":{"line":7,"column":13},"end":{"line":7,"column":37}},"3":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"4":{"start":{"line":9,"column":15},"end":{"line":9,"column":34}},"5":{"start":{"line":10,"column":25},"end":{"line":10,"column":61}},"6":{"start":{"line":11,"column":14},"end":{"line":11,"column":40}},"7":{"start":{"line":12,"column":10},"end":{"line":12,"column":25}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"9":{"start":{"line":14,"column":13},"end":{"line":14,"column":14}},"10":{"start":{"line":14,"column":31},"end":{"line":14,"column":41}},"11":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"12":{"start":{"line":20,"column":11},"end":{"line":20,"column":15}},"13":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"14":{"start":{"line":21,"column":29},"end":{"line":21,"column":51}},"15":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"16":{"start":{"line":23,"column":13},"end":{"line":23,"column":52}},"17":{"start":{"line":24,"column":7},"end":{"line":24,"column":32}},"18":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"19":{"start":{"line":28,"column":2},"end":{"line":28,"column":20}},"20":{"start":{"line":29,"column":2},"end":{"line":29,"column":20}},"21":{"start":{"line":30,"column":2},"end":{"line":30,"column":17}},"22":{"start":{"line":32,"column":2},"end":{"line":32,"column":25}},"23":{"start":{"line":33,"column":2},"end":{"line":33,"column":24}},"24":{"start":{"line":35,"column":2},"end":{"line":35,"column":21}},"25":{"start":{"line":36,"column":2},"end":{"line":43,"column":4}},"26":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"27":{"start":{"line":37,"column":35},"end":{"line":37,"column":41}},"28":{"start":{"line":38,"column":4},"end":{"line":38,"column":22}},"29":{"start":{"line":39,"column":4},"end":{"line":41,"column":6}},"30":{"start":{"line":40,"column":6},"end":{"line":40,"column":25}},"31":{"start":{"line":42,"column":4},"end":{"line":42,"column":15}},"32":{"start":{"line":46,"column":0},"end":{"line":57,"column":1}},"33":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"34":{"start":{"line":48,"column":23},"end":{"line":48,"column":29}},"35":{"start":{"line":49,"column":2},"end":{"line":49,"column":24}},"36":{"start":{"line":51,"column":11},"end":{"line":51,"column":15}},"37":{"start":{"line":52,"column":2},"end":{"line":56,"column":10}},"38":{"start":{"line":54,"column":6},"end":{"line":54,"column":24}},"39":{"start":{"line":59,"column":0},"end":{"line":69,"column":1}},"40":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"41":{"start":{"line":60,"column":40},"end":{"line":60,"column":68}},"42":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"43":{"start":{"line":62,"column":19},"end":{"line":62,"column":72}},"44":{"start":{"line":64,"column":2},"end":{"line":64,"column":17}},"45":{"start":{"line":65,"column":2},"end":{"line":65,"column":27}},"46":{"start":{"line":66,"column":2},"end":{"line":66,"column":17}},"47":{"start":{"line":67,"column":2},"end":{"line":67,"column":43}},"48":{"start":{"line":68,"column":2},"end":{"line":68,"column":25}},"49":{"start":{"line":71,"column":0},"end":{"line":75,"column":1}},"50":{"start":{"line":72,"column":2},"end":{"line":72,"column":21}},"51":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"52":{"start":{"line":73,"column":26},"end":{"line":73,"column":52}},"53":{"start":{"line":74,"column":2},"end":{"line":74,"column":20}},"54":{"start":{"line":77,"column":0},"end":{"line":82,"column":1}},"55":{"start":{"line":78,"column":2},"end":{"line":78,"column":22}},"56":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"57":{"start":{"line":79,"column":26},"end":{"line":79,"column":53}},"58":{"start":{"line":80,"column":2},"end":{"line":80,"column":21}},"59":{"start":{"line":81,"column":2},"end":{"line":81,"column":17}},"60":{"start":{"line":84,"column":0},"end":{"line":88,"column":1}},"61":{"start":{"line":85,"column":2},"end":{"line":85,"column":20}},"62":{"start":{"line":86,"column":2},"end":{"line":86,"column":24}},"63":{"start":{"line":87,"column":2},"end":{"line":87,"column":17}},"64":{"start":{"line":90,"column":0},"end":{"line":233,"column":1}},"65":{"start":{"line":91,"column":11},"end":{"line":91,"column":15}},"66":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"67":{"start":{"line":93,"column":4},"end":{"line":93,"column":10}},"68":{"start":{"line":96,"column":14},"end":{"line":96,"column":32}},"69":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"70":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"71":{"start":{"line":100,"column":6},"end":{"line":100,"column":22}},"72":{"start":{"line":102,"column":4},"end":{"line":102,"column":10}},"73":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"74":{"start":{"line":107,"column":4},"end":{"line":107,"column":29}},"75":{"start":{"line":108,"column":4},"end":{"line":111,"column":6}},"76":{"start":{"line":110,"column":6},"end":{"line":110,"column":19}},"77":{"start":{"line":112,"column":4},"end":{"line":112,"column":10}},"78":{"start":{"line":115,"column":2},"end":{"line":115,"column":23}},"79":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"80":{"start":{"line":119,"column":4},"end":{"line":119,"column":24}},"81":{"start":{"line":120,"column":4},"end":{"line":120,"column":24}},"82":{"start":{"line":121,"column":4},"end":{"line":121,"column":18}},"83":{"start":{"line":122,"column":4},"end":{"line":122,"column":20}},"84":{"start":{"line":123,"column":4},"end":{"line":123,"column":10}},"85":{"start":{"line":134,"column":13},"end":{"line":134,"column":53}},"86":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"87":{"start":{"line":137,"column":4},"end":{"line":137,"column":27}},"88":{"start":{"line":140,"column":15},"end":{"line":140,"column":17}},"89":{"start":{"line":142,"column":2},"end":{"line":144,"column":4}},"90":{"start":{"line":143,"column":4},"end":{"line":143,"column":30}},"91":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"92":{"start":{"line":146,"column":25},"end":{"line":146,"column":52}},"93":{"start":{"line":148,"column":2},"end":{"line":148,"column":53}},"94":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"95":{"start":{"line":152,"column":4},"end":{"line":152,"column":49}},"96":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"97":{"start":{"line":156,"column":4},"end":{"line":156,"column":29}},"98":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"99":{"start":{"line":161,"column":6},"end":{"line":161,"column":12}},"100":{"start":{"line":164,"column":6},"end":{"line":164,"column":24}},"101":{"start":{"line":165,"column":6},"end":{"line":165,"column":21}},"102":{"start":{"line":166,"column":6},"end":{"line":166,"column":11}},"103":{"start":{"line":169,"column":15},"end":{"line":169,"column":69}},"104":{"start":{"line":170,"column":6},"end":{"line":170,"column":54}},"105":{"start":{"line":171,"column":6},"end":{"line":171,"column":21}},"106":{"start":{"line":172,"column":6},"end":{"line":172,"column":11}},"107":{"start":{"line":175,"column":15},"end":{"line":175,"column":69}},"108":{"start":{"line":176,"column":6},"end":{"line":176,"column":74}},"109":{"start":{"line":177,"column":6},"end":{"line":177,"column":21}},"110":{"start":{"line":178,"column":6},"end":{"line":178,"column":11}},"111":{"start":{"line":187,"column":15},"end":{"line":187,"column":53}},"112":{"start":{"line":189,"column":2},"end":{"line":189,"column":20}},"113":{"start":{"line":195,"column":2},"end":{"line":197,"column":4}},"114":{"start":{"line":196,"column":4},"end":{"line":196,"column":22}},"115":{"start":{"line":199,"column":2},"end":{"line":205,"column":4}},"116":{"start":{"line":200,"column":4},"end":{"line":202,"column":5}},"117":{"start":{"line":201,"column":6},"end":{"line":201,"column":50}},"118":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"119":{"start":{"line":204,"column":33},"end":{"line":204,"column":44}},"120":{"start":{"line":206,"column":2},"end":{"line":206,"column":31}},"121":{"start":{"line":208,"column":14},"end":{"line":208,"column":19}},"122":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"123":{"start":{"line":210,"column":15},"end":{"line":210,"column":21}},"124":{"start":{"line":211,"column":4},"end":{"line":211,"column":16}},"125":{"start":{"line":215,"column":4},"end":{"line":215,"column":27}},"126":{"start":{"line":216,"column":4},"end":{"line":216,"column":26}},"127":{"start":{"line":217,"column":4},"end":{"line":217,"column":17}},"128":{"start":{"line":220,"column":2},"end":{"line":223,"column":4}},"129":{"start":{"line":222,"column":4},"end":{"line":222,"column":24}},"130":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"131":{"start":{"line":229,"column":4},"end":{"line":229,"column":21}},"132":{"start":{"line":232,"column":2},"end":{"line":232,"column":20}},"133":{"start":{"line":235,"column":0},"end":{"line":235,"column":39}},"134":{"start":{"line":236,"column":0},"end":{"line":236,"column":37}}},"fnMap":{"0":{"name":"Pack","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":13}},"loc":{"start":{"line":18,"column":22},"end":{"line":44,"column":1}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":36,"column":16},"end":{"line":36,"column":17}},"loc":{"start":{"line":36,"column":31},"end":{"line":43,"column":3}},"line":36},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":18},"end":{"line":39,"column":19}},"loc":{"start":{"line":39,"column":30},"end":{"line":41,"column":5}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":27},"end":{"line":46,"column":28}},"loc":{"start":{"line":46,"column":44},"end":{"line":57,"column":1}},"line":46},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":29},"end":{"line":55,"column":5}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":21},"end":{"line":59,"column":22}},"loc":{"start":{"line":59,"column":39},"end":{"line":69,"column":1}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":71,"column":23},"end":{"line":71,"column":24}},"loc":{"start":{"line":71,"column":35},"end":{"line":75,"column":1}},"line":71},"7":{"name":"(anonymous_7)","decl":{"start":{"line":77,"column":24},"end":{"line":77,"column":25}},"loc":{"start":{"line":77,"column":36},"end":{"line":82,"column":1}},"line":77},"8":{"name":"(anonymous_8)","decl":{"start":{"line":84,"column":21},"end":{"line":84,"column":22}},"loc":{"start":{"line":84,"column":33},"end":{"line":88,"column":1}},"line":84},"9":{"name":"(anonymous_9)","decl":{"start":{"line":90,"column":26},"end":{"line":90,"column":27}},"loc":{"start":{"line":90,"column":38},"end":{"line":233,"column":1}},"line":90},"10":{"name":"(anonymous_10)","decl":{"start":{"line":108,"column":22},"end":{"line":108,"column":23}},"loc":{"start":{"line":108,"column":34},"end":{"line":111,"column":5}},"line":108},"11":{"name":"(anonymous_11)","decl":{"start":{"line":142,"column":41},"end":{"line":142,"column":42}},"loc":{"start":{"line":142,"column":54},"end":{"line":144,"column":3}},"line":142},"12":{"name":"(anonymous_12)","decl":{"start":{"line":195,"column":20},"end":{"line":195,"column":21}},"loc":{"start":{"line":195,"column":33},"end":{"line":197,"column":3}},"line":195},"13":{"name":"(anonymous_13)","decl":{"start":{"line":199,"column":22},"end":{"line":199,"column":23}},"loc":{"start":{"line":199,"column":34},"end":{"line":205,"column":3}},"line":199},"14":{"name":"(anonymous_14)","decl":{"start":{"line":200,"column":30},"end":{"line":200,"column":31}},"loc":{"start":{"line":200,"column":42},"end":{"line":202,"column":5}},"line":200},"15":{"name":"nextEntry","decl":{"start":{"line":209,"column":11},"end":{"line":209,"column":20}},"loc":{"start":{"line":209,"column":24},"end":{"line":218,"column":3}},"line":209},"16":{"name":"(anonymous_16)","decl":{"start":{"line":220,"column":21},"end":{"line":220,"column":22}},"loc":{"start":{"line":220,"column":35},"end":{"line":223,"column":3}},"line":220},"17":{"name":"(anonymous_17)","decl":{"start":{"line":235,"column":25},"end":{"line":235,"column":26}},"loc":{"start":{"line":235,"column":37},"end":{"line":235,"column":39}},"line":235},"18":{"name":"(anonymous_18)","decl":{"start":{"line":236,"column":23},"end":{"line":236,"column":24}},"loc":{"start":{"line":236,"column":35},"end":{"line":236,"column":37}},"line":236}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},{"start":{"line":21,"column":2},"end":{"line":21,"column":51}}],"line":21},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},{"start":{"line":23,"column":2},"end":{"line":24,"column":32}}],"line":23},"2":{"loc":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},{"start":{"line":37,"column":4},"end":{"line":37,"column":41}}],"line":37},"3":{"loc":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},{"start":{"line":48,"column":2},"end":{"line":48,"column":29}}],"line":48},"4":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},{"start":{"line":60,"column":2},"end":{"line":60,"column":68}}],"line":60},"5":{"loc":{"start":{"line":60,"column":6},"end":{"line":60,"column":38}},"type":"binary-expr","locations":[{"start":{"line":60,"column":6},"end":{"line":60,"column":18}},{"start":{"line":60,"column":22},"end":{"line":60,"column":38}}],"line":60},"6":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},{"start":{"line":62,"column":2},"end":{"line":62,"column":72}}],"line":62},"7":{"loc":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},{"start":{"line":73,"column":2},"end":{"line":73,"column":52}}],"line":73},"8":{"loc":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},{"start":{"line":79,"column":2},"end":{"line":79,"column":53}}],"line":79},"9":{"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},{"start":{"line":92,"column":2},"end":{"line":94,"column":3}}],"line":92},"10":{"loc":{"start":{"line":92,"column":6},"end":{"line":92,"column":34}},"type":"binary-expr","locations":[{"start":{"line":92,"column":6},"end":{"line":92,"column":16}},{"start":{"line":92,"column":20},"end":{"line":92,"column":34}}],"line":92},"11":{"loc":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},{"start":{"line":98,"column":2},"end":{"line":103,"column":3}}],"line":98},"12":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},{"start":{"line":99,"column":4},"end":{"line":101,"column":5}}],"line":99},"13":{"loc":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},{"start":{"line":105,"column":2},"end":{"line":113,"column":3}}],"line":105},"14":{"loc":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},{"start":{"line":117,"column":2},"end":{"line":124,"column":3}}],"line":117},"15":{"loc":{"start":{"line":134,"column":27},"end":{"line":134,"column":46}},"type":"binary-expr","locations":[{"start":{"line":134,"column":27},"end":{"line":134,"column":37}},{"start":{"line":134,"column":41},"end":{"line":134,"column":46}}],"line":134},"16":{"loc":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},{"start":{"line":135,"column":2},"end":{"line":138,"column":3}}],"line":135},"17":{"loc":{"start":{"line":135,"column":6},"end":{"line":135,"column":72}},"type":"binary-expr","locations":[{"start":{"line":135,"column":6},"end":{"line":135,"column":16}},{"start":{"line":135,"column":20},"end":{"line":135,"column":39}},{"start":{"line":135,"column":43},"end":{"line":135,"column":53}},{"start":{"line":135,"column":57},"end":{"line":135,"column":72}}],"line":135},"18":{"loc":{"start":{"line":142,"column":14},"end":{"line":142,"column":31}},"type":"binary-expr","locations":[{"start":{"line":142,"column":14},"end":{"line":142,"column":25}},{"start":{"line":142,"column":29},"end":{"line":142,"column":31}}],"line":142},"19":{"loc":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"type":"if","locations":[{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},{"start":{"line":146,"column":2},"end":{"line":146,"column":52}}],"line":146},"20":{"loc":{"start":{"line":148,"column":36},"end":{"line":148,"column":52}},"type":"binary-expr","locations":[{"start":{"line":148,"column":36},"end":{"line":148,"column":46}},{"start":{"line":148,"column":50},"end":{"line":148,"column":52}}],"line":148},"21":{"loc":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},{"start":{"line":151,"column":2},"end":{"line":153,"column":3}}],"line":151},"22":{"loc":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"type":"if","locations":[{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},{"start":{"line":155,"column":2},"end":{"line":156,"column":29}}],"line":155},"23":{"loc":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"type":"switch","locations":[{"start":{"line":160,"column":4},"end":{"line":161,"column":12}},{"start":{"line":163,"column":4},"end":{"line":166,"column":11}},{"start":{"line":168,"column":4},"end":{"line":172,"column":11}},{"start":{"line":174,"column":4},"end":{"line":178,"column":11}}],"line":158},"24":{"loc":{"start":{"line":170,"column":24},"end":{"line":170,"column":54}},"type":"binary-expr","locations":[{"start":{"line":170,"column":24},"end":{"line":170,"column":47}},{"start":{"line":170,"column":51},"end":{"line":170,"column":54}}],"line":170},"25":{"loc":{"start":{"line":176,"column":24},"end":{"line":176,"column":74}},"type":"binary-expr","locations":[{"start":{"line":176,"column":24},"end":{"line":176,"column":67}},{"start":{"line":176,"column":71},"end":{"line":176,"column":74}}],"line":176},"26":{"loc":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"type":"if","locations":[{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},{"start":{"line":204,"column":4},"end":{"line":204,"column":44}}],"line":204},"27":{"loc":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"type":"if","locations":[{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},{"start":{"line":210,"column":4},"end":{"line":210,"column":21}}],"line":210},"28":{"loc":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},{"start":{"line":227,"column":2},"end":{"line":230,"column":3}}],"line":227}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":512,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":1,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":1,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1,"50":0,"51":0,"52":0,"53":0,"54":1,"55":0,"56":0,"57":0,"58":0,"59":0,"60":1,"61":0,"62":0,"63":0,"64":1,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":1,"134":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0,0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0,0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"8beb16ccde52e484aa1dd87f5ece33d696c808ab","contentHash":"7bb2b7ebe1111c0deefbf9a61d17bf9d2dbe951adb585db96f9d89663ce5909d"},"/Users/isaacs/dev/js/tar/lib/entry-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}},"1":{"start":{"line":3,"column":10},"end":{"line":3,"column":30}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":38}},"3":{"start":{"line":5,"column":12},"end":{"line":5,"column":33}},"4":{"start":{"line":6,"column":15},"end":{"line":6,"column":34}},"5":{"start":{"line":7,"column":18},"end":{"line":7,"column":41}},"6":{"start":{"line":9,"column":13},"end":{"line":9,"column":37}},"7":{"start":{"line":10,"column":10},"end":{"line":10,"column":12}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":29}},"9":{"start":{"line":15,"column":11},"end":{"line":15,"column":15}},"10":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"11":{"start":{"line":18,"column":4},"end":{"line":18,"column":33}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":20}},"13":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"14":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":35}},"16":{"start":{"line":28,"column":2},"end":{"line":30,"column":4}},"17":{"start":{"line":29,"column":4},"end":{"line":29,"column":22}},"18":{"start":{"line":32,"column":2},"end":{"line":34,"column":4}},"19":{"start":{"line":33,"column":4},"end":{"line":33,"column":20}},"20":{"start":{"line":36,"column":2},"end":{"line":39,"column":4}},"21":{"start":{"line":37,"column":4},"end":{"line":37,"column":18}},"22":{"start":{"line":38,"column":4},"end":{"line":38,"column":20}},"23":{"start":{"line":41,"column":2},"end":{"line":41,"column":18}},"24":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"25":{"start":{"line":43,"column":4},"end":{"line":43,"column":18}},"26":{"start":{"line":45,"column":2},"end":{"line":45,"column":25}},"27":{"start":{"line":46,"column":2},"end":{"line":46,"column":23}},"28":{"start":{"line":47,"column":2},"end":{"line":47,"column":22}},"29":{"start":{"line":49,"column":2},"end":{"line":49,"column":17}},"30":{"start":{"line":50,"column":2},"end":{"line":50,"column":23}},"31":{"start":{"line":51,"column":2},"end":{"line":51,"column":18}},"32":{"start":{"line":53,"column":2},"end":{"line":55,"column":4}},"33":{"start":{"line":54,"column":4},"end":{"line":54,"column":17}},"34":{"start":{"line":58,"column":0},"end":{"line":65,"column":1}},"35":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"36":{"start":{"line":60,"column":19},"end":{"line":60,"column":74}},"37":{"start":{"line":61,"column":2},"end":{"line":61,"column":22}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":17}},"39":{"start":{"line":63,"column":2},"end":{"line":63,"column":43}},"40":{"start":{"line":64,"column":2},"end":{"line":64,"column":25}},"41":{"start":{"line":67,"column":0},"end":{"line":74,"column":1}},"42":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"43":{"start":{"line":69,"column":9},"end":{"line":69,"column":29}},"44":{"start":{"line":70,"column":2},"end":{"line":70,"column":24}},"45":{"start":{"line":71,"column":2},"end":{"line":71,"column":20}},"46":{"start":{"line":72,"column":2},"end":{"line":72,"column":17}},"47":{"start":{"line":73,"column":2},"end":{"line":73,"column":43}},"48":{"start":{"line":76,"column":0},"end":{"line":80,"column":1}},"49":{"start":{"line":78,"column":2},"end":{"line":78,"column":21}},"50":{"start":{"line":79,"column":2},"end":{"line":79,"column":20}},"51":{"start":{"line":82,"column":0},"end":{"line":87,"column":1}},"52":{"start":{"line":84,"column":2},"end":{"line":84,"column":22}},"53":{"start":{"line":85,"column":2},"end":{"line":85,"column":21}},"54":{"start":{"line":86,"column":2},"end":{"line":86,"column":17}},"55":{"start":{"line":89,"column":0},"end":{"line":98,"column":1}},"56":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"57":{"start":{"line":91,"column":20},"end":{"line":91,"column":69}},"58":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"59":{"start":{"line":95,"column":20},"end":{"line":95,"column":30}},"60":{"start":{"line":97,"column":2},"end":{"line":97,"column":31}},"61":{"start":{"line":100,"column":0},"end":{"line":126,"column":1}},"62":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"63":{"start":{"line":102,"column":23},"end":{"line":102,"column":29}},"64":{"start":{"line":103,"column":2},"end":{"line":103,"column":24}},"65":{"start":{"line":105,"column":20},"end":{"line":105,"column":48}},"66":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"67":{"start":{"line":108,"column":13},"end":{"line":108,"column":17}},"68":{"start":{"line":110,"column":4},"end":{"line":111,"column":44}},"69":{"start":{"line":113,"column":4},"end":{"line":120,"column":12}},"70":{"start":{"line":115,"column":8},"end":{"line":115,"column":26}},"71":{"start":{"line":118,"column":8},"end":{"line":118,"column":28}},"72":{"start":{"line":124,"column":2},"end":{"line":124,"column":32}},"73":{"start":{"line":125,"column":2},"end":{"line":125,"column":21}},"74":{"start":{"line":128,"column":0},"end":{"line":167,"column":1}},"75":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"76":{"start":{"line":131,"column":4},"end":{"line":131,"column":18}},"77":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"78":{"start":{"line":136,"column":4},"end":{"line":136,"column":10}},"79":{"start":{"line":139,"column":2},"end":{"line":139,"column":25}},"80":{"start":{"line":141,"column":12},"end":{"line":141,"column":24}},"81":{"start":{"line":142,"column":2},"end":{"line":159,"column":3}},"82":{"start":{"line":142,"column":15},"end":{"line":142,"column":16}},"83":{"start":{"line":145,"column":12},"end":{"line":145,"column":18}},"84":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"85":{"start":{"line":147,"column":19},"end":{"line":147,"column":37}},"86":{"start":{"line":148,"column":9},"end":{"line":148,"column":30}},"87":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"88":{"start":{"line":152,"column":6},"end":{"line":152,"column":30}},"89":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"90":{"start":{"line":154,"column":8},"end":{"line":154,"column":30}},"91":{"start":{"line":155,"column":8},"end":{"line":155,"column":39}},"92":{"start":{"line":157,"column":6},"end":{"line":157,"column":12}},"93":{"start":{"line":162,"column":2},"end":{"line":162,"column":25}},"94":{"start":{"line":163,"column":2},"end":{"line":163,"column":26}},"95":{"start":{"line":166,"column":2},"end":{"line":166,"column":20}},"96":{"start":{"line":169,"column":0},"end":{"line":169,"column":46}}},"fnMap":{"0":{"name":"EntryWriter","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":20}},"loc":{"start":{"line":14,"column":29},"end":{"line":56,"column":1}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":25}},"loc":{"start":{"line":28,"column":37},"end":{"line":30,"column":3}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":25},"end":{"line":32,"column":26}},"loc":{"start":{"line":32,"column":37},"end":{"line":34,"column":3}},"line":32},"3":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":23},"end":{"line":36,"column":24}},"loc":{"start":{"line":36,"column":35},"end":{"line":39,"column":3}},"line":36},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":28},"end":{"line":55,"column":3}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":30},"end":{"line":58,"column":31}},"loc":{"start":{"line":58,"column":43},"end":{"line":65,"column":1}},"line":58},"6":{"name":"(anonymous_6)","decl":{"start":{"line":67,"column":28},"end":{"line":67,"column":29}},"loc":{"start":{"line":67,"column":41},"end":{"line":74,"column":1}},"line":67},"7":{"name":"(anonymous_7)","decl":{"start":{"line":76,"column":30},"end":{"line":76,"column":31}},"loc":{"start":{"line":76,"column":42},"end":{"line":80,"column":1}},"line":76},"8":{"name":"(anonymous_8)","decl":{"start":{"line":82,"column":31},"end":{"line":82,"column":32}},"loc":{"start":{"line":82,"column":43},"end":{"line":87,"column":1}},"line":82},"9":{"name":"(anonymous_9)","decl":{"start":{"line":89,"column":28},"end":{"line":89,"column":29}},"loc":{"start":{"line":89,"column":45},"end":{"line":98,"column":1}},"line":89},"10":{"name":"(anonymous_10)","decl":{"start":{"line":100,"column":32},"end":{"line":100,"column":33}},"loc":{"start":{"line":100,"column":44},"end":{"line":126,"column":1}},"line":100},"11":{"name":"(anonymous_11)","decl":{"start":{"line":114,"column":18},"end":{"line":114,"column":19}},"loc":{"start":{"line":114,"column":31},"end":{"line":116,"column":7}},"line":114},"12":{"name":"(anonymous_12)","decl":{"start":{"line":117,"column":19},"end":{"line":117,"column":20}},"loc":{"start":{"line":117,"column":33},"end":{"line":119,"column":7}},"line":117},"13":{"name":"(anonymous_13)","decl":{"start":{"line":128,"column":33},"end":{"line":128,"column":34}},"loc":{"start":{"line":128,"column":45},"end":{"line":167,"column":1}},"line":128},"14":{"name":"(anonymous_14)","decl":{"start":{"line":169,"column":32},"end":{"line":169,"column":33}},"loc":{"start":{"line":169,"column":44},"end":{"line":169,"column":46}},"line":169}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"1":{"loc":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},{"start":{"line":42,"column":2},"end":{"line":44,"column":3}}],"line":42},"2":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},{"start":{"line":60,"column":2},"end":{"line":60,"column":74}}],"line":60},"3":{"loc":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},{"start":{"line":69,"column":2},"end":{"line":69,"column":29}}],"line":69},"4":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},{"start":{"line":91,"column":2},"end":{"line":91,"column":69}}],"line":91},"5":{"loc":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},{"start":{"line":95,"column":2},"end":{"line":95,"column":30}}],"line":95},"6":{"loc":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"type":"if","locations":[{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},{"start":{"line":102,"column":2},"end":{"line":102,"column":29}}],"line":102},"7":{"loc":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},{"start":{"line":107,"column":2},"end":{"line":121,"column":3}}],"line":107},"8":{"loc":{"start":{"line":107,"column":6},"end":{"line":107,"column":44}},"type":"binary-expr","locations":[{"start":{"line":107,"column":6},"end":{"line":107,"column":29}},{"start":{"line":107,"column":33},"end":{"line":107,"column":44}}],"line":107},"9":{"loc":{"start":{"line":110,"column":27},"end":{"line":111,"column":44}},"type":"binary-expr","locations":[{"start":{"line":110,"column":27},"end":{"line":110,"column":47}},{"start":{"line":111,"column":6},"end":{"line":111,"column":44}}],"line":110},"10":{"loc":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},{"start":{"line":130,"column":2},"end":{"line":132,"column":3}}],"line":130},"11":{"loc":{"start":{"line":130,"column":6},"end":{"line":130,"column":37}},"type":"binary-expr","locations":[{"start":{"line":130,"column":6},"end":{"line":130,"column":22}},{"start":{"line":130,"column":26},"end":{"line":130,"column":37}}],"line":130},"12":{"loc":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"type":"if","locations":[{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},{"start":{"line":134,"column":2},"end":{"line":137,"column":3}}],"line":134},"13":{"loc":{"start":{"line":134,"column":6},"end":{"line":134,"column":38}},"type":"binary-expr","locations":[{"start":{"line":134,"column":6},"end":{"line":134,"column":18}},{"start":{"line":134,"column":22},"end":{"line":134,"column":38}}],"line":134},"14":{"loc":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"type":"if","locations":[{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},{"start":{"line":147,"column":4},"end":{"line":148,"column":30}}],"line":147},"15":{"loc":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},{"start":{"line":150,"column":4},"end":{"line":158,"column":5}}],"line":150},"16":{"loc":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"type":"if","locations":[{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},{"start":{"line":153,"column":6},"end":{"line":156,"column":7}}],"line":153}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":1,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":1,"49":0,"50":0,"51":1,"52":0,"53":0,"54":0,"55":1,"56":0,"57":0,"58":0,"59":0,"60":0,"61":1,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":1,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3e169418508e031df78186ff63b5fa5aa2484ab8","contentHash":"84191ed4732b6763ae8701256051735aebbe5e95c932c15bef34da01b33ba1a0"},"/Users/isaacs/dev/js/tar/lib/entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry.js","statementMap":{"0":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"1":{"start":{"line":9,"column":16},"end":{"line":9,"column":38}},"2":{"start":{"line":10,"column":10},"end":{"line":10,"column":27}},"3":{"start":{"line":11,"column":13},"end":{"line":11,"column":33}},"4":{"start":{"line":12,"column":13},"end":{"line":12,"column":37}},"5":{"start":{"line":13,"column":15},"end":{"line":13,"column":34}},"6":{"start":{"line":14,"column":14},"end":{"line":14,"column":41}},"7":{"start":{"line":17,"column":2},"end":{"line":17,"column":19}},"8":{"start":{"line":18,"column":2},"end":{"line":18,"column":22}},"9":{"start":{"line":19,"column":2},"end":{"line":19,"column":22}},"10":{"start":{"line":21,"column":2},"end":{"line":21,"column":25}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":22}},"12":{"start":{"line":23,"column":2},"end":{"line":23,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":22}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":21}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":21}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":21}},"17":{"start":{"line":28,"column":2},"end":{"line":28,"column":18}},"18":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"19":{"start":{"line":30,"column":2},"end":{"line":30,"column":20}},"20":{"start":{"line":32,"column":2},"end":{"line":32,"column":36}},"21":{"start":{"line":34,"column":2},"end":{"line":34,"column":17}},"22":{"start":{"line":35,"column":2},"end":{"line":35,"column":23}},"23":{"start":{"line":36,"column":2},"end":{"line":36,"column":33}},"24":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"25":{"start":{"line":41,"column":11},"end":{"line":41,"column":15}},"26":{"start":{"line":42,"column":2},"end":{"line":44,"column":4}},"27":{"start":{"line":43,"column":4},"end":{"line":43,"column":29}},"28":{"start":{"line":46,"column":2},"end":{"line":46,"column":18}},"29":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"30":{"start":{"line":51,"column":0},"end":{"line":78,"column":1}},"31":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"32":{"start":{"line":52,"column":20},"end":{"line":52,"column":65}},"33":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"34":{"start":{"line":54,"column":4},"end":{"line":54,"column":40}},"35":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"36":{"start":{"line":60,"column":4},"end":{"line":60,"column":35}},"37":{"start":{"line":62,"column":2},"end":{"line":62,"column":29}},"38":{"start":{"line":65,"column":11},"end":{"line":65,"column":25}},"39":{"start":{"line":66,"column":2},"end":{"line":66,"column":21}},"40":{"start":{"line":67,"column":2},"end":{"line":67,"column":19}},"41":{"start":{"line":69,"column":2},"end":{"line":69,"column":14}},"42":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"43":{"start":{"line":73,"column":4},"end":{"line":73,"column":26}},"44":{"start":{"line":74,"column":4},"end":{"line":74,"column":16}},"45":{"start":{"line":77,"column":2},"end":{"line":77,"column":13}},"46":{"start":{"line":80,"column":0},"end":{"line":84,"column":1}},"47":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"48":{"start":{"line":81,"column":9},"end":{"line":81,"column":22}},"49":{"start":{"line":82,"column":2},"end":{"line":82,"column":21}},"50":{"start":{"line":83,"column":2},"end":{"line":83,"column":14}},"51":{"start":{"line":86,"column":0},"end":{"line":89,"column":1}},"52":{"start":{"line":87,"column":2},"end":{"line":87,"column":21}},"53":{"start":{"line":88,"column":2},"end":{"line":88,"column":20}},"54":{"start":{"line":91,"column":0},"end":{"line":97,"column":1}},"55":{"start":{"line":93,"column":2},"end":{"line":93,"column":21}},"56":{"start":{"line":94,"column":2},"end":{"line":94,"column":22}},"57":{"start":{"line":95,"column":2},"end":{"line":95,"column":14}},"58":{"start":{"line":96,"column":2},"end":{"line":96,"column":41}},"59":{"start":{"line":100,"column":0},"end":{"line":139,"column":1}},"60":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"61":{"start":{"line":103,"column":52},"end":{"line":103,"column":58}},"62":{"start":{"line":107,"column":2},"end":{"line":107,"column":22}},"63":{"start":{"line":110,"column":2},"end":{"line":113,"column":3}},"64":{"start":{"line":111,"column":16},"end":{"line":111,"column":43}},"65":{"start":{"line":112,"column":4},"end":{"line":112,"column":28}},"66":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"67":{"start":{"line":117,"column":4},"end":{"line":117,"column":57}},"68":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"69":{"start":{"line":119,"column":6},"end":{"line":119,"column":29}},"70":{"start":{"line":120,"column":6},"end":{"line":120,"column":24}},"71":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"72":{"start":{"line":123,"column":6},"end":{"line":123,"column":24}},"73":{"start":{"line":124,"column":6},"end":{"line":124,"column":22}},"74":{"start":{"line":130,"column":12},"end":{"line":130,"column":29}},"75":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"76":{"start":{"line":132,"column":4},"end":{"line":132,"column":36}},"77":{"start":{"line":133,"column":4},"end":{"line":133,"column":22}},"78":{"start":{"line":134,"column":4},"end":{"line":134,"column":25}},"79":{"start":{"line":135,"column":4},"end":{"line":135,"column":40}},"80":{"start":{"line":138,"column":2},"end":{"line":138,"column":23}},"81":{"start":{"line":141,"column":0},"end":{"line":211,"column":1}},"82":{"start":{"line":143,"column":15},"end":{"line":143,"column":27}},"83":{"start":{"line":144,"column":17},"end":{"line":144,"column":31}},"84":{"start":{"line":145,"column":15},"end":{"line":145,"column":27}},"85":{"start":{"line":146,"column":14},"end":{"line":146,"column":24}},"86":{"start":{"line":149,"column":15},"end":{"line":149,"column":25}},"87":{"start":{"line":150,"column":2},"end":{"line":154,"column":3}},"88":{"start":{"line":150,"column":15},"end":{"line":150,"column":16}},"89":{"start":{"line":151,"column":16},"end":{"line":151,"column":25}},"90":{"start":{"line":152,"column":14},"end":{"line":152,"column":27}},"91":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"92":{"start":{"line":153,"column":36},"end":{"line":153,"column":54}},"93":{"start":{"line":158,"column":3},"end":{"line":165,"column":3}},"94":{"start":{"line":159,"column":4},"end":{"line":161,"column":6}},"95":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"96":{"start":{"line":160,"column":39},"end":{"line":160,"column":54}},"97":{"start":{"line":165,"column":3},"end":{"line":173,"column":3}},"98":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"99":{"start":{"line":167,"column":6},"end":{"line":167,"column":40}},"100":{"start":{"line":173,"column":3},"end":{"line":177,"column":4}},"101":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"102":{"start":{"line":175,"column":6},"end":{"line":175,"column":42}},"103":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"104":{"start":{"line":184,"column":6},"end":{"line":184,"column":19}},"105":{"start":{"line":185,"column":6},"end":{"line":185,"column":11}},"106":{"start":{"line":188,"column":6},"end":{"line":188,"column":24}},"107":{"start":{"line":189,"column":6},"end":{"line":189,"column":11}},"108":{"start":{"line":192,"column":6},"end":{"line":192,"column":22}},"109":{"start":{"line":193,"column":6},"end":{"line":193,"column":11}},"110":{"start":{"line":202,"column":6},"end":{"line":202,"column":34}},"111":{"start":{"line":205,"column":2},"end":{"line":205,"column":18}},"112":{"start":{"line":206,"column":2},"end":{"line":206,"column":24}},"113":{"start":{"line":207,"column":2},"end":{"line":207,"column":24}},"114":{"start":{"line":210,"column":2},"end":{"line":210,"column":30}},"115":{"start":{"line":215,"column":0},"end":{"line":217,"column":1}},"116":{"start":{"line":216,"column":2},"end":{"line":216,"column":20}},"117":{"start":{"line":219,"column":0},"end":{"line":219,"column":35}},"118":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}}},"fnMap":{"0":{"name":"Entry","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":14}},"loc":{"start":{"line":16,"column":42},"end":{"line":47,"column":1}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":36},"end":{"line":42,"column":37}},"loc":{"start":{"line":42,"column":49},"end":{"line":44,"column":3}},"line":42},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":24},"end":{"line":51,"column":25}},"loc":{"start":{"line":51,"column":37},"end":{"line":78,"column":1}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":80,"column":22},"end":{"line":80,"column":23}},"loc":{"start":{"line":80,"column":35},"end":{"line":84,"column":1}},"line":80},"4":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":24},"end":{"line":86,"column":25}},"loc":{"start":{"line":86,"column":36},"end":{"line":89,"column":1}},"line":86},"5":{"name":"(anonymous_5)","decl":{"start":{"line":91,"column":25},"end":{"line":91,"column":26}},"loc":{"start":{"line":91,"column":37},"end":{"line":97,"column":1}},"line":91},"6":{"name":"(anonymous_6)","decl":{"start":{"line":100,"column":24},"end":{"line":100,"column":25}},"loc":{"start":{"line":100,"column":36},"end":{"line":139,"column":1}},"line":100},"7":{"name":"(anonymous_7)","decl":{"start":{"line":141,"column":28},"end":{"line":141,"column":29}},"loc":{"start":{"line":141,"column":40},"end":{"line":211,"column":1}},"line":141},"8":{"name":"(anonymous_8)","decl":{"start":{"line":158,"column":30},"end":{"line":158,"column":31}},"loc":{"start":{"line":158,"column":43},"end":{"line":162,"column":3}},"line":158},"9":{"name":"(anonymous_9)","decl":{"start":{"line":159,"column":27},"end":{"line":159,"column":28}},"loc":{"start":{"line":159,"column":40},"end":{"line":161,"column":5}},"line":159},"10":{"name":"(anonymous_10)","decl":{"start":{"line":165,"column":32},"end":{"line":165,"column":33}},"loc":{"start":{"line":165,"column":45},"end":{"line":169,"column":3}},"line":165},"11":{"name":"(anonymous_11)","decl":{"start":{"line":173,"column":39},"end":{"line":173,"column":40}},"loc":{"start":{"line":173,"column":52},"end":{"line":177,"column":3}},"line":173},"12":{"name":"(anonymous_12)","decl":{"start":{"line":215,"column":24},"end":{"line":215,"column":25}},"loc":{"start":{"line":215,"column":34},"end":{"line":217,"column":1}},"line":215}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":19},"end":{"line":36,"column":33}},"type":"binary-expr","locations":[{"start":{"line":36,"column":19},"end":{"line":36,"column":27}},{"start":{"line":36,"column":31},"end":{"line":36,"column":33}}],"line":36},"1":{"loc":{"start":{"line":42,"column":14},"end":{"line":42,"column":26}},"type":"binary-expr","locations":[{"start":{"line":42,"column":14},"end":{"line":42,"column":20}},{"start":{"line":42,"column":24},"end":{"line":42,"column":26}}],"line":42},"2":{"loc":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},{"start":{"line":52,"column":2},"end":{"line":52,"column":65}}],"line":52},"3":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},{"start":{"line":53,"column":2},"end":{"line":55,"column":3}}],"line":53},"4":{"loc":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},{"start":{"line":59,"column":2},"end":{"line":61,"column":3}}],"line":59},"5":{"loc":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},{"start":{"line":72,"column":2},"end":{"line":75,"column":3}}],"line":72},"6":{"loc":{"start":{"line":72,"column":6},"end":{"line":72,"column":28}},"type":"binary-expr","locations":[{"start":{"line":72,"column":6},"end":{"line":72,"column":18}},{"start":{"line":72,"column":22},"end":{"line":72,"column":28}}],"line":72},"7":{"loc":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},{"start":{"line":81,"column":2},"end":{"line":81,"column":22}}],"line":81},"8":{"loc":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},{"start":{"line":103,"column":2},"end":{"line":103,"column":58}}],"line":103},"9":{"loc":{"start":{"line":103,"column":6},"end":{"line":103,"column":50}},"type":"binary-expr","locations":[{"start":{"line":103,"column":6},"end":{"line":103,"column":18}},{"start":{"line":103,"column":22},"end":{"line":103,"column":35}},{"start":{"line":103,"column":39},"end":{"line":103,"column":50}}],"line":103},"10":{"loc":{"start":{"line":110,"column":9},"end":{"line":110,"column":54}},"type":"binary-expr","locations":[{"start":{"line":110,"column":9},"end":{"line":110,"column":37}},{"start":{"line":110,"column":41},"end":{"line":110,"column":54}}],"line":110},"11":{"loc":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},{"start":{"line":116,"column":2},"end":{"line":126,"column":3}}],"line":116},"12":{"loc":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},{"start":{"line":118,"column":4},"end":{"line":121,"column":5}}],"line":118},"13":{"loc":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"type":"if","locations":[{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},{"start":{"line":122,"column":4},"end":{"line":125,"column":5}}],"line":122},"14":{"loc":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},{"start":{"line":131,"column":2},"end":{"line":136,"column":3}}],"line":131},"15":{"loc":{"start":{"line":131,"column":6},"end":{"line":131,"column":45}},"type":"binary-expr","locations":[{"start":{"line":131,"column":6},"end":{"line":131,"column":26}},{"start":{"line":131,"column":30},"end":{"line":131,"column":45}}],"line":131},"16":{"loc":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"type":"if","locations":[{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},{"start":{"line":153,"column":4},"end":{"line":153,"column":54}}],"line":153},"17":{"loc":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"type":"if","locations":[{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},{"start":{"line":160,"column":6},"end":{"line":160,"column":54}}],"line":160},"18":{"loc":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"type":"if","locations":[{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},{"start":{"line":166,"column":4},"end":{"line":168,"column":5}}],"line":166},"19":{"loc":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"type":"if","locations":[{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},{"start":{"line":174,"column":4},"end":{"line":176,"column":5}}],"line":174},"20":{"loc":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"type":"switch","locations":[{"start":{"line":182,"column":4},"end":{"line":182,"column":19}},{"start":{"line":183,"column":4},"end":{"line":185,"column":11}},{"start":{"line":187,"column":4},"end":{"line":189,"column":11}},{"start":{"line":191,"column":4},"end":{"line":193,"column":11}},{"start":{"line":195,"column":4},"end":{"line":195,"column":16}},{"start":{"line":196,"column":4},"end":{"line":196,"column":24}},{"start":{"line":197,"column":4},"end":{"line":197,"column":27}},{"start":{"line":198,"column":4},"end":{"line":198,"column":23}},{"start":{"line":199,"column":4},"end":{"line":199,"column":21}},{"start":{"line":200,"column":4},"end":{"line":200,"column":16}},{"start":{"line":201,"column":4},"end":{"line":202,"column":34}}],"line":181}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"18":2,"19":2,"20":2,"21":2,"22":2,"23":2,"24":2,"25":2,"26":2,"27":0,"28":2,"29":1,"30":1,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":1,"47":2,"48":0,"49":2,"50":2,"51":1,"52":2,"53":2,"54":1,"55":3,"56":3,"57":3,"58":3,"59":1,"60":5,"61":4,"62":1,"63":1,"64":0,"65":0,"66":1,"67":1,"68":1,"69":0,"70":0,"71":1,"72":1,"73":1,"74":1,"75":1,"76":0,"77":0,"78":0,"79":0,"80":1,"81":1,"82":2,"83":2,"84":2,"85":2,"86":2,"87":2,"88":2,"89":34,"90":34,"91":34,"92":32,"93":2,"94":4,"95":0,"96":0,"97":2,"98":4,"99":4,"100":2,"101":6,"102":2,"103":2,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":2,"111":2,"112":2,"113":2,"114":2,"115":1,"116":0,"117":1,"118":1},"f":{"0":2,"1":0,"2":0,"3":2,"4":2,"5":3,"6":5,"7":2,"8":4,"9":0,"10":4,"11":6,"12":0},"b":{"0":[2,2],"1":[2,2],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,2],"8":[4,1],"9":[5,3,2],"10":[1,0],"11":[1,0],"12":[0,1],"13":[1,0],"14":[0,1],"15":[1,0],"16":[32,2],"17":[0,0],"18":[4,0],"19":[2,4],"20":[0,0,0,0,0,0,0,0,2,2,2]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"2cc4f925db2a60e89bf0743124faec4e8996dfdb","contentHash":"245d5cb2b23d975dc5b9a0ed2553c93c587727d50a7961242f50cec333c04ba9"},"/Users/isaacs/dev/js/tar/lib/global-header-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/global-header-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"1":{"start":{"line":3,"column":27},"end":{"line":3,"column":65}},"2":{"start":{"line":4,"column":15},"end":{"line":4,"column":34}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":50}},"4":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":40}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":40}},"7":{"start":{"line":13,"column":2},"end":{"line":13,"column":23}}},"fnMap":{"0":{"name":"GlobalHeaderWriter","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":27}},"loc":{"start":{"line":8,"column":36},"end":{"line":14,"column":1}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},{"start":{"line":9,"column":2},"end":{"line":11,"column":3}}],"line":9}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0},"f":{"0":0},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3d0c8589f62a5c8ccec606d52d3abd98e5627d57","contentHash":"a2570ca840cf3e44d77e15af0aee52f7c145da39b76366006f3672b9708def3e"},"/Users/isaacs/dev/js/tar/lib/parse.js":{"path":"/Users/isaacs/dev/js/tar/lib/parse.js","statementMap":{"0":{"start":{"line":6,"column":0},"end":{"line":6,"column":37}},"1":{"start":{"line":8,"column":13},"end":{"line":8,"column":30}},"2":{"start":{"line":9,"column":13},"end":{"line":9,"column":26}},"3":{"start":{"line":10,"column":18},"end":{"line":10,"column":41}},"4":{"start":{"line":11,"column":10},"end":{"line":11,"column":30}},"5":{"start":{"line":12,"column":16},"end":{"line":12,"column":38}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":46}},"8":{"start":{"line":15,"column":21},"end":{"line":15,"column":52}},"9":{"start":{"line":16,"column":13},"end":{"line":16,"column":33}},"10":{"start":{"line":17,"column":15},"end":{"line":17,"column":34}},"11":{"start":{"line":18,"column":14},"end":{"line":18,"column":32}},"12":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"13":{"start":{"line":28,"column":11},"end":{"line":28,"column":15}},"14":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"15":{"start":{"line":29,"column":30},"end":{"line":29,"column":48}},"16":{"start":{"line":34,"column":2},"end":{"line":34,"column":18}},"17":{"start":{"line":36,"column":2},"end":{"line":36,"column":20}},"18":{"start":{"line":37,"column":2},"end":{"line":37,"column":20}},"19":{"start":{"line":38,"column":2},"end":{"line":38,"column":35}},"20":{"start":{"line":39,"column":2},"end":{"line":39,"column":17}},"21":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"22":{"start":{"line":41,"column":2},"end":{"line":41,"column":20}},"23":{"start":{"line":43,"column":2},"end":{"line":45,"column":4}},"24":{"start":{"line":44,"column":4},"end":{"line":44,"column":23}},"25":{"start":{"line":47,"column":2},"end":{"line":49,"column":4}},"26":{"start":{"line":48,"column":4},"end":{"line":48,"column":18}},"27":{"start":{"line":51,"column":2},"end":{"line":53,"column":4}},"28":{"start":{"line":52,"column":4},"end":{"line":52,"column":19}},"29":{"start":{"line":55,"column":2},"end":{"line":57,"column":4}},"30":{"start":{"line":56,"column":4},"end":{"line":56,"column":20}},"31":{"start":{"line":63,"column":0},"end":{"line":67,"column":1}},"32":{"start":{"line":64,"column":11},"end":{"line":64,"column":15}},"33":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"34":{"start":{"line":65,"column":31},"end":{"line":65,"column":57}},"35":{"start":{"line":66,"column":2},"end":{"line":66,"column":16}},"36":{"start":{"line":72,"column":0},"end":{"line":83,"column":1}},"37":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"38":{"start":{"line":77,"column":4},"end":{"line":79,"column":5}},"39":{"start":{"line":77,"column":17},"end":{"line":77,"column":18}},"40":{"start":{"line":77,"column":24},"end":{"line":77,"column":32}},"41":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"42":{"start":{"line":78,"column":22},"end":{"line":78,"column":62}},"43":{"start":{"line":80,"column":4},"end":{"line":80,"column":10}},"44":{"start":{"line":82,"column":2},"end":{"line":82,"column":30}},"45":{"start":{"line":85,"column":0},"end":{"line":88,"column":1}},"46":{"start":{"line":86,"column":2},"end":{"line":86,"column":20}},"47":{"start":{"line":87,"column":2},"end":{"line":87,"column":28}},"48":{"start":{"line":94,"column":0},"end":{"line":94,"column":38}},"49":{"start":{"line":96,"column":0},"end":{"line":137,"column":1}},"50":{"start":{"line":97,"column":2},"end":{"line":97,"column":59}},"51":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"52":{"start":{"line":105,"column":16},"end":{"line":105,"column":27}},"53":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"54":{"start":{"line":106,"column":22},"end":{"line":106,"column":36}},"55":{"start":{"line":108,"column":6},"end":{"line":108,"column":34}},"56":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"57":{"start":{"line":109,"column":31},"end":{"line":109,"column":51}},"58":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"59":{"start":{"line":112,"column":6},"end":{"line":112,"column":17}},"60":{"start":{"line":113,"column":6},"end":{"line":113,"column":24}},"61":{"start":{"line":117,"column":15},"end":{"line":117,"column":19}},"62":{"start":{"line":118,"column":4},"end":{"line":120,"column":5}},"63":{"start":{"line":118,"column":17},"end":{"line":118,"column":18}},"64":{"start":{"line":119,"column":6},"end":{"line":119,"column":23}},"65":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"66":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"67":{"start":{"line":128,"column":8},"end":{"line":128,"column":26}},"68":{"start":{"line":129,"column":6},"end":{"line":129,"column":29}},"69":{"start":{"line":131,"column":6},"end":{"line":131,"column":30}},"70":{"start":{"line":132,"column":6},"end":{"line":132,"column":25}},"71":{"start":{"line":136,"column":2},"end":{"line":136,"column":22}},"72":{"start":{"line":140,"column":0},"end":{"line":285,"column":1}},"73":{"start":{"line":141,"column":15},"end":{"line":141,"column":31}},"74":{"start":{"line":142,"column":13},"end":{"line":142,"column":17}},"75":{"start":{"line":147,"column":13},"end":{"line":147,"column":18}},"76":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"77":{"start":{"line":150,"column":12},"end":{"line":150,"column":41}},"78":{"start":{"line":151,"column":4},"end":{"line":151,"column":21}},"79":{"start":{"line":152,"column":4},"end":{"line":152,"column":37}},"80":{"start":{"line":153,"column":4},"end":{"line":153,"column":37}},"81":{"start":{"line":154,"column":4},"end":{"line":154,"column":32}},"82":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"83":{"start":{"line":171,"column":6},"end":{"line":171,"column":23}},"84":{"start":{"line":172,"column":6},"end":{"line":172,"column":18}},"85":{"start":{"line":173,"column":6},"end":{"line":173,"column":11}},"86":{"start":{"line":177,"column":6},"end":{"line":177,"column":32}},"87":{"start":{"line":178,"column":6},"end":{"line":183,"column":7}},"88":{"start":{"line":179,"column":8},"end":{"line":179,"column":41}},"89":{"start":{"line":180,"column":8},"end":{"line":182,"column":10}},"90":{"start":{"line":181,"column":10},"end":{"line":181,"column":43}},"91":{"start":{"line":184,"column":6},"end":{"line":184,"column":33}},"92":{"start":{"line":185,"column":6},"end":{"line":185,"column":17}},"93":{"start":{"line":186,"column":6},"end":{"line":186,"column":11}},"94":{"start":{"line":191,"column":6},"end":{"line":191,"column":32}},"95":{"start":{"line":192,"column":6},"end":{"line":194,"column":7}},"96":{"start":{"line":193,"column":8},"end":{"line":193,"column":37}},"97":{"start":{"line":195,"column":6},"end":{"line":195,"column":27}},"98":{"start":{"line":196,"column":6},"end":{"line":196,"column":17}},"99":{"start":{"line":197,"column":6},"end":{"line":197,"column":11}},"100":{"start":{"line":201,"column":6},"end":{"line":201,"column":29}},"101":{"start":{"line":202,"column":6},"end":{"line":205,"column":7}},"102":{"start":{"line":203,"column":8},"end":{"line":203,"column":45}},"103":{"start":{"line":204,"column":8},"end":{"line":204,"column":44}},"104":{"start":{"line":206,"column":6},"end":{"line":206,"column":25}},"105":{"start":{"line":207,"column":6},"end":{"line":207,"column":17}},"106":{"start":{"line":208,"column":6},"end":{"line":208,"column":11}},"107":{"start":{"line":213,"column":6},"end":{"line":213,"column":29}},"108":{"start":{"line":214,"column":6},"end":{"line":217,"column":7}},"109":{"start":{"line":215,"column":8},"end":{"line":215,"column":45}},"110":{"start":{"line":216,"column":8},"end":{"line":216,"column":40}},"111":{"start":{"line":218,"column":6},"end":{"line":218,"column":21}},"112":{"start":{"line":219,"column":6},"end":{"line":219,"column":17}},"113":{"start":{"line":220,"column":6},"end":{"line":220,"column":11}},"114":{"start":{"line":226,"column":6},"end":{"line":226,"column":23}},"115":{"start":{"line":227,"column":6},"end":{"line":227,"column":25}},"116":{"start":{"line":228,"column":6},"end":{"line":228,"column":11}},"117":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"118":{"start":{"line":233,"column":4},"end":{"line":233,"column":28}},"119":{"start":{"line":235,"column":17},"end":{"line":235,"column":29}},"120":{"start":{"line":236,"column":19},"end":{"line":236,"column":33}},"121":{"start":{"line":240,"column":4},"end":{"line":240,"column":25}},"122":{"start":{"line":242,"column":2},"end":{"line":242,"column":49}},"123":{"start":{"line":243,"column":2},"end":{"line":243,"column":19}},"124":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"125":{"start":{"line":247,"column":4},"end":{"line":249,"column":6}},"126":{"start":{"line":248,"column":6},"end":{"line":248,"column":24}},"127":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"128":{"start":{"line":252,"column":13},"end":{"line":252,"column":35}},"129":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"130":{"start":{"line":255,"column":4},"end":{"line":255,"column":23}},"131":{"start":{"line":258,"column":2},"end":{"line":258,"column":21}},"132":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"133":{"start":{"line":261,"column":4},"end":{"line":261,"column":39}},"134":{"start":{"line":264,"column":11},"end":{"line":264,"column":15}},"135":{"start":{"line":266,"column":2},"end":{"line":268,"column":4}},"136":{"start":{"line":267,"column":4},"end":{"line":267,"column":14}},"137":{"start":{"line":270,"column":2},"end":{"line":272,"column":4}},"138":{"start":{"line":271,"column":4},"end":{"line":271,"column":15}},"139":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"140":{"start":{"line":275,"column":4},"end":{"line":275,"column":29}},"141":{"start":{"line":278,"column":2},"end":{"line":278,"column":22}},"142":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"143":{"start":{"line":282,"column":4},"end":{"line":282,"column":15}},"144":{"start":{"line":283,"column":4},"end":{"line":283,"column":22}}},"fnMap":{"0":{"name":"Parse","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":14}},"loc":{"start":{"line":27,"column":18},"end":{"line":58,"column":1}},"line":27},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":25},"end":{"line":43,"column":26}},"loc":{"start":{"line":43,"column":38},"end":{"line":45,"column":3}},"line":43},"2":{"name":"(anonymous_2)","decl":{"start":{"line":47,"column":24},"end":{"line":47,"column":25}},"loc":{"start":{"line":47,"column":37},"end":{"line":49,"column":3}},"line":47},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":23},"end":{"line":51,"column":24}},"loc":{"start":{"line":51,"column":35},"end":{"line":53,"column":3}},"line":51},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":25},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":37},"end":{"line":57,"column":3}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":63,"column":29},"end":{"line":63,"column":30}},"loc":{"start":{"line":63,"column":41},"end":{"line":67,"column":1}},"line":63},"6":{"name":"(anonymous_6)","decl":{"start":{"line":72,"column":24},"end":{"line":72,"column":25}},"loc":{"start":{"line":72,"column":37},"end":{"line":83,"column":1}},"line":72},"7":{"name":"(anonymous_7)","decl":{"start":{"line":85,"column":22},"end":{"line":85,"column":23}},"loc":{"start":{"line":85,"column":35},"end":{"line":88,"column":1}},"line":85},"8":{"name":"(anonymous_8)","decl":{"start":{"line":94,"column":24},"end":{"line":94,"column":25}},"loc":{"start":{"line":94,"column":36},"end":{"line":94,"column":38}},"line":94},"9":{"name":"(anonymous_9)","decl":{"start":{"line":96,"column":27},"end":{"line":96,"column":28}},"loc":{"start":{"line":96,"column":40},"end":{"line":137,"column":1}},"line":96},"10":{"name":"(anonymous_10)","decl":{"start":{"line":140,"column":30},"end":{"line":140,"column":31}},"loc":{"start":{"line":140,"column":43},"end":{"line":285,"column":1}},"line":140},"11":{"name":"(anonymous_11)","decl":{"start":{"line":178,"column":14},"end":{"line":178,"column":15}},"loc":{"start":{"line":178,"column":26},"end":{"line":183,"column":7}},"line":178},"12":{"name":"(anonymous_12)","decl":{"start":{"line":180,"column":42},"end":{"line":180,"column":43}},"loc":{"start":{"line":180,"column":55},"end":{"line":182,"column":9}},"line":180},"13":{"name":"(anonymous_13)","decl":{"start":{"line":192,"column":14},"end":{"line":192,"column":15}},"loc":{"start":{"line":192,"column":26},"end":{"line":194,"column":7}},"line":192},"14":{"name":"(anonymous_14)","decl":{"start":{"line":202,"column":14},"end":{"line":202,"column":15}},"loc":{"start":{"line":202,"column":26},"end":{"line":205,"column":7}},"line":202},"15":{"name":"(anonymous_15)","decl":{"start":{"line":214,"column":14},"end":{"line":214,"column":15}},"loc":{"start":{"line":214,"column":26},"end":{"line":217,"column":7}},"line":214},"16":{"name":"(anonymous_16)","decl":{"start":{"line":247,"column":21},"end":{"line":247,"column":22}},"loc":{"start":{"line":247,"column":34},"end":{"line":249,"column":5}},"line":247},"17":{"name":"(anonymous_17)","decl":{"start":{"line":266,"column":20},"end":{"line":266,"column":21}},"loc":{"start":{"line":266,"column":32},"end":{"line":268,"column":3}},"line":266},"18":{"name":"(anonymous_18)","decl":{"start":{"line":270,"column":21},"end":{"line":270,"column":22}},"loc":{"start":{"line":270,"column":33},"end":{"line":272,"column":3}},"line":270}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},{"start":{"line":29,"column":2},"end":{"line":29,"column":48}}],"line":29},"1":{"loc":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},{"start":{"line":65,"column":2},"end":{"line":65,"column":57}}],"line":65},"2":{"loc":{"start":{"line":65,"column":6},"end":{"line":65,"column":29}},"type":"binary-expr","locations":[{"start":{"line":65,"column":6},"end":{"line":65,"column":16}},{"start":{"line":65,"column":20},"end":{"line":65,"column":29}}],"line":65},"3":{"loc":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},{"start":{"line":73,"column":2},"end":{"line":81,"column":3}}],"line":73},"4":{"loc":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"type":"if","locations":[{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},{"start":{"line":78,"column":6},"end":{"line":78,"column":62}}],"line":78},"5":{"loc":{"start":{"line":97,"column":9},"end":{"line":97,"column":30}},"type":"binary-expr","locations":[{"start":{"line":97,"column":9},"end":{"line":97,"column":10}},{"start":{"line":97,"column":14},"end":{"line":97,"column":30}}],"line":97},"6":{"loc":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},{"start":{"line":104,"column":2},"end":{"line":134,"column":3}}],"line":104},"7":{"loc":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"type":"if","locations":[{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},{"start":{"line":106,"column":4},"end":{"line":110,"column":5}}],"line":106},"8":{"loc":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"type":"if","locations":[{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},{"start":{"line":109,"column":6},"end":{"line":109,"column":51}}],"line":109},"9":{"loc":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},{"start":{"line":111,"column":4},"end":{"line":114,"column":5}}],"line":111},"10":{"loc":{"start":{"line":118,"column":20},"end":{"line":118,"column":35}},"type":"binary-expr","locations":[{"start":{"line":118,"column":20},"end":{"line":118,"column":27}},{"start":{"line":118,"column":31},"end":{"line":118,"column":35}}],"line":118},"11":{"loc":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"type":"if","locations":[{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},{"start":{"line":126,"column":4},"end":{"line":133,"column":5}}],"line":126},"12":{"loc":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"type":"if","locations":[{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},{"start":{"line":127,"column":6},"end":{"line":128,"column":26}}],"line":127},"13":{"loc":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},{"start":{"line":149,"column":2},"end":{"line":155,"column":3}}],"line":149},"14":{"loc":{"start":{"line":149,"column":6},"end":{"line":149,"column":48}},"type":"binary-expr","locations":[{"start":{"line":149,"column":6},"end":{"line":149,"column":26}},{"start":{"line":149,"column":30},"end":{"line":149,"column":48}}],"line":149},"15":{"loc":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"type":"switch","locations":[{"start":{"line":158,"column":4},"end":{"line":158,"column":16}},{"start":{"line":159,"column":4},"end":{"line":159,"column":19}},{"start":{"line":160,"column":4},"end":{"line":160,"column":16}},{"start":{"line":161,"column":4},"end":{"line":161,"column":24}},{"start":{"line":162,"column":4},"end":{"line":162,"column":27}},{"start":{"line":163,"column":4},"end":{"line":163,"column":23}},{"start":{"line":164,"column":4},"end":{"line":164,"column":21}},{"start":{"line":165,"column":4},"end":{"line":165,"column":16}},{"start":{"line":166,"column":4},"end":{"line":166,"column":26}},{"start":{"line":167,"column":4},"end":{"line":173,"column":11}},{"start":{"line":175,"column":4},"end":{"line":186,"column":11}},{"start":{"line":188,"column":4},"end":{"line":188,"column":26}},{"start":{"line":189,"column":4},"end":{"line":197,"column":11}},{"start":{"line":199,"column":4},"end":{"line":208,"column":11}},{"start":{"line":210,"column":4},"end":{"line":210,"column":31}},{"start":{"line":211,"column":4},"end":{"line":220,"column":11}},{"start":{"line":222,"column":4},"end":{"line":228,"column":11}}],"line":157},"16":{"loc":{"start":{"line":179,"column":23},"end":{"line":179,"column":41}},"type":"binary-expr","locations":[{"start":{"line":179,"column":23},"end":{"line":179,"column":35}},{"start":{"line":179,"column":39},"end":{"line":179,"column":41}}],"line":179},"17":{"loc":{"start":{"line":203,"column":25},"end":{"line":203,"column":45}},"type":"binary-expr","locations":[{"start":{"line":203,"column":25},"end":{"line":203,"column":39}},{"start":{"line":203,"column":43},"end":{"line":203,"column":45}}],"line":203},"18":{"loc":{"start":{"line":215,"column":25},"end":{"line":215,"column":45}},"type":"binary-expr","locations":[{"start":{"line":215,"column":25},"end":{"line":215,"column":39}},{"start":{"line":215,"column":43},"end":{"line":215,"column":45}}],"line":215},"19":{"loc":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},{"start":{"line":232,"column":2},"end":{"line":241,"column":3}}],"line":232},"20":{"loc":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},{"start":{"line":246,"column":2},"end":{"line":250,"column":3}}],"line":246},"21":{"loc":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"type":"if","locations":[{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},{"start":{"line":252,"column":2},"end":{"line":252,"column":35}}],"line":252},"22":{"loc":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},{"start":{"line":254,"column":2},"end":{"line":256,"column":3}}],"line":254},"23":{"loc":{"start":{"line":254,"column":6},"end":{"line":254,"column":58}},"type":"binary-expr","locations":[{"start":{"line":254,"column":6},"end":{"line":254,"column":27}},{"start":{"line":254,"column":31},"end":{"line":254,"column":58}}],"line":254},"24":{"loc":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},{"start":{"line":260,"column":2},"end":{"line":262,"column":3}}],"line":260},"25":{"loc":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"type":"if","locations":[{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},{"start":{"line":274,"column":2},"end":{"line":276,"column":3}}],"line":274},"26":{"loc":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"type":"if","locations":[{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},{"start":{"line":281,"column":2},"end":{"line":284,"column":3}}],"line":281}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":0,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":0,"25":1,"26":4,"27":1,"28":1,"29":1,"30":1,"31":1,"32":0,"33":0,"34":0,"35":0,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":4,"51":4,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":4,"62":4,"63":4,"64":1026,"65":4,"66":2,"67":1,"68":2,"69":2,"70":2,"71":4,"72":1,"73":2,"74":2,"75":2,"76":2,"77":0,"78":0,"79":0,"80":0,"81":0,"82":2,"83":2,"84":2,"85":2,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":2,"118":0,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":0,"127":2,"128":0,"129":2,"130":0,"131":2,"132":2,"133":0,"134":2,"135":2,"136":2,"137":2,"138":3,"139":2,"140":0,"141":2,"142":2,"143":2,"144":2},"f":{"0":1,"1":0,"2":4,"3":1,"4":1,"5":0,"6":1,"7":1,"8":4,"9":4,"10":2,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":2,"18":3},"b":{"0":[0,1],"1":[0,0],"2":[0,0],"3":[0,1],"4":[0,0],"5":[4,4],"6":[0,4],"7":[0,0],"8":[0,0],"9":[0,0],"10":[1030,1028],"11":[2,2],"12":[1,1],"13":[0,2],"14":[2,2],"15":[0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,2],"20":[2,0],"21":[0,2],"22":[0,2],"23":[2,0],"24":[0,2],"25":[0,2],"26":[2,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"4a8f51a3a12b59eb69694618530032a813fbf8cb","contentHash":"d347e73abcd3109143efee20401d9f0bfc6d68a4a6323bd4559ada44c741786a"},"/Users/isaacs/dev/js/tar/lib/buffer-entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/buffer-entry.js","statementMap":{"0":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"1":{"start":{"line":10,"column":15},"end":{"line":10,"column":34}},"2":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"3":{"start":{"line":14,"column":2},"end":{"line":14,"column":30}},"4":{"start":{"line":15,"column":2},"end":{"line":15,"column":44}},"5":{"start":{"line":16,"column":2},"end":{"line":16,"column":18}},"6":{"start":{"line":17,"column":2},"end":{"line":17,"column":16}},"7":{"start":{"line":18,"column":2},"end":{"line":20,"column":4}},"8":{"start":{"line":19,"column":4},"end":{"line":19,"column":52}},"9":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"10":{"start":{"line":26,"column":0},"end":{"line":30,"column":1}},"11":{"start":{"line":27,"column":2},"end":{"line":27,"column":36}},"12":{"start":{"line":28,"column":2},"end":{"line":28,"column":26}},"13":{"start":{"line":29,"column":2},"end":{"line":29,"column":37}}},"fnMap":{"0":{"name":"BufferEntry","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":24},"end":{"line":21,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":17},"end":{"line":18,"column":18}},"loc":{"start":{"line":18,"column":29},"end":{"line":20,"column":3}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":30},"end":{"line":26,"column":31}},"loc":{"start":{"line":26,"column":43},"end":{"line":30,"column":1}},"line":26}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":1,"10":1,"11":0,"12":0,"13":0},"f":{"0":0,"1":0,"2":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"d8ad66df900443c9c9d8aefe5fc126a55ba268ec","contentHash":"25e5b3c51e476fcffac7affa191a0ed0f54d64d3d3b760e887bd45ba08fffa65"},"/Users/isaacs/dev/js/tar/lib/extended-header.js":{"path":"/Users/isaacs/dev/js/tar/lib/extended-header.js","statementMap":{"0":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"1":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"2":{"start":{"line":12,"column":15},"end":{"line":12,"column":34}},"3":{"start":{"line":13,"column":10},"end":{"line":13,"column":30}},"4":{"start":{"line":14,"column":14},"end":{"line":14,"column":25}},"5":{"start":{"line":15,"column":15},"end":{"line":17,"column":42}},"6":{"start":{"line":20,"column":2},"end":{"line":20,"column":30}},"7":{"start":{"line":21,"column":2},"end":{"line":21,"column":30}},"8":{"start":{"line":22,"column":2},"end":{"line":22,"column":18}},"9":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"10":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":20}},"12":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"13":{"start":{"line":27,"column":2},"end":{"line":27,"column":19}},"14":{"start":{"line":28,"column":2},"end":{"line":28,"column":19}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"16":{"start":{"line":30,"column":2},"end":{"line":30,"column":16}},"17":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"18":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"19":{"start":{"line":36,"column":8},"end":{"line":36,"column":9}},"20":{"start":{"line":37,"column":13},"end":{"line":37,"column":39}},"21":{"start":{"line":38,"column":11},"end":{"line":38,"column":28}},"22":{"start":{"line":39,"column":11},"end":{"line":39,"column":28}},"23":{"start":{"line":40,"column":11},"end":{"line":40,"column":28}},"24":{"start":{"line":41,"column":11},"end":{"line":41,"column":28}},"25":{"start":{"line":43,"column":0},"end":{"line":45,"column":2}},"26":{"start":{"line":44,"column":2},"end":{"line":44,"column":31}},"27":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"28":{"start":{"line":50,"column":9},"end":{"line":50,"column":26}},"29":{"start":{"line":51,"column":9},"end":{"line":51,"column":26}},"30":{"start":{"line":52,"column":12},"end":{"line":52,"column":29}},"31":{"start":{"line":53,"column":8},"end":{"line":53,"column":25}},"32":{"start":{"line":54,"column":8},"end":{"line":54,"column":25}},"33":{"start":{"line":55,"column":8},"end":{"line":55,"column":25}},"34":{"start":{"line":56,"column":8},"end":{"line":56,"column":25}},"35":{"start":{"line":57,"column":12},"end":{"line":57,"column":29}},"36":{"start":{"line":58,"column":9},"end":{"line":58,"column":26}},"37":{"start":{"line":59,"column":9},"end":{"line":59,"column":27}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"39":{"start":{"line":62,"column":27},"end":{"line":62,"column":33}},"40":{"start":{"line":64,"column":2},"end":{"line":130,"column":3}},"41":{"start":{"line":64,"column":16},"end":{"line":64,"column":17}},"42":{"start":{"line":64,"column":23},"end":{"line":64,"column":31}},"43":{"start":{"line":69,"column":12},"end":{"line":69,"column":16}},"44":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"45":{"start":{"line":72,"column":6},"end":{"line":72,"column":53}},"46":{"start":{"line":73,"column":6},"end":{"line":73,"column":12}},"47":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"48":{"start":{"line":77,"column":16},"end":{"line":77,"column":22}},"49":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"50":{"start":{"line":82,"column":10},"end":{"line":82,"column":27}},"51":{"start":{"line":84,"column":10},"end":{"line":84,"column":73}},"52":{"start":{"line":85,"column":10},"end":{"line":85,"column":34}},"53":{"start":{"line":86,"column":10},"end":{"line":86,"column":18}},"54":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"55":{"start":{"line":89,"column":10},"end":{"line":89,"column":68}},"56":{"start":{"line":90,"column":10},"end":{"line":90,"column":16}},"57":{"start":{"line":92,"column":8},"end":{"line":92,"column":29}},"58":{"start":{"line":93,"column":8},"end":{"line":93,"column":16}},"59":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"60":{"start":{"line":98,"column":10},"end":{"line":98,"column":27}},"61":{"start":{"line":99,"column":10},"end":{"line":99,"column":57}},"62":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"63":{"start":{"line":100,"column":35},"end":{"line":100,"column":66}},"64":{"start":{"line":101,"column":10},"end":{"line":101,"column":33}},"65":{"start":{"line":102,"column":10},"end":{"line":102,"column":18}},"66":{"start":{"line":104,"column":8},"end":{"line":104,"column":28}},"67":{"start":{"line":105,"column":8},"end":{"line":105,"column":16}},"68":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"69":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"70":{"start":{"line":112,"column":12},"end":{"line":112,"column":55}},"71":{"start":{"line":113,"column":12},"end":{"line":113,"column":18}},"72":{"start":{"line":115,"column":20},"end":{"line":115,"column":55}},"73":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"74":{"start":{"line":117,"column":12},"end":{"line":117,"column":33}},"75":{"start":{"line":119,"column":10},"end":{"line":119,"column":38}},"76":{"start":{"line":121,"column":10},"end":{"line":121,"column":33}},"77":{"start":{"line":122,"column":10},"end":{"line":122,"column":28}},"78":{"start":{"line":123,"column":10},"end":{"line":123,"column":25}},"79":{"start":{"line":124,"column":10},"end":{"line":124,"column":29}},"80":{"start":{"line":125,"column":10},"end":{"line":125,"column":18}},"81":{"start":{"line":127,"column":8},"end":{"line":127,"column":28}},"82":{"start":{"line":128,"column":8},"end":{"line":128,"column":16}},"83":{"start":{"line":134,"column":2},"end":{"line":136,"column":42}},"84":{"start":{"line":138,"column":2},"end":{"line":138,"column":15}},"85":{"start":{"line":139,"column":2},"end":{"line":139,"column":16}}},"fnMap":{"0":{"name":"ExtendedHeader","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":23}},"loc":{"start":{"line":19,"column":27},"end":{"line":31,"column":1}},"line":19},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":28},"end":{"line":43,"column":29}},"loc":{"start":{"line":43,"column":41},"end":{"line":45,"column":1}},"line":43},"2":{"name":"parse","decl":{"start":{"line":61,"column":9},"end":{"line":61,"column":14}},"loc":{"start":{"line":61,"column":19},"end":{"line":131,"column":1}},"line":61},"3":{"name":"error","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":14}},"loc":{"start":{"line":133,"column":25},"end":{"line":140,"column":1}},"line":133}},"branchMap":{"0":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},{"start":{"line":62,"column":2},"end":{"line":62,"column":33}}],"line":62},"1":{"loc":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},{"start":{"line":71,"column":4},"end":{"line":74,"column":5}}],"line":71},"2":{"loc":{"start":{"line":71,"column":8},"end":{"line":71,"column":54}},"type":"binary-expr","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":23}},{"start":{"line":71,"column":27},"end":{"line":71,"column":54}}],"line":71},"3":{"loc":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"type":"switch","locations":[{"start":{"line":77,"column":6},"end":{"line":77,"column":22}},{"start":{"line":79,"column":6},"end":{"line":93,"column":16}},{"start":{"line":95,"column":6},"end":{"line":105,"column":16}},{"start":{"line":107,"column":6},"end":{"line":128,"column":16}}],"line":76},"4":{"loc":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},{"start":{"line":81,"column":8},"end":{"line":87,"column":9}}],"line":81},"5":{"loc":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},{"start":{"line":88,"column":8},"end":{"line":91,"column":9}}],"line":88},"6":{"loc":{"start":{"line":88,"column":12},"end":{"line":88,"column":28}},"type":"binary-expr","locations":[{"start":{"line":88,"column":12},"end":{"line":88,"column":18}},{"start":{"line":88,"column":22},"end":{"line":88,"column":28}}],"line":88},"7":{"loc":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"type":"if","locations":[{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},{"start":{"line":97,"column":8},"end":{"line":103,"column":9}}],"line":97},"8":{"loc":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"type":"if","locations":[{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},{"start":{"line":100,"column":10},"end":{"line":100,"column":66}}],"line":100},"9":{"loc":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},{"start":{"line":109,"column":8},"end":{"line":126,"column":9}}],"line":109},"10":{"loc":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"type":"if","locations":[{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},{"start":{"line":111,"column":10},"end":{"line":114,"column":11}}],"line":111},"11":{"loc":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"type":"if","locations":[{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},{"start":{"line":116,"column":10},"end":{"line":118,"column":11}}],"line":116}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":4,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0},"f":{"0":0,"1":4,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0,0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"77cb382c69a46833a08275dbc55bf34db0dcd796","contentHash":"78a790af1726a774425fb478f1423068fe64414b747d89b597baf45139e7ae3d"},"/Users/isaacs/dev/js/tar/lib/extract.js":{"path":"/Users/isaacs/dev/js/tar/lib/extract.js","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":24}},"1":{"start":{"line":5,"column":10},"end":{"line":5,"column":30}},"2":{"start":{"line":6,"column":14},"end":{"line":6,"column":32}},"3":{"start":{"line":7,"column":15},"end":{"line":7,"column":34}},"4":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"5":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"6":{"start":{"line":11,"column":34},"end":{"line":11,"column":58}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":23}},"8":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"9":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"10":{"start":{"line":19,"column":2},"end":{"line":19,"column":59}},"11":{"start":{"line":20,"column":2},"end":{"line":20,"column":25}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":26}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"15":{"start":{"line":25,"column":38},"end":{"line":25,"column":52}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":34}},"17":{"start":{"line":29,"column":2},"end":{"line":29,"column":14}},"18":{"start":{"line":30,"column":11},"end":{"line":30,"column":15}},"19":{"start":{"line":35,"column":2},"end":{"line":60,"column":4}},"20":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"21":{"start":{"line":39,"column":14},"end":{"line":39,"column":63}},"22":{"start":{"line":40,"column":6},"end":{"line":40,"column":39}},"23":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"24":{"start":{"line":42,"column":17},"end":{"line":42,"column":70}},"25":{"start":{"line":43,"column":8},"end":{"line":43,"column":50}},"26":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"27":{"start":{"line":47,"column":6},"end":{"line":48,"column":66}},"28":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"29":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"30":{"start":{"line":53,"column":21},"end":{"line":53,"column":41}},"31":{"start":{"line":54,"column":19},"end":{"line":54,"column":56}},"32":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"33":{"start":{"line":56,"column":8},"end":{"line":56,"column":65}},"34":{"start":{"line":58,"column":6},"end":{"line":58,"column":54}},"35":{"start":{"line":62,"column":2},"end":{"line":65,"column":4}},"36":{"start":{"line":63,"column":4},"end":{"line":63,"column":36}},"37":{"start":{"line":64,"column":4},"end":{"line":64,"column":15}},"38":{"start":{"line":67,"column":2},"end":{"line":69,"column":4}},"39":{"start":{"line":68,"column":4},"end":{"line":68,"column":25}},"40":{"start":{"line":71,"column":2},"end":{"line":73,"column":4}},"41":{"start":{"line":72,"column":4},"end":{"line":72,"column":20}},"42":{"start":{"line":79,"column":2},"end":{"line":84,"column":4}},"43":{"start":{"line":81,"column":4},"end":{"line":81,"column":21}},"44":{"start":{"line":82,"column":4},"end":{"line":82,"column":18}},"45":{"start":{"line":83,"column":4},"end":{"line":83,"column":20}},"46":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"47":{"start":{"line":89,"column":0},"end":{"line":94,"column":1}},"48":{"start":{"line":90,"column":11},"end":{"line":90,"column":15}},"49":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"50":{"start":{"line":91,"column":31},"end":{"line":91,"column":57}},"51":{"start":{"line":92,"column":2},"end":{"line":92,"column":15}}},"fnMap":{"0":{"name":"Extract","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":16}},"loc":{"start":{"line":10,"column":24},"end":{"line":85,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":17},"end":{"line":35,"column":18}},"loc":{"start":{"line":35,"column":34},"end":{"line":60,"column":3}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":36},"end":{"line":65,"column":3}},"line":62},"3":{"name":"(anonymous_3)","decl":{"start":{"line":67,"column":24},"end":{"line":67,"column":25}},"loc":{"start":{"line":67,"column":38},"end":{"line":69,"column":3}},"line":67},"4":{"name":"(anonymous_4)","decl":{"start":{"line":71,"column":24},"end":{"line":71,"column":25}},"loc":{"start":{"line":71,"column":35},"end":{"line":73,"column":3}},"line":71},"5":{"name":"(anonymous_5)","decl":{"start":{"line":79,"column":24},"end":{"line":79,"column":25}},"loc":{"start":{"line":79,"column":36},"end":{"line":84,"column":3}},"line":79},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":31},"end":{"line":89,"column":32}},"loc":{"start":{"line":89,"column":43},"end":{"line":94,"column":1}},"line":89}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},{"start":{"line":11,"column":2},"end":{"line":11,"column":58}}],"line":11},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},{"start":{"line":14,"column":2},"end":{"line":16,"column":3}}],"line":14},"2":{"loc":{"start":{"line":19,"column":14},"end":{"line":19,"column":59}},"type":"binary-expr","locations":[{"start":{"line":19,"column":14},"end":{"line":19,"column":23}},{"start":{"line":19,"column":27},"end":{"line":19,"column":59}}],"line":19},"3":{"loc":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"type":"if","locations":[{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},{"start":{"line":25,"column":2},"end":{"line":25,"column":52}}],"line":25},"4":{"loc":{"start":{"line":25,"column":6},"end":{"line":25,"column":36}},"type":"binary-expr","locations":[{"start":{"line":25,"column":6},"end":{"line":25,"column":17}},{"start":{"line":25,"column":21},"end":{"line":25,"column":36}}],"line":25},"5":{"loc":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},{"start":{"line":38,"column":4},"end":{"line":45,"column":5}}],"line":38},"6":{"loc":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},{"start":{"line":41,"column":6},"end":{"line":44,"column":7}}],"line":41},"7":{"loc":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},{"start":{"line":46,"column":4},"end":{"line":49,"column":5}}],"line":46},"8":{"loc":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},{"start":{"line":51,"column":4},"end":{"line":59,"column":5}}],"line":51},"9":{"loc":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"type":"binary-expr","locations":[{"start":{"line":52,"column":15},"end":{"line":52,"column":39}},{"start":{"line":52,"column":43},"end":{"line":52,"column":45}}],"line":52},"10":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},{"start":{"line":55,"column":6},"end":{"line":57,"column":7}}],"line":55},"11":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},{"start":{"line":91,"column":2},"end":{"line":91,"column":57}}],"line":91},"12":{"loc":{"start":{"line":91,"column":6},"end":{"line":91,"column":29}},"type":"binary-expr","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":16}},{"start":{"line":91,"column":20},"end":{"line":91,"column":29}}],"line":91}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":2,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":2,"21":0,"22":0,"23":0,"24":0,"25":0,"26":2,"27":0,"28":2,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":0,"42":1,"43":0,"44":0,"45":0,"46":1,"47":1,"48":1,"49":1,"50":0,"51":1},"f":{"0":2,"1":2,"2":1,"3":1,"4":0,"5":0,"6":1},"b":{"0":[1,1],"1":[1,0],"2":[1,0],"3":[1,0],"4":[1,0],"5":[0,2],"6":[0,0],"7":[0,2],"8":[0,2],"9":[0,0],"10":[0,0],"11":[0,1],"12":[1,1]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3fb9f60facc409fe944dc36bd2e14fc6153e403d","contentHash":"3d9485ca58c6c768b022a39d276296b53647ccf39986885459406e933921c962"}} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/fb518800-240c-42ff-811f-79e92708d9db.json b/node_modules/tar/.nyc_output/fb518800-240c-42ff-811f-79e92708d9db.json new file mode 100644 index 00000000..646757b4 --- /dev/null +++ b/node_modules/tar/.nyc_output/fb518800-240c-42ff-811f-79e92708d9db.json @@ -0,0 +1 @@ +{"/Users/isaacs/dev/js/tar/lib/pack.js":{"path":"/Users/isaacs/dev/js/tar/lib/pack.js","statementMap":{"0":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}},"1":{"start":{"line":6,"column":18},"end":{"line":6,"column":46}},"2":{"start":{"line":7,"column":13},"end":{"line":7,"column":37}},"3":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"4":{"start":{"line":9,"column":15},"end":{"line":9,"column":34}},"5":{"start":{"line":10,"column":25},"end":{"line":10,"column":61}},"6":{"start":{"line":11,"column":14},"end":{"line":11,"column":40}},"7":{"start":{"line":12,"column":10},"end":{"line":12,"column":25}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"9":{"start":{"line":14,"column":13},"end":{"line":14,"column":14}},"10":{"start":{"line":14,"column":31},"end":{"line":14,"column":41}},"11":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"12":{"start":{"line":20,"column":11},"end":{"line":20,"column":15}},"13":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"14":{"start":{"line":21,"column":29},"end":{"line":21,"column":51}},"15":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"16":{"start":{"line":23,"column":13},"end":{"line":23,"column":52}},"17":{"start":{"line":24,"column":7},"end":{"line":24,"column":32}},"18":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"19":{"start":{"line":28,"column":2},"end":{"line":28,"column":20}},"20":{"start":{"line":29,"column":2},"end":{"line":29,"column":20}},"21":{"start":{"line":30,"column":2},"end":{"line":30,"column":17}},"22":{"start":{"line":32,"column":2},"end":{"line":32,"column":25}},"23":{"start":{"line":33,"column":2},"end":{"line":33,"column":24}},"24":{"start":{"line":35,"column":2},"end":{"line":35,"column":21}},"25":{"start":{"line":36,"column":2},"end":{"line":43,"column":4}},"26":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"27":{"start":{"line":37,"column":35},"end":{"line":37,"column":41}},"28":{"start":{"line":38,"column":4},"end":{"line":38,"column":22}},"29":{"start":{"line":39,"column":4},"end":{"line":41,"column":6}},"30":{"start":{"line":40,"column":6},"end":{"line":40,"column":25}},"31":{"start":{"line":42,"column":4},"end":{"line":42,"column":15}},"32":{"start":{"line":46,"column":0},"end":{"line":57,"column":1}},"33":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"34":{"start":{"line":48,"column":23},"end":{"line":48,"column":29}},"35":{"start":{"line":49,"column":2},"end":{"line":49,"column":24}},"36":{"start":{"line":51,"column":11},"end":{"line":51,"column":15}},"37":{"start":{"line":52,"column":2},"end":{"line":56,"column":10}},"38":{"start":{"line":54,"column":6},"end":{"line":54,"column":24}},"39":{"start":{"line":59,"column":0},"end":{"line":69,"column":1}},"40":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"41":{"start":{"line":60,"column":40},"end":{"line":60,"column":68}},"42":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"43":{"start":{"line":62,"column":19},"end":{"line":62,"column":72}},"44":{"start":{"line":64,"column":2},"end":{"line":64,"column":17}},"45":{"start":{"line":65,"column":2},"end":{"line":65,"column":27}},"46":{"start":{"line":66,"column":2},"end":{"line":66,"column":17}},"47":{"start":{"line":67,"column":2},"end":{"line":67,"column":43}},"48":{"start":{"line":68,"column":2},"end":{"line":68,"column":25}},"49":{"start":{"line":71,"column":0},"end":{"line":75,"column":1}},"50":{"start":{"line":72,"column":2},"end":{"line":72,"column":21}},"51":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"52":{"start":{"line":73,"column":26},"end":{"line":73,"column":52}},"53":{"start":{"line":74,"column":2},"end":{"line":74,"column":20}},"54":{"start":{"line":77,"column":0},"end":{"line":82,"column":1}},"55":{"start":{"line":78,"column":2},"end":{"line":78,"column":22}},"56":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"57":{"start":{"line":79,"column":26},"end":{"line":79,"column":53}},"58":{"start":{"line":80,"column":2},"end":{"line":80,"column":21}},"59":{"start":{"line":81,"column":2},"end":{"line":81,"column":17}},"60":{"start":{"line":84,"column":0},"end":{"line":88,"column":1}},"61":{"start":{"line":85,"column":2},"end":{"line":85,"column":20}},"62":{"start":{"line":86,"column":2},"end":{"line":86,"column":24}},"63":{"start":{"line":87,"column":2},"end":{"line":87,"column":17}},"64":{"start":{"line":90,"column":0},"end":{"line":233,"column":1}},"65":{"start":{"line":91,"column":11},"end":{"line":91,"column":15}},"66":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"67":{"start":{"line":93,"column":4},"end":{"line":93,"column":10}},"68":{"start":{"line":96,"column":14},"end":{"line":96,"column":32}},"69":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"70":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"71":{"start":{"line":100,"column":6},"end":{"line":100,"column":22}},"72":{"start":{"line":102,"column":4},"end":{"line":102,"column":10}},"73":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"74":{"start":{"line":107,"column":4},"end":{"line":107,"column":29}},"75":{"start":{"line":108,"column":4},"end":{"line":111,"column":6}},"76":{"start":{"line":110,"column":6},"end":{"line":110,"column":19}},"77":{"start":{"line":112,"column":4},"end":{"line":112,"column":10}},"78":{"start":{"line":115,"column":2},"end":{"line":115,"column":23}},"79":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"80":{"start":{"line":119,"column":4},"end":{"line":119,"column":24}},"81":{"start":{"line":120,"column":4},"end":{"line":120,"column":24}},"82":{"start":{"line":121,"column":4},"end":{"line":121,"column":18}},"83":{"start":{"line":122,"column":4},"end":{"line":122,"column":20}},"84":{"start":{"line":123,"column":4},"end":{"line":123,"column":10}},"85":{"start":{"line":134,"column":13},"end":{"line":134,"column":53}},"86":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"87":{"start":{"line":137,"column":4},"end":{"line":137,"column":27}},"88":{"start":{"line":140,"column":15},"end":{"line":140,"column":17}},"89":{"start":{"line":142,"column":2},"end":{"line":144,"column":4}},"90":{"start":{"line":143,"column":4},"end":{"line":143,"column":30}},"91":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"92":{"start":{"line":146,"column":25},"end":{"line":146,"column":52}},"93":{"start":{"line":148,"column":2},"end":{"line":148,"column":53}},"94":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"95":{"start":{"line":152,"column":4},"end":{"line":152,"column":49}},"96":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"97":{"start":{"line":156,"column":4},"end":{"line":156,"column":29}},"98":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"99":{"start":{"line":161,"column":6},"end":{"line":161,"column":12}},"100":{"start":{"line":164,"column":6},"end":{"line":164,"column":24}},"101":{"start":{"line":165,"column":6},"end":{"line":165,"column":21}},"102":{"start":{"line":166,"column":6},"end":{"line":166,"column":11}},"103":{"start":{"line":169,"column":15},"end":{"line":169,"column":69}},"104":{"start":{"line":170,"column":6},"end":{"line":170,"column":54}},"105":{"start":{"line":171,"column":6},"end":{"line":171,"column":21}},"106":{"start":{"line":172,"column":6},"end":{"line":172,"column":11}},"107":{"start":{"line":175,"column":15},"end":{"line":175,"column":69}},"108":{"start":{"line":176,"column":6},"end":{"line":176,"column":74}},"109":{"start":{"line":177,"column":6},"end":{"line":177,"column":21}},"110":{"start":{"line":178,"column":6},"end":{"line":178,"column":11}},"111":{"start":{"line":187,"column":15},"end":{"line":187,"column":53}},"112":{"start":{"line":189,"column":2},"end":{"line":189,"column":20}},"113":{"start":{"line":195,"column":2},"end":{"line":197,"column":4}},"114":{"start":{"line":196,"column":4},"end":{"line":196,"column":22}},"115":{"start":{"line":199,"column":2},"end":{"line":205,"column":4}},"116":{"start":{"line":200,"column":4},"end":{"line":202,"column":5}},"117":{"start":{"line":201,"column":6},"end":{"line":201,"column":50}},"118":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"119":{"start":{"line":204,"column":33},"end":{"line":204,"column":44}},"120":{"start":{"line":206,"column":2},"end":{"line":206,"column":31}},"121":{"start":{"line":208,"column":14},"end":{"line":208,"column":19}},"122":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"123":{"start":{"line":210,"column":15},"end":{"line":210,"column":21}},"124":{"start":{"line":211,"column":4},"end":{"line":211,"column":16}},"125":{"start":{"line":215,"column":4},"end":{"line":215,"column":27}},"126":{"start":{"line":216,"column":4},"end":{"line":216,"column":26}},"127":{"start":{"line":217,"column":4},"end":{"line":217,"column":17}},"128":{"start":{"line":220,"column":2},"end":{"line":223,"column":4}},"129":{"start":{"line":222,"column":4},"end":{"line":222,"column":24}},"130":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"131":{"start":{"line":229,"column":4},"end":{"line":229,"column":21}},"132":{"start":{"line":232,"column":2},"end":{"line":232,"column":20}},"133":{"start":{"line":235,"column":0},"end":{"line":235,"column":39}},"134":{"start":{"line":236,"column":0},"end":{"line":236,"column":37}}},"fnMap":{"0":{"name":"Pack","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":13}},"loc":{"start":{"line":18,"column":22},"end":{"line":44,"column":1}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":36,"column":16},"end":{"line":36,"column":17}},"loc":{"start":{"line":36,"column":31},"end":{"line":43,"column":3}},"line":36},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":18},"end":{"line":39,"column":19}},"loc":{"start":{"line":39,"column":30},"end":{"line":41,"column":5}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":27},"end":{"line":46,"column":28}},"loc":{"start":{"line":46,"column":44},"end":{"line":57,"column":1}},"line":46},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":29},"end":{"line":55,"column":5}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":21},"end":{"line":59,"column":22}},"loc":{"start":{"line":59,"column":39},"end":{"line":69,"column":1}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":71,"column":23},"end":{"line":71,"column":24}},"loc":{"start":{"line":71,"column":35},"end":{"line":75,"column":1}},"line":71},"7":{"name":"(anonymous_7)","decl":{"start":{"line":77,"column":24},"end":{"line":77,"column":25}},"loc":{"start":{"line":77,"column":36},"end":{"line":82,"column":1}},"line":77},"8":{"name":"(anonymous_8)","decl":{"start":{"line":84,"column":21},"end":{"line":84,"column":22}},"loc":{"start":{"line":84,"column":33},"end":{"line":88,"column":1}},"line":84},"9":{"name":"(anonymous_9)","decl":{"start":{"line":90,"column":26},"end":{"line":90,"column":27}},"loc":{"start":{"line":90,"column":38},"end":{"line":233,"column":1}},"line":90},"10":{"name":"(anonymous_10)","decl":{"start":{"line":108,"column":22},"end":{"line":108,"column":23}},"loc":{"start":{"line":108,"column":34},"end":{"line":111,"column":5}},"line":108},"11":{"name":"(anonymous_11)","decl":{"start":{"line":142,"column":41},"end":{"line":142,"column":42}},"loc":{"start":{"line":142,"column":54},"end":{"line":144,"column":3}},"line":142},"12":{"name":"(anonymous_12)","decl":{"start":{"line":195,"column":20},"end":{"line":195,"column":21}},"loc":{"start":{"line":195,"column":33},"end":{"line":197,"column":3}},"line":195},"13":{"name":"(anonymous_13)","decl":{"start":{"line":199,"column":22},"end":{"line":199,"column":23}},"loc":{"start":{"line":199,"column":34},"end":{"line":205,"column":3}},"line":199},"14":{"name":"(anonymous_14)","decl":{"start":{"line":200,"column":30},"end":{"line":200,"column":31}},"loc":{"start":{"line":200,"column":42},"end":{"line":202,"column":5}},"line":200},"15":{"name":"nextEntry","decl":{"start":{"line":209,"column":11},"end":{"line":209,"column":20}},"loc":{"start":{"line":209,"column":24},"end":{"line":218,"column":3}},"line":209},"16":{"name":"(anonymous_16)","decl":{"start":{"line":220,"column":21},"end":{"line":220,"column":22}},"loc":{"start":{"line":220,"column":35},"end":{"line":223,"column":3}},"line":220},"17":{"name":"(anonymous_17)","decl":{"start":{"line":235,"column":25},"end":{"line":235,"column":26}},"loc":{"start":{"line":235,"column":37},"end":{"line":235,"column":39}},"line":235},"18":{"name":"(anonymous_18)","decl":{"start":{"line":236,"column":23},"end":{"line":236,"column":24}},"loc":{"start":{"line":236,"column":35},"end":{"line":236,"column":37}},"line":236}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},{"start":{"line":21,"column":2},"end":{"line":21,"column":51}}],"line":21},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},{"start":{"line":23,"column":2},"end":{"line":24,"column":32}}],"line":23},"2":{"loc":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},{"start":{"line":37,"column":4},"end":{"line":37,"column":41}}],"line":37},"3":{"loc":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},{"start":{"line":48,"column":2},"end":{"line":48,"column":29}}],"line":48},"4":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},{"start":{"line":60,"column":2},"end":{"line":60,"column":68}}],"line":60},"5":{"loc":{"start":{"line":60,"column":6},"end":{"line":60,"column":38}},"type":"binary-expr","locations":[{"start":{"line":60,"column":6},"end":{"line":60,"column":18}},{"start":{"line":60,"column":22},"end":{"line":60,"column":38}}],"line":60},"6":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},{"start":{"line":62,"column":2},"end":{"line":62,"column":72}}],"line":62},"7":{"loc":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},{"start":{"line":73,"column":2},"end":{"line":73,"column":52}}],"line":73},"8":{"loc":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},{"start":{"line":79,"column":2},"end":{"line":79,"column":53}}],"line":79},"9":{"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},{"start":{"line":92,"column":2},"end":{"line":94,"column":3}}],"line":92},"10":{"loc":{"start":{"line":92,"column":6},"end":{"line":92,"column":34}},"type":"binary-expr","locations":[{"start":{"line":92,"column":6},"end":{"line":92,"column":16}},{"start":{"line":92,"column":20},"end":{"line":92,"column":34}}],"line":92},"11":{"loc":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},{"start":{"line":98,"column":2},"end":{"line":103,"column":3}}],"line":98},"12":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},{"start":{"line":99,"column":4},"end":{"line":101,"column":5}}],"line":99},"13":{"loc":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},{"start":{"line":105,"column":2},"end":{"line":113,"column":3}}],"line":105},"14":{"loc":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},{"start":{"line":117,"column":2},"end":{"line":124,"column":3}}],"line":117},"15":{"loc":{"start":{"line":134,"column":27},"end":{"line":134,"column":46}},"type":"binary-expr","locations":[{"start":{"line":134,"column":27},"end":{"line":134,"column":37}},{"start":{"line":134,"column":41},"end":{"line":134,"column":46}}],"line":134},"16":{"loc":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},{"start":{"line":135,"column":2},"end":{"line":138,"column":3}}],"line":135},"17":{"loc":{"start":{"line":135,"column":6},"end":{"line":135,"column":72}},"type":"binary-expr","locations":[{"start":{"line":135,"column":6},"end":{"line":135,"column":16}},{"start":{"line":135,"column":20},"end":{"line":135,"column":39}},{"start":{"line":135,"column":43},"end":{"line":135,"column":53}},{"start":{"line":135,"column":57},"end":{"line":135,"column":72}}],"line":135},"18":{"loc":{"start":{"line":142,"column":14},"end":{"line":142,"column":31}},"type":"binary-expr","locations":[{"start":{"line":142,"column":14},"end":{"line":142,"column":25}},{"start":{"line":142,"column":29},"end":{"line":142,"column":31}}],"line":142},"19":{"loc":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"type":"if","locations":[{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},{"start":{"line":146,"column":2},"end":{"line":146,"column":52}}],"line":146},"20":{"loc":{"start":{"line":148,"column":36},"end":{"line":148,"column":52}},"type":"binary-expr","locations":[{"start":{"line":148,"column":36},"end":{"line":148,"column":46}},{"start":{"line":148,"column":50},"end":{"line":148,"column":52}}],"line":148},"21":{"loc":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},{"start":{"line":151,"column":2},"end":{"line":153,"column":3}}],"line":151},"22":{"loc":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"type":"if","locations":[{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},{"start":{"line":155,"column":2},"end":{"line":156,"column":29}}],"line":155},"23":{"loc":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"type":"switch","locations":[{"start":{"line":160,"column":4},"end":{"line":161,"column":12}},{"start":{"line":163,"column":4},"end":{"line":166,"column":11}},{"start":{"line":168,"column":4},"end":{"line":172,"column":11}},{"start":{"line":174,"column":4},"end":{"line":178,"column":11}}],"line":158},"24":{"loc":{"start":{"line":170,"column":24},"end":{"line":170,"column":54}},"type":"binary-expr","locations":[{"start":{"line":170,"column":24},"end":{"line":170,"column":47}},{"start":{"line":170,"column":51},"end":{"line":170,"column":54}}],"line":170},"25":{"loc":{"start":{"line":176,"column":24},"end":{"line":176,"column":74}},"type":"binary-expr","locations":[{"start":{"line":176,"column":24},"end":{"line":176,"column":67}},{"start":{"line":176,"column":71},"end":{"line":176,"column":74}}],"line":176},"26":{"loc":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"type":"if","locations":[{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},{"start":{"line":204,"column":4},"end":{"line":204,"column":44}}],"line":204},"27":{"loc":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"type":"if","locations":[{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},{"start":{"line":210,"column":4},"end":{"line":210,"column":21}}],"line":210},"28":{"loc":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},{"start":{"line":227,"column":2},"end":{"line":230,"column":3}}],"line":227}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":512,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":1,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":1,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1,"50":0,"51":0,"52":0,"53":0,"54":1,"55":0,"56":0,"57":0,"58":0,"59":0,"60":1,"61":0,"62":0,"63":0,"64":1,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":1,"134":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0,0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0,0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"8beb16ccde52e484aa1dd87f5ece33d696c808ab","contentHash":"7bb2b7ebe1111c0deefbf9a61d17bf9d2dbe951adb585db96f9d89663ce5909d"},"/Users/isaacs/dev/js/tar/lib/entry-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}},"1":{"start":{"line":3,"column":10},"end":{"line":3,"column":30}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":38}},"3":{"start":{"line":5,"column":12},"end":{"line":5,"column":33}},"4":{"start":{"line":6,"column":15},"end":{"line":6,"column":34}},"5":{"start":{"line":7,"column":18},"end":{"line":7,"column":41}},"6":{"start":{"line":9,"column":13},"end":{"line":9,"column":37}},"7":{"start":{"line":10,"column":10},"end":{"line":10,"column":12}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":29}},"9":{"start":{"line":15,"column":11},"end":{"line":15,"column":15}},"10":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"11":{"start":{"line":18,"column":4},"end":{"line":18,"column":33}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":20}},"13":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"14":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":35}},"16":{"start":{"line":28,"column":2},"end":{"line":30,"column":4}},"17":{"start":{"line":29,"column":4},"end":{"line":29,"column":22}},"18":{"start":{"line":32,"column":2},"end":{"line":34,"column":4}},"19":{"start":{"line":33,"column":4},"end":{"line":33,"column":20}},"20":{"start":{"line":36,"column":2},"end":{"line":39,"column":4}},"21":{"start":{"line":37,"column":4},"end":{"line":37,"column":18}},"22":{"start":{"line":38,"column":4},"end":{"line":38,"column":20}},"23":{"start":{"line":41,"column":2},"end":{"line":41,"column":18}},"24":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"25":{"start":{"line":43,"column":4},"end":{"line":43,"column":18}},"26":{"start":{"line":45,"column":2},"end":{"line":45,"column":25}},"27":{"start":{"line":46,"column":2},"end":{"line":46,"column":23}},"28":{"start":{"line":47,"column":2},"end":{"line":47,"column":22}},"29":{"start":{"line":49,"column":2},"end":{"line":49,"column":17}},"30":{"start":{"line":50,"column":2},"end":{"line":50,"column":23}},"31":{"start":{"line":51,"column":2},"end":{"line":51,"column":18}},"32":{"start":{"line":53,"column":2},"end":{"line":55,"column":4}},"33":{"start":{"line":54,"column":4},"end":{"line":54,"column":17}},"34":{"start":{"line":58,"column":0},"end":{"line":65,"column":1}},"35":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"36":{"start":{"line":60,"column":19},"end":{"line":60,"column":74}},"37":{"start":{"line":61,"column":2},"end":{"line":61,"column":22}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":17}},"39":{"start":{"line":63,"column":2},"end":{"line":63,"column":43}},"40":{"start":{"line":64,"column":2},"end":{"line":64,"column":25}},"41":{"start":{"line":67,"column":0},"end":{"line":74,"column":1}},"42":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"43":{"start":{"line":69,"column":9},"end":{"line":69,"column":29}},"44":{"start":{"line":70,"column":2},"end":{"line":70,"column":24}},"45":{"start":{"line":71,"column":2},"end":{"line":71,"column":20}},"46":{"start":{"line":72,"column":2},"end":{"line":72,"column":17}},"47":{"start":{"line":73,"column":2},"end":{"line":73,"column":43}},"48":{"start":{"line":76,"column":0},"end":{"line":80,"column":1}},"49":{"start":{"line":78,"column":2},"end":{"line":78,"column":21}},"50":{"start":{"line":79,"column":2},"end":{"line":79,"column":20}},"51":{"start":{"line":82,"column":0},"end":{"line":87,"column":1}},"52":{"start":{"line":84,"column":2},"end":{"line":84,"column":22}},"53":{"start":{"line":85,"column":2},"end":{"line":85,"column":21}},"54":{"start":{"line":86,"column":2},"end":{"line":86,"column":17}},"55":{"start":{"line":89,"column":0},"end":{"line":98,"column":1}},"56":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"57":{"start":{"line":91,"column":20},"end":{"line":91,"column":69}},"58":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"59":{"start":{"line":95,"column":20},"end":{"line":95,"column":30}},"60":{"start":{"line":97,"column":2},"end":{"line":97,"column":31}},"61":{"start":{"line":100,"column":0},"end":{"line":126,"column":1}},"62":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"63":{"start":{"line":102,"column":23},"end":{"line":102,"column":29}},"64":{"start":{"line":103,"column":2},"end":{"line":103,"column":24}},"65":{"start":{"line":105,"column":20},"end":{"line":105,"column":48}},"66":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"67":{"start":{"line":108,"column":13},"end":{"line":108,"column":17}},"68":{"start":{"line":110,"column":4},"end":{"line":111,"column":44}},"69":{"start":{"line":113,"column":4},"end":{"line":120,"column":12}},"70":{"start":{"line":115,"column":8},"end":{"line":115,"column":26}},"71":{"start":{"line":118,"column":8},"end":{"line":118,"column":28}},"72":{"start":{"line":124,"column":2},"end":{"line":124,"column":32}},"73":{"start":{"line":125,"column":2},"end":{"line":125,"column":21}},"74":{"start":{"line":128,"column":0},"end":{"line":167,"column":1}},"75":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"76":{"start":{"line":131,"column":4},"end":{"line":131,"column":18}},"77":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"78":{"start":{"line":136,"column":4},"end":{"line":136,"column":10}},"79":{"start":{"line":139,"column":2},"end":{"line":139,"column":25}},"80":{"start":{"line":141,"column":12},"end":{"line":141,"column":24}},"81":{"start":{"line":142,"column":2},"end":{"line":159,"column":3}},"82":{"start":{"line":142,"column":15},"end":{"line":142,"column":16}},"83":{"start":{"line":145,"column":12},"end":{"line":145,"column":18}},"84":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"85":{"start":{"line":147,"column":19},"end":{"line":147,"column":37}},"86":{"start":{"line":148,"column":9},"end":{"line":148,"column":30}},"87":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"88":{"start":{"line":152,"column":6},"end":{"line":152,"column":30}},"89":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"90":{"start":{"line":154,"column":8},"end":{"line":154,"column":30}},"91":{"start":{"line":155,"column":8},"end":{"line":155,"column":39}},"92":{"start":{"line":157,"column":6},"end":{"line":157,"column":12}},"93":{"start":{"line":162,"column":2},"end":{"line":162,"column":25}},"94":{"start":{"line":163,"column":2},"end":{"line":163,"column":26}},"95":{"start":{"line":166,"column":2},"end":{"line":166,"column":20}},"96":{"start":{"line":169,"column":0},"end":{"line":169,"column":46}}},"fnMap":{"0":{"name":"EntryWriter","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":20}},"loc":{"start":{"line":14,"column":29},"end":{"line":56,"column":1}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":25}},"loc":{"start":{"line":28,"column":37},"end":{"line":30,"column":3}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":25},"end":{"line":32,"column":26}},"loc":{"start":{"line":32,"column":37},"end":{"line":34,"column":3}},"line":32},"3":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":23},"end":{"line":36,"column":24}},"loc":{"start":{"line":36,"column":35},"end":{"line":39,"column":3}},"line":36},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":28},"end":{"line":55,"column":3}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":30},"end":{"line":58,"column":31}},"loc":{"start":{"line":58,"column":43},"end":{"line":65,"column":1}},"line":58},"6":{"name":"(anonymous_6)","decl":{"start":{"line":67,"column":28},"end":{"line":67,"column":29}},"loc":{"start":{"line":67,"column":41},"end":{"line":74,"column":1}},"line":67},"7":{"name":"(anonymous_7)","decl":{"start":{"line":76,"column":30},"end":{"line":76,"column":31}},"loc":{"start":{"line":76,"column":42},"end":{"line":80,"column":1}},"line":76},"8":{"name":"(anonymous_8)","decl":{"start":{"line":82,"column":31},"end":{"line":82,"column":32}},"loc":{"start":{"line":82,"column":43},"end":{"line":87,"column":1}},"line":82},"9":{"name":"(anonymous_9)","decl":{"start":{"line":89,"column":28},"end":{"line":89,"column":29}},"loc":{"start":{"line":89,"column":45},"end":{"line":98,"column":1}},"line":89},"10":{"name":"(anonymous_10)","decl":{"start":{"line":100,"column":32},"end":{"line":100,"column":33}},"loc":{"start":{"line":100,"column":44},"end":{"line":126,"column":1}},"line":100},"11":{"name":"(anonymous_11)","decl":{"start":{"line":114,"column":18},"end":{"line":114,"column":19}},"loc":{"start":{"line":114,"column":31},"end":{"line":116,"column":7}},"line":114},"12":{"name":"(anonymous_12)","decl":{"start":{"line":117,"column":19},"end":{"line":117,"column":20}},"loc":{"start":{"line":117,"column":33},"end":{"line":119,"column":7}},"line":117},"13":{"name":"(anonymous_13)","decl":{"start":{"line":128,"column":33},"end":{"line":128,"column":34}},"loc":{"start":{"line":128,"column":45},"end":{"line":167,"column":1}},"line":128},"14":{"name":"(anonymous_14)","decl":{"start":{"line":169,"column":32},"end":{"line":169,"column":33}},"loc":{"start":{"line":169,"column":44},"end":{"line":169,"column":46}},"line":169}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"1":{"loc":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},{"start":{"line":42,"column":2},"end":{"line":44,"column":3}}],"line":42},"2":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},{"start":{"line":60,"column":2},"end":{"line":60,"column":74}}],"line":60},"3":{"loc":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},{"start":{"line":69,"column":2},"end":{"line":69,"column":29}}],"line":69},"4":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},{"start":{"line":91,"column":2},"end":{"line":91,"column":69}}],"line":91},"5":{"loc":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},{"start":{"line":95,"column":2},"end":{"line":95,"column":30}}],"line":95},"6":{"loc":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"type":"if","locations":[{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},{"start":{"line":102,"column":2},"end":{"line":102,"column":29}}],"line":102},"7":{"loc":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},{"start":{"line":107,"column":2},"end":{"line":121,"column":3}}],"line":107},"8":{"loc":{"start":{"line":107,"column":6},"end":{"line":107,"column":44}},"type":"binary-expr","locations":[{"start":{"line":107,"column":6},"end":{"line":107,"column":29}},{"start":{"line":107,"column":33},"end":{"line":107,"column":44}}],"line":107},"9":{"loc":{"start":{"line":110,"column":27},"end":{"line":111,"column":44}},"type":"binary-expr","locations":[{"start":{"line":110,"column":27},"end":{"line":110,"column":47}},{"start":{"line":111,"column":6},"end":{"line":111,"column":44}}],"line":110},"10":{"loc":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},{"start":{"line":130,"column":2},"end":{"line":132,"column":3}}],"line":130},"11":{"loc":{"start":{"line":130,"column":6},"end":{"line":130,"column":37}},"type":"binary-expr","locations":[{"start":{"line":130,"column":6},"end":{"line":130,"column":22}},{"start":{"line":130,"column":26},"end":{"line":130,"column":37}}],"line":130},"12":{"loc":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"type":"if","locations":[{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},{"start":{"line":134,"column":2},"end":{"line":137,"column":3}}],"line":134},"13":{"loc":{"start":{"line":134,"column":6},"end":{"line":134,"column":38}},"type":"binary-expr","locations":[{"start":{"line":134,"column":6},"end":{"line":134,"column":18}},{"start":{"line":134,"column":22},"end":{"line":134,"column":38}}],"line":134},"14":{"loc":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"type":"if","locations":[{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},{"start":{"line":147,"column":4},"end":{"line":148,"column":30}}],"line":147},"15":{"loc":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},{"start":{"line":150,"column":4},"end":{"line":158,"column":5}}],"line":150},"16":{"loc":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"type":"if","locations":[{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},{"start":{"line":153,"column":6},"end":{"line":156,"column":7}}],"line":153}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":1,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":1,"49":0,"50":0,"51":1,"52":0,"53":0,"54":0,"55":1,"56":0,"57":0,"58":0,"59":0,"60":0,"61":1,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":1,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3e169418508e031df78186ff63b5fa5aa2484ab8","contentHash":"84191ed4732b6763ae8701256051735aebbe5e95c932c15bef34da01b33ba1a0"},"/Users/isaacs/dev/js/tar/lib/entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry.js","statementMap":{"0":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"1":{"start":{"line":9,"column":16},"end":{"line":9,"column":38}},"2":{"start":{"line":10,"column":10},"end":{"line":10,"column":27}},"3":{"start":{"line":11,"column":13},"end":{"line":11,"column":33}},"4":{"start":{"line":12,"column":13},"end":{"line":12,"column":37}},"5":{"start":{"line":13,"column":15},"end":{"line":13,"column":34}},"6":{"start":{"line":14,"column":14},"end":{"line":14,"column":41}},"7":{"start":{"line":17,"column":2},"end":{"line":17,"column":19}},"8":{"start":{"line":18,"column":2},"end":{"line":18,"column":22}},"9":{"start":{"line":19,"column":2},"end":{"line":19,"column":22}},"10":{"start":{"line":21,"column":2},"end":{"line":21,"column":25}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":22}},"12":{"start":{"line":23,"column":2},"end":{"line":23,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":22}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":21}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":21}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":21}},"17":{"start":{"line":28,"column":2},"end":{"line":28,"column":18}},"18":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"19":{"start":{"line":30,"column":2},"end":{"line":30,"column":20}},"20":{"start":{"line":32,"column":2},"end":{"line":32,"column":36}},"21":{"start":{"line":34,"column":2},"end":{"line":34,"column":17}},"22":{"start":{"line":35,"column":2},"end":{"line":35,"column":23}},"23":{"start":{"line":36,"column":2},"end":{"line":36,"column":33}},"24":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"25":{"start":{"line":41,"column":11},"end":{"line":41,"column":15}},"26":{"start":{"line":42,"column":2},"end":{"line":44,"column":4}},"27":{"start":{"line":43,"column":4},"end":{"line":43,"column":29}},"28":{"start":{"line":46,"column":2},"end":{"line":46,"column":18}},"29":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"30":{"start":{"line":51,"column":0},"end":{"line":78,"column":1}},"31":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"32":{"start":{"line":52,"column":20},"end":{"line":52,"column":65}},"33":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"34":{"start":{"line":54,"column":4},"end":{"line":54,"column":40}},"35":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"36":{"start":{"line":60,"column":4},"end":{"line":60,"column":35}},"37":{"start":{"line":62,"column":2},"end":{"line":62,"column":29}},"38":{"start":{"line":65,"column":11},"end":{"line":65,"column":25}},"39":{"start":{"line":66,"column":2},"end":{"line":66,"column":21}},"40":{"start":{"line":67,"column":2},"end":{"line":67,"column":19}},"41":{"start":{"line":69,"column":2},"end":{"line":69,"column":14}},"42":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"43":{"start":{"line":73,"column":4},"end":{"line":73,"column":26}},"44":{"start":{"line":74,"column":4},"end":{"line":74,"column":16}},"45":{"start":{"line":77,"column":2},"end":{"line":77,"column":13}},"46":{"start":{"line":80,"column":0},"end":{"line":84,"column":1}},"47":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"48":{"start":{"line":81,"column":9},"end":{"line":81,"column":22}},"49":{"start":{"line":82,"column":2},"end":{"line":82,"column":21}},"50":{"start":{"line":83,"column":2},"end":{"line":83,"column":14}},"51":{"start":{"line":86,"column":0},"end":{"line":89,"column":1}},"52":{"start":{"line":87,"column":2},"end":{"line":87,"column":21}},"53":{"start":{"line":88,"column":2},"end":{"line":88,"column":20}},"54":{"start":{"line":91,"column":0},"end":{"line":97,"column":1}},"55":{"start":{"line":93,"column":2},"end":{"line":93,"column":21}},"56":{"start":{"line":94,"column":2},"end":{"line":94,"column":22}},"57":{"start":{"line":95,"column":2},"end":{"line":95,"column":14}},"58":{"start":{"line":96,"column":2},"end":{"line":96,"column":41}},"59":{"start":{"line":100,"column":0},"end":{"line":139,"column":1}},"60":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"61":{"start":{"line":103,"column":52},"end":{"line":103,"column":58}},"62":{"start":{"line":107,"column":2},"end":{"line":107,"column":22}},"63":{"start":{"line":110,"column":2},"end":{"line":113,"column":3}},"64":{"start":{"line":111,"column":16},"end":{"line":111,"column":43}},"65":{"start":{"line":112,"column":4},"end":{"line":112,"column":28}},"66":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"67":{"start":{"line":117,"column":4},"end":{"line":117,"column":57}},"68":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"69":{"start":{"line":119,"column":6},"end":{"line":119,"column":29}},"70":{"start":{"line":120,"column":6},"end":{"line":120,"column":24}},"71":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"72":{"start":{"line":123,"column":6},"end":{"line":123,"column":24}},"73":{"start":{"line":124,"column":6},"end":{"line":124,"column":22}},"74":{"start":{"line":130,"column":12},"end":{"line":130,"column":29}},"75":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"76":{"start":{"line":132,"column":4},"end":{"line":132,"column":36}},"77":{"start":{"line":133,"column":4},"end":{"line":133,"column":22}},"78":{"start":{"line":134,"column":4},"end":{"line":134,"column":25}},"79":{"start":{"line":135,"column":4},"end":{"line":135,"column":40}},"80":{"start":{"line":138,"column":2},"end":{"line":138,"column":23}},"81":{"start":{"line":141,"column":0},"end":{"line":211,"column":1}},"82":{"start":{"line":143,"column":15},"end":{"line":143,"column":27}},"83":{"start":{"line":144,"column":17},"end":{"line":144,"column":31}},"84":{"start":{"line":145,"column":15},"end":{"line":145,"column":27}},"85":{"start":{"line":146,"column":14},"end":{"line":146,"column":24}},"86":{"start":{"line":149,"column":15},"end":{"line":149,"column":25}},"87":{"start":{"line":150,"column":2},"end":{"line":154,"column":3}},"88":{"start":{"line":150,"column":15},"end":{"line":150,"column":16}},"89":{"start":{"line":151,"column":16},"end":{"line":151,"column":25}},"90":{"start":{"line":152,"column":14},"end":{"line":152,"column":27}},"91":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"92":{"start":{"line":153,"column":36},"end":{"line":153,"column":54}},"93":{"start":{"line":158,"column":3},"end":{"line":165,"column":3}},"94":{"start":{"line":159,"column":4},"end":{"line":161,"column":6}},"95":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"96":{"start":{"line":160,"column":39},"end":{"line":160,"column":54}},"97":{"start":{"line":165,"column":3},"end":{"line":173,"column":3}},"98":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"99":{"start":{"line":167,"column":6},"end":{"line":167,"column":40}},"100":{"start":{"line":173,"column":3},"end":{"line":177,"column":4}},"101":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"102":{"start":{"line":175,"column":6},"end":{"line":175,"column":42}},"103":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"104":{"start":{"line":184,"column":6},"end":{"line":184,"column":19}},"105":{"start":{"line":185,"column":6},"end":{"line":185,"column":11}},"106":{"start":{"line":188,"column":6},"end":{"line":188,"column":24}},"107":{"start":{"line":189,"column":6},"end":{"line":189,"column":11}},"108":{"start":{"line":192,"column":6},"end":{"line":192,"column":22}},"109":{"start":{"line":193,"column":6},"end":{"line":193,"column":11}},"110":{"start":{"line":202,"column":6},"end":{"line":202,"column":34}},"111":{"start":{"line":205,"column":2},"end":{"line":205,"column":18}},"112":{"start":{"line":206,"column":2},"end":{"line":206,"column":24}},"113":{"start":{"line":207,"column":2},"end":{"line":207,"column":24}},"114":{"start":{"line":210,"column":2},"end":{"line":210,"column":30}},"115":{"start":{"line":215,"column":0},"end":{"line":217,"column":1}},"116":{"start":{"line":216,"column":2},"end":{"line":216,"column":20}},"117":{"start":{"line":219,"column":0},"end":{"line":219,"column":35}},"118":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}}},"fnMap":{"0":{"name":"Entry","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":14}},"loc":{"start":{"line":16,"column":42},"end":{"line":47,"column":1}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":36},"end":{"line":42,"column":37}},"loc":{"start":{"line":42,"column":49},"end":{"line":44,"column":3}},"line":42},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":24},"end":{"line":51,"column":25}},"loc":{"start":{"line":51,"column":37},"end":{"line":78,"column":1}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":80,"column":22},"end":{"line":80,"column":23}},"loc":{"start":{"line":80,"column":35},"end":{"line":84,"column":1}},"line":80},"4":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":24},"end":{"line":86,"column":25}},"loc":{"start":{"line":86,"column":36},"end":{"line":89,"column":1}},"line":86},"5":{"name":"(anonymous_5)","decl":{"start":{"line":91,"column":25},"end":{"line":91,"column":26}},"loc":{"start":{"line":91,"column":37},"end":{"line":97,"column":1}},"line":91},"6":{"name":"(anonymous_6)","decl":{"start":{"line":100,"column":24},"end":{"line":100,"column":25}},"loc":{"start":{"line":100,"column":36},"end":{"line":139,"column":1}},"line":100},"7":{"name":"(anonymous_7)","decl":{"start":{"line":141,"column":28},"end":{"line":141,"column":29}},"loc":{"start":{"line":141,"column":40},"end":{"line":211,"column":1}},"line":141},"8":{"name":"(anonymous_8)","decl":{"start":{"line":158,"column":30},"end":{"line":158,"column":31}},"loc":{"start":{"line":158,"column":43},"end":{"line":162,"column":3}},"line":158},"9":{"name":"(anonymous_9)","decl":{"start":{"line":159,"column":27},"end":{"line":159,"column":28}},"loc":{"start":{"line":159,"column":40},"end":{"line":161,"column":5}},"line":159},"10":{"name":"(anonymous_10)","decl":{"start":{"line":165,"column":32},"end":{"line":165,"column":33}},"loc":{"start":{"line":165,"column":45},"end":{"line":169,"column":3}},"line":165},"11":{"name":"(anonymous_11)","decl":{"start":{"line":173,"column":39},"end":{"line":173,"column":40}},"loc":{"start":{"line":173,"column":52},"end":{"line":177,"column":3}},"line":173},"12":{"name":"(anonymous_12)","decl":{"start":{"line":215,"column":24},"end":{"line":215,"column":25}},"loc":{"start":{"line":215,"column":34},"end":{"line":217,"column":1}},"line":215}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":19},"end":{"line":36,"column":33}},"type":"binary-expr","locations":[{"start":{"line":36,"column":19},"end":{"line":36,"column":27}},{"start":{"line":36,"column":31},"end":{"line":36,"column":33}}],"line":36},"1":{"loc":{"start":{"line":42,"column":14},"end":{"line":42,"column":26}},"type":"binary-expr","locations":[{"start":{"line":42,"column":14},"end":{"line":42,"column":20}},{"start":{"line":42,"column":24},"end":{"line":42,"column":26}}],"line":42},"2":{"loc":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},{"start":{"line":52,"column":2},"end":{"line":52,"column":65}}],"line":52},"3":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},{"start":{"line":53,"column":2},"end":{"line":55,"column":3}}],"line":53},"4":{"loc":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},{"start":{"line":59,"column":2},"end":{"line":61,"column":3}}],"line":59},"5":{"loc":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},{"start":{"line":72,"column":2},"end":{"line":75,"column":3}}],"line":72},"6":{"loc":{"start":{"line":72,"column":6},"end":{"line":72,"column":28}},"type":"binary-expr","locations":[{"start":{"line":72,"column":6},"end":{"line":72,"column":18}},{"start":{"line":72,"column":22},"end":{"line":72,"column":28}}],"line":72},"7":{"loc":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},{"start":{"line":81,"column":2},"end":{"line":81,"column":22}}],"line":81},"8":{"loc":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},{"start":{"line":103,"column":2},"end":{"line":103,"column":58}}],"line":103},"9":{"loc":{"start":{"line":103,"column":6},"end":{"line":103,"column":50}},"type":"binary-expr","locations":[{"start":{"line":103,"column":6},"end":{"line":103,"column":18}},{"start":{"line":103,"column":22},"end":{"line":103,"column":35}},{"start":{"line":103,"column":39},"end":{"line":103,"column":50}}],"line":103},"10":{"loc":{"start":{"line":110,"column":9},"end":{"line":110,"column":54}},"type":"binary-expr","locations":[{"start":{"line":110,"column":9},"end":{"line":110,"column":37}},{"start":{"line":110,"column":41},"end":{"line":110,"column":54}}],"line":110},"11":{"loc":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},{"start":{"line":116,"column":2},"end":{"line":126,"column":3}}],"line":116},"12":{"loc":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},{"start":{"line":118,"column":4},"end":{"line":121,"column":5}}],"line":118},"13":{"loc":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"type":"if","locations":[{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},{"start":{"line":122,"column":4},"end":{"line":125,"column":5}}],"line":122},"14":{"loc":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},{"start":{"line":131,"column":2},"end":{"line":136,"column":3}}],"line":131},"15":{"loc":{"start":{"line":131,"column":6},"end":{"line":131,"column":45}},"type":"binary-expr","locations":[{"start":{"line":131,"column":6},"end":{"line":131,"column":26}},{"start":{"line":131,"column":30},"end":{"line":131,"column":45}}],"line":131},"16":{"loc":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"type":"if","locations":[{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},{"start":{"line":153,"column":4},"end":{"line":153,"column":54}}],"line":153},"17":{"loc":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"type":"if","locations":[{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},{"start":{"line":160,"column":6},"end":{"line":160,"column":54}}],"line":160},"18":{"loc":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"type":"if","locations":[{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},{"start":{"line":166,"column":4},"end":{"line":168,"column":5}}],"line":166},"19":{"loc":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"type":"if","locations":[{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},{"start":{"line":174,"column":4},"end":{"line":176,"column":5}}],"line":174},"20":{"loc":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"type":"switch","locations":[{"start":{"line":182,"column":4},"end":{"line":182,"column":19}},{"start":{"line":183,"column":4},"end":{"line":185,"column":11}},{"start":{"line":187,"column":4},"end":{"line":189,"column":11}},{"start":{"line":191,"column":4},"end":{"line":193,"column":11}},{"start":{"line":195,"column":4},"end":{"line":195,"column":16}},{"start":{"line":196,"column":4},"end":{"line":196,"column":24}},{"start":{"line":197,"column":4},"end":{"line":197,"column":27}},{"start":{"line":198,"column":4},"end":{"line":198,"column":23}},{"start":{"line":199,"column":4},"end":{"line":199,"column":21}},{"start":{"line":200,"column":4},"end":{"line":200,"column":16}},{"start":{"line":201,"column":4},"end":{"line":202,"column":34}}],"line":181}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":1,"30":1,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":1,"47":0,"48":0,"49":0,"50":0,"51":1,"52":0,"53":0,"54":1,"55":0,"56":0,"57":0,"58":0,"59":1,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":1,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":1,"116":0,"117":1,"118":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0,0,0,0,0,0,0,0,0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"2cc4f925db2a60e89bf0743124faec4e8996dfdb","contentHash":"245d5cb2b23d975dc5b9a0ed2553c93c587727d50a7961242f50cec333c04ba9"},"/Users/isaacs/dev/js/tar/lib/global-header-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/global-header-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"1":{"start":{"line":3,"column":27},"end":{"line":3,"column":65}},"2":{"start":{"line":4,"column":15},"end":{"line":4,"column":34}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":50}},"4":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":40}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":40}},"7":{"start":{"line":13,"column":2},"end":{"line":13,"column":23}}},"fnMap":{"0":{"name":"GlobalHeaderWriter","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":27}},"loc":{"start":{"line":8,"column":36},"end":{"line":14,"column":1}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},{"start":{"line":9,"column":2},"end":{"line":11,"column":3}}],"line":9}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0},"f":{"0":0},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3d0c8589f62a5c8ccec606d52d3abd98e5627d57","contentHash":"a2570ca840cf3e44d77e15af0aee52f7c145da39b76366006f3672b9708def3e"},"/Users/isaacs/dev/js/tar/lib/parse.js":{"path":"/Users/isaacs/dev/js/tar/lib/parse.js","statementMap":{"0":{"start":{"line":6,"column":0},"end":{"line":6,"column":37}},"1":{"start":{"line":8,"column":13},"end":{"line":8,"column":30}},"2":{"start":{"line":9,"column":13},"end":{"line":9,"column":26}},"3":{"start":{"line":10,"column":18},"end":{"line":10,"column":41}},"4":{"start":{"line":11,"column":10},"end":{"line":11,"column":30}},"5":{"start":{"line":12,"column":16},"end":{"line":12,"column":38}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":46}},"8":{"start":{"line":15,"column":21},"end":{"line":15,"column":52}},"9":{"start":{"line":16,"column":13},"end":{"line":16,"column":33}},"10":{"start":{"line":17,"column":15},"end":{"line":17,"column":34}},"11":{"start":{"line":18,"column":14},"end":{"line":18,"column":32}},"12":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"13":{"start":{"line":28,"column":11},"end":{"line":28,"column":15}},"14":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"15":{"start":{"line":29,"column":30},"end":{"line":29,"column":48}},"16":{"start":{"line":34,"column":2},"end":{"line":34,"column":18}},"17":{"start":{"line":36,"column":2},"end":{"line":36,"column":20}},"18":{"start":{"line":37,"column":2},"end":{"line":37,"column":20}},"19":{"start":{"line":38,"column":2},"end":{"line":38,"column":35}},"20":{"start":{"line":39,"column":2},"end":{"line":39,"column":17}},"21":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"22":{"start":{"line":41,"column":2},"end":{"line":41,"column":20}},"23":{"start":{"line":43,"column":2},"end":{"line":45,"column":4}},"24":{"start":{"line":44,"column":4},"end":{"line":44,"column":23}},"25":{"start":{"line":47,"column":2},"end":{"line":49,"column":4}},"26":{"start":{"line":48,"column":4},"end":{"line":48,"column":18}},"27":{"start":{"line":51,"column":2},"end":{"line":53,"column":4}},"28":{"start":{"line":52,"column":4},"end":{"line":52,"column":19}},"29":{"start":{"line":55,"column":2},"end":{"line":57,"column":4}},"30":{"start":{"line":56,"column":4},"end":{"line":56,"column":20}},"31":{"start":{"line":63,"column":0},"end":{"line":67,"column":1}},"32":{"start":{"line":64,"column":11},"end":{"line":64,"column":15}},"33":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"34":{"start":{"line":65,"column":31},"end":{"line":65,"column":57}},"35":{"start":{"line":66,"column":2},"end":{"line":66,"column":16}},"36":{"start":{"line":72,"column":0},"end":{"line":83,"column":1}},"37":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"38":{"start":{"line":77,"column":4},"end":{"line":79,"column":5}},"39":{"start":{"line":77,"column":17},"end":{"line":77,"column":18}},"40":{"start":{"line":77,"column":24},"end":{"line":77,"column":32}},"41":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"42":{"start":{"line":78,"column":22},"end":{"line":78,"column":62}},"43":{"start":{"line":80,"column":4},"end":{"line":80,"column":10}},"44":{"start":{"line":82,"column":2},"end":{"line":82,"column":30}},"45":{"start":{"line":85,"column":0},"end":{"line":88,"column":1}},"46":{"start":{"line":86,"column":2},"end":{"line":86,"column":20}},"47":{"start":{"line":87,"column":2},"end":{"line":87,"column":28}},"48":{"start":{"line":94,"column":0},"end":{"line":94,"column":38}},"49":{"start":{"line":96,"column":0},"end":{"line":137,"column":1}},"50":{"start":{"line":97,"column":2},"end":{"line":97,"column":59}},"51":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"52":{"start":{"line":105,"column":16},"end":{"line":105,"column":27}},"53":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"54":{"start":{"line":106,"column":22},"end":{"line":106,"column":36}},"55":{"start":{"line":108,"column":6},"end":{"line":108,"column":34}},"56":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"57":{"start":{"line":109,"column":31},"end":{"line":109,"column":51}},"58":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"59":{"start":{"line":112,"column":6},"end":{"line":112,"column":17}},"60":{"start":{"line":113,"column":6},"end":{"line":113,"column":24}},"61":{"start":{"line":117,"column":15},"end":{"line":117,"column":19}},"62":{"start":{"line":118,"column":4},"end":{"line":120,"column":5}},"63":{"start":{"line":118,"column":17},"end":{"line":118,"column":18}},"64":{"start":{"line":119,"column":6},"end":{"line":119,"column":23}},"65":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"66":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"67":{"start":{"line":128,"column":8},"end":{"line":128,"column":26}},"68":{"start":{"line":129,"column":6},"end":{"line":129,"column":29}},"69":{"start":{"line":131,"column":6},"end":{"line":131,"column":30}},"70":{"start":{"line":132,"column":6},"end":{"line":132,"column":25}},"71":{"start":{"line":136,"column":2},"end":{"line":136,"column":22}},"72":{"start":{"line":140,"column":0},"end":{"line":285,"column":1}},"73":{"start":{"line":141,"column":15},"end":{"line":141,"column":31}},"74":{"start":{"line":142,"column":13},"end":{"line":142,"column":17}},"75":{"start":{"line":147,"column":13},"end":{"line":147,"column":18}},"76":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"77":{"start":{"line":150,"column":12},"end":{"line":150,"column":41}},"78":{"start":{"line":151,"column":4},"end":{"line":151,"column":21}},"79":{"start":{"line":152,"column":4},"end":{"line":152,"column":37}},"80":{"start":{"line":153,"column":4},"end":{"line":153,"column":37}},"81":{"start":{"line":154,"column":4},"end":{"line":154,"column":32}},"82":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"83":{"start":{"line":171,"column":6},"end":{"line":171,"column":23}},"84":{"start":{"line":172,"column":6},"end":{"line":172,"column":18}},"85":{"start":{"line":173,"column":6},"end":{"line":173,"column":11}},"86":{"start":{"line":177,"column":6},"end":{"line":177,"column":32}},"87":{"start":{"line":178,"column":6},"end":{"line":183,"column":7}},"88":{"start":{"line":179,"column":8},"end":{"line":179,"column":41}},"89":{"start":{"line":180,"column":8},"end":{"line":182,"column":10}},"90":{"start":{"line":181,"column":10},"end":{"line":181,"column":43}},"91":{"start":{"line":184,"column":6},"end":{"line":184,"column":33}},"92":{"start":{"line":185,"column":6},"end":{"line":185,"column":17}},"93":{"start":{"line":186,"column":6},"end":{"line":186,"column":11}},"94":{"start":{"line":191,"column":6},"end":{"line":191,"column":32}},"95":{"start":{"line":192,"column":6},"end":{"line":194,"column":7}},"96":{"start":{"line":193,"column":8},"end":{"line":193,"column":37}},"97":{"start":{"line":195,"column":6},"end":{"line":195,"column":27}},"98":{"start":{"line":196,"column":6},"end":{"line":196,"column":17}},"99":{"start":{"line":197,"column":6},"end":{"line":197,"column":11}},"100":{"start":{"line":201,"column":6},"end":{"line":201,"column":29}},"101":{"start":{"line":202,"column":6},"end":{"line":205,"column":7}},"102":{"start":{"line":203,"column":8},"end":{"line":203,"column":45}},"103":{"start":{"line":204,"column":8},"end":{"line":204,"column":44}},"104":{"start":{"line":206,"column":6},"end":{"line":206,"column":25}},"105":{"start":{"line":207,"column":6},"end":{"line":207,"column":17}},"106":{"start":{"line":208,"column":6},"end":{"line":208,"column":11}},"107":{"start":{"line":213,"column":6},"end":{"line":213,"column":29}},"108":{"start":{"line":214,"column":6},"end":{"line":217,"column":7}},"109":{"start":{"line":215,"column":8},"end":{"line":215,"column":45}},"110":{"start":{"line":216,"column":8},"end":{"line":216,"column":40}},"111":{"start":{"line":218,"column":6},"end":{"line":218,"column":21}},"112":{"start":{"line":219,"column":6},"end":{"line":219,"column":17}},"113":{"start":{"line":220,"column":6},"end":{"line":220,"column":11}},"114":{"start":{"line":226,"column":6},"end":{"line":226,"column":23}},"115":{"start":{"line":227,"column":6},"end":{"line":227,"column":25}},"116":{"start":{"line":228,"column":6},"end":{"line":228,"column":11}},"117":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"118":{"start":{"line":233,"column":4},"end":{"line":233,"column":28}},"119":{"start":{"line":235,"column":17},"end":{"line":235,"column":29}},"120":{"start":{"line":236,"column":19},"end":{"line":236,"column":33}},"121":{"start":{"line":240,"column":4},"end":{"line":240,"column":25}},"122":{"start":{"line":242,"column":2},"end":{"line":242,"column":49}},"123":{"start":{"line":243,"column":2},"end":{"line":243,"column":19}},"124":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"125":{"start":{"line":247,"column":4},"end":{"line":249,"column":6}},"126":{"start":{"line":248,"column":6},"end":{"line":248,"column":24}},"127":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"128":{"start":{"line":252,"column":13},"end":{"line":252,"column":35}},"129":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"130":{"start":{"line":255,"column":4},"end":{"line":255,"column":23}},"131":{"start":{"line":258,"column":2},"end":{"line":258,"column":21}},"132":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"133":{"start":{"line":261,"column":4},"end":{"line":261,"column":39}},"134":{"start":{"line":264,"column":11},"end":{"line":264,"column":15}},"135":{"start":{"line":266,"column":2},"end":{"line":268,"column":4}},"136":{"start":{"line":267,"column":4},"end":{"line":267,"column":14}},"137":{"start":{"line":270,"column":2},"end":{"line":272,"column":4}},"138":{"start":{"line":271,"column":4},"end":{"line":271,"column":15}},"139":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"140":{"start":{"line":275,"column":4},"end":{"line":275,"column":29}},"141":{"start":{"line":278,"column":2},"end":{"line":278,"column":22}},"142":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"143":{"start":{"line":282,"column":4},"end":{"line":282,"column":15}},"144":{"start":{"line":283,"column":4},"end":{"line":283,"column":22}}},"fnMap":{"0":{"name":"Parse","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":14}},"loc":{"start":{"line":27,"column":18},"end":{"line":58,"column":1}},"line":27},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":25},"end":{"line":43,"column":26}},"loc":{"start":{"line":43,"column":38},"end":{"line":45,"column":3}},"line":43},"2":{"name":"(anonymous_2)","decl":{"start":{"line":47,"column":24},"end":{"line":47,"column":25}},"loc":{"start":{"line":47,"column":37},"end":{"line":49,"column":3}},"line":47},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":23},"end":{"line":51,"column":24}},"loc":{"start":{"line":51,"column":35},"end":{"line":53,"column":3}},"line":51},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":25},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":37},"end":{"line":57,"column":3}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":63,"column":29},"end":{"line":63,"column":30}},"loc":{"start":{"line":63,"column":41},"end":{"line":67,"column":1}},"line":63},"6":{"name":"(anonymous_6)","decl":{"start":{"line":72,"column":24},"end":{"line":72,"column":25}},"loc":{"start":{"line":72,"column":37},"end":{"line":83,"column":1}},"line":72},"7":{"name":"(anonymous_7)","decl":{"start":{"line":85,"column":22},"end":{"line":85,"column":23}},"loc":{"start":{"line":85,"column":35},"end":{"line":88,"column":1}},"line":85},"8":{"name":"(anonymous_8)","decl":{"start":{"line":94,"column":24},"end":{"line":94,"column":25}},"loc":{"start":{"line":94,"column":36},"end":{"line":94,"column":38}},"line":94},"9":{"name":"(anonymous_9)","decl":{"start":{"line":96,"column":27},"end":{"line":96,"column":28}},"loc":{"start":{"line":96,"column":40},"end":{"line":137,"column":1}},"line":96},"10":{"name":"(anonymous_10)","decl":{"start":{"line":140,"column":30},"end":{"line":140,"column":31}},"loc":{"start":{"line":140,"column":43},"end":{"line":285,"column":1}},"line":140},"11":{"name":"(anonymous_11)","decl":{"start":{"line":178,"column":14},"end":{"line":178,"column":15}},"loc":{"start":{"line":178,"column":26},"end":{"line":183,"column":7}},"line":178},"12":{"name":"(anonymous_12)","decl":{"start":{"line":180,"column":42},"end":{"line":180,"column":43}},"loc":{"start":{"line":180,"column":55},"end":{"line":182,"column":9}},"line":180},"13":{"name":"(anonymous_13)","decl":{"start":{"line":192,"column":14},"end":{"line":192,"column":15}},"loc":{"start":{"line":192,"column":26},"end":{"line":194,"column":7}},"line":192},"14":{"name":"(anonymous_14)","decl":{"start":{"line":202,"column":14},"end":{"line":202,"column":15}},"loc":{"start":{"line":202,"column":26},"end":{"line":205,"column":7}},"line":202},"15":{"name":"(anonymous_15)","decl":{"start":{"line":214,"column":14},"end":{"line":214,"column":15}},"loc":{"start":{"line":214,"column":26},"end":{"line":217,"column":7}},"line":214},"16":{"name":"(anonymous_16)","decl":{"start":{"line":247,"column":21},"end":{"line":247,"column":22}},"loc":{"start":{"line":247,"column":34},"end":{"line":249,"column":5}},"line":247},"17":{"name":"(anonymous_17)","decl":{"start":{"line":266,"column":20},"end":{"line":266,"column":21}},"loc":{"start":{"line":266,"column":32},"end":{"line":268,"column":3}},"line":266},"18":{"name":"(anonymous_18)","decl":{"start":{"line":270,"column":21},"end":{"line":270,"column":22}},"loc":{"start":{"line":270,"column":33},"end":{"line":272,"column":3}},"line":270}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},{"start":{"line":29,"column":2},"end":{"line":29,"column":48}}],"line":29},"1":{"loc":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},{"start":{"line":65,"column":2},"end":{"line":65,"column":57}}],"line":65},"2":{"loc":{"start":{"line":65,"column":6},"end":{"line":65,"column":29}},"type":"binary-expr","locations":[{"start":{"line":65,"column":6},"end":{"line":65,"column":16}},{"start":{"line":65,"column":20},"end":{"line":65,"column":29}}],"line":65},"3":{"loc":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},{"start":{"line":73,"column":2},"end":{"line":81,"column":3}}],"line":73},"4":{"loc":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"type":"if","locations":[{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},{"start":{"line":78,"column":6},"end":{"line":78,"column":62}}],"line":78},"5":{"loc":{"start":{"line":97,"column":9},"end":{"line":97,"column":30}},"type":"binary-expr","locations":[{"start":{"line":97,"column":9},"end":{"line":97,"column":10}},{"start":{"line":97,"column":14},"end":{"line":97,"column":30}}],"line":97},"6":{"loc":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},{"start":{"line":104,"column":2},"end":{"line":134,"column":3}}],"line":104},"7":{"loc":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"type":"if","locations":[{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},{"start":{"line":106,"column":4},"end":{"line":110,"column":5}}],"line":106},"8":{"loc":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"type":"if","locations":[{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},{"start":{"line":109,"column":6},"end":{"line":109,"column":51}}],"line":109},"9":{"loc":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},{"start":{"line":111,"column":4},"end":{"line":114,"column":5}}],"line":111},"10":{"loc":{"start":{"line":118,"column":20},"end":{"line":118,"column":35}},"type":"binary-expr","locations":[{"start":{"line":118,"column":20},"end":{"line":118,"column":27}},{"start":{"line":118,"column":31},"end":{"line":118,"column":35}}],"line":118},"11":{"loc":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"type":"if","locations":[{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},{"start":{"line":126,"column":4},"end":{"line":133,"column":5}}],"line":126},"12":{"loc":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"type":"if","locations":[{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},{"start":{"line":127,"column":6},"end":{"line":128,"column":26}}],"line":127},"13":{"loc":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},{"start":{"line":149,"column":2},"end":{"line":155,"column":3}}],"line":149},"14":{"loc":{"start":{"line":149,"column":6},"end":{"line":149,"column":48}},"type":"binary-expr","locations":[{"start":{"line":149,"column":6},"end":{"line":149,"column":26}},{"start":{"line":149,"column":30},"end":{"line":149,"column":48}}],"line":149},"15":{"loc":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"type":"switch","locations":[{"start":{"line":158,"column":4},"end":{"line":158,"column":16}},{"start":{"line":159,"column":4},"end":{"line":159,"column":19}},{"start":{"line":160,"column":4},"end":{"line":160,"column":16}},{"start":{"line":161,"column":4},"end":{"line":161,"column":24}},{"start":{"line":162,"column":4},"end":{"line":162,"column":27}},{"start":{"line":163,"column":4},"end":{"line":163,"column":23}},{"start":{"line":164,"column":4},"end":{"line":164,"column":21}},{"start":{"line":165,"column":4},"end":{"line":165,"column":16}},{"start":{"line":166,"column":4},"end":{"line":166,"column":26}},{"start":{"line":167,"column":4},"end":{"line":173,"column":11}},{"start":{"line":175,"column":4},"end":{"line":186,"column":11}},{"start":{"line":188,"column":4},"end":{"line":188,"column":26}},{"start":{"line":189,"column":4},"end":{"line":197,"column":11}},{"start":{"line":199,"column":4},"end":{"line":208,"column":11}},{"start":{"line":210,"column":4},"end":{"line":210,"column":31}},{"start":{"line":211,"column":4},"end":{"line":220,"column":11}},{"start":{"line":222,"column":4},"end":{"line":228,"column":11}}],"line":157},"16":{"loc":{"start":{"line":179,"column":23},"end":{"line":179,"column":41}},"type":"binary-expr","locations":[{"start":{"line":179,"column":23},"end":{"line":179,"column":35}},{"start":{"line":179,"column":39},"end":{"line":179,"column":41}}],"line":179},"17":{"loc":{"start":{"line":203,"column":25},"end":{"line":203,"column":45}},"type":"binary-expr","locations":[{"start":{"line":203,"column":25},"end":{"line":203,"column":39}},{"start":{"line":203,"column":43},"end":{"line":203,"column":45}}],"line":203},"18":{"loc":{"start":{"line":215,"column":25},"end":{"line":215,"column":45}},"type":"binary-expr","locations":[{"start":{"line":215,"column":25},"end":{"line":215,"column":39}},{"start":{"line":215,"column":43},"end":{"line":215,"column":45}}],"line":215},"19":{"loc":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},{"start":{"line":232,"column":2},"end":{"line":241,"column":3}}],"line":232},"20":{"loc":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},{"start":{"line":246,"column":2},"end":{"line":250,"column":3}}],"line":246},"21":{"loc":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"type":"if","locations":[{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},{"start":{"line":252,"column":2},"end":{"line":252,"column":35}}],"line":252},"22":{"loc":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},{"start":{"line":254,"column":2},"end":{"line":256,"column":3}}],"line":254},"23":{"loc":{"start":{"line":254,"column":6},"end":{"line":254,"column":58}},"type":"binary-expr","locations":[{"start":{"line":254,"column":6},"end":{"line":254,"column":27}},{"start":{"line":254,"column":31},"end":{"line":254,"column":58}}],"line":254},"24":{"loc":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},{"start":{"line":260,"column":2},"end":{"line":262,"column":3}}],"line":260},"25":{"loc":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"type":"if","locations":[{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},{"start":{"line":274,"column":2},"end":{"line":276,"column":3}}],"line":274},"26":{"loc":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"type":"if","locations":[{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},{"start":{"line":281,"column":2},"end":{"line":284,"column":3}}],"line":281}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":1,"32":0,"33":0,"34":0,"35":0,"36":1,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":1,"46":0,"47":0,"48":1,"49":1,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":1,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"4a8f51a3a12b59eb69694618530032a813fbf8cb","contentHash":"d347e73abcd3109143efee20401d9f0bfc6d68a4a6323bd4559ada44c741786a"},"/Users/isaacs/dev/js/tar/lib/buffer-entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/buffer-entry.js","statementMap":{"0":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"1":{"start":{"line":10,"column":15},"end":{"line":10,"column":34}},"2":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"3":{"start":{"line":14,"column":2},"end":{"line":14,"column":30}},"4":{"start":{"line":15,"column":2},"end":{"line":15,"column":44}},"5":{"start":{"line":16,"column":2},"end":{"line":16,"column":18}},"6":{"start":{"line":17,"column":2},"end":{"line":17,"column":16}},"7":{"start":{"line":18,"column":2},"end":{"line":20,"column":4}},"8":{"start":{"line":19,"column":4},"end":{"line":19,"column":52}},"9":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"10":{"start":{"line":26,"column":0},"end":{"line":30,"column":1}},"11":{"start":{"line":27,"column":2},"end":{"line":27,"column":36}},"12":{"start":{"line":28,"column":2},"end":{"line":28,"column":26}},"13":{"start":{"line":29,"column":2},"end":{"line":29,"column":37}}},"fnMap":{"0":{"name":"BufferEntry","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":24},"end":{"line":21,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":17},"end":{"line":18,"column":18}},"loc":{"start":{"line":18,"column":29},"end":{"line":20,"column":3}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":30},"end":{"line":26,"column":31}},"loc":{"start":{"line":26,"column":43},"end":{"line":30,"column":1}},"line":26}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":1,"10":1,"11":0,"12":0,"13":0},"f":{"0":0,"1":0,"2":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"d8ad66df900443c9c9d8aefe5fc126a55ba268ec","contentHash":"25e5b3c51e476fcffac7affa191a0ed0f54d64d3d3b760e887bd45ba08fffa65"},"/Users/isaacs/dev/js/tar/lib/extended-header.js":{"path":"/Users/isaacs/dev/js/tar/lib/extended-header.js","statementMap":{"0":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"1":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"2":{"start":{"line":12,"column":15},"end":{"line":12,"column":34}},"3":{"start":{"line":13,"column":10},"end":{"line":13,"column":30}},"4":{"start":{"line":14,"column":14},"end":{"line":14,"column":25}},"5":{"start":{"line":15,"column":15},"end":{"line":17,"column":42}},"6":{"start":{"line":20,"column":2},"end":{"line":20,"column":30}},"7":{"start":{"line":21,"column":2},"end":{"line":21,"column":30}},"8":{"start":{"line":22,"column":2},"end":{"line":22,"column":18}},"9":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"10":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":20}},"12":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"13":{"start":{"line":27,"column":2},"end":{"line":27,"column":19}},"14":{"start":{"line":28,"column":2},"end":{"line":28,"column":19}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"16":{"start":{"line":30,"column":2},"end":{"line":30,"column":16}},"17":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"18":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"19":{"start":{"line":36,"column":8},"end":{"line":36,"column":9}},"20":{"start":{"line":37,"column":13},"end":{"line":37,"column":39}},"21":{"start":{"line":38,"column":11},"end":{"line":38,"column":28}},"22":{"start":{"line":39,"column":11},"end":{"line":39,"column":28}},"23":{"start":{"line":40,"column":11},"end":{"line":40,"column":28}},"24":{"start":{"line":41,"column":11},"end":{"line":41,"column":28}},"25":{"start":{"line":43,"column":0},"end":{"line":45,"column":2}},"26":{"start":{"line":44,"column":2},"end":{"line":44,"column":31}},"27":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"28":{"start":{"line":50,"column":9},"end":{"line":50,"column":26}},"29":{"start":{"line":51,"column":9},"end":{"line":51,"column":26}},"30":{"start":{"line":52,"column":12},"end":{"line":52,"column":29}},"31":{"start":{"line":53,"column":8},"end":{"line":53,"column":25}},"32":{"start":{"line":54,"column":8},"end":{"line":54,"column":25}},"33":{"start":{"line":55,"column":8},"end":{"line":55,"column":25}},"34":{"start":{"line":56,"column":8},"end":{"line":56,"column":25}},"35":{"start":{"line":57,"column":12},"end":{"line":57,"column":29}},"36":{"start":{"line":58,"column":9},"end":{"line":58,"column":26}},"37":{"start":{"line":59,"column":9},"end":{"line":59,"column":27}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"39":{"start":{"line":62,"column":27},"end":{"line":62,"column":33}},"40":{"start":{"line":64,"column":2},"end":{"line":130,"column":3}},"41":{"start":{"line":64,"column":16},"end":{"line":64,"column":17}},"42":{"start":{"line":64,"column":23},"end":{"line":64,"column":31}},"43":{"start":{"line":69,"column":12},"end":{"line":69,"column":16}},"44":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"45":{"start":{"line":72,"column":6},"end":{"line":72,"column":53}},"46":{"start":{"line":73,"column":6},"end":{"line":73,"column":12}},"47":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"48":{"start":{"line":77,"column":16},"end":{"line":77,"column":22}},"49":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"50":{"start":{"line":82,"column":10},"end":{"line":82,"column":27}},"51":{"start":{"line":84,"column":10},"end":{"line":84,"column":73}},"52":{"start":{"line":85,"column":10},"end":{"line":85,"column":34}},"53":{"start":{"line":86,"column":10},"end":{"line":86,"column":18}},"54":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"55":{"start":{"line":89,"column":10},"end":{"line":89,"column":68}},"56":{"start":{"line":90,"column":10},"end":{"line":90,"column":16}},"57":{"start":{"line":92,"column":8},"end":{"line":92,"column":29}},"58":{"start":{"line":93,"column":8},"end":{"line":93,"column":16}},"59":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"60":{"start":{"line":98,"column":10},"end":{"line":98,"column":27}},"61":{"start":{"line":99,"column":10},"end":{"line":99,"column":57}},"62":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"63":{"start":{"line":100,"column":35},"end":{"line":100,"column":66}},"64":{"start":{"line":101,"column":10},"end":{"line":101,"column":33}},"65":{"start":{"line":102,"column":10},"end":{"line":102,"column":18}},"66":{"start":{"line":104,"column":8},"end":{"line":104,"column":28}},"67":{"start":{"line":105,"column":8},"end":{"line":105,"column":16}},"68":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"69":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"70":{"start":{"line":112,"column":12},"end":{"line":112,"column":55}},"71":{"start":{"line":113,"column":12},"end":{"line":113,"column":18}},"72":{"start":{"line":115,"column":20},"end":{"line":115,"column":55}},"73":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"74":{"start":{"line":117,"column":12},"end":{"line":117,"column":33}},"75":{"start":{"line":119,"column":10},"end":{"line":119,"column":38}},"76":{"start":{"line":121,"column":10},"end":{"line":121,"column":33}},"77":{"start":{"line":122,"column":10},"end":{"line":122,"column":28}},"78":{"start":{"line":123,"column":10},"end":{"line":123,"column":25}},"79":{"start":{"line":124,"column":10},"end":{"line":124,"column":29}},"80":{"start":{"line":125,"column":10},"end":{"line":125,"column":18}},"81":{"start":{"line":127,"column":8},"end":{"line":127,"column":28}},"82":{"start":{"line":128,"column":8},"end":{"line":128,"column":16}},"83":{"start":{"line":134,"column":2},"end":{"line":136,"column":42}},"84":{"start":{"line":138,"column":2},"end":{"line":138,"column":15}},"85":{"start":{"line":139,"column":2},"end":{"line":139,"column":16}}},"fnMap":{"0":{"name":"ExtendedHeader","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":23}},"loc":{"start":{"line":19,"column":27},"end":{"line":31,"column":1}},"line":19},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":28},"end":{"line":43,"column":29}},"loc":{"start":{"line":43,"column":41},"end":{"line":45,"column":1}},"line":43},"2":{"name":"parse","decl":{"start":{"line":61,"column":9},"end":{"line":61,"column":14}},"loc":{"start":{"line":61,"column":19},"end":{"line":131,"column":1}},"line":61},"3":{"name":"error","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":14}},"loc":{"start":{"line":133,"column":25},"end":{"line":140,"column":1}},"line":133}},"branchMap":{"0":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},{"start":{"line":62,"column":2},"end":{"line":62,"column":33}}],"line":62},"1":{"loc":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},{"start":{"line":71,"column":4},"end":{"line":74,"column":5}}],"line":71},"2":{"loc":{"start":{"line":71,"column":8},"end":{"line":71,"column":54}},"type":"binary-expr","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":23}},{"start":{"line":71,"column":27},"end":{"line":71,"column":54}}],"line":71},"3":{"loc":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"type":"switch","locations":[{"start":{"line":77,"column":6},"end":{"line":77,"column":22}},{"start":{"line":79,"column":6},"end":{"line":93,"column":16}},{"start":{"line":95,"column":6},"end":{"line":105,"column":16}},{"start":{"line":107,"column":6},"end":{"line":128,"column":16}}],"line":76},"4":{"loc":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},{"start":{"line":81,"column":8},"end":{"line":87,"column":9}}],"line":81},"5":{"loc":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},{"start":{"line":88,"column":8},"end":{"line":91,"column":9}}],"line":88},"6":{"loc":{"start":{"line":88,"column":12},"end":{"line":88,"column":28}},"type":"binary-expr","locations":[{"start":{"line":88,"column":12},"end":{"line":88,"column":18}},{"start":{"line":88,"column":22},"end":{"line":88,"column":28}}],"line":88},"7":{"loc":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"type":"if","locations":[{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},{"start":{"line":97,"column":8},"end":{"line":103,"column":9}}],"line":97},"8":{"loc":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"type":"if","locations":[{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},{"start":{"line":100,"column":10},"end":{"line":100,"column":66}}],"line":100},"9":{"loc":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},{"start":{"line":109,"column":8},"end":{"line":126,"column":9}}],"line":109},"10":{"loc":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"type":"if","locations":[{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},{"start":{"line":111,"column":10},"end":{"line":114,"column":11}}],"line":111},"11":{"loc":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"type":"if","locations":[{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},{"start":{"line":116,"column":10},"end":{"line":118,"column":11}}],"line":116}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":4,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0},"f":{"0":0,"1":4,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0,0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"77cb382c69a46833a08275dbc55bf34db0dcd796","contentHash":"78a790af1726a774425fb478f1423068fe64414b747d89b597baf45139e7ae3d"},"/Users/isaacs/dev/js/tar/lib/extract.js":{"path":"/Users/isaacs/dev/js/tar/lib/extract.js","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":24}},"1":{"start":{"line":5,"column":10},"end":{"line":5,"column":30}},"2":{"start":{"line":6,"column":14},"end":{"line":6,"column":32}},"3":{"start":{"line":7,"column":15},"end":{"line":7,"column":34}},"4":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"5":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"6":{"start":{"line":11,"column":34},"end":{"line":11,"column":58}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":23}},"8":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"9":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"10":{"start":{"line":19,"column":2},"end":{"line":19,"column":59}},"11":{"start":{"line":20,"column":2},"end":{"line":20,"column":25}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":26}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"15":{"start":{"line":25,"column":38},"end":{"line":25,"column":52}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":34}},"17":{"start":{"line":29,"column":2},"end":{"line":29,"column":14}},"18":{"start":{"line":30,"column":11},"end":{"line":30,"column":15}},"19":{"start":{"line":35,"column":2},"end":{"line":60,"column":4}},"20":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"21":{"start":{"line":39,"column":14},"end":{"line":39,"column":63}},"22":{"start":{"line":40,"column":6},"end":{"line":40,"column":39}},"23":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"24":{"start":{"line":42,"column":17},"end":{"line":42,"column":70}},"25":{"start":{"line":43,"column":8},"end":{"line":43,"column":50}},"26":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"27":{"start":{"line":47,"column":6},"end":{"line":48,"column":66}},"28":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"29":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"30":{"start":{"line":53,"column":21},"end":{"line":53,"column":41}},"31":{"start":{"line":54,"column":19},"end":{"line":54,"column":56}},"32":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"33":{"start":{"line":56,"column":8},"end":{"line":56,"column":65}},"34":{"start":{"line":58,"column":6},"end":{"line":58,"column":54}},"35":{"start":{"line":62,"column":2},"end":{"line":65,"column":4}},"36":{"start":{"line":63,"column":4},"end":{"line":63,"column":36}},"37":{"start":{"line":64,"column":4},"end":{"line":64,"column":15}},"38":{"start":{"line":67,"column":2},"end":{"line":69,"column":4}},"39":{"start":{"line":68,"column":4},"end":{"line":68,"column":25}},"40":{"start":{"line":71,"column":2},"end":{"line":73,"column":4}},"41":{"start":{"line":72,"column":4},"end":{"line":72,"column":20}},"42":{"start":{"line":79,"column":2},"end":{"line":84,"column":4}},"43":{"start":{"line":81,"column":4},"end":{"line":81,"column":21}},"44":{"start":{"line":82,"column":4},"end":{"line":82,"column":18}},"45":{"start":{"line":83,"column":4},"end":{"line":83,"column":20}},"46":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"47":{"start":{"line":89,"column":0},"end":{"line":94,"column":1}},"48":{"start":{"line":90,"column":11},"end":{"line":90,"column":15}},"49":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"50":{"start":{"line":91,"column":31},"end":{"line":91,"column":57}},"51":{"start":{"line":92,"column":2},"end":{"line":92,"column":15}}},"fnMap":{"0":{"name":"Extract","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":16}},"loc":{"start":{"line":10,"column":24},"end":{"line":85,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":17},"end":{"line":35,"column":18}},"loc":{"start":{"line":35,"column":34},"end":{"line":60,"column":3}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":36},"end":{"line":65,"column":3}},"line":62},"3":{"name":"(anonymous_3)","decl":{"start":{"line":67,"column":24},"end":{"line":67,"column":25}},"loc":{"start":{"line":67,"column":38},"end":{"line":69,"column":3}},"line":67},"4":{"name":"(anonymous_4)","decl":{"start":{"line":71,"column":24},"end":{"line":71,"column":25}},"loc":{"start":{"line":71,"column":35},"end":{"line":73,"column":3}},"line":71},"5":{"name":"(anonymous_5)","decl":{"start":{"line":79,"column":24},"end":{"line":79,"column":25}},"loc":{"start":{"line":79,"column":36},"end":{"line":84,"column":3}},"line":79},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":31},"end":{"line":89,"column":32}},"loc":{"start":{"line":89,"column":43},"end":{"line":94,"column":1}},"line":89}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},{"start":{"line":11,"column":2},"end":{"line":11,"column":58}}],"line":11},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},{"start":{"line":14,"column":2},"end":{"line":16,"column":3}}],"line":14},"2":{"loc":{"start":{"line":19,"column":14},"end":{"line":19,"column":59}},"type":"binary-expr","locations":[{"start":{"line":19,"column":14},"end":{"line":19,"column":23}},{"start":{"line":19,"column":27},"end":{"line":19,"column":59}}],"line":19},"3":{"loc":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"type":"if","locations":[{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},{"start":{"line":25,"column":2},"end":{"line":25,"column":52}}],"line":25},"4":{"loc":{"start":{"line":25,"column":6},"end":{"line":25,"column":36}},"type":"binary-expr","locations":[{"start":{"line":25,"column":6},"end":{"line":25,"column":17}},{"start":{"line":25,"column":21},"end":{"line":25,"column":36}}],"line":25},"5":{"loc":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},{"start":{"line":38,"column":4},"end":{"line":45,"column":5}}],"line":38},"6":{"loc":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},{"start":{"line":41,"column":6},"end":{"line":44,"column":7}}],"line":41},"7":{"loc":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},{"start":{"line":46,"column":4},"end":{"line":49,"column":5}}],"line":46},"8":{"loc":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},{"start":{"line":51,"column":4},"end":{"line":59,"column":5}}],"line":51},"9":{"loc":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"type":"binary-expr","locations":[{"start":{"line":52,"column":15},"end":{"line":52,"column":39}},{"start":{"line":52,"column":43},"end":{"line":52,"column":45}}],"line":52},"10":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},{"start":{"line":55,"column":6},"end":{"line":57,"column":7}}],"line":55},"11":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},{"start":{"line":91,"column":2},"end":{"line":91,"column":57}}],"line":91},"12":{"loc":{"start":{"line":91,"column":6},"end":{"line":91,"column":29}},"type":"binary-expr","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":16}},{"start":{"line":91,"column":20},"end":{"line":91,"column":29}}],"line":91}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":1,"47":1,"48":0,"49":0,"50":0,"51":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3fb9f60facc409fe944dc36bd2e14fc6153e403d","contentHash":"3d9485ca58c6c768b022a39d276296b53647ccf39986885459406e933921c962"}} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/fdecfc06-a944-4897-9530-e08f62883fc1.json b/node_modules/tar/.nyc_output/fdecfc06-a944-4897-9530-e08f62883fc1.json new file mode 100644 index 00000000..18f79cb1 --- /dev/null +++ b/node_modules/tar/.nyc_output/fdecfc06-a944-4897-9530-e08f62883fc1.json @@ -0,0 +1 @@ +{"/Users/isaacs/dev/js/tar/lib/pack.js":{"path":"/Users/isaacs/dev/js/tar/lib/pack.js","statementMap":{"0":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}},"1":{"start":{"line":6,"column":18},"end":{"line":6,"column":46}},"2":{"start":{"line":7,"column":13},"end":{"line":7,"column":37}},"3":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"4":{"start":{"line":9,"column":15},"end":{"line":9,"column":34}},"5":{"start":{"line":10,"column":25},"end":{"line":10,"column":61}},"6":{"start":{"line":11,"column":14},"end":{"line":11,"column":40}},"7":{"start":{"line":12,"column":10},"end":{"line":12,"column":25}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"9":{"start":{"line":14,"column":13},"end":{"line":14,"column":14}},"10":{"start":{"line":14,"column":31},"end":{"line":14,"column":41}},"11":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"12":{"start":{"line":20,"column":11},"end":{"line":20,"column":15}},"13":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"14":{"start":{"line":21,"column":29},"end":{"line":21,"column":51}},"15":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"16":{"start":{"line":23,"column":13},"end":{"line":23,"column":52}},"17":{"start":{"line":24,"column":7},"end":{"line":24,"column":32}},"18":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"19":{"start":{"line":28,"column":2},"end":{"line":28,"column":20}},"20":{"start":{"line":29,"column":2},"end":{"line":29,"column":20}},"21":{"start":{"line":30,"column":2},"end":{"line":30,"column":17}},"22":{"start":{"line":32,"column":2},"end":{"line":32,"column":25}},"23":{"start":{"line":33,"column":2},"end":{"line":33,"column":24}},"24":{"start":{"line":35,"column":2},"end":{"line":35,"column":21}},"25":{"start":{"line":36,"column":2},"end":{"line":43,"column":4}},"26":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"27":{"start":{"line":37,"column":35},"end":{"line":37,"column":41}},"28":{"start":{"line":38,"column":4},"end":{"line":38,"column":22}},"29":{"start":{"line":39,"column":4},"end":{"line":41,"column":6}},"30":{"start":{"line":40,"column":6},"end":{"line":40,"column":25}},"31":{"start":{"line":42,"column":4},"end":{"line":42,"column":15}},"32":{"start":{"line":46,"column":0},"end":{"line":57,"column":1}},"33":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"34":{"start":{"line":48,"column":23},"end":{"line":48,"column":29}},"35":{"start":{"line":49,"column":2},"end":{"line":49,"column":24}},"36":{"start":{"line":51,"column":11},"end":{"line":51,"column":15}},"37":{"start":{"line":52,"column":2},"end":{"line":56,"column":10}},"38":{"start":{"line":54,"column":6},"end":{"line":54,"column":24}},"39":{"start":{"line":59,"column":0},"end":{"line":69,"column":1}},"40":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"41":{"start":{"line":60,"column":40},"end":{"line":60,"column":68}},"42":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"43":{"start":{"line":62,"column":19},"end":{"line":62,"column":72}},"44":{"start":{"line":64,"column":2},"end":{"line":64,"column":17}},"45":{"start":{"line":65,"column":2},"end":{"line":65,"column":27}},"46":{"start":{"line":66,"column":2},"end":{"line":66,"column":17}},"47":{"start":{"line":67,"column":2},"end":{"line":67,"column":43}},"48":{"start":{"line":68,"column":2},"end":{"line":68,"column":25}},"49":{"start":{"line":71,"column":0},"end":{"line":75,"column":1}},"50":{"start":{"line":72,"column":2},"end":{"line":72,"column":21}},"51":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"52":{"start":{"line":73,"column":26},"end":{"line":73,"column":52}},"53":{"start":{"line":74,"column":2},"end":{"line":74,"column":20}},"54":{"start":{"line":77,"column":0},"end":{"line":82,"column":1}},"55":{"start":{"line":78,"column":2},"end":{"line":78,"column":22}},"56":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"57":{"start":{"line":79,"column":26},"end":{"line":79,"column":53}},"58":{"start":{"line":80,"column":2},"end":{"line":80,"column":21}},"59":{"start":{"line":81,"column":2},"end":{"line":81,"column":17}},"60":{"start":{"line":84,"column":0},"end":{"line":88,"column":1}},"61":{"start":{"line":85,"column":2},"end":{"line":85,"column":20}},"62":{"start":{"line":86,"column":2},"end":{"line":86,"column":24}},"63":{"start":{"line":87,"column":2},"end":{"line":87,"column":17}},"64":{"start":{"line":90,"column":0},"end":{"line":233,"column":1}},"65":{"start":{"line":91,"column":11},"end":{"line":91,"column":15}},"66":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"67":{"start":{"line":93,"column":4},"end":{"line":93,"column":10}},"68":{"start":{"line":96,"column":14},"end":{"line":96,"column":32}},"69":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"70":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"71":{"start":{"line":100,"column":6},"end":{"line":100,"column":22}},"72":{"start":{"line":102,"column":4},"end":{"line":102,"column":10}},"73":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"74":{"start":{"line":107,"column":4},"end":{"line":107,"column":29}},"75":{"start":{"line":108,"column":4},"end":{"line":111,"column":6}},"76":{"start":{"line":110,"column":6},"end":{"line":110,"column":19}},"77":{"start":{"line":112,"column":4},"end":{"line":112,"column":10}},"78":{"start":{"line":115,"column":2},"end":{"line":115,"column":23}},"79":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"80":{"start":{"line":119,"column":4},"end":{"line":119,"column":24}},"81":{"start":{"line":120,"column":4},"end":{"line":120,"column":24}},"82":{"start":{"line":121,"column":4},"end":{"line":121,"column":18}},"83":{"start":{"line":122,"column":4},"end":{"line":122,"column":20}},"84":{"start":{"line":123,"column":4},"end":{"line":123,"column":10}},"85":{"start":{"line":134,"column":13},"end":{"line":134,"column":53}},"86":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"87":{"start":{"line":137,"column":4},"end":{"line":137,"column":27}},"88":{"start":{"line":140,"column":15},"end":{"line":140,"column":17}},"89":{"start":{"line":142,"column":2},"end":{"line":144,"column":4}},"90":{"start":{"line":143,"column":4},"end":{"line":143,"column":30}},"91":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"92":{"start":{"line":146,"column":25},"end":{"line":146,"column":52}},"93":{"start":{"line":148,"column":2},"end":{"line":148,"column":53}},"94":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"95":{"start":{"line":152,"column":4},"end":{"line":152,"column":49}},"96":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"97":{"start":{"line":156,"column":4},"end":{"line":156,"column":29}},"98":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"99":{"start":{"line":161,"column":6},"end":{"line":161,"column":12}},"100":{"start":{"line":164,"column":6},"end":{"line":164,"column":24}},"101":{"start":{"line":165,"column":6},"end":{"line":165,"column":21}},"102":{"start":{"line":166,"column":6},"end":{"line":166,"column":11}},"103":{"start":{"line":169,"column":15},"end":{"line":169,"column":69}},"104":{"start":{"line":170,"column":6},"end":{"line":170,"column":54}},"105":{"start":{"line":171,"column":6},"end":{"line":171,"column":21}},"106":{"start":{"line":172,"column":6},"end":{"line":172,"column":11}},"107":{"start":{"line":175,"column":15},"end":{"line":175,"column":69}},"108":{"start":{"line":176,"column":6},"end":{"line":176,"column":74}},"109":{"start":{"line":177,"column":6},"end":{"line":177,"column":21}},"110":{"start":{"line":178,"column":6},"end":{"line":178,"column":11}},"111":{"start":{"line":187,"column":15},"end":{"line":187,"column":53}},"112":{"start":{"line":189,"column":2},"end":{"line":189,"column":20}},"113":{"start":{"line":195,"column":2},"end":{"line":197,"column":4}},"114":{"start":{"line":196,"column":4},"end":{"line":196,"column":22}},"115":{"start":{"line":199,"column":2},"end":{"line":205,"column":4}},"116":{"start":{"line":200,"column":4},"end":{"line":202,"column":5}},"117":{"start":{"line":201,"column":6},"end":{"line":201,"column":50}},"118":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"119":{"start":{"line":204,"column":33},"end":{"line":204,"column":44}},"120":{"start":{"line":206,"column":2},"end":{"line":206,"column":31}},"121":{"start":{"line":208,"column":14},"end":{"line":208,"column":19}},"122":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"123":{"start":{"line":210,"column":15},"end":{"line":210,"column":21}},"124":{"start":{"line":211,"column":4},"end":{"line":211,"column":16}},"125":{"start":{"line":215,"column":4},"end":{"line":215,"column":27}},"126":{"start":{"line":216,"column":4},"end":{"line":216,"column":26}},"127":{"start":{"line":217,"column":4},"end":{"line":217,"column":17}},"128":{"start":{"line":220,"column":2},"end":{"line":223,"column":4}},"129":{"start":{"line":222,"column":4},"end":{"line":222,"column":24}},"130":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"131":{"start":{"line":229,"column":4},"end":{"line":229,"column":21}},"132":{"start":{"line":232,"column":2},"end":{"line":232,"column":20}},"133":{"start":{"line":235,"column":0},"end":{"line":235,"column":39}},"134":{"start":{"line":236,"column":0},"end":{"line":236,"column":37}}},"fnMap":{"0":{"name":"Pack","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":13}},"loc":{"start":{"line":18,"column":22},"end":{"line":44,"column":1}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":36,"column":16},"end":{"line":36,"column":17}},"loc":{"start":{"line":36,"column":31},"end":{"line":43,"column":3}},"line":36},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":18},"end":{"line":39,"column":19}},"loc":{"start":{"line":39,"column":30},"end":{"line":41,"column":5}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":27},"end":{"line":46,"column":28}},"loc":{"start":{"line":46,"column":44},"end":{"line":57,"column":1}},"line":46},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":29},"end":{"line":55,"column":5}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":21},"end":{"line":59,"column":22}},"loc":{"start":{"line":59,"column":39},"end":{"line":69,"column":1}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":71,"column":23},"end":{"line":71,"column":24}},"loc":{"start":{"line":71,"column":35},"end":{"line":75,"column":1}},"line":71},"7":{"name":"(anonymous_7)","decl":{"start":{"line":77,"column":24},"end":{"line":77,"column":25}},"loc":{"start":{"line":77,"column":36},"end":{"line":82,"column":1}},"line":77},"8":{"name":"(anonymous_8)","decl":{"start":{"line":84,"column":21},"end":{"line":84,"column":22}},"loc":{"start":{"line":84,"column":33},"end":{"line":88,"column":1}},"line":84},"9":{"name":"(anonymous_9)","decl":{"start":{"line":90,"column":26},"end":{"line":90,"column":27}},"loc":{"start":{"line":90,"column":38},"end":{"line":233,"column":1}},"line":90},"10":{"name":"(anonymous_10)","decl":{"start":{"line":108,"column":22},"end":{"line":108,"column":23}},"loc":{"start":{"line":108,"column":34},"end":{"line":111,"column":5}},"line":108},"11":{"name":"(anonymous_11)","decl":{"start":{"line":142,"column":41},"end":{"line":142,"column":42}},"loc":{"start":{"line":142,"column":54},"end":{"line":144,"column":3}},"line":142},"12":{"name":"(anonymous_12)","decl":{"start":{"line":195,"column":20},"end":{"line":195,"column":21}},"loc":{"start":{"line":195,"column":33},"end":{"line":197,"column":3}},"line":195},"13":{"name":"(anonymous_13)","decl":{"start":{"line":199,"column":22},"end":{"line":199,"column":23}},"loc":{"start":{"line":199,"column":34},"end":{"line":205,"column":3}},"line":199},"14":{"name":"(anonymous_14)","decl":{"start":{"line":200,"column":30},"end":{"line":200,"column":31}},"loc":{"start":{"line":200,"column":42},"end":{"line":202,"column":5}},"line":200},"15":{"name":"nextEntry","decl":{"start":{"line":209,"column":11},"end":{"line":209,"column":20}},"loc":{"start":{"line":209,"column":24},"end":{"line":218,"column":3}},"line":209},"16":{"name":"(anonymous_16)","decl":{"start":{"line":220,"column":21},"end":{"line":220,"column":22}},"loc":{"start":{"line":220,"column":35},"end":{"line":223,"column":3}},"line":220},"17":{"name":"(anonymous_17)","decl":{"start":{"line":235,"column":25},"end":{"line":235,"column":26}},"loc":{"start":{"line":235,"column":37},"end":{"line":235,"column":39}},"line":235},"18":{"name":"(anonymous_18)","decl":{"start":{"line":236,"column":23},"end":{"line":236,"column":24}},"loc":{"start":{"line":236,"column":35},"end":{"line":236,"column":37}},"line":236}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":21,"column":51}},{"start":{"line":21,"column":2},"end":{"line":21,"column":51}}],"line":21},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":24,"column":32}},{"start":{"line":23,"column":2},"end":{"line":24,"column":32}}],"line":23},"2":{"loc":{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":41}},{"start":{"line":37,"column":4},"end":{"line":37,"column":41}}],"line":37},"3":{"loc":{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":48,"column":29}},{"start":{"line":48,"column":2},"end":{"line":48,"column":29}}],"line":48},"4":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":68}},{"start":{"line":60,"column":2},"end":{"line":60,"column":68}}],"line":60},"5":{"loc":{"start":{"line":60,"column":6},"end":{"line":60,"column":38}},"type":"binary-expr","locations":[{"start":{"line":60,"column":6},"end":{"line":60,"column":18}},{"start":{"line":60,"column":22},"end":{"line":60,"column":38}}],"line":60},"6":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":72}},{"start":{"line":62,"column":2},"end":{"line":62,"column":72}}],"line":62},"7":{"loc":{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":73,"column":52}},{"start":{"line":73,"column":2},"end":{"line":73,"column":52}}],"line":73},"8":{"loc":{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":79,"column":53}},{"start":{"line":79,"column":2},"end":{"line":79,"column":53}}],"line":79},"9":{"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},{"start":{"line":92,"column":2},"end":{"line":94,"column":3}}],"line":92},"10":{"loc":{"start":{"line":92,"column":6},"end":{"line":92,"column":34}},"type":"binary-expr","locations":[{"start":{"line":92,"column":6},"end":{"line":92,"column":16}},{"start":{"line":92,"column":20},"end":{"line":92,"column":34}}],"line":92},"11":{"loc":{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":103,"column":3}},{"start":{"line":98,"column":2},"end":{"line":103,"column":3}}],"line":98},"12":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":5}},{"start":{"line":99,"column":4},"end":{"line":101,"column":5}}],"line":99},"13":{"loc":{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":113,"column":3}},{"start":{"line":105,"column":2},"end":{"line":113,"column":3}}],"line":105},"14":{"loc":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},{"start":{"line":117,"column":2},"end":{"line":124,"column":3}}],"line":117},"15":{"loc":{"start":{"line":134,"column":27},"end":{"line":134,"column":46}},"type":"binary-expr","locations":[{"start":{"line":134,"column":27},"end":{"line":134,"column":37}},{"start":{"line":134,"column":41},"end":{"line":134,"column":46}}],"line":134},"16":{"loc":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},{"start":{"line":135,"column":2},"end":{"line":138,"column":3}}],"line":135},"17":{"loc":{"start":{"line":135,"column":6},"end":{"line":135,"column":72}},"type":"binary-expr","locations":[{"start":{"line":135,"column":6},"end":{"line":135,"column":16}},{"start":{"line":135,"column":20},"end":{"line":135,"column":39}},{"start":{"line":135,"column":43},"end":{"line":135,"column":53}},{"start":{"line":135,"column":57},"end":{"line":135,"column":72}}],"line":135},"18":{"loc":{"start":{"line":142,"column":14},"end":{"line":142,"column":31}},"type":"binary-expr","locations":[{"start":{"line":142,"column":14},"end":{"line":142,"column":25}},{"start":{"line":142,"column":29},"end":{"line":142,"column":31}}],"line":142},"19":{"loc":{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},"type":"if","locations":[{"start":{"line":146,"column":2},"end":{"line":146,"column":52}},{"start":{"line":146,"column":2},"end":{"line":146,"column":52}}],"line":146},"20":{"loc":{"start":{"line":148,"column":36},"end":{"line":148,"column":52}},"type":"binary-expr","locations":[{"start":{"line":148,"column":36},"end":{"line":148,"column":46}},{"start":{"line":148,"column":50},"end":{"line":148,"column":52}}],"line":148},"21":{"loc":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},{"start":{"line":151,"column":2},"end":{"line":153,"column":3}}],"line":151},"22":{"loc":{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},"type":"if","locations":[{"start":{"line":155,"column":2},"end":{"line":156,"column":29}},{"start":{"line":155,"column":2},"end":{"line":156,"column":29}}],"line":155},"23":{"loc":{"start":{"line":158,"column":2},"end":{"line":179,"column":3}},"type":"switch","locations":[{"start":{"line":160,"column":4},"end":{"line":161,"column":12}},{"start":{"line":163,"column":4},"end":{"line":166,"column":11}},{"start":{"line":168,"column":4},"end":{"line":172,"column":11}},{"start":{"line":174,"column":4},"end":{"line":178,"column":11}}],"line":158},"24":{"loc":{"start":{"line":170,"column":24},"end":{"line":170,"column":54}},"type":"binary-expr","locations":[{"start":{"line":170,"column":24},"end":{"line":170,"column":47}},{"start":{"line":170,"column":51},"end":{"line":170,"column":54}}],"line":170},"25":{"loc":{"start":{"line":176,"column":24},"end":{"line":176,"column":74}},"type":"binary-expr","locations":[{"start":{"line":176,"column":24},"end":{"line":176,"column":67}},{"start":{"line":176,"column":71},"end":{"line":176,"column":74}}],"line":176},"26":{"loc":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"type":"if","locations":[{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},{"start":{"line":204,"column":4},"end":{"line":204,"column":44}}],"line":204},"27":{"loc":{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},"type":"if","locations":[{"start":{"line":210,"column":4},"end":{"line":210,"column":21}},{"start":{"line":210,"column":4},"end":{"line":210,"column":21}}],"line":210},"28":{"loc":{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":227,"column":2},"end":{"line":230,"column":3}},{"start":{"line":227,"column":2},"end":{"line":230,"column":3}}],"line":227}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":512,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":1,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":1,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1,"50":0,"51":0,"52":0,"53":0,"54":1,"55":0,"56":0,"57":0,"58":0,"59":0,"60":1,"61":0,"62":0,"63":0,"64":1,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":1,"134":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0,0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0,0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"8beb16ccde52e484aa1dd87f5ece33d696c808ab","contentHash":"7bb2b7ebe1111c0deefbf9a61d17bf9d2dbe951adb585db96f9d89663ce5909d"},"/Users/isaacs/dev/js/tar/lib/entry-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}},"1":{"start":{"line":3,"column":10},"end":{"line":3,"column":30}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":38}},"3":{"start":{"line":5,"column":12},"end":{"line":5,"column":33}},"4":{"start":{"line":6,"column":15},"end":{"line":6,"column":34}},"5":{"start":{"line":7,"column":18},"end":{"line":7,"column":41}},"6":{"start":{"line":9,"column":13},"end":{"line":9,"column":37}},"7":{"start":{"line":10,"column":10},"end":{"line":10,"column":12}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":29}},"9":{"start":{"line":15,"column":11},"end":{"line":15,"column":15}},"10":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"11":{"start":{"line":18,"column":4},"end":{"line":18,"column":33}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":20}},"13":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"14":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":35}},"16":{"start":{"line":28,"column":2},"end":{"line":30,"column":4}},"17":{"start":{"line":29,"column":4},"end":{"line":29,"column":22}},"18":{"start":{"line":32,"column":2},"end":{"line":34,"column":4}},"19":{"start":{"line":33,"column":4},"end":{"line":33,"column":20}},"20":{"start":{"line":36,"column":2},"end":{"line":39,"column":4}},"21":{"start":{"line":37,"column":4},"end":{"line":37,"column":18}},"22":{"start":{"line":38,"column":4},"end":{"line":38,"column":20}},"23":{"start":{"line":41,"column":2},"end":{"line":41,"column":18}},"24":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"25":{"start":{"line":43,"column":4},"end":{"line":43,"column":18}},"26":{"start":{"line":45,"column":2},"end":{"line":45,"column":25}},"27":{"start":{"line":46,"column":2},"end":{"line":46,"column":23}},"28":{"start":{"line":47,"column":2},"end":{"line":47,"column":22}},"29":{"start":{"line":49,"column":2},"end":{"line":49,"column":17}},"30":{"start":{"line":50,"column":2},"end":{"line":50,"column":23}},"31":{"start":{"line":51,"column":2},"end":{"line":51,"column":18}},"32":{"start":{"line":53,"column":2},"end":{"line":55,"column":4}},"33":{"start":{"line":54,"column":4},"end":{"line":54,"column":17}},"34":{"start":{"line":58,"column":0},"end":{"line":65,"column":1}},"35":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"36":{"start":{"line":60,"column":19},"end":{"line":60,"column":74}},"37":{"start":{"line":61,"column":2},"end":{"line":61,"column":22}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":17}},"39":{"start":{"line":63,"column":2},"end":{"line":63,"column":43}},"40":{"start":{"line":64,"column":2},"end":{"line":64,"column":25}},"41":{"start":{"line":67,"column":0},"end":{"line":74,"column":1}},"42":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"43":{"start":{"line":69,"column":9},"end":{"line":69,"column":29}},"44":{"start":{"line":70,"column":2},"end":{"line":70,"column":24}},"45":{"start":{"line":71,"column":2},"end":{"line":71,"column":20}},"46":{"start":{"line":72,"column":2},"end":{"line":72,"column":17}},"47":{"start":{"line":73,"column":2},"end":{"line":73,"column":43}},"48":{"start":{"line":76,"column":0},"end":{"line":80,"column":1}},"49":{"start":{"line":78,"column":2},"end":{"line":78,"column":21}},"50":{"start":{"line":79,"column":2},"end":{"line":79,"column":20}},"51":{"start":{"line":82,"column":0},"end":{"line":87,"column":1}},"52":{"start":{"line":84,"column":2},"end":{"line":84,"column":22}},"53":{"start":{"line":85,"column":2},"end":{"line":85,"column":21}},"54":{"start":{"line":86,"column":2},"end":{"line":86,"column":17}},"55":{"start":{"line":89,"column":0},"end":{"line":98,"column":1}},"56":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"57":{"start":{"line":91,"column":20},"end":{"line":91,"column":69}},"58":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"59":{"start":{"line":95,"column":20},"end":{"line":95,"column":30}},"60":{"start":{"line":97,"column":2},"end":{"line":97,"column":31}},"61":{"start":{"line":100,"column":0},"end":{"line":126,"column":1}},"62":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"63":{"start":{"line":102,"column":23},"end":{"line":102,"column":29}},"64":{"start":{"line":103,"column":2},"end":{"line":103,"column":24}},"65":{"start":{"line":105,"column":20},"end":{"line":105,"column":48}},"66":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"67":{"start":{"line":108,"column":13},"end":{"line":108,"column":17}},"68":{"start":{"line":110,"column":4},"end":{"line":111,"column":44}},"69":{"start":{"line":113,"column":4},"end":{"line":120,"column":12}},"70":{"start":{"line":115,"column":8},"end":{"line":115,"column":26}},"71":{"start":{"line":118,"column":8},"end":{"line":118,"column":28}},"72":{"start":{"line":124,"column":2},"end":{"line":124,"column":32}},"73":{"start":{"line":125,"column":2},"end":{"line":125,"column":21}},"74":{"start":{"line":128,"column":0},"end":{"line":167,"column":1}},"75":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"76":{"start":{"line":131,"column":4},"end":{"line":131,"column":18}},"77":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"78":{"start":{"line":136,"column":4},"end":{"line":136,"column":10}},"79":{"start":{"line":139,"column":2},"end":{"line":139,"column":25}},"80":{"start":{"line":141,"column":12},"end":{"line":141,"column":24}},"81":{"start":{"line":142,"column":2},"end":{"line":159,"column":3}},"82":{"start":{"line":142,"column":15},"end":{"line":142,"column":16}},"83":{"start":{"line":145,"column":12},"end":{"line":145,"column":18}},"84":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"85":{"start":{"line":147,"column":19},"end":{"line":147,"column":37}},"86":{"start":{"line":148,"column":9},"end":{"line":148,"column":30}},"87":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"88":{"start":{"line":152,"column":6},"end":{"line":152,"column":30}},"89":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"90":{"start":{"line":154,"column":8},"end":{"line":154,"column":30}},"91":{"start":{"line":155,"column":8},"end":{"line":155,"column":39}},"92":{"start":{"line":157,"column":6},"end":{"line":157,"column":12}},"93":{"start":{"line":162,"column":2},"end":{"line":162,"column":25}},"94":{"start":{"line":163,"column":2},"end":{"line":163,"column":26}},"95":{"start":{"line":166,"column":2},"end":{"line":166,"column":20}},"96":{"start":{"line":169,"column":0},"end":{"line":169,"column":46}}},"fnMap":{"0":{"name":"EntryWriter","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":20}},"loc":{"start":{"line":14,"column":29},"end":{"line":56,"column":1}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":25}},"loc":{"start":{"line":28,"column":37},"end":{"line":30,"column":3}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":25},"end":{"line":32,"column":26}},"loc":{"start":{"line":32,"column":37},"end":{"line":34,"column":3}},"line":32},"3":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":23},"end":{"line":36,"column":24}},"loc":{"start":{"line":36,"column":35},"end":{"line":39,"column":3}},"line":36},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":16},"end":{"line":53,"column":17}},"loc":{"start":{"line":53,"column":28},"end":{"line":55,"column":3}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":30},"end":{"line":58,"column":31}},"loc":{"start":{"line":58,"column":43},"end":{"line":65,"column":1}},"line":58},"6":{"name":"(anonymous_6)","decl":{"start":{"line":67,"column":28},"end":{"line":67,"column":29}},"loc":{"start":{"line":67,"column":41},"end":{"line":74,"column":1}},"line":67},"7":{"name":"(anonymous_7)","decl":{"start":{"line":76,"column":30},"end":{"line":76,"column":31}},"loc":{"start":{"line":76,"column":42},"end":{"line":80,"column":1}},"line":76},"8":{"name":"(anonymous_8)","decl":{"start":{"line":82,"column":31},"end":{"line":82,"column":32}},"loc":{"start":{"line":82,"column":43},"end":{"line":87,"column":1}},"line":82},"9":{"name":"(anonymous_9)","decl":{"start":{"line":89,"column":28},"end":{"line":89,"column":29}},"loc":{"start":{"line":89,"column":45},"end":{"line":98,"column":1}},"line":89},"10":{"name":"(anonymous_10)","decl":{"start":{"line":100,"column":32},"end":{"line":100,"column":33}},"loc":{"start":{"line":100,"column":44},"end":{"line":126,"column":1}},"line":100},"11":{"name":"(anonymous_11)","decl":{"start":{"line":114,"column":18},"end":{"line":114,"column":19}},"loc":{"start":{"line":114,"column":31},"end":{"line":116,"column":7}},"line":114},"12":{"name":"(anonymous_12)","decl":{"start":{"line":117,"column":19},"end":{"line":117,"column":20}},"loc":{"start":{"line":117,"column":33},"end":{"line":119,"column":7}},"line":117},"13":{"name":"(anonymous_13)","decl":{"start":{"line":128,"column":33},"end":{"line":128,"column":34}},"loc":{"start":{"line":128,"column":45},"end":{"line":167,"column":1}},"line":128},"14":{"name":"(anonymous_14)","decl":{"start":{"line":169,"column":32},"end":{"line":169,"column":33}},"loc":{"start":{"line":169,"column":44},"end":{"line":169,"column":46}},"line":169}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"1":{"loc":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},{"start":{"line":42,"column":2},"end":{"line":44,"column":3}}],"line":42},"2":{"loc":{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":60,"column":74}},{"start":{"line":60,"column":2},"end":{"line":60,"column":74}}],"line":60},"3":{"loc":{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":69,"column":29}},{"start":{"line":69,"column":2},"end":{"line":69,"column":29}}],"line":69},"4":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":69}},{"start":{"line":91,"column":2},"end":{"line":91,"column":69}}],"line":91},"5":{"loc":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},{"start":{"line":95,"column":2},"end":{"line":95,"column":30}}],"line":95},"6":{"loc":{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},"type":"if","locations":[{"start":{"line":102,"column":2},"end":{"line":102,"column":29}},{"start":{"line":102,"column":2},"end":{"line":102,"column":29}}],"line":102},"7":{"loc":{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":121,"column":3}},{"start":{"line":107,"column":2},"end":{"line":121,"column":3}}],"line":107},"8":{"loc":{"start":{"line":107,"column":6},"end":{"line":107,"column":44}},"type":"binary-expr","locations":[{"start":{"line":107,"column":6},"end":{"line":107,"column":29}},{"start":{"line":107,"column":33},"end":{"line":107,"column":44}}],"line":107},"9":{"loc":{"start":{"line":110,"column":27},"end":{"line":111,"column":44}},"type":"binary-expr","locations":[{"start":{"line":110,"column":27},"end":{"line":110,"column":47}},{"start":{"line":111,"column":6},"end":{"line":111,"column":44}}],"line":110},"10":{"loc":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},{"start":{"line":130,"column":2},"end":{"line":132,"column":3}}],"line":130},"11":{"loc":{"start":{"line":130,"column":6},"end":{"line":130,"column":37}},"type":"binary-expr","locations":[{"start":{"line":130,"column":6},"end":{"line":130,"column":22}},{"start":{"line":130,"column":26},"end":{"line":130,"column":37}}],"line":130},"12":{"loc":{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},"type":"if","locations":[{"start":{"line":134,"column":2},"end":{"line":137,"column":3}},{"start":{"line":134,"column":2},"end":{"line":137,"column":3}}],"line":134},"13":{"loc":{"start":{"line":134,"column":6},"end":{"line":134,"column":38}},"type":"binary-expr","locations":[{"start":{"line":134,"column":6},"end":{"line":134,"column":18}},{"start":{"line":134,"column":22},"end":{"line":134,"column":38}}],"line":134},"14":{"loc":{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},"type":"if","locations":[{"start":{"line":147,"column":4},"end":{"line":148,"column":30}},{"start":{"line":147,"column":4},"end":{"line":148,"column":30}}],"line":147},"15":{"loc":{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":158,"column":5}},{"start":{"line":150,"column":4},"end":{"line":158,"column":5}}],"line":150},"16":{"loc":{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},"type":"if","locations":[{"start":{"line":153,"column":6},"end":{"line":156,"column":7}},{"start":{"line":153,"column":6},"end":{"line":156,"column":7}}],"line":153}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":1,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":1,"49":0,"50":0,"51":1,"52":0,"53":0,"54":0,"55":1,"56":0,"57":0,"58":0,"59":0,"60":0,"61":1,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":1,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3e169418508e031df78186ff63b5fa5aa2484ab8","contentHash":"84191ed4732b6763ae8701256051735aebbe5e95c932c15bef34da01b33ba1a0"},"/Users/isaacs/dev/js/tar/lib/entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/entry.js","statementMap":{"0":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"1":{"start":{"line":9,"column":16},"end":{"line":9,"column":38}},"2":{"start":{"line":10,"column":10},"end":{"line":10,"column":27}},"3":{"start":{"line":11,"column":13},"end":{"line":11,"column":33}},"4":{"start":{"line":12,"column":13},"end":{"line":12,"column":37}},"5":{"start":{"line":13,"column":15},"end":{"line":13,"column":34}},"6":{"start":{"line":14,"column":14},"end":{"line":14,"column":41}},"7":{"start":{"line":17,"column":2},"end":{"line":17,"column":19}},"8":{"start":{"line":18,"column":2},"end":{"line":18,"column":22}},"9":{"start":{"line":19,"column":2},"end":{"line":19,"column":22}},"10":{"start":{"line":21,"column":2},"end":{"line":21,"column":25}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":22}},"12":{"start":{"line":23,"column":2},"end":{"line":23,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":22}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":21}},"15":{"start":{"line":26,"column":2},"end":{"line":26,"column":21}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":21}},"17":{"start":{"line":28,"column":2},"end":{"line":28,"column":18}},"18":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"19":{"start":{"line":30,"column":2},"end":{"line":30,"column":20}},"20":{"start":{"line":32,"column":2},"end":{"line":32,"column":36}},"21":{"start":{"line":34,"column":2},"end":{"line":34,"column":17}},"22":{"start":{"line":35,"column":2},"end":{"line":35,"column":23}},"23":{"start":{"line":36,"column":2},"end":{"line":36,"column":33}},"24":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"25":{"start":{"line":41,"column":11},"end":{"line":41,"column":15}},"26":{"start":{"line":42,"column":2},"end":{"line":44,"column":4}},"27":{"start":{"line":43,"column":4},"end":{"line":43,"column":29}},"28":{"start":{"line":46,"column":2},"end":{"line":46,"column":18}},"29":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"30":{"start":{"line":51,"column":0},"end":{"line":78,"column":1}},"31":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"32":{"start":{"line":52,"column":20},"end":{"line":52,"column":65}},"33":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"34":{"start":{"line":54,"column":4},"end":{"line":54,"column":40}},"35":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"36":{"start":{"line":60,"column":4},"end":{"line":60,"column":35}},"37":{"start":{"line":62,"column":2},"end":{"line":62,"column":29}},"38":{"start":{"line":65,"column":11},"end":{"line":65,"column":25}},"39":{"start":{"line":66,"column":2},"end":{"line":66,"column":21}},"40":{"start":{"line":67,"column":2},"end":{"line":67,"column":19}},"41":{"start":{"line":69,"column":2},"end":{"line":69,"column":14}},"42":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"43":{"start":{"line":73,"column":4},"end":{"line":73,"column":26}},"44":{"start":{"line":74,"column":4},"end":{"line":74,"column":16}},"45":{"start":{"line":77,"column":2},"end":{"line":77,"column":13}},"46":{"start":{"line":80,"column":0},"end":{"line":84,"column":1}},"47":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"48":{"start":{"line":81,"column":9},"end":{"line":81,"column":22}},"49":{"start":{"line":82,"column":2},"end":{"line":82,"column":21}},"50":{"start":{"line":83,"column":2},"end":{"line":83,"column":14}},"51":{"start":{"line":86,"column":0},"end":{"line":89,"column":1}},"52":{"start":{"line":87,"column":2},"end":{"line":87,"column":21}},"53":{"start":{"line":88,"column":2},"end":{"line":88,"column":20}},"54":{"start":{"line":91,"column":0},"end":{"line":97,"column":1}},"55":{"start":{"line":93,"column":2},"end":{"line":93,"column":21}},"56":{"start":{"line":94,"column":2},"end":{"line":94,"column":22}},"57":{"start":{"line":95,"column":2},"end":{"line":95,"column":14}},"58":{"start":{"line":96,"column":2},"end":{"line":96,"column":41}},"59":{"start":{"line":100,"column":0},"end":{"line":139,"column":1}},"60":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"61":{"start":{"line":103,"column":52},"end":{"line":103,"column":58}},"62":{"start":{"line":107,"column":2},"end":{"line":107,"column":22}},"63":{"start":{"line":110,"column":2},"end":{"line":113,"column":3}},"64":{"start":{"line":111,"column":16},"end":{"line":111,"column":43}},"65":{"start":{"line":112,"column":4},"end":{"line":112,"column":28}},"66":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"67":{"start":{"line":117,"column":4},"end":{"line":117,"column":57}},"68":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"69":{"start":{"line":119,"column":6},"end":{"line":119,"column":29}},"70":{"start":{"line":120,"column":6},"end":{"line":120,"column":24}},"71":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"72":{"start":{"line":123,"column":6},"end":{"line":123,"column":24}},"73":{"start":{"line":124,"column":6},"end":{"line":124,"column":22}},"74":{"start":{"line":130,"column":12},"end":{"line":130,"column":29}},"75":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"76":{"start":{"line":132,"column":4},"end":{"line":132,"column":36}},"77":{"start":{"line":133,"column":4},"end":{"line":133,"column":22}},"78":{"start":{"line":134,"column":4},"end":{"line":134,"column":25}},"79":{"start":{"line":135,"column":4},"end":{"line":135,"column":40}},"80":{"start":{"line":138,"column":2},"end":{"line":138,"column":23}},"81":{"start":{"line":141,"column":0},"end":{"line":211,"column":1}},"82":{"start":{"line":143,"column":15},"end":{"line":143,"column":27}},"83":{"start":{"line":144,"column":17},"end":{"line":144,"column":31}},"84":{"start":{"line":145,"column":15},"end":{"line":145,"column":27}},"85":{"start":{"line":146,"column":14},"end":{"line":146,"column":24}},"86":{"start":{"line":149,"column":15},"end":{"line":149,"column":25}},"87":{"start":{"line":150,"column":2},"end":{"line":154,"column":3}},"88":{"start":{"line":150,"column":15},"end":{"line":150,"column":16}},"89":{"start":{"line":151,"column":16},"end":{"line":151,"column":25}},"90":{"start":{"line":152,"column":14},"end":{"line":152,"column":27}},"91":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"92":{"start":{"line":153,"column":36},"end":{"line":153,"column":54}},"93":{"start":{"line":158,"column":3},"end":{"line":165,"column":3}},"94":{"start":{"line":159,"column":4},"end":{"line":161,"column":6}},"95":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"96":{"start":{"line":160,"column":39},"end":{"line":160,"column":54}},"97":{"start":{"line":165,"column":3},"end":{"line":173,"column":3}},"98":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"99":{"start":{"line":167,"column":6},"end":{"line":167,"column":40}},"100":{"start":{"line":173,"column":3},"end":{"line":177,"column":4}},"101":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"102":{"start":{"line":175,"column":6},"end":{"line":175,"column":42}},"103":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"104":{"start":{"line":184,"column":6},"end":{"line":184,"column":19}},"105":{"start":{"line":185,"column":6},"end":{"line":185,"column":11}},"106":{"start":{"line":188,"column":6},"end":{"line":188,"column":24}},"107":{"start":{"line":189,"column":6},"end":{"line":189,"column":11}},"108":{"start":{"line":192,"column":6},"end":{"line":192,"column":22}},"109":{"start":{"line":193,"column":6},"end":{"line":193,"column":11}},"110":{"start":{"line":202,"column":6},"end":{"line":202,"column":34}},"111":{"start":{"line":205,"column":2},"end":{"line":205,"column":18}},"112":{"start":{"line":206,"column":2},"end":{"line":206,"column":24}},"113":{"start":{"line":207,"column":2},"end":{"line":207,"column":24}},"114":{"start":{"line":210,"column":2},"end":{"line":210,"column":30}},"115":{"start":{"line":215,"column":0},"end":{"line":217,"column":1}},"116":{"start":{"line":216,"column":2},"end":{"line":216,"column":20}},"117":{"start":{"line":219,"column":0},"end":{"line":219,"column":35}},"118":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}}},"fnMap":{"0":{"name":"Entry","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":14}},"loc":{"start":{"line":16,"column":42},"end":{"line":47,"column":1}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":36},"end":{"line":42,"column":37}},"loc":{"start":{"line":42,"column":49},"end":{"line":44,"column":3}},"line":42},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":24},"end":{"line":51,"column":25}},"loc":{"start":{"line":51,"column":37},"end":{"line":78,"column":1}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":80,"column":22},"end":{"line":80,"column":23}},"loc":{"start":{"line":80,"column":35},"end":{"line":84,"column":1}},"line":80},"4":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":24},"end":{"line":86,"column":25}},"loc":{"start":{"line":86,"column":36},"end":{"line":89,"column":1}},"line":86},"5":{"name":"(anonymous_5)","decl":{"start":{"line":91,"column":25},"end":{"line":91,"column":26}},"loc":{"start":{"line":91,"column":37},"end":{"line":97,"column":1}},"line":91},"6":{"name":"(anonymous_6)","decl":{"start":{"line":100,"column":24},"end":{"line":100,"column":25}},"loc":{"start":{"line":100,"column":36},"end":{"line":139,"column":1}},"line":100},"7":{"name":"(anonymous_7)","decl":{"start":{"line":141,"column":28},"end":{"line":141,"column":29}},"loc":{"start":{"line":141,"column":40},"end":{"line":211,"column":1}},"line":141},"8":{"name":"(anonymous_8)","decl":{"start":{"line":158,"column":30},"end":{"line":158,"column":31}},"loc":{"start":{"line":158,"column":43},"end":{"line":162,"column":3}},"line":158},"9":{"name":"(anonymous_9)","decl":{"start":{"line":159,"column":27},"end":{"line":159,"column":28}},"loc":{"start":{"line":159,"column":40},"end":{"line":161,"column":5}},"line":159},"10":{"name":"(anonymous_10)","decl":{"start":{"line":165,"column":32},"end":{"line":165,"column":33}},"loc":{"start":{"line":165,"column":45},"end":{"line":169,"column":3}},"line":165},"11":{"name":"(anonymous_11)","decl":{"start":{"line":173,"column":39},"end":{"line":173,"column":40}},"loc":{"start":{"line":173,"column":52},"end":{"line":177,"column":3}},"line":173},"12":{"name":"(anonymous_12)","decl":{"start":{"line":215,"column":24},"end":{"line":215,"column":25}},"loc":{"start":{"line":215,"column":34},"end":{"line":217,"column":1}},"line":215}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":19},"end":{"line":36,"column":33}},"type":"binary-expr","locations":[{"start":{"line":36,"column":19},"end":{"line":36,"column":27}},{"start":{"line":36,"column":31},"end":{"line":36,"column":33}}],"line":36},"1":{"loc":{"start":{"line":42,"column":14},"end":{"line":42,"column":26}},"type":"binary-expr","locations":[{"start":{"line":42,"column":14},"end":{"line":42,"column":20}},{"start":{"line":42,"column":24},"end":{"line":42,"column":26}}],"line":42},"2":{"loc":{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":52,"column":65}},{"start":{"line":52,"column":2},"end":{"line":52,"column":65}}],"line":52},"3":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},{"start":{"line":53,"column":2},"end":{"line":55,"column":3}}],"line":53},"4":{"loc":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},{"start":{"line":59,"column":2},"end":{"line":61,"column":3}}],"line":59},"5":{"loc":{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":75,"column":3}},{"start":{"line":72,"column":2},"end":{"line":75,"column":3}}],"line":72},"6":{"loc":{"start":{"line":72,"column":6},"end":{"line":72,"column":28}},"type":"binary-expr","locations":[{"start":{"line":72,"column":6},"end":{"line":72,"column":18}},{"start":{"line":72,"column":22},"end":{"line":72,"column":28}}],"line":72},"7":{"loc":{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":81,"column":22}},{"start":{"line":81,"column":2},"end":{"line":81,"column":22}}],"line":81},"8":{"loc":{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":103,"column":58}},{"start":{"line":103,"column":2},"end":{"line":103,"column":58}}],"line":103},"9":{"loc":{"start":{"line":103,"column":6},"end":{"line":103,"column":50}},"type":"binary-expr","locations":[{"start":{"line":103,"column":6},"end":{"line":103,"column":18}},{"start":{"line":103,"column":22},"end":{"line":103,"column":35}},{"start":{"line":103,"column":39},"end":{"line":103,"column":50}}],"line":103},"10":{"loc":{"start":{"line":110,"column":9},"end":{"line":110,"column":54}},"type":"binary-expr","locations":[{"start":{"line":110,"column":9},"end":{"line":110,"column":37}},{"start":{"line":110,"column":41},"end":{"line":110,"column":54}}],"line":110},"11":{"loc":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},{"start":{"line":116,"column":2},"end":{"line":126,"column":3}}],"line":116},"12":{"loc":{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":121,"column":5}},{"start":{"line":118,"column":4},"end":{"line":121,"column":5}}],"line":118},"13":{"loc":{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},"type":"if","locations":[{"start":{"line":122,"column":4},"end":{"line":125,"column":5}},{"start":{"line":122,"column":4},"end":{"line":125,"column":5}}],"line":122},"14":{"loc":{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":136,"column":3}},{"start":{"line":131,"column":2},"end":{"line":136,"column":3}}],"line":131},"15":{"loc":{"start":{"line":131,"column":6},"end":{"line":131,"column":45}},"type":"binary-expr","locations":[{"start":{"line":131,"column":6},"end":{"line":131,"column":26}},{"start":{"line":131,"column":30},"end":{"line":131,"column":45}}],"line":131},"16":{"loc":{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},"type":"if","locations":[{"start":{"line":153,"column":4},"end":{"line":153,"column":54}},{"start":{"line":153,"column":4},"end":{"line":153,"column":54}}],"line":153},"17":{"loc":{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},"type":"if","locations":[{"start":{"line":160,"column":6},"end":{"line":160,"column":54}},{"start":{"line":160,"column":6},"end":{"line":160,"column":54}}],"line":160},"18":{"loc":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"type":"if","locations":[{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},{"start":{"line":166,"column":4},"end":{"line":168,"column":5}}],"line":166},"19":{"loc":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"type":"if","locations":[{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},{"start":{"line":174,"column":4},"end":{"line":176,"column":5}}],"line":174},"20":{"loc":{"start":{"line":181,"column":2},"end":{"line":203,"column":3}},"type":"switch","locations":[{"start":{"line":182,"column":4},"end":{"line":182,"column":19}},{"start":{"line":183,"column":4},"end":{"line":185,"column":11}},{"start":{"line":187,"column":4},"end":{"line":189,"column":11}},{"start":{"line":191,"column":4},"end":{"line":193,"column":11}},{"start":{"line":195,"column":4},"end":{"line":195,"column":16}},{"start":{"line":196,"column":4},"end":{"line":196,"column":24}},{"start":{"line":197,"column":4},"end":{"line":197,"column":27}},{"start":{"line":198,"column":4},"end":{"line":198,"column":23}},{"start":{"line":199,"column":4},"end":{"line":199,"column":21}},{"start":{"line":200,"column":4},"end":{"line":200,"column":16}},{"start":{"line":201,"column":4},"end":{"line":202,"column":34}}],"line":181}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":17,"8":17,"9":17,"10":17,"11":17,"12":17,"13":17,"14":17,"15":17,"16":17,"17":17,"18":17,"19":17,"20":17,"21":17,"22":17,"23":17,"24":17,"25":17,"26":17,"27":0,"28":17,"29":1,"30":1,"31":17,"32":0,"33":17,"34":0,"35":17,"36":15,"37":17,"38":17,"39":17,"40":17,"41":17,"42":17,"43":0,"44":0,"45":17,"46":1,"47":17,"48":0,"49":17,"50":17,"51":1,"52":0,"53":0,"54":1,"55":0,"56":0,"57":0,"58":0,"59":1,"60":34,"61":0,"62":34,"63":34,"64":17,"65":17,"66":34,"67":34,"68":34,"69":0,"70":0,"71":34,"72":17,"73":17,"74":34,"75":34,"76":0,"77":0,"78":0,"79":0,"80":34,"81":1,"82":17,"83":17,"84":17,"85":17,"86":17,"87":17,"88":17,"89":289,"90":289,"91":289,"92":242,"93":17,"94":34,"95":29,"96":29,"97":17,"98":34,"99":34,"100":17,"101":51,"102":25,"103":17,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":17,"111":17,"112":17,"113":17,"114":17,"115":1,"116":0,"117":1,"118":1},"f":{"0":17,"1":0,"2":17,"3":17,"4":0,"5":0,"6":34,"7":17,"8":34,"9":29,"10":34,"11":51,"12":0},"b":{"0":[17,11],"1":[17,17],"2":[0,17],"3":[0,17],"4":[15,2],"5":[0,17],"6":[17,17],"7":[0,17],"8":[0,34],"9":[34,34,34],"10":[51,17],"11":[34,0],"12":[0,34],"13":[17,17],"14":[0,34],"15":[34,0],"16":[242,47],"17":[29,0],"18":[34,0],"19":[25,26],"20":[0,0,0,0,1,2,2,2,2,2,17]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"2cc4f925db2a60e89bf0743124faec4e8996dfdb","contentHash":"245d5cb2b23d975dc5b9a0ed2553c93c587727d50a7961242f50cec333c04ba9"},"/Users/isaacs/dev/js/tar/lib/global-header-writer.js":{"path":"/Users/isaacs/dev/js/tar/lib/global-header-writer.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"1":{"start":{"line":3,"column":27},"end":{"line":3,"column":65}},"2":{"start":{"line":4,"column":15},"end":{"line":4,"column":34}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":50}},"4":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":40}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":40}},"7":{"start":{"line":13,"column":2},"end":{"line":13,"column":23}}},"fnMap":{"0":{"name":"GlobalHeaderWriter","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":27}},"loc":{"start":{"line":8,"column":36},"end":{"line":14,"column":1}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},{"start":{"line":9,"column":2},"end":{"line":11,"column":3}}],"line":9}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0},"f":{"0":0},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3d0c8589f62a5c8ccec606d52d3abd98e5627d57","contentHash":"a2570ca840cf3e44d77e15af0aee52f7c145da39b76366006f3672b9708def3e"},"/Users/isaacs/dev/js/tar/lib/parse.js":{"path":"/Users/isaacs/dev/js/tar/lib/parse.js","statementMap":{"0":{"start":{"line":6,"column":0},"end":{"line":6,"column":37}},"1":{"start":{"line":8,"column":13},"end":{"line":8,"column":30}},"2":{"start":{"line":9,"column":13},"end":{"line":9,"column":26}},"3":{"start":{"line":10,"column":18},"end":{"line":10,"column":41}},"4":{"start":{"line":11,"column":10},"end":{"line":11,"column":30}},"5":{"start":{"line":12,"column":16},"end":{"line":12,"column":38}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":46}},"8":{"start":{"line":15,"column":21},"end":{"line":15,"column":52}},"9":{"start":{"line":16,"column":13},"end":{"line":16,"column":33}},"10":{"start":{"line":17,"column":15},"end":{"line":17,"column":34}},"11":{"start":{"line":18,"column":14},"end":{"line":18,"column":32}},"12":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"13":{"start":{"line":28,"column":11},"end":{"line":28,"column":15}},"14":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"15":{"start":{"line":29,"column":30},"end":{"line":29,"column":48}},"16":{"start":{"line":34,"column":2},"end":{"line":34,"column":18}},"17":{"start":{"line":36,"column":2},"end":{"line":36,"column":20}},"18":{"start":{"line":37,"column":2},"end":{"line":37,"column":20}},"19":{"start":{"line":38,"column":2},"end":{"line":38,"column":35}},"20":{"start":{"line":39,"column":2},"end":{"line":39,"column":17}},"21":{"start":{"line":40,"column":2},"end":{"line":40,"column":19}},"22":{"start":{"line":41,"column":2},"end":{"line":41,"column":20}},"23":{"start":{"line":43,"column":2},"end":{"line":45,"column":4}},"24":{"start":{"line":44,"column":4},"end":{"line":44,"column":23}},"25":{"start":{"line":47,"column":2},"end":{"line":49,"column":4}},"26":{"start":{"line":48,"column":4},"end":{"line":48,"column":18}},"27":{"start":{"line":51,"column":2},"end":{"line":53,"column":4}},"28":{"start":{"line":52,"column":4},"end":{"line":52,"column":19}},"29":{"start":{"line":55,"column":2},"end":{"line":57,"column":4}},"30":{"start":{"line":56,"column":4},"end":{"line":56,"column":20}},"31":{"start":{"line":63,"column":0},"end":{"line":67,"column":1}},"32":{"start":{"line":64,"column":11},"end":{"line":64,"column":15}},"33":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"34":{"start":{"line":65,"column":31},"end":{"line":65,"column":57}},"35":{"start":{"line":66,"column":2},"end":{"line":66,"column":16}},"36":{"start":{"line":72,"column":0},"end":{"line":83,"column":1}},"37":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"38":{"start":{"line":77,"column":4},"end":{"line":79,"column":5}},"39":{"start":{"line":77,"column":17},"end":{"line":77,"column":18}},"40":{"start":{"line":77,"column":24},"end":{"line":77,"column":32}},"41":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"42":{"start":{"line":78,"column":22},"end":{"line":78,"column":62}},"43":{"start":{"line":80,"column":4},"end":{"line":80,"column":10}},"44":{"start":{"line":82,"column":2},"end":{"line":82,"column":30}},"45":{"start":{"line":85,"column":0},"end":{"line":88,"column":1}},"46":{"start":{"line":86,"column":2},"end":{"line":86,"column":20}},"47":{"start":{"line":87,"column":2},"end":{"line":87,"column":28}},"48":{"start":{"line":94,"column":0},"end":{"line":94,"column":38}},"49":{"start":{"line":96,"column":0},"end":{"line":137,"column":1}},"50":{"start":{"line":97,"column":2},"end":{"line":97,"column":59}},"51":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"52":{"start":{"line":105,"column":16},"end":{"line":105,"column":27}},"53":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"54":{"start":{"line":106,"column":22},"end":{"line":106,"column":36}},"55":{"start":{"line":108,"column":6},"end":{"line":108,"column":34}},"56":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"57":{"start":{"line":109,"column":31},"end":{"line":109,"column":51}},"58":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"59":{"start":{"line":112,"column":6},"end":{"line":112,"column":17}},"60":{"start":{"line":113,"column":6},"end":{"line":113,"column":24}},"61":{"start":{"line":117,"column":15},"end":{"line":117,"column":19}},"62":{"start":{"line":118,"column":4},"end":{"line":120,"column":5}},"63":{"start":{"line":118,"column":17},"end":{"line":118,"column":18}},"64":{"start":{"line":119,"column":6},"end":{"line":119,"column":23}},"65":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"66":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"67":{"start":{"line":128,"column":8},"end":{"line":128,"column":26}},"68":{"start":{"line":129,"column":6},"end":{"line":129,"column":29}},"69":{"start":{"line":131,"column":6},"end":{"line":131,"column":30}},"70":{"start":{"line":132,"column":6},"end":{"line":132,"column":25}},"71":{"start":{"line":136,"column":2},"end":{"line":136,"column":22}},"72":{"start":{"line":140,"column":0},"end":{"line":285,"column":1}},"73":{"start":{"line":141,"column":15},"end":{"line":141,"column":31}},"74":{"start":{"line":142,"column":13},"end":{"line":142,"column":17}},"75":{"start":{"line":147,"column":13},"end":{"line":147,"column":18}},"76":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"77":{"start":{"line":150,"column":12},"end":{"line":150,"column":41}},"78":{"start":{"line":151,"column":4},"end":{"line":151,"column":21}},"79":{"start":{"line":152,"column":4},"end":{"line":152,"column":37}},"80":{"start":{"line":153,"column":4},"end":{"line":153,"column":37}},"81":{"start":{"line":154,"column":4},"end":{"line":154,"column":32}},"82":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"83":{"start":{"line":171,"column":6},"end":{"line":171,"column":23}},"84":{"start":{"line":172,"column":6},"end":{"line":172,"column":18}},"85":{"start":{"line":173,"column":6},"end":{"line":173,"column":11}},"86":{"start":{"line":177,"column":6},"end":{"line":177,"column":32}},"87":{"start":{"line":178,"column":6},"end":{"line":183,"column":7}},"88":{"start":{"line":179,"column":8},"end":{"line":179,"column":41}},"89":{"start":{"line":180,"column":8},"end":{"line":182,"column":10}},"90":{"start":{"line":181,"column":10},"end":{"line":181,"column":43}},"91":{"start":{"line":184,"column":6},"end":{"line":184,"column":33}},"92":{"start":{"line":185,"column":6},"end":{"line":185,"column":17}},"93":{"start":{"line":186,"column":6},"end":{"line":186,"column":11}},"94":{"start":{"line":191,"column":6},"end":{"line":191,"column":32}},"95":{"start":{"line":192,"column":6},"end":{"line":194,"column":7}},"96":{"start":{"line":193,"column":8},"end":{"line":193,"column":37}},"97":{"start":{"line":195,"column":6},"end":{"line":195,"column":27}},"98":{"start":{"line":196,"column":6},"end":{"line":196,"column":17}},"99":{"start":{"line":197,"column":6},"end":{"line":197,"column":11}},"100":{"start":{"line":201,"column":6},"end":{"line":201,"column":29}},"101":{"start":{"line":202,"column":6},"end":{"line":205,"column":7}},"102":{"start":{"line":203,"column":8},"end":{"line":203,"column":45}},"103":{"start":{"line":204,"column":8},"end":{"line":204,"column":44}},"104":{"start":{"line":206,"column":6},"end":{"line":206,"column":25}},"105":{"start":{"line":207,"column":6},"end":{"line":207,"column":17}},"106":{"start":{"line":208,"column":6},"end":{"line":208,"column":11}},"107":{"start":{"line":213,"column":6},"end":{"line":213,"column":29}},"108":{"start":{"line":214,"column":6},"end":{"line":217,"column":7}},"109":{"start":{"line":215,"column":8},"end":{"line":215,"column":45}},"110":{"start":{"line":216,"column":8},"end":{"line":216,"column":40}},"111":{"start":{"line":218,"column":6},"end":{"line":218,"column":21}},"112":{"start":{"line":219,"column":6},"end":{"line":219,"column":17}},"113":{"start":{"line":220,"column":6},"end":{"line":220,"column":11}},"114":{"start":{"line":226,"column":6},"end":{"line":226,"column":23}},"115":{"start":{"line":227,"column":6},"end":{"line":227,"column":25}},"116":{"start":{"line":228,"column":6},"end":{"line":228,"column":11}},"117":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"118":{"start":{"line":233,"column":4},"end":{"line":233,"column":28}},"119":{"start":{"line":235,"column":17},"end":{"line":235,"column":29}},"120":{"start":{"line":236,"column":19},"end":{"line":236,"column":33}},"121":{"start":{"line":240,"column":4},"end":{"line":240,"column":25}},"122":{"start":{"line":242,"column":2},"end":{"line":242,"column":49}},"123":{"start":{"line":243,"column":2},"end":{"line":243,"column":19}},"124":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"125":{"start":{"line":247,"column":4},"end":{"line":249,"column":6}},"126":{"start":{"line":248,"column":6},"end":{"line":248,"column":24}},"127":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"128":{"start":{"line":252,"column":13},"end":{"line":252,"column":35}},"129":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"130":{"start":{"line":255,"column":4},"end":{"line":255,"column":23}},"131":{"start":{"line":258,"column":2},"end":{"line":258,"column":21}},"132":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"133":{"start":{"line":261,"column":4},"end":{"line":261,"column":39}},"134":{"start":{"line":264,"column":11},"end":{"line":264,"column":15}},"135":{"start":{"line":266,"column":2},"end":{"line":268,"column":4}},"136":{"start":{"line":267,"column":4},"end":{"line":267,"column":14}},"137":{"start":{"line":270,"column":2},"end":{"line":272,"column":4}},"138":{"start":{"line":271,"column":4},"end":{"line":271,"column":15}},"139":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"140":{"start":{"line":275,"column":4},"end":{"line":275,"column":29}},"141":{"start":{"line":278,"column":2},"end":{"line":278,"column":22}},"142":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"143":{"start":{"line":282,"column":4},"end":{"line":282,"column":15}},"144":{"start":{"line":283,"column":4},"end":{"line":283,"column":22}}},"fnMap":{"0":{"name":"Parse","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":14}},"loc":{"start":{"line":27,"column":18},"end":{"line":58,"column":1}},"line":27},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":25},"end":{"line":43,"column":26}},"loc":{"start":{"line":43,"column":38},"end":{"line":45,"column":3}},"line":43},"2":{"name":"(anonymous_2)","decl":{"start":{"line":47,"column":24},"end":{"line":47,"column":25}},"loc":{"start":{"line":47,"column":37},"end":{"line":49,"column":3}},"line":47},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":23},"end":{"line":51,"column":24}},"loc":{"start":{"line":51,"column":35},"end":{"line":53,"column":3}},"line":51},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":25},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":37},"end":{"line":57,"column":3}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":63,"column":29},"end":{"line":63,"column":30}},"loc":{"start":{"line":63,"column":41},"end":{"line":67,"column":1}},"line":63},"6":{"name":"(anonymous_6)","decl":{"start":{"line":72,"column":24},"end":{"line":72,"column":25}},"loc":{"start":{"line":72,"column":37},"end":{"line":83,"column":1}},"line":72},"7":{"name":"(anonymous_7)","decl":{"start":{"line":85,"column":22},"end":{"line":85,"column":23}},"loc":{"start":{"line":85,"column":35},"end":{"line":88,"column":1}},"line":85},"8":{"name":"(anonymous_8)","decl":{"start":{"line":94,"column":24},"end":{"line":94,"column":25}},"loc":{"start":{"line":94,"column":36},"end":{"line":94,"column":38}},"line":94},"9":{"name":"(anonymous_9)","decl":{"start":{"line":96,"column":27},"end":{"line":96,"column":28}},"loc":{"start":{"line":96,"column":40},"end":{"line":137,"column":1}},"line":96},"10":{"name":"(anonymous_10)","decl":{"start":{"line":140,"column":30},"end":{"line":140,"column":31}},"loc":{"start":{"line":140,"column":43},"end":{"line":285,"column":1}},"line":140},"11":{"name":"(anonymous_11)","decl":{"start":{"line":178,"column":14},"end":{"line":178,"column":15}},"loc":{"start":{"line":178,"column":26},"end":{"line":183,"column":7}},"line":178},"12":{"name":"(anonymous_12)","decl":{"start":{"line":180,"column":42},"end":{"line":180,"column":43}},"loc":{"start":{"line":180,"column":55},"end":{"line":182,"column":9}},"line":180},"13":{"name":"(anonymous_13)","decl":{"start":{"line":192,"column":14},"end":{"line":192,"column":15}},"loc":{"start":{"line":192,"column":26},"end":{"line":194,"column":7}},"line":192},"14":{"name":"(anonymous_14)","decl":{"start":{"line":202,"column":14},"end":{"line":202,"column":15}},"loc":{"start":{"line":202,"column":26},"end":{"line":205,"column":7}},"line":202},"15":{"name":"(anonymous_15)","decl":{"start":{"line":214,"column":14},"end":{"line":214,"column":15}},"loc":{"start":{"line":214,"column":26},"end":{"line":217,"column":7}},"line":214},"16":{"name":"(anonymous_16)","decl":{"start":{"line":247,"column":21},"end":{"line":247,"column":22}},"loc":{"start":{"line":247,"column":34},"end":{"line":249,"column":5}},"line":247},"17":{"name":"(anonymous_17)","decl":{"start":{"line":266,"column":20},"end":{"line":266,"column":21}},"loc":{"start":{"line":266,"column":32},"end":{"line":268,"column":3}},"line":266},"18":{"name":"(anonymous_18)","decl":{"start":{"line":270,"column":21},"end":{"line":270,"column":22}},"loc":{"start":{"line":270,"column":33},"end":{"line":272,"column":3}},"line":270}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":29,"column":48}},{"start":{"line":29,"column":2},"end":{"line":29,"column":48}}],"line":29},"1":{"loc":{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":65,"column":57}},{"start":{"line":65,"column":2},"end":{"line":65,"column":57}}],"line":65},"2":{"loc":{"start":{"line":65,"column":6},"end":{"line":65,"column":29}},"type":"binary-expr","locations":[{"start":{"line":65,"column":6},"end":{"line":65,"column":16}},{"start":{"line":65,"column":20},"end":{"line":65,"column":29}}],"line":65},"3":{"loc":{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":81,"column":3}},{"start":{"line":73,"column":2},"end":{"line":81,"column":3}}],"line":73},"4":{"loc":{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},"type":"if","locations":[{"start":{"line":78,"column":6},"end":{"line":78,"column":62}},{"start":{"line":78,"column":6},"end":{"line":78,"column":62}}],"line":78},"5":{"loc":{"start":{"line":97,"column":9},"end":{"line":97,"column":30}},"type":"binary-expr","locations":[{"start":{"line":97,"column":9},"end":{"line":97,"column":10}},{"start":{"line":97,"column":14},"end":{"line":97,"column":30}}],"line":97},"6":{"loc":{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":134,"column":3}},{"start":{"line":104,"column":2},"end":{"line":134,"column":3}}],"line":104},"7":{"loc":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"type":"if","locations":[{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},{"start":{"line":106,"column":4},"end":{"line":110,"column":5}}],"line":106},"8":{"loc":{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},"type":"if","locations":[{"start":{"line":109,"column":6},"end":{"line":109,"column":51}},{"start":{"line":109,"column":6},"end":{"line":109,"column":51}}],"line":109},"9":{"loc":{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":114,"column":5}},{"start":{"line":111,"column":4},"end":{"line":114,"column":5}}],"line":111},"10":{"loc":{"start":{"line":118,"column":20},"end":{"line":118,"column":35}},"type":"binary-expr","locations":[{"start":{"line":118,"column":20},"end":{"line":118,"column":27}},{"start":{"line":118,"column":31},"end":{"line":118,"column":35}}],"line":118},"11":{"loc":{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},"type":"if","locations":[{"start":{"line":126,"column":4},"end":{"line":133,"column":5}},{"start":{"line":126,"column":4},"end":{"line":133,"column":5}}],"line":126},"12":{"loc":{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},"type":"if","locations":[{"start":{"line":127,"column":6},"end":{"line":128,"column":26}},{"start":{"line":127,"column":6},"end":{"line":128,"column":26}}],"line":127},"13":{"loc":{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":155,"column":3}},{"start":{"line":149,"column":2},"end":{"line":155,"column":3}}],"line":149},"14":{"loc":{"start":{"line":149,"column":6},"end":{"line":149,"column":48}},"type":"binary-expr","locations":[{"start":{"line":149,"column":6},"end":{"line":149,"column":26}},{"start":{"line":149,"column":30},"end":{"line":149,"column":48}}],"line":149},"15":{"loc":{"start":{"line":157,"column":2},"end":{"line":229,"column":3}},"type":"switch","locations":[{"start":{"line":158,"column":4},"end":{"line":158,"column":16}},{"start":{"line":159,"column":4},"end":{"line":159,"column":19}},{"start":{"line":160,"column":4},"end":{"line":160,"column":16}},{"start":{"line":161,"column":4},"end":{"line":161,"column":24}},{"start":{"line":162,"column":4},"end":{"line":162,"column":27}},{"start":{"line":163,"column":4},"end":{"line":163,"column":23}},{"start":{"line":164,"column":4},"end":{"line":164,"column":21}},{"start":{"line":165,"column":4},"end":{"line":165,"column":16}},{"start":{"line":166,"column":4},"end":{"line":166,"column":26}},{"start":{"line":167,"column":4},"end":{"line":173,"column":11}},{"start":{"line":175,"column":4},"end":{"line":186,"column":11}},{"start":{"line":188,"column":4},"end":{"line":188,"column":26}},{"start":{"line":189,"column":4},"end":{"line":197,"column":11}},{"start":{"line":199,"column":4},"end":{"line":208,"column":11}},{"start":{"line":210,"column":4},"end":{"line":210,"column":31}},{"start":{"line":211,"column":4},"end":{"line":220,"column":11}},{"start":{"line":222,"column":4},"end":{"line":228,"column":11}}],"line":157},"16":{"loc":{"start":{"line":179,"column":23},"end":{"line":179,"column":41}},"type":"binary-expr","locations":[{"start":{"line":179,"column":23},"end":{"line":179,"column":35}},{"start":{"line":179,"column":39},"end":{"line":179,"column":41}}],"line":179},"17":{"loc":{"start":{"line":203,"column":25},"end":{"line":203,"column":45}},"type":"binary-expr","locations":[{"start":{"line":203,"column":25},"end":{"line":203,"column":39}},{"start":{"line":203,"column":43},"end":{"line":203,"column":45}}],"line":203},"18":{"loc":{"start":{"line":215,"column":25},"end":{"line":215,"column":45}},"type":"binary-expr","locations":[{"start":{"line":215,"column":25},"end":{"line":215,"column":39}},{"start":{"line":215,"column":43},"end":{"line":215,"column":45}}],"line":215},"19":{"loc":{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":241,"column":3}},{"start":{"line":232,"column":2},"end":{"line":241,"column":3}}],"line":232},"20":{"loc":{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":250,"column":3}},{"start":{"line":246,"column":2},"end":{"line":250,"column":3}}],"line":246},"21":{"loc":{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},"type":"if","locations":[{"start":{"line":252,"column":2},"end":{"line":252,"column":35}},{"start":{"line":252,"column":2},"end":{"line":252,"column":35}}],"line":252},"22":{"loc":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},{"start":{"line":254,"column":2},"end":{"line":256,"column":3}}],"line":254},"23":{"loc":{"start":{"line":254,"column":6},"end":{"line":254,"column":58}},"type":"binary-expr","locations":[{"start":{"line":254,"column":6},"end":{"line":254,"column":27}},{"start":{"line":254,"column":31},"end":{"line":254,"column":58}}],"line":254},"24":{"loc":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},{"start":{"line":260,"column":2},"end":{"line":262,"column":3}}],"line":260},"25":{"loc":{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},"type":"if","locations":[{"start":{"line":274,"column":2},"end":{"line":276,"column":3}},{"start":{"line":274,"column":2},"end":{"line":276,"column":3}}],"line":274},"26":{"loc":{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},"type":"if","locations":[{"start":{"line":281,"column":2},"end":{"line":284,"column":3}},{"start":{"line":281,"column":2},"end":{"line":284,"column":3}}],"line":281}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":2,"14":2,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":0,"25":1,"26":36,"27":1,"28":1,"29":1,"30":0,"31":1,"32":1,"33":1,"34":0,"35":1,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":36,"51":36,"52":17,"53":17,"54":17,"55":0,"56":0,"57":0,"58":17,"59":15,"60":15,"61":19,"62":19,"63":19,"64":1041,"65":19,"66":2,"67":1,"68":2,"69":17,"70":17,"71":36,"72":1,"73":17,"74":17,"75":17,"76":17,"77":0,"78":0,"79":0,"80":0,"81":0,"82":17,"83":10,"84":10,"85":10,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":0,"115":0,"116":0,"117":17,"118":7,"119":10,"120":10,"121":10,"122":17,"123":17,"124":17,"125":10,"126":10,"127":17,"128":7,"129":17,"130":0,"131":17,"132":17,"133":1,"134":17,"135":17,"136":0,"137":17,"138":0,"139":17,"140":17,"141":17,"142":17,"143":2,"144":2},"f":{"0":2,"1":0,"2":36,"3":1,"4":0,"5":1,"6":1,"7":1,"8":0,"9":36,"10":17,"11":0,"12":0,"13":4,"14":1,"15":2,"16":10,"17":0,"18":0},"b":{"0":[1,1],"1":[0,1],"2":[1,1],"3":[0,1],"4":[0,0],"5":[36,36],"6":[17,19],"7":[17,0],"8":[0,0],"9":[15,2],"10":[1060,1058],"11":[2,17],"12":[1,1],"13":[0,17],"14":[17,17],"15":[8,8,9,10,10,10,10,10,10,10,0,4,4,1,2,2,0],"16":[0,0],"17":[1,1],"18":[2,1],"19":[7,10],"20":[10,7],"21":[7,10],"22":[0,17],"23":[17,8],"24":[1,16],"25":[17,0],"26":[2,15]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"4a8f51a3a12b59eb69694618530032a813fbf8cb","contentHash":"d347e73abcd3109143efee20401d9f0bfc6d68a4a6323bd4559ada44c741786a"},"/Users/isaacs/dev/js/tar/lib/buffer-entry.js":{"path":"/Users/isaacs/dev/js/tar/lib/buffer-entry.js","statementMap":{"0":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"1":{"start":{"line":10,"column":15},"end":{"line":10,"column":34}},"2":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"3":{"start":{"line":14,"column":2},"end":{"line":14,"column":30}},"4":{"start":{"line":15,"column":2},"end":{"line":15,"column":44}},"5":{"start":{"line":16,"column":2},"end":{"line":16,"column":18}},"6":{"start":{"line":17,"column":2},"end":{"line":17,"column":16}},"7":{"start":{"line":18,"column":2},"end":{"line":20,"column":4}},"8":{"start":{"line":19,"column":4},"end":{"line":19,"column":52}},"9":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"10":{"start":{"line":26,"column":0},"end":{"line":30,"column":1}},"11":{"start":{"line":27,"column":2},"end":{"line":27,"column":36}},"12":{"start":{"line":28,"column":2},"end":{"line":28,"column":26}},"13":{"start":{"line":29,"column":2},"end":{"line":29,"column":37}}},"fnMap":{"0":{"name":"BufferEntry","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":24},"end":{"line":21,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":17},"end":{"line":18,"column":18}},"loc":{"start":{"line":18,"column":29},"end":{"line":20,"column":3}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":30},"end":{"line":26,"column":31}},"loc":{"start":{"line":26,"column":43},"end":{"line":30,"column":1}},"line":26}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":1,"10":1,"11":3,"12":3,"13":3},"f":{"0":3,"1":3,"2":3},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"d8ad66df900443c9c9d8aefe5fc126a55ba268ec","contentHash":"25e5b3c51e476fcffac7affa191a0ed0f54d64d3d3b760e887bd45ba08fffa65"},"/Users/isaacs/dev/js/tar/lib/extended-header.js":{"path":"/Users/isaacs/dev/js/tar/lib/extended-header.js","statementMap":{"0":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"1":{"start":{"line":11,"column":12},"end":{"line":11,"column":33}},"2":{"start":{"line":12,"column":15},"end":{"line":12,"column":34}},"3":{"start":{"line":13,"column":10},"end":{"line":13,"column":30}},"4":{"start":{"line":14,"column":14},"end":{"line":14,"column":25}},"5":{"start":{"line":15,"column":15},"end":{"line":17,"column":42}},"6":{"start":{"line":20,"column":2},"end":{"line":20,"column":30}},"7":{"start":{"line":21,"column":2},"end":{"line":21,"column":30}},"8":{"start":{"line":22,"column":2},"end":{"line":22,"column":18}},"9":{"start":{"line":23,"column":2},"end":{"line":23,"column":20}},"10":{"start":{"line":24,"column":2},"end":{"line":24,"column":20}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":20}},"12":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"13":{"start":{"line":27,"column":2},"end":{"line":27,"column":19}},"14":{"start":{"line":28,"column":2},"end":{"line":28,"column":19}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":17}},"16":{"start":{"line":30,"column":2},"end":{"line":30,"column":16}},"17":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"18":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"19":{"start":{"line":36,"column":8},"end":{"line":36,"column":9}},"20":{"start":{"line":37,"column":13},"end":{"line":37,"column":39}},"21":{"start":{"line":38,"column":11},"end":{"line":38,"column":28}},"22":{"start":{"line":39,"column":11},"end":{"line":39,"column":28}},"23":{"start":{"line":40,"column":11},"end":{"line":40,"column":28}},"24":{"start":{"line":41,"column":11},"end":{"line":41,"column":28}},"25":{"start":{"line":43,"column":0},"end":{"line":45,"column":2}},"26":{"start":{"line":44,"column":2},"end":{"line":44,"column":31}},"27":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"28":{"start":{"line":50,"column":9},"end":{"line":50,"column":26}},"29":{"start":{"line":51,"column":9},"end":{"line":51,"column":26}},"30":{"start":{"line":52,"column":12},"end":{"line":52,"column":29}},"31":{"start":{"line":53,"column":8},"end":{"line":53,"column":25}},"32":{"start":{"line":54,"column":8},"end":{"line":54,"column":25}},"33":{"start":{"line":55,"column":8},"end":{"line":55,"column":25}},"34":{"start":{"line":56,"column":8},"end":{"line":56,"column":25}},"35":{"start":{"line":57,"column":12},"end":{"line":57,"column":29}},"36":{"start":{"line":58,"column":9},"end":{"line":58,"column":26}},"37":{"start":{"line":59,"column":9},"end":{"line":59,"column":27}},"38":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"39":{"start":{"line":62,"column":27},"end":{"line":62,"column":33}},"40":{"start":{"line":64,"column":2},"end":{"line":130,"column":3}},"41":{"start":{"line":64,"column":16},"end":{"line":64,"column":17}},"42":{"start":{"line":64,"column":23},"end":{"line":64,"column":31}},"43":{"start":{"line":69,"column":12},"end":{"line":69,"column":16}},"44":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"45":{"start":{"line":72,"column":6},"end":{"line":72,"column":53}},"46":{"start":{"line":73,"column":6},"end":{"line":73,"column":12}},"47":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"48":{"start":{"line":77,"column":16},"end":{"line":77,"column":22}},"49":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"50":{"start":{"line":82,"column":10},"end":{"line":82,"column":27}},"51":{"start":{"line":84,"column":10},"end":{"line":84,"column":73}},"52":{"start":{"line":85,"column":10},"end":{"line":85,"column":34}},"53":{"start":{"line":86,"column":10},"end":{"line":86,"column":18}},"54":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"55":{"start":{"line":89,"column":10},"end":{"line":89,"column":68}},"56":{"start":{"line":90,"column":10},"end":{"line":90,"column":16}},"57":{"start":{"line":92,"column":8},"end":{"line":92,"column":29}},"58":{"start":{"line":93,"column":8},"end":{"line":93,"column":16}},"59":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"60":{"start":{"line":98,"column":10},"end":{"line":98,"column":27}},"61":{"start":{"line":99,"column":10},"end":{"line":99,"column":57}},"62":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"63":{"start":{"line":100,"column":35},"end":{"line":100,"column":66}},"64":{"start":{"line":101,"column":10},"end":{"line":101,"column":33}},"65":{"start":{"line":102,"column":10},"end":{"line":102,"column":18}},"66":{"start":{"line":104,"column":8},"end":{"line":104,"column":28}},"67":{"start":{"line":105,"column":8},"end":{"line":105,"column":16}},"68":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"69":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"70":{"start":{"line":112,"column":12},"end":{"line":112,"column":55}},"71":{"start":{"line":113,"column":12},"end":{"line":113,"column":18}},"72":{"start":{"line":115,"column":20},"end":{"line":115,"column":55}},"73":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"74":{"start":{"line":117,"column":12},"end":{"line":117,"column":33}},"75":{"start":{"line":119,"column":10},"end":{"line":119,"column":38}},"76":{"start":{"line":121,"column":10},"end":{"line":121,"column":33}},"77":{"start":{"line":122,"column":10},"end":{"line":122,"column":28}},"78":{"start":{"line":123,"column":10},"end":{"line":123,"column":25}},"79":{"start":{"line":124,"column":10},"end":{"line":124,"column":29}},"80":{"start":{"line":125,"column":10},"end":{"line":125,"column":18}},"81":{"start":{"line":127,"column":8},"end":{"line":127,"column":28}},"82":{"start":{"line":128,"column":8},"end":{"line":128,"column":16}},"83":{"start":{"line":134,"column":2},"end":{"line":136,"column":42}},"84":{"start":{"line":138,"column":2},"end":{"line":138,"column":15}},"85":{"start":{"line":139,"column":2},"end":{"line":139,"column":16}}},"fnMap":{"0":{"name":"ExtendedHeader","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":23}},"loc":{"start":{"line":19,"column":27},"end":{"line":31,"column":1}},"line":19},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":28},"end":{"line":43,"column":29}},"loc":{"start":{"line":43,"column":41},"end":{"line":45,"column":1}},"line":43},"2":{"name":"parse","decl":{"start":{"line":61,"column":9},"end":{"line":61,"column":14}},"loc":{"start":{"line":61,"column":19},"end":{"line":131,"column":1}},"line":61},"3":{"name":"error","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":14}},"loc":{"start":{"line":133,"column":25},"end":{"line":140,"column":1}},"line":133}},"branchMap":{"0":{"loc":{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":62,"column":33}},{"start":{"line":62,"column":2},"end":{"line":62,"column":33}}],"line":62},"1":{"loc":{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":74,"column":5}},{"start":{"line":71,"column":4},"end":{"line":74,"column":5}}],"line":71},"2":{"loc":{"start":{"line":71,"column":8},"end":{"line":71,"column":54}},"type":"binary-expr","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":23}},{"start":{"line":71,"column":27},"end":{"line":71,"column":54}}],"line":71},"3":{"loc":{"start":{"line":76,"column":4},"end":{"line":129,"column":5}},"type":"switch","locations":[{"start":{"line":77,"column":6},"end":{"line":77,"column":22}},{"start":{"line":79,"column":6},"end":{"line":93,"column":16}},{"start":{"line":95,"column":6},"end":{"line":105,"column":16}},{"start":{"line":107,"column":6},"end":{"line":128,"column":16}}],"line":76},"4":{"loc":{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":87,"column":9}},{"start":{"line":81,"column":8},"end":{"line":87,"column":9}}],"line":81},"5":{"loc":{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":91,"column":9}},{"start":{"line":88,"column":8},"end":{"line":91,"column":9}}],"line":88},"6":{"loc":{"start":{"line":88,"column":12},"end":{"line":88,"column":28}},"type":"binary-expr","locations":[{"start":{"line":88,"column":12},"end":{"line":88,"column":18}},{"start":{"line":88,"column":22},"end":{"line":88,"column":28}}],"line":88},"7":{"loc":{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},"type":"if","locations":[{"start":{"line":97,"column":8},"end":{"line":103,"column":9}},{"start":{"line":97,"column":8},"end":{"line":103,"column":9}}],"line":97},"8":{"loc":{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},"type":"if","locations":[{"start":{"line":100,"column":10},"end":{"line":100,"column":66}},{"start":{"line":100,"column":10},"end":{"line":100,"column":66}}],"line":100},"9":{"loc":{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":126,"column":9}},{"start":{"line":109,"column":8},"end":{"line":126,"column":9}}],"line":109},"10":{"loc":{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},"type":"if","locations":[{"start":{"line":111,"column":10},"end":{"line":114,"column":11}},{"start":{"line":111,"column":10},"end":{"line":114,"column":11}}],"line":111},"11":{"loc":{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},"type":"if","locations":[{"start":{"line":116,"column":10},"end":{"line":118,"column":11}},{"start":{"line":116,"column":10},"end":{"line":118,"column":11}}],"line":116}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":4,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":4,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":4,"39":0,"40":4,"41":4,"42":4,"43":969,"44":969,"45":0,"46":0,"47":969,"48":0,"49":80,"50":26,"51":26,"52":26,"53":26,"54":54,"55":0,"56":0,"57":54,"58":54,"59":275,"60":26,"61":26,"62":26,"63":12,"64":26,"65":26,"66":249,"67":249,"68":614,"69":26,"70":0,"71":0,"72":26,"73":26,"74":20,"75":26,"76":26,"77":26,"78":26,"79":26,"80":26,"81":588,"82":588,"83":0,"84":0,"85":0},"f":{"0":4,"1":4,"2":4,"3":0},"b":{"0":[0,4],"1":[0,969],"2":[969,889],"3":[0,80,275,614],"4":[26,54],"5":[0,54],"6":[54,54],"7":[26,249],"8":[12,14],"9":[26,588],"10":[0,26],"11":[20,6]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"77cb382c69a46833a08275dbc55bf34db0dcd796","contentHash":"78a790af1726a774425fb478f1423068fe64414b747d89b597baf45139e7ae3d"},"/Users/isaacs/dev/js/tar/lib/extract.js":{"path":"/Users/isaacs/dev/js/tar/lib/extract.js","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":24}},"1":{"start":{"line":5,"column":10},"end":{"line":5,"column":30}},"2":{"start":{"line":6,"column":14},"end":{"line":6,"column":32}},"3":{"start":{"line":7,"column":15},"end":{"line":7,"column":34}},"4":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"5":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"6":{"start":{"line":11,"column":34},"end":{"line":11,"column":58}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":23}},"8":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"9":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"10":{"start":{"line":19,"column":2},"end":{"line":19,"column":59}},"11":{"start":{"line":20,"column":2},"end":{"line":20,"column":25}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":23}},"13":{"start":{"line":24,"column":2},"end":{"line":24,"column":26}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"15":{"start":{"line":25,"column":38},"end":{"line":25,"column":52}},"16":{"start":{"line":27,"column":2},"end":{"line":27,"column":34}},"17":{"start":{"line":29,"column":2},"end":{"line":29,"column":14}},"18":{"start":{"line":30,"column":11},"end":{"line":30,"column":15}},"19":{"start":{"line":35,"column":2},"end":{"line":60,"column":4}},"20":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"21":{"start":{"line":39,"column":14},"end":{"line":39,"column":63}},"22":{"start":{"line":40,"column":6},"end":{"line":40,"column":39}},"23":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"24":{"start":{"line":42,"column":17},"end":{"line":42,"column":70}},"25":{"start":{"line":43,"column":8},"end":{"line":43,"column":50}},"26":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"27":{"start":{"line":47,"column":6},"end":{"line":48,"column":66}},"28":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"29":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"30":{"start":{"line":53,"column":21},"end":{"line":53,"column":41}},"31":{"start":{"line":54,"column":19},"end":{"line":54,"column":56}},"32":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"33":{"start":{"line":56,"column":8},"end":{"line":56,"column":65}},"34":{"start":{"line":58,"column":6},"end":{"line":58,"column":54}},"35":{"start":{"line":62,"column":2},"end":{"line":65,"column":4}},"36":{"start":{"line":63,"column":4},"end":{"line":63,"column":36}},"37":{"start":{"line":64,"column":4},"end":{"line":64,"column":15}},"38":{"start":{"line":67,"column":2},"end":{"line":69,"column":4}},"39":{"start":{"line":68,"column":4},"end":{"line":68,"column":25}},"40":{"start":{"line":71,"column":2},"end":{"line":73,"column":4}},"41":{"start":{"line":72,"column":4},"end":{"line":72,"column":20}},"42":{"start":{"line":79,"column":2},"end":{"line":84,"column":4}},"43":{"start":{"line":81,"column":4},"end":{"line":81,"column":21}},"44":{"start":{"line":82,"column":4},"end":{"line":82,"column":18}},"45":{"start":{"line":83,"column":4},"end":{"line":83,"column":20}},"46":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"47":{"start":{"line":89,"column":0},"end":{"line":94,"column":1}},"48":{"start":{"line":90,"column":11},"end":{"line":90,"column":15}},"49":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"50":{"start":{"line":91,"column":31},"end":{"line":91,"column":57}},"51":{"start":{"line":92,"column":2},"end":{"line":92,"column":15}}},"fnMap":{"0":{"name":"Extract","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":16}},"loc":{"start":{"line":10,"column":24},"end":{"line":85,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":17},"end":{"line":35,"column":18}},"loc":{"start":{"line":35,"column":34},"end":{"line":60,"column":3}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":36},"end":{"line":65,"column":3}},"line":62},"3":{"name":"(anonymous_3)","decl":{"start":{"line":67,"column":24},"end":{"line":67,"column":25}},"loc":{"start":{"line":67,"column":38},"end":{"line":69,"column":3}},"line":67},"4":{"name":"(anonymous_4)","decl":{"start":{"line":71,"column":24},"end":{"line":71,"column":25}},"loc":{"start":{"line":71,"column":35},"end":{"line":73,"column":3}},"line":71},"5":{"name":"(anonymous_5)","decl":{"start":{"line":79,"column":24},"end":{"line":79,"column":25}},"loc":{"start":{"line":79,"column":36},"end":{"line":84,"column":3}},"line":79},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":31},"end":{"line":89,"column":32}},"loc":{"start":{"line":89,"column":43},"end":{"line":94,"column":1}},"line":89}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},{"start":{"line":11,"column":2},"end":{"line":11,"column":58}}],"line":11},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":16,"column":3}},{"start":{"line":14,"column":2},"end":{"line":16,"column":3}}],"line":14},"2":{"loc":{"start":{"line":19,"column":14},"end":{"line":19,"column":59}},"type":"binary-expr","locations":[{"start":{"line":19,"column":14},"end":{"line":19,"column":23}},{"start":{"line":19,"column":27},"end":{"line":19,"column":59}}],"line":19},"3":{"loc":{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},"type":"if","locations":[{"start":{"line":25,"column":2},"end":{"line":25,"column":52}},{"start":{"line":25,"column":2},"end":{"line":25,"column":52}}],"line":25},"4":{"loc":{"start":{"line":25,"column":6},"end":{"line":25,"column":36}},"type":"binary-expr","locations":[{"start":{"line":25,"column":6},"end":{"line":25,"column":17}},{"start":{"line":25,"column":21},"end":{"line":25,"column":36}}],"line":25},"5":{"loc":{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":45,"column":5}},{"start":{"line":38,"column":4},"end":{"line":45,"column":5}}],"line":38},"6":{"loc":{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":44,"column":7}},{"start":{"line":41,"column":6},"end":{"line":44,"column":7}}],"line":41},"7":{"loc":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},{"start":{"line":46,"column":4},"end":{"line":49,"column":5}}],"line":46},"8":{"loc":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},{"start":{"line":51,"column":4},"end":{"line":59,"column":5}}],"line":51},"9":{"loc":{"start":{"line":52,"column":15},"end":{"line":52,"column":45}},"type":"binary-expr","locations":[{"start":{"line":52,"column":15},"end":{"line":52,"column":39}},{"start":{"line":52,"column":43},"end":{"line":52,"column":45}}],"line":52},"10":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},{"start":{"line":55,"column":6},"end":{"line":57,"column":7}}],"line":55},"11":{"loc":{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":91,"column":57}},{"start":{"line":91,"column":2},"end":{"line":91,"column":57}}],"line":91},"12":{"loc":{"start":{"line":91,"column":6},"end":{"line":91,"column":29}},"type":"binary-expr","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":16}},{"start":{"line":91,"column":20},"end":{"line":91,"column":29}}],"line":91}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":1,"47":1,"48":0,"49":0,"50":0,"51":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3fb9f60facc409fe944dc36bd2e14fc6153e403d","contentHash":"3d9485ca58c6c768b022a39d276296b53647ccf39986885459406e933921c962"}} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/0471d9cf-687f-4ae8-84a5-ce7468becd03.json b/node_modules/tar/.nyc_output/processinfo/0471d9cf-687f-4ae8-84a5-ce7468becd03.json new file mode 100644 index 00000000..b45408c7 --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/0471d9cf-687f-4ae8-84a5-ce7468becd03.json @@ -0,0 +1 @@ +{"uuid":"0471d9cf-687f-4ae8-84a5-ce7468becd03","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93247,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/parse-discard.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878802822,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/0471d9cf-687f-4ae8-84a5-ce7468becd03.json","externalId":"test/parse-discard.js","files":["/Users/isaacs/dev/js/tar/lib/pack.js","/Users/isaacs/dev/js/tar/lib/entry-writer.js","/Users/isaacs/dev/js/tar/lib/entry.js","/Users/isaacs/dev/js/tar/lib/global-header-writer.js","/Users/isaacs/dev/js/tar/lib/parse.js","/Users/isaacs/dev/js/tar/lib/buffer-entry.js","/Users/isaacs/dev/js/tar/lib/extended-header.js","/Users/isaacs/dev/js/tar/lib/extract.js"]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/12bca2bc-6a2b-4f45-abc7-8483922a524d.json b/node_modules/tar/.nyc_output/processinfo/12bca2bc-6a2b-4f45-abc7-8483922a524d.json new file mode 100644 index 00000000..a5278760 --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/12bca2bc-6a2b-4f45-abc7-8483922a524d.json @@ -0,0 +1 @@ +{"uuid":"12bca2bc-6a2b-4f45-abc7-8483922a524d","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93240,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/dir-normalization.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878801286,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/12bca2bc-6a2b-4f45-abc7-8483922a524d.json","externalId":"test/dir-normalization.js","files":["/Users/isaacs/dev/js/tar/lib/pack.js","/Users/isaacs/dev/js/tar/lib/entry-writer.js","/Users/isaacs/dev/js/tar/lib/entry.js","/Users/isaacs/dev/js/tar/lib/global-header-writer.js","/Users/isaacs/dev/js/tar/lib/parse.js","/Users/isaacs/dev/js/tar/lib/buffer-entry.js","/Users/isaacs/dev/js/tar/lib/extended-header.js","/Users/isaacs/dev/js/tar/lib/extract.js"]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/37d58de4-deea-4808-bb77-d27685bd1501.json b/node_modules/tar/.nyc_output/processinfo/37d58de4-deea-4808-bb77-d27685bd1501.json new file mode 100644 index 00000000..8bb0420d --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/37d58de4-deea-4808-bb77-d27685bd1501.json @@ -0,0 +1 @@ +{"uuid":"37d58de4-deea-4808-bb77-d27685bd1501","parent":null,"pid":93238,"argv":["/usr/local/bin/node","/usr/local/bin/tap","test/00-setup-fixtures.js","test/dir-normalization.js","test/error-on-broken.js","test/extract-move.js","test/extract.js","test/header.js","test/pack-no-proprietary.js","test/pack.js","test/parse-discard.js","test/parse.js","test/zz-cleanup.js"],"execArgv":[],"cwd":"/Users/isaacs/dev/js/tar","time":1557878798122,"ppid":93237,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/37d58de4-deea-4808-bb77-d27685bd1501.json","files":[]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json b/node_modules/tar/.nyc_output/processinfo/5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json new file mode 100644 index 00000000..b8f9b3eb --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json @@ -0,0 +1 @@ +{"uuid":"5ad8066b-6b8c-4bc8-b807-c40bf80898b7","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93246,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/pack.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878801645,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/5ad8066b-6b8c-4bc8-b807-c40bf80898b7.json","externalId":"test/pack.js","files":[]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json b/node_modules/tar/.nyc_output/processinfo/5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json new file mode 100644 index 00000000..04bc15ad --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json @@ -0,0 +1 @@ +{"uuid":"5cbf674c-7089-4b7d-b9de-2119be4dbb0b","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93241,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/error-on-broken.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878801335,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/5cbf674c-7089-4b7d-b9de-2119be4dbb0b.json","externalId":"test/error-on-broken.js","files":["/Users/isaacs/dev/js/tar/lib/pack.js","/Users/isaacs/dev/js/tar/lib/entry-writer.js","/Users/isaacs/dev/js/tar/lib/entry.js","/Users/isaacs/dev/js/tar/lib/global-header-writer.js","/Users/isaacs/dev/js/tar/lib/parse.js","/Users/isaacs/dev/js/tar/lib/buffer-entry.js","/Users/isaacs/dev/js/tar/lib/extended-header.js","/Users/isaacs/dev/js/tar/lib/extract.js"]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json b/node_modules/tar/.nyc_output/processinfo/7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json new file mode 100644 index 00000000..b8e852c4 --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json @@ -0,0 +1 @@ +{"uuid":"7853e29b-78ef-4ab4-b8fb-e1e176c0787b","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93245,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/pack-no-proprietary.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878801610,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/7853e29b-78ef-4ab4-b8fb-e1e176c0787b.json","externalId":"test/pack-no-proprietary.js","files":[]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json b/node_modules/tar/.nyc_output/processinfo/9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json new file mode 100644 index 00000000..f85d7b5c --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json @@ -0,0 +1 @@ +{"uuid":"9d414044-b18d-4f6d-b2e0-531a89bf6f4f","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93250,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/zz-cleanup.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878803490,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/9d414044-b18d-4f6d-b2e0-531a89bf6f4f.json","externalId":"test/zz-cleanup.js","files":[]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json b/node_modules/tar/.nyc_output/processinfo/c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json new file mode 100644 index 00000000..ad2a8697 --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json @@ -0,0 +1 @@ +{"uuid":"c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93243,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/extract.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878801464,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/c3ffeb8c-8e79-4a2c-b678-e5a917fe721e.json","externalId":"test/extract.js","files":["/Users/isaacs/dev/js/tar/lib/pack.js","/Users/isaacs/dev/js/tar/lib/entry-writer.js","/Users/isaacs/dev/js/tar/lib/entry.js","/Users/isaacs/dev/js/tar/lib/global-header-writer.js","/Users/isaacs/dev/js/tar/lib/parse.js","/Users/isaacs/dev/js/tar/lib/buffer-entry.js","/Users/isaacs/dev/js/tar/lib/extended-header.js","/Users/isaacs/dev/js/tar/lib/extract.js"]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/ea0194cb-f599-402f-8876-84fb8251e8db.json b/node_modules/tar/.nyc_output/processinfo/ea0194cb-f599-402f-8876-84fb8251e8db.json new file mode 100644 index 00000000..18f129bf --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/ea0194cb-f599-402f-8876-84fb8251e8db.json @@ -0,0 +1 @@ +{"uuid":"ea0194cb-f599-402f-8876-84fb8251e8db","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93239,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/00-setup-fixtures.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878801284,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/ea0194cb-f599-402f-8876-84fb8251e8db.json","externalId":"test/00-setup-fixtures.js","files":[]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/eda6b7a3-5e15-440f-8619-e11a15a07f77.json b/node_modules/tar/.nyc_output/processinfo/eda6b7a3-5e15-440f-8619-e11a15a07f77.json new file mode 100644 index 00000000..bf261bf8 --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/eda6b7a3-5e15-440f-8619-e11a15a07f77.json @@ -0,0 +1 @@ +{"uuid":"eda6b7a3-5e15-440f-8619-e11a15a07f77","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93242,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/extract-move.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878801409,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/eda6b7a3-5e15-440f-8619-e11a15a07f77.json","externalId":"test/extract-move.js","files":["/Users/isaacs/dev/js/tar/lib/pack.js","/Users/isaacs/dev/js/tar/lib/entry-writer.js","/Users/isaacs/dev/js/tar/lib/entry.js","/Users/isaacs/dev/js/tar/lib/global-header-writer.js","/Users/isaacs/dev/js/tar/lib/parse.js","/Users/isaacs/dev/js/tar/lib/buffer-entry.js","/Users/isaacs/dev/js/tar/lib/extended-header.js","/Users/isaacs/dev/js/tar/lib/extract.js"]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/fb518800-240c-42ff-811f-79e92708d9db.json b/node_modules/tar/.nyc_output/processinfo/fb518800-240c-42ff-811f-79e92708d9db.json new file mode 100644 index 00000000..dcf5d5b4 --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/fb518800-240c-42ff-811f-79e92708d9db.json @@ -0,0 +1 @@ +{"uuid":"fb518800-240c-42ff-811f-79e92708d9db","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93244,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/header.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878801608,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/fb518800-240c-42ff-811f-79e92708d9db.json","externalId":"test/header.js","files":["/Users/isaacs/dev/js/tar/lib/pack.js","/Users/isaacs/dev/js/tar/lib/entry-writer.js","/Users/isaacs/dev/js/tar/lib/entry.js","/Users/isaacs/dev/js/tar/lib/global-header-writer.js","/Users/isaacs/dev/js/tar/lib/parse.js","/Users/isaacs/dev/js/tar/lib/buffer-entry.js","/Users/isaacs/dev/js/tar/lib/extended-header.js","/Users/isaacs/dev/js/tar/lib/extract.js"]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/fdecfc06-a944-4897-9530-e08f62883fc1.json b/node_modules/tar/.nyc_output/processinfo/fdecfc06-a944-4897-9530-e08f62883fc1.json new file mode 100644 index 00000000..dad6627a --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/fdecfc06-a944-4897-9530-e08f62883fc1.json @@ -0,0 +1 @@ +{"uuid":"fdecfc06-a944-4897-9530-e08f62883fc1","parent":"37d58de4-deea-4808-bb77-d27685bd1501","pid":93248,"argv":["/usr/local/bin/node","/Users/isaacs/dev/js/tar/test/parse.js"],"execArgv":["-r","/usr/local/lib/node_modules/tap/node_modules/esm/esm.js"],"cwd":"/Users/isaacs/dev/js/tar","time":1557878802931,"ppid":93238,"root":"e52f8603-1293-44df-8bfa-ed740bdd2b77","coverageFilename":"/Users/isaacs/dev/js/tar/.nyc_output/fdecfc06-a944-4897-9530-e08f62883fc1.json","externalId":"test/parse.js","files":["/Users/isaacs/dev/js/tar/lib/pack.js","/Users/isaacs/dev/js/tar/lib/entry-writer.js","/Users/isaacs/dev/js/tar/lib/entry.js","/Users/isaacs/dev/js/tar/lib/global-header-writer.js","/Users/isaacs/dev/js/tar/lib/parse.js","/Users/isaacs/dev/js/tar/lib/buffer-entry.js","/Users/isaacs/dev/js/tar/lib/extended-header.js","/Users/isaacs/dev/js/tar/lib/extract.js"]} \ No newline at end of file diff --git a/node_modules/tar/.nyc_output/processinfo/index.json b/node_modules/tar/.nyc_output/processinfo/index.json new file mode 100644 index 00000000..9550e8e4 --- /dev/null +++ b/node_modules/tar/.nyc_output/processinfo/index.json @@ -0,0 +1 @@ +{"processes":{"0471d9cf-687f-4ae8-84a5-ce7468becd03":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/parse-discard.js","children":[]},"12bca2bc-6a2b-4f45-abc7-8483922a524d":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/dir-normalization.js","children":[]},"37d58de4-deea-4808-bb77-d27685bd1501":{"parent":null,"children":["0471d9cf-687f-4ae8-84a5-ce7468becd03","12bca2bc-6a2b-4f45-abc7-8483922a524d","5ad8066b-6b8c-4bc8-b807-c40bf80898b7","5cbf674c-7089-4b7d-b9de-2119be4dbb0b","7853e29b-78ef-4ab4-b8fb-e1e176c0787b","9d414044-b18d-4f6d-b2e0-531a89bf6f4f","c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","ea0194cb-f599-402f-8876-84fb8251e8db","eda6b7a3-5e15-440f-8619-e11a15a07f77","fb518800-240c-42ff-811f-79e92708d9db","fdecfc06-a944-4897-9530-e08f62883fc1"]},"5ad8066b-6b8c-4bc8-b807-c40bf80898b7":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/pack.js","children":[]},"5cbf674c-7089-4b7d-b9de-2119be4dbb0b":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/error-on-broken.js","children":[]},"7853e29b-78ef-4ab4-b8fb-e1e176c0787b":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/pack-no-proprietary.js","children":[]},"9d414044-b18d-4f6d-b2e0-531a89bf6f4f":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/zz-cleanup.js","children":[]},"c3ffeb8c-8e79-4a2c-b678-e5a917fe721e":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/extract.js","children":[]},"ea0194cb-f599-402f-8876-84fb8251e8db":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/00-setup-fixtures.js","children":[]},"eda6b7a3-5e15-440f-8619-e11a15a07f77":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/extract-move.js","children":[]},"fb518800-240c-42ff-811f-79e92708d9db":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/header.js","children":[]},"fdecfc06-a944-4897-9530-e08f62883fc1":{"parent":"37d58de4-deea-4808-bb77-d27685bd1501","externalId":"test/parse.js","children":[]}},"files":{"/Users/isaacs/dev/js/tar/lib/pack.js":["0471d9cf-687f-4ae8-84a5-ce7468becd03","12bca2bc-6a2b-4f45-abc7-8483922a524d","5cbf674c-7089-4b7d-b9de-2119be4dbb0b","c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","eda6b7a3-5e15-440f-8619-e11a15a07f77","fb518800-240c-42ff-811f-79e92708d9db","fdecfc06-a944-4897-9530-e08f62883fc1"],"/Users/isaacs/dev/js/tar/lib/entry-writer.js":["0471d9cf-687f-4ae8-84a5-ce7468becd03","12bca2bc-6a2b-4f45-abc7-8483922a524d","5cbf674c-7089-4b7d-b9de-2119be4dbb0b","c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","eda6b7a3-5e15-440f-8619-e11a15a07f77","fb518800-240c-42ff-811f-79e92708d9db","fdecfc06-a944-4897-9530-e08f62883fc1"],"/Users/isaacs/dev/js/tar/lib/entry.js":["0471d9cf-687f-4ae8-84a5-ce7468becd03","12bca2bc-6a2b-4f45-abc7-8483922a524d","5cbf674c-7089-4b7d-b9de-2119be4dbb0b","c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","eda6b7a3-5e15-440f-8619-e11a15a07f77","fb518800-240c-42ff-811f-79e92708d9db","fdecfc06-a944-4897-9530-e08f62883fc1"],"/Users/isaacs/dev/js/tar/lib/global-header-writer.js":["0471d9cf-687f-4ae8-84a5-ce7468becd03","12bca2bc-6a2b-4f45-abc7-8483922a524d","5cbf674c-7089-4b7d-b9de-2119be4dbb0b","c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","eda6b7a3-5e15-440f-8619-e11a15a07f77","fb518800-240c-42ff-811f-79e92708d9db","fdecfc06-a944-4897-9530-e08f62883fc1"],"/Users/isaacs/dev/js/tar/lib/parse.js":["0471d9cf-687f-4ae8-84a5-ce7468becd03","12bca2bc-6a2b-4f45-abc7-8483922a524d","5cbf674c-7089-4b7d-b9de-2119be4dbb0b","c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","eda6b7a3-5e15-440f-8619-e11a15a07f77","fb518800-240c-42ff-811f-79e92708d9db","fdecfc06-a944-4897-9530-e08f62883fc1"],"/Users/isaacs/dev/js/tar/lib/buffer-entry.js":["0471d9cf-687f-4ae8-84a5-ce7468becd03","12bca2bc-6a2b-4f45-abc7-8483922a524d","5cbf674c-7089-4b7d-b9de-2119be4dbb0b","c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","eda6b7a3-5e15-440f-8619-e11a15a07f77","fb518800-240c-42ff-811f-79e92708d9db","fdecfc06-a944-4897-9530-e08f62883fc1"],"/Users/isaacs/dev/js/tar/lib/extended-header.js":["0471d9cf-687f-4ae8-84a5-ce7468becd03","12bca2bc-6a2b-4f45-abc7-8483922a524d","5cbf674c-7089-4b7d-b9de-2119be4dbb0b","c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","eda6b7a3-5e15-440f-8619-e11a15a07f77","fb518800-240c-42ff-811f-79e92708d9db","fdecfc06-a944-4897-9530-e08f62883fc1"],"/Users/isaacs/dev/js/tar/lib/extract.js":["0471d9cf-687f-4ae8-84a5-ce7468becd03","12bca2bc-6a2b-4f45-abc7-8483922a524d","5cbf674c-7089-4b7d-b9de-2119be4dbb0b","c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","eda6b7a3-5e15-440f-8619-e11a15a07f77","fb518800-240c-42ff-811f-79e92708d9db","fdecfc06-a944-4897-9530-e08f62883fc1"]},"externalIds":{"test/parse-discard.js":{"root":"0471d9cf-687f-4ae8-84a5-ce7468becd03","children":[]},"test/dir-normalization.js":{"root":"12bca2bc-6a2b-4f45-abc7-8483922a524d","children":[]},"test/pack.js":{"root":"5ad8066b-6b8c-4bc8-b807-c40bf80898b7","children":[]},"test/error-on-broken.js":{"root":"5cbf674c-7089-4b7d-b9de-2119be4dbb0b","children":[]},"test/pack-no-proprietary.js":{"root":"7853e29b-78ef-4ab4-b8fb-e1e176c0787b","children":[]},"test/zz-cleanup.js":{"root":"9d414044-b18d-4f6d-b2e0-531a89bf6f4f","children":[]},"test/extract.js":{"root":"c3ffeb8c-8e79-4a2c-b678-e5a917fe721e","children":[]},"test/00-setup-fixtures.js":{"root":"ea0194cb-f599-402f-8876-84fb8251e8db","children":[]},"test/extract-move.js":{"root":"eda6b7a3-5e15-440f-8619-e11a15a07f77","children":[]},"test/header.js":{"root":"fb518800-240c-42ff-811f-79e92708d9db","children":[]},"test/parse.js":{"root":"fdecfc06-a944-4897-9530-e08f62883fc1","children":[]}}} \ No newline at end of file diff --git a/node_modules/tar/.travis.yml b/node_modules/tar/.travis.yml new file mode 100644 index 00000000..fca8ef01 --- /dev/null +++ b/node_modules/tar/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.10 + - 0.11 diff --git a/node_modules/tar/LICENSE b/node_modules/tar/LICENSE new file mode 100644 index 00000000..019b7e40 --- /dev/null +++ b/node_modules/tar/LICENSE @@ -0,0 +1,12 @@ +The ISC License +Copyright (c) Isaac Z. Schlueter and Contributors +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/tar/README.md b/node_modules/tar/README.md new file mode 100644 index 00000000..cfda2ac1 --- /dev/null +++ b/node_modules/tar/README.md @@ -0,0 +1,50 @@ +# node-tar + +Tar for Node.js. + +[![NPM](https://nodei.co/npm/tar.png)](https://nodei.co/npm/tar/) + +## API + +See `examples/` for usage examples. + +### var tar = require('tar') + +Returns an object with `.Pack`, `.Extract` and `.Parse` methods. + +### tar.Pack([properties]) + +Returns a through stream. Use +[fstream](https://npmjs.org/package/fstream) to write files into the +pack stream and you will receive tar archive data from the pack +stream. + +This only works with directories, it does not work with individual files. + +The optional `properties` object are used to set properties in the tar +'Global Extended Header'. If the `fromBase` property is set to true, +the tar will contain files relative to the path passed, and not with +the path included. + +### tar.Extract([options]) + +Returns a through stream. Write tar data to the stream and the files +in the tarball will be extracted onto the filesystem. + +`options` can be: + +```js +{ + path: '/path/to/extract/tar/into', + strip: 0, // how many path segments to strip from the root when extracting +} +``` + +`options` also get passed to the `fstream.Writer` instance that `tar` +uses internally. + +### tar.Parse() + +Returns a writable stream. Write tar data to it and it will emit +`entry` events for each entry parsed from the tarball. This is used by +`tar.Extract`. diff --git a/node_modules/tar/coverage/lcov-report/base.css b/node_modules/tar/coverage/lcov-report/base.css new file mode 100644 index 00000000..417c7adc --- /dev/null +++ b/node_modules/tar/coverage/lcov-report/base.css @@ -0,0 +1,212 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } + + +.medium .chart { border:1px solid #666; } +.medium .cover-fill { background: #666; } + +.cbranch-no { background: yellow !important; color: #111; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } +.medium { background: #eaeaea; } + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/node_modules/tar/coverage/lcov-report/index.html b/node_modules/tar/coverage/lcov-report/index.html new file mode 100644 index 00000000..27224804 --- /dev/null +++ b/node_modules/tar/coverage/lcov-report/index.html @@ -0,0 +1,106 @@ + + + + Code coverage report for All files + + + + + + + +
      +
      +

      + All files +

      +
      +
      + 99.94% + Statements + 1795/1796 +
      +
      + 99.67% + Branches + 1224/1228 +
      +
      + 100% + Functions + 271/271 +
      +
      + 99.94% + Lines + 1748/1749 +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      FileStatementsBranchesFunctionsLines
      tar
      100%13/13100%0/0100%0/0100%13/13
      tar/lib
      99.94%1782/178399.67%1224/1228100%271/27199.94%1735/1736
      +
      +
      + + + + + + + diff --git a/node_modules/tar/coverage/lcov-report/prettify.css b/node_modules/tar/coverage/lcov-report/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/node_modules/tar/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/node_modules/tar/coverage/lcov-report/prettify.js b/node_modules/tar/coverage/lcov-report/prettify.js new file mode 100644 index 00000000..ef51e038 --- /dev/null +++ b/node_modules/tar/coverage/lcov-report/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/node_modules/tar/coverage/lcov-report/sort-arrow-sprite.png b/node_modules/tar/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/node_modules/tar/coverage/lcov-report/tar/index.html b/node_modules/tar/coverage/lcov-report/tar/index.html new file mode 100644 index 00000000..9c917bde --- /dev/null +++ b/node_modules/tar/coverage/lcov-report/tar/index.html @@ -0,0 +1,93 @@ + + + + Code coverage report for tar + + + + + + + +
      +
      +

      + All files tar +

      +
      +
      + 100% + Statements + 13/13 +
      +
      + 100% + Branches + 0/0 +
      +
      + 100% + Functions + 0/0 +
      +
      + 100% + Lines + 13/13 +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      FileStatementsBranchesFunctionsLines
      index.js
      100%13/13100%0/0100%0/0100%13/13
      +
      +
      + + + + + + + diff --git a/node_modules/tar/coverage/lcov-report/tar/index.js.html b/node_modules/tar/coverage/lcov-report/tar/index.js.html new file mode 100644 index 00000000..f04c9923 --- /dev/null +++ b/node_modules/tar/coverage/lcov-report/tar/index.js.html @@ -0,0 +1,119 @@ + + + + Code coverage report for tar/index.js + + + + + + + +
      +
      +

      + All files / tar index.js +

      +
      +
      + 100% + Statements + 13/13 +
      +
      + 100% + Branches + 0/0 +
      +
      + 100% + Functions + 0/0 +
      +
      + 100% + Lines + 13/13 +
      +
      +
      +
      +
      
      +
      +
      1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19  +  +  +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x + 
      'use strict'
      + 
      +// high-level commands
      +exports.c = exports.create = require('./lib/create.js')
      +exports.r = exports.replace = require('./lib/replace.js')
      +exports.t = exports.list = require('./lib/list.js')
      +exports.u = exports.update = require('./lib/update.js')
      +exports.x = exports.extract = require('./lib/extract.js')
      + 
      +// classes
      +exports.Pack = require('./lib/pack.js')
      +exports.Unpack = require('./lib/unpack.js')
      +exports.Parse = require('./lib/parse.js')
      +exports.ReadEntry = require('./lib/read-entry.js')
      +exports.WriteEntry = require('./lib/write-entry.js')
      +exports.Header = require('./lib/header.js')
      +exports.Pax = require('./lib/pax.js')
      +exports.types = require('./lib/types.js')
      + 
      +
      +
      + + + + + + + diff --git a/node_modules/tar/coverage/lcov.info b/node_modules/tar/coverage/lcov.info new file mode 100644 index 00000000..19aa7c22 --- /dev/null +++ b/node_modules/tar/coverage/lcov.info @@ -0,0 +1,3690 @@ +TN: +SF:/Users/isaacs/dev/js/tar/index.js +FNF:0 +FNH:0 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +LF:13 +LH:13 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/create.js +FN:12,(anonymous_0) +FN:38,(anonymous_1) +FN:47,(anonymous_2) +FN:54,(anonymous_3) +FN:65,(anonymous_4) +FN:66,(anonymous_5) +FN:72,(anonymous_6) +FN:80,(anonymous_7) +FN:87,(anonymous_8) +FN:88,(anonymous_9) +FN:95,(anonymous_10) +FN:101,(anonymous_11) +FNF:12 +FNH:12 +FNDA:15,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:4,(anonymous_2) +FNDA:4,(anonymous_3) +FNDA:5,(anonymous_4) +FNDA:7,(anonymous_5) +FNDA:7,(anonymous_6) +FNDA:9,(anonymous_7) +FNDA:7,(anonymous_8) +FNDA:3,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:2,(anonymous_11) +DA:4,2 +DA:6,2 +DA:7,2 +DA:8,2 +DA:9,2 +DA:10,2 +DA:12,2 +DA:13,15 +DA:14,1 +DA:16,15 +DA:17,1 +DA:19,15 +DA:20,2 +DA:22,13 +DA:24,13 +DA:26,13 +DA:27,1 +DA:29,12 +DA:30,1 +DA:32,11 +DA:38,2 +DA:39,4 +DA:40,4 +DA:43,4 +DA:44,4 +DA:47,2 +DA:48,4 +DA:49,4 +DA:52,4 +DA:54,4 +DA:55,4 +DA:56,4 +DA:57,4 +DA:60,4 +DA:62,4 +DA:65,2 +DA:66,5 +DA:67,7 +DA:68,3 +DA:72,7 +DA:75,4 +DA:77,4 +DA:80,2 +DA:81,9 +DA:82,8 +DA:83,8 +DA:84,3 +DA:87,7 +DA:88,3 +DA:90,5 +DA:92,6 +DA:95,2 +DA:96,1 +DA:97,1 +DA:98,1 +DA:101,2 +DA:102,2 +DA:103,2 +DA:104,2 +LF:59 +LH:59 +BRDA:13,0,0,1 +BRDA:13,0,1,14 +BRDA:16,1,0,1 +BRDA:16,1,1,14 +BRDA:19,2,0,2 +BRDA:19,2,1,13 +BRDA:19,3,0,15 +BRDA:19,3,1,14 +BRDA:19,3,2,13 +BRDA:26,4,0,1 +BRDA:26,4,1,12 +BRDA:26,5,0,13 +BRDA:26,5,1,6 +BRDA:29,6,0,1 +BRDA:29,6,1,11 +BRDA:29,7,0,12 +BRDA:29,7,1,4 +BRDA:32,8,0,4 +BRDA:32,8,1,7 +BRDA:32,9,0,11 +BRDA:32,9,1,8 +BRDA:33,10,0,4 +BRDA:33,10,1,3 +BRDA:34,11,0,1 +BRDA:34,11,1,2 +BRDA:41,12,0,4 +BRDA:41,12,1,3 +BRDA:50,13,0,4 +BRDA:50,13,1,3 +BRDA:62,14,0,3 +BRDA:62,14,1,1 +BRDA:67,15,0,3 +BRDA:67,15,1,4 +BRDA:83,16,0,3 +BRDA:83,16,1,5 +BRF:35 +BRH:35 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/extract.js +FN:10,(anonymous_0) +FN:43,(anonymous_1) +FN:44,(anonymous_2) +FN:47,(anonymous_3) +FN:58,(anonymous_4) +FN:59,(anonymous_5) +FN:62,(anonymous_6) +FN:79,(anonymous_7) +FN:84,(anonymous_8) +FN:90,(anonymous_9) +FN:106,(anonymous_10) +FN:110,(anonymous_11) +FNF:12 +FNH:12 +FNDA:21,(anonymous_0) +FNDA:7,(anonymous_1) +FNDA:13,(anonymous_2) +FNDA:87,(anonymous_3) +FNDA:9,(anonymous_4) +FNDA:9,(anonymous_5) +FNDA:6,(anonymous_6) +FNDA:9,(anonymous_7) +FNDA:9,(anonymous_8) +FNDA:9,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:2,(anonymous_11) +DA:4,2 +DA:5,2 +DA:6,2 +DA:7,2 +DA:8,2 +DA:10,2 +DA:11,21 +DA:12,1 +DA:13,20 +DA:14,1 +DA:16,21 +DA:17,3 +DA:19,21 +DA:20,13 +DA:22,8 +DA:24,21 +DA:26,21 +DA:27,2 +DA:29,19 +DA:30,1 +DA:32,18 +DA:33,7 +DA:35,18 +DA:43,2 +DA:44,13 +DA:45,7 +DA:47,7 +DA:48,87 +DA:49,87 +DA:53,87 +DA:54,87 +DA:57,7 +DA:58,9 +DA:59,9 +DA:62,2 +DA:63,6 +DA:65,6 +DA:66,6 +DA:68,6 +DA:71,5 +DA:72,5 +DA:76,4 +DA:79,2 +DA:80,9 +DA:81,9 +DA:83,9 +DA:84,9 +DA:85,9 +DA:86,9 +DA:90,9 +DA:91,9 +DA:92,1 +DA:94,8 +DA:98,8 +DA:99,8 +DA:103,9 +DA:106,2 +DA:107,1 +DA:110,2 +DA:111,2 +LF:60 +LH:60 +BRDA:11,0,0,1 +BRDA:11,0,1,20 +BRDA:13,1,0,1 +BRDA:13,1,1,19 +BRDA:16,2,0,3 +BRDA:16,2,1,18 +BRDA:19,3,0,13 +BRDA:19,3,1,8 +BRDA:26,4,0,2 +BRDA:26,4,1,19 +BRDA:26,5,0,21 +BRDA:26,5,1,9 +BRDA:29,6,0,1 +BRDA:29,6,1,18 +BRDA:29,7,0,19 +BRDA:29,7,1,4 +BRDA:32,8,0,7 +BRDA:32,8,1,11 +BRDA:35,9,0,6 +BRDA:35,9,1,12 +BRDA:35,10,0,18 +BRDA:35,10,1,15 +BRDA:36,11,0,9 +BRDA:36,11,1,3 +BRDA:37,12,0,1 +BRDA:37,12,1,2 +BRDA:48,13,0,87 +BRDA:48,13,1,12 +BRDA:48,13,2,12 +BRDA:49,14,0,3 +BRDA:49,14,1,84 +BRDA:50,15,0,9 +BRDA:50,15,1,75 +BRDA:57,16,0,3 +BRDA:57,16,1,4 +BRDA:58,17,0,9 +BRDA:58,17,1,3 +BRDA:71,18,0,5 +BRDA:71,18,1,3 +BRDA:81,19,0,9 +BRDA:81,19,1,7 +BRDA:91,20,0,1 +BRDA:91,20,1,8 +BRDA:103,21,0,4 +BRDA:103,21,1,5 +BRF:45 +BRH:45 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/header.js +FN:14,(anonymous_0) +FN:42,(anonymous_1) +FN:103,(anonymous_2) +FN:157,(anonymous_3) +FN:164,(anonymous_4) +FN:168,(anonymous_5) +FN:172,(anonymous_6) +FN:180,(anonymous_7) +FN:219,(anonymous_8) +FN:222,(anonymous_9) +FN:225,(anonymous_10) +FN:227,(anonymous_11) +FN:231,(anonymous_12) +FN:233,(anonymous_13) +FN:244,(anonymous_14) +FN:250,(anonymous_15) +FN:253,(anonymous_16) +FN:256,(anonymous_17) +FN:260,(anonymous_18) +FN:267,(anonymous_19) +FNF:20 +FNH:20 +FNDA:13121,(anonymous_0) +FNDA:6393,(anonymous_1) +FNDA:6719,(anonymous_2) +FNDA:6728,(anonymous_3) +FNDA:8178,(anonymous_4) +FNDA:4,(anonymous_5) +FNDA:6723,(anonymous_6) +FNDA:6718,(anonymous_7) +FNDA:32001,(anonymous_8) +FNDA:14938,(anonymous_9) +FNDA:14938,(anonymous_10) +FNDA:55448,(anonymous_11) +FNDA:55411,(anonymous_12) +FNDA:55411,(anonymous_13) +FNDA:66910,(anonymous_14) +FNDA:66615,(anonymous_15) +FNDA:66615,(anonymous_16) +FNDA:66615,(anonymous_17) +FNDA:20150,(anonymous_18) +FNDA:40308,(anonymous_19) +DA:7,13 +DA:8,13 +DA:9,13 +DA:11,13 +DA:15,13121 +DA:16,13121 +DA:17,13121 +DA:19,13121 +DA:20,13121 +DA:21,13121 +DA:22,13121 +DA:23,13121 +DA:24,13121 +DA:25,13121 +DA:26,13121 +DA:27,13121 +DA:28,13121 +DA:29,13121 +DA:30,13121 +DA:31,13121 +DA:32,13121 +DA:33,13121 +DA:34,13121 +DA:36,13121 +DA:37,6393 +DA:38,6728 +DA:39,6726 +DA:43,6393 +DA:44,2795 +DA:46,6393 +DA:47,1 +DA:49,6392 +DA:50,6392 +DA:51,6392 +DA:52,6392 +DA:53,6392 +DA:54,6392 +DA:55,6392 +DA:58,6392 +DA:59,6392 +DA:60,1990 +DA:61,6392 +DA:62,2 +DA:69,6392 +DA:70,1594 +DA:72,6392 +DA:73,6392 +DA:74,4275 +DA:75,4275 +DA:76,4275 +DA:77,4275 +DA:78,4275 +DA:80,2 +DA:81,2 +DA:83,4273 +DA:84,4273 +DA:85,295 +DA:86,4273 +DA:87,4273 +DA:91,6392 +DA:92,6392 +DA:93,946016 +DA:95,6392 +DA:96,2275552 +DA:98,6392 +DA:99,6392 +DA:100,1860 +DA:104,6719 +DA:105,6600 +DA:106,6600 +DA:109,6719 +DA:110,6717 +DA:112,6719 +DA:113,1 +DA:115,6718 +DA:116,6718 +DA:117,6718 +DA:118,6718 +DA:119,6718 +DA:121,6718 +DA:122,6718 +DA:123,6718 +DA:124,6718 +DA:125,6718 +DA:126,6718 +DA:127,6718 +DA:128,6718 +DA:129,6718 +DA:130,6718 +DA:131,6718 +DA:132,6718 +DA:133,6718 +DA:134,6718 +DA:135,6718 +DA:136,2 +DA:138,6716 +DA:139,6716 +DA:140,6716 +DA:143,6718 +DA:144,6718 +DA:145,994264 +DA:147,6718 +DA:148,2391608 +DA:150,6718 +DA:151,6718 +DA:152,6718 +DA:154,6718 +DA:158,6728 +DA:159,73451 +DA:160,66740 +DA:165,8178 +DA:169,4 +DA:173,6723 +DA:174,6719 +DA:176,4 +DA:180,13 +DA:181,6718 +DA:182,6718 +DA:183,6718 +DA:185,6718 +DA:187,6718 +DA:188,6683 +DA:191,35 +DA:192,35 +DA:194,35 +DA:196,49 +DA:198,21 +DA:201,28 +DA:203,13 +DA:207,15 +DA:208,15 +DA:213,35 +DA:214,1 +DA:216,6718 +DA:219,13 +DA:220,32001 +DA:222,13 +DA:223,14938 +DA:225,14938 +DA:227,13 +DA:228,55448 +DA:231,55411 +DA:233,13 +DA:234,55411 +DA:239,13 +DA:244,13 +DA:245,66910 +DA:250,13 +DA:251,66615 +DA:253,13 +DA:254,66615 +DA:256,13 +DA:257,66615 +DA:260,13 +DA:261,20150 +DA:265,13 +DA:267,13 +DA:268,40308 +DA:272,13 +LF:159 +LH:159 +BRDA:36,0,0,6393 +BRDA:36,0,1,6728 +BRDA:37,1,0,6393 +BRDA:37,1,1,2795 +BRDA:38,2,0,6726 +BRDA:38,2,1,2 +BRDA:43,3,0,2795 +BRDA:43,3,1,3598 +BRDA:46,4,0,1 +BRDA:46,4,1,6392 +BRDA:46,5,0,6393 +BRDA:46,5,1,6393 +BRDA:59,6,0,1990 +BRDA:59,6,1,4402 +BRDA:61,7,0,2 +BRDA:61,7,1,6390 +BRDA:61,8,0,6392 +BRDA:61,8,1,3769 +BRDA:69,9,0,1594 +BRDA:69,9,1,4798 +BRDA:73,10,0,4275 +BRDA:73,10,1,2117 +BRDA:78,11,0,2 +BRDA:78,11,1,4273 +BRDA:84,12,0,295 +BRDA:84,12,1,3978 +BRDA:99,13,0,1860 +BRDA:99,13,1,4532 +BRDA:99,14,0,6392 +BRDA:99,14,1,1994 +BRDA:104,15,0,6600 +BRDA:104,15,1,119 +BRDA:109,16,0,6717 +BRDA:109,16,1,2 +BRDA:112,17,0,1 +BRDA:112,17,1,6718 +BRDA:115,18,0,6623 +BRDA:115,18,1,95 +BRDA:115,19,0,6718 +BRDA:115,19,1,95 +BRDA:116,20,0,6718 +BRDA:116,20,1,1 +BRDA:121,21,0,6718 +BRDA:121,21,1,6678 +BRDA:122,22,0,6718 +BRDA:122,22,1,6718 +BRDA:123,23,0,6718 +BRDA:123,23,1,6715 +BRDA:124,24,0,6718 +BRDA:124,24,1,6715 +BRDA:125,25,0,6718 +BRDA:125,25,1,6717 +BRDA:126,26,0,6718 +BRDA:126,26,1,6718 +BRDA:128,27,0,6718 +BRDA:128,27,1,6718 +BRDA:130,28,0,6718 +BRDA:130,28,1,6718 +BRDA:131,29,0,6718 +BRDA:131,29,1,6718 +BRDA:132,30,0,6718 +BRDA:132,30,1,6718 +BRDA:133,31,0,6718 +BRDA:133,31,1,6718 +BRDA:134,32,0,6718 +BRDA:134,32,1,6718 +BRDA:135,33,0,2 +BRDA:135,33,1,6716 +BRDA:136,34,0,2 +BRDA:136,34,1,2 +BRDA:138,35,0,6716 +BRDA:138,35,1,6716 +BRDA:139,36,0,6716 +BRDA:139,36,1,6716 +BRDA:140,37,0,6716 +BRDA:140,37,1,6716 +BRDA:159,38,0,66740 +BRDA:159,38,1,6711 +BRDA:159,39,0,73451 +BRDA:159,39,1,73273 +BRDA:165,40,0,8178 +BRDA:165,40,1,6 +BRDA:173,41,0,6719 +BRDA:173,41,1,4 +BRDA:185,42,0,6718 +BRDA:185,42,1,6712 +BRDA:187,43,0,6683 +BRDA:187,43,1,35 +BRDA:210,44,0,49 +BRDA:210,44,1,34 +BRDA:196,45,0,21 +BRDA:196,45,1,28 +BRDA:196,46,0,49 +BRDA:196,46,1,35 +BRDA:201,47,0,13 +BRDA:201,47,1,15 +BRDA:201,48,0,28 +BRDA:201,48,1,14 +BRDA:213,49,0,1 +BRDA:213,49,1,34 +BRDA:225,50,0,10449 +BRDA:225,50,1,4489 +BRDA:228,51,0,37 +BRDA:228,51,1,55411 +BRDA:231,52,0,21489 +BRDA:231,52,1,33922 +BRDA:245,53,0,288 +BRDA:245,53,1,66622 +BRDA:246,54,0,7 +BRDA:246,54,1,66615 +BRDA:246,55,0,66622 +BRDA:246,55,1,66615 +BRDA:257,56,0,19852 +BRDA:257,56,1,46763 +BRDA:261,57,0,266 +BRDA:261,57,1,19884 +BRDA:268,58,0,13394 +BRDA:268,58,1,26914 +BRDA:270,59,0,26914 +BRDA:270,59,1,26874 +BRF:120 +BRH:120 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/high-level-opt.js +FN:27,(anonymous_0) +FN:27,(anonymous_1) +FN:29,(anonymous_2) +FNF:3 +FNH:3 +FNDA:177,(anonymous_0) +FNDA:469,(anonymous_1) +FNDA:469,(anonymous_2) +DA:5,7 +DA:27,469 +DA:29,469 +LF:3 +LH:3 +BRDA:27,0,0,174 +BRDA:27,0,1,3 +BRDA:28,1,0,26 +BRDA:28,1,1,443 +BRF:4 +BRH:4 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/large-numbers.js +FN:7,(anonymous_0) +FN:16,(anonymous_1) +FN:28,(anonymous_2) +FN:51,(anonymous_3) +FN:58,(anonymous_4) +FN:79,(anonymous_5) +FN:90,(anonymous_6) +FN:92,(anonymous_7) +FNF:8 +FNH:8 +FNDA:17,(anonymous_0) +FNDA:11,(anonymous_1) +FNDA:6,(anonymous_2) +FNDA:47,(anonymous_3) +FNDA:6,(anonymous_4) +FNDA:41,(anonymous_5) +FNDA:96,(anonymous_6) +FNDA:12,(anonymous_7) +DA:7,14 +DA:8,17 +DA:9,17 +DA:10,6 +DA:12,11 +DA:13,17 +DA:16,14 +DA:17,11 +DA:18,11 +DA:19,86 +DA:20,31 +DA:22,55 +DA:23,55 +DA:28,14 +DA:29,6 +DA:30,6 +DA:31,6 +DA:32,6 +DA:34,60 +DA:35,42 +DA:37,18 +DA:38,18 +DA:40,60 +DA:41,48 +DA:42,12 +DA:43,6 +DA:45,6 +DA:46,6 +DA:51,14 +DA:52,47 +DA:53,47 +DA:54,47 +DA:58,14 +DA:59,6 +DA:60,6 +DA:61,6 +DA:62,6 +DA:63,60 +DA:65,60 +DA:66,48 +DA:67,12 +DA:68,6 +DA:70,6 +DA:71,6 +DA:73,60 +DA:74,12 +DA:76,6 +DA:79,14 +DA:80,41 +DA:81,41 +DA:82,41 +DA:83,266 +DA:84,266 +DA:85,161 +DA:87,41 +DA:90,96 +DA:92,14 +LF:57 +LH:57 +BRDA:9,0,0,6 +BRDA:9,0,1,11 +BRDA:19,1,0,31 +BRDA:19,1,1,55 +BRDA:34,2,0,42 +BRDA:34,2,1,18 +BRDA:40,3,0,48 +BRDA:40,3,1,12 +BRDA:42,4,0,6 +BRDA:42,4,1,6 +BRDA:54,5,0,41 +BRDA:54,5,1,6 +BRDA:65,6,0,48 +BRDA:65,6,1,12 +BRDA:67,7,0,6 +BRDA:67,7,1,6 +BRDA:73,8,0,12 +BRDA:73,8,1,48 +BRDA:84,9,0,161 +BRDA:84,9,1,105 +BRF:20 +BRH:20 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/list.js +FN:13,(anonymous_0) +FN:46,(anonymous_1) +FN:48,(anonymous_2) +FN:51,(anonymous_3) +FN:56,(anonymous_4) +FN:57,(anonymous_5) +FN:60,(anonymous_6) +FN:71,(anonymous_7) +FN:72,(anonymous_8) +FN:75,(anonymous_9) +FN:103,(anonymous_10) +FN:108,(anonymous_11) +FN:112,(anonymous_12) +FN:128,(anonymous_13) +FNF:14 +FNH:14 +FNDA:34,(anonymous_0) +FNDA:22,(anonymous_1) +FNDA:255,(anonymous_2) +FNDA:72,(anonymous_3) +FNDA:3,(anonymous_4) +FNDA:6,(anonymous_5) +FNDA:125,(anonymous_6) +FNDA:32,(anonymous_7) +FNDA:64,(anonymous_8) +FNDA:13,(anonymous_9) +FNDA:16,(anonymous_10) +FNDA:16,(anonymous_11) +FNDA:16,(anonymous_12) +FNDA:16,(anonymous_13) +DA:7,5 +DA:8,5 +DA:9,5 +DA:10,5 +DA:11,5 +DA:13,5 +DA:14,34 +DA:15,1 +DA:16,33 +DA:17,1 +DA:19,34 +DA:20,5 +DA:22,34 +DA:23,31 +DA:25,3 +DA:27,34 +DA:29,34 +DA:30,1 +DA:32,33 +DA:33,1 +DA:35,32 +DA:36,3 +DA:38,32 +DA:39,22 +DA:41,32 +DA:46,5 +DA:47,22 +DA:48,22 +DA:49,255 +DA:50,255 +DA:51,72 +DA:56,5 +DA:57,6 +DA:58,3 +DA:60,3 +DA:61,125 +DA:62,125 +DA:66,125 +DA:67,125 +DA:70,3 +DA:71,32 +DA:72,64 +DA:75,5 +DA:76,13 +DA:77,13 +DA:78,13 +DA:80,13 +DA:81,13 +DA:82,12 +DA:83,12 +DA:84,10 +DA:86,2 +DA:87,2 +DA:88,2 +DA:89,2 +DA:90,28 +DA:91,27 +DA:92,27 +DA:94,1 +DA:96,11 +DA:98,13 +DA:99,1 +DA:103,5 +DA:104,16 +DA:105,16 +DA:107,16 +DA:108,16 +DA:109,16 +DA:110,16 +DA:112,16 +DA:113,16 +DA:114,2 +DA:116,14 +DA:120,14 +DA:121,14 +DA:125,16 +DA:128,16 +LF:77 +LH:77 +BRDA:14,0,0,1 +BRDA:14,0,1,33 +BRDA:16,1,0,1 +BRDA:16,1,1,32 +BRDA:19,2,0,5 +BRDA:19,2,1,29 +BRDA:22,3,0,31 +BRDA:22,3,1,3 +BRDA:29,4,0,1 +BRDA:29,4,1,33 +BRDA:29,5,0,34 +BRDA:29,5,1,15 +BRDA:32,6,0,1 +BRDA:32,6,1,32 +BRDA:32,7,0,33 +BRDA:32,7,1,4 +BRDA:35,8,0,3 +BRDA:35,8,1,29 +BRDA:38,9,0,22 +BRDA:38,9,1,10 +BRDA:41,10,0,13 +BRDA:41,10,1,19 +BRDA:41,11,0,32 +BRDA:41,11,1,29 +BRDA:42,12,0,16 +BRDA:42,12,1,3 +BRDA:48,13,0,13 +BRDA:48,13,1,9 +BRDA:61,14,0,125 +BRDA:61,14,1,65 +BRDA:61,14,2,65 +BRDA:62,15,0,6 +BRDA:62,15,1,119 +BRDA:63,16,0,59 +BRDA:63,16,1,60 +BRDA:70,17,0,1 +BRDA:70,17,1,2 +BRDA:71,18,0,32 +BRDA:71,18,1,1 +BRDA:82,19,0,12 +BRDA:82,19,1,10 +BRDA:83,20,0,10 +BRDA:83,20,1,2 +BRDA:98,21,0,1 +BRDA:98,21,1,12 +BRDA:98,22,0,13 +BRDA:98,22,1,2 +BRDA:105,23,0,16 +BRDA:105,23,1,14 +BRDA:113,24,0,2 +BRDA:113,24,1,14 +BRDA:125,25,0,4 +BRDA:125,25,1,12 +BRF:53 +BRH:53 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/mkdir.js +FN:13,(anonymous_0) +FN:19,(anonymous_1) +FN:25,(anonymous_2) +FN:31,(anonymous_3) +FN:36,(anonymous_4) +FN:54,(anonymous_5) +FN:60,(anonymous_6) +FN:72,(anonymous_7) +FN:86,(anonymous_8) +FN:96,(anonymous_9) +FN:96,(anonymous_10) +FN:102,(anonymous_11) +FN:108,(anonymous_12) +FN:124,(anonymous_13) +FN:142,(anonymous_14) +FNF:15 +FNH:15 +FNDA:4,(anonymous_0) +FNDA:8,(anonymous_1) +FNDA:12,(anonymous_2) +FNDA:36,(anonymous_3) +FNDA:451,(anonymous_4) +FNDA:457,(anonymous_5) +FNDA:6,(anonymous_6) +FNDA:40,(anonymous_7) +FNDA:1062,(anonymous_8) +FNDA:222,(anonymous_9) +FNDA:222,(anonymous_10) +FNDA:32,(anonymous_11) +FNDA:3,(anonymous_12) +FNDA:276,(anonymous_13) +FNDA:266,(anonymous_14) +DA:7,3 +DA:8,3 +DA:9,3 +DA:10,3 +DA:14,4 +DA:15,4 +DA:16,4 +DA:20,8 +DA:26,12 +DA:27,12 +DA:28,12 +DA:32,36 +DA:36,3 +DA:39,451 +DA:40,451 +DA:41,451 +DA:43,451 +DA:44,451 +DA:45,451 +DA:49,451 +DA:50,451 +DA:51,451 +DA:52,451 +DA:54,451 +DA:55,457 +DA:56,15 +DA:58,442 +DA:59,442 +DA:60,6 +DA:61,436 +DA:62,1 +DA:64,435 +DA:68,451 +DA:69,272 +DA:71,179 +DA:72,40 +DA:73,40 +DA:74,2 +DA:75,40 +DA:78,139 +DA:79,8 +DA:81,131 +DA:82,131 +DA:83,131 +DA:86,3 +DA:87,1062 +DA:88,119 +DA:89,943 +DA:90,943 +DA:91,943 +DA:92,723 +DA:93,220 +DA:96,222 +DA:97,222 +DA:98,36 +DA:100,4 +DA:102,32 +DA:103,32 +DA:104,4 +DA:105,28 +DA:106,22 +DA:107,6 +DA:108,3 +DA:109,3 +DA:110,1 +DA:111,2 +DA:113,3 +DA:114,2 +DA:116,1 +DA:119,186 +DA:120,186 +DA:124,3 +DA:127,276 +DA:128,276 +DA:129,276 +DA:131,276 +DA:132,276 +DA:133,276 +DA:137,276 +DA:138,276 +DA:139,276 +DA:140,276 +DA:142,276 +DA:143,266 +DA:144,266 +DA:145,6 +DA:146,266 +DA:147,1 +DA:148,266 +DA:151,276 +DA:152,128 +DA:154,148 +DA:155,34 +DA:156,34 +DA:157,34 +DA:158,34 +DA:160,1 +DA:162,34 +DA:163,2 +DA:165,32 +DA:166,32 +DA:169,114 +DA:170,7 +DA:172,107 +DA:173,107 +DA:174,107 +DA:175,107 +DA:179,792 +DA:180,608 +DA:182,184 +DA:183,184 +DA:184,169 +DA:185,169 +DA:187,15 +DA:189,4 +DA:191,11 +DA:192,9 +DA:193,4 +DA:194,4 +DA:195,5 +DA:196,2 +DA:197,2 +DA:198,2 +DA:199,2 +DA:200,2 +DA:201,3 +DA:202,2 +DA:206,99 +LF:128 +LH:128 +BRDA:45,0,0,451 +BRDA:45,0,1,6 +BRDA:45,0,2,6 +BRDA:45,0,3,2 +BRDA:55,1,0,15 +BRDA:55,1,1,442 +BRDA:59,2,0,6 +BRDA:59,2,1,436 +BRDA:59,3,0,442 +BRDA:59,3,1,114 +BRDA:61,4,0,1 +BRDA:61,4,1,435 +BRDA:68,5,0,272 +BRDA:68,5,1,179 +BRDA:68,6,0,451 +BRDA:68,6,1,451 +BRDA:71,7,0,40 +BRDA:71,7,1,139 +BRDA:73,8,0,2 +BRDA:73,8,1,38 +BRDA:73,9,0,40 +BRDA:73,9,1,39 +BRDA:74,10,0,2 +BRDA:74,10,1,1 +BRDA:74,10,2,1 +BRDA:78,11,0,8 +BRDA:78,11,1,131 +BRDA:87,12,0,119 +BRDA:87,12,1,943 +BRDA:91,13,0,723 +BRDA:91,13,1,220 +BRDA:97,14,0,36 +BRDA:97,14,1,186 +BRDA:98,15,0,4 +BRDA:98,15,1,32 +BRDA:98,16,0,36 +BRDA:98,16,1,35 +BRDA:98,16,2,16 +BRDA:98,16,3,14 +BRDA:103,17,0,4 +BRDA:103,17,1,28 +BRDA:105,18,0,22 +BRDA:105,18,1,6 +BRDA:107,19,0,3 +BRDA:107,19,1,3 +BRDA:109,20,0,1 +BRDA:109,20,1,2 +BRDA:113,21,0,2 +BRDA:113,21,1,1 +BRDA:119,22,0,186 +BRDA:119,22,1,108 +BRDA:133,23,0,276 +BRDA:133,23,1,6 +BRDA:133,23,2,6 +BRDA:133,23,3,2 +BRDA:144,24,0,6 +BRDA:144,24,1,260 +BRDA:144,25,0,266 +BRDA:144,25,1,101 +BRDA:146,26,0,1 +BRDA:146,26,1,265 +BRDA:151,27,0,128 +BRDA:151,27,1,148 +BRDA:151,28,0,276 +BRDA:151,28,1,276 +BRDA:154,29,0,34 +BRDA:154,29,1,114 +BRDA:162,30,0,2 +BRDA:162,30,1,32 +BRDA:169,31,0,7 +BRDA:169,31,1,107 +BRDA:176,32,0,891 +BRDA:176,32,1,792 +BRDA:179,33,0,608 +BRDA:179,33,1,184 +BRDA:184,34,0,169 +BRDA:184,34,1,93 +BRDA:187,35,0,4 +BRDA:187,35,1,11 +BRDA:187,36,0,15 +BRDA:187,36,1,14 +BRDA:187,36,2,5 +BRDA:187,36,3,3 +BRDA:192,37,0,4 +BRDA:192,37,1,5 +BRDA:195,38,0,2 +BRDA:195,38,1,3 +BRDA:198,39,0,2 +BRDA:198,39,1,2 +BRDA:201,40,0,2 +BRDA:201,40,1,1 +BRF:91 +BRH:91 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/pack.js +FN:13,(anonymous_0) +FN:59,(anonymous_1) +FN:81,(anonymous_2) +FN:82,(anonymous_3) +FN:83,(anonymous_4) +FN:84,(anonymous_5) +FN:94,(anonymous_6) +FN:103,(anonymous_7) +FN:107,(anonymous_8) +FN:112,(anonymous_9) +FN:120,(anonymous_10) +FN:131,(anonymous_11) +FN:142,(anonymous_12) +FN:150,(anonymous_13) +FN:159,(anonymous_14) +FN:163,(anonymous_15) +FN:173,(anonymous_16) +FN:184,(anonymous_17) +FN:187,(anonymous_18) +FN:196,(anonymous_19) +FN:202,(anonymous_20) +FN:230,(anonymous_21) +FN:234,(anonymous_22) +FN:240,(anonymous_23) +FN:283,(anonymous_24) +FN:285,(anonymous_25) +FN:301,(anonymous_26) +FN:305,(anonymous_27) +FN:306,(anonymous_28) +FN:312,(anonymous_29) +FN:318,(anonymous_30) +FN:322,(anonymous_31) +FN:335,(anonymous_32) +FN:340,(anonymous_33) +FN:346,(anonymous_34) +FN:354,(anonymous_35) +FN:360,(anonymous_36) +FN:361,(anonymous_37) +FN:363,(anonymous_38) +FN:368,(anonymous_39) +FN:373,(anonymous_40) +FN:378,(anonymous_41) +FN:389,(anonymous_42) +FN:393,(anonymous_43) +FNF:44 +FNH:44 +FNDA:6566,(anonymous_0) +FNDA:122,(anonymous_1) +FNDA:503,(anonymous_2) +FNDA:4,(anonymous_3) +FNDA:146,(anonymous_4) +FNDA:219,(anonymous_5) +FNDA:6507,(anonymous_6) +FNDA:106,(anonymous_7) +FNDA:107,(anonymous_8) +FNDA:100,(anonymous_9) +FNDA:128,(anonymous_10) +FNDA:27,(anonymous_11) +FNDA:25,(anonymous_12) +FNDA:6541,(anonymous_13) +FNDA:6453,(anonymous_14) +FNDA:6453,(anonymous_15) +FNDA:6538,(anonymous_16) +FNDA:821,(anonymous_17) +FNDA:821,(anonymous_18) +FNDA:858,(anonymous_19) +FNDA:20596,(anonymous_20) +FNDA:25863,(anonymous_21) +FNDA:6533,(anonymous_22) +FNDA:38739,(anonymous_23) +FNDA:6537,(anonymous_24) +FNDA:1,(anonymous_25) +FNDA:6512,(anonymous_26) +FNDA:6508,(anonymous_27) +FNDA:1,(anonymous_28) +FNDA:248,(anonymous_29) +FNDA:6448,(anonymous_30) +FNDA:6393,(anonymous_31) +FNDA:11830,(anonymous_32) +FNDA:199,(anonymous_33) +FNDA:265,(anonymous_34) +FNDA:47,(anonymous_35) +FNDA:1,(anonymous_36) +FNDA:1,(anonymous_37) +FNDA:84,(anonymous_38) +FNDA:37,(anonymous_39) +FNDA:87,(anonymous_40) +FNDA:48,(anonymous_41) +FNDA:39,(anonymous_42) +FNDA:106,(anonymous_43) +DA:14,6566 +DA:15,6566 +DA:16,6566 +DA:17,6566 +DA:18,6566 +DA:19,6566 +DA:20,6566 +DA:21,6566 +DA:25,5 +DA:26,5 +DA:27,5 +DA:28,5 +DA:29,5 +DA:30,5 +DA:31,5 +DA:32,5 +DA:33,5 +DA:34,5 +DA:35,5 +DA:36,5 +DA:37,5 +DA:38,5 +DA:39,5 +DA:40,5 +DA:41,5 +DA:42,5 +DA:43,5 +DA:44,5 +DA:45,5 +DA:46,5 +DA:47,5 +DA:48,5 +DA:49,5 +DA:50,5 +DA:51,5 +DA:52,5 +DA:54,5 +DA:55,5 +DA:56,5 +DA:58,5 +DA:60,122 +DA:61,122 +DA:62,122 +DA:63,122 +DA:64,122 +DA:65,122 +DA:66,122 +DA:67,122 +DA:68,122 +DA:69,122 +DA:70,122 +DA:71,122 +DA:72,122 +DA:73,122 +DA:74,3 +DA:76,122 +DA:77,122 +DA:78,5 +DA:79,4 +DA:80,5 +DA:81,503 +DA:82,5 +DA:83,146 +DA:84,219 +DA:86,117 +DA:88,122 +DA:89,122 +DA:90,122 +DA:91,122 +DA:94,6507 +DA:96,122 +DA:97,122 +DA:98,122 +DA:99,122 +DA:100,122 +DA:104,106 +DA:108,107 +DA:109,103 +DA:113,100 +DA:114,21 +DA:115,99 +DA:116,99 +DA:117,99 +DA:121,128 +DA:122,1 +DA:124,127 +DA:125,27 +DA:127,100 +DA:128,123 +DA:132,27 +DA:133,27 +DA:134,1 +DA:137,27 +DA:138,2 +DA:140,25 +DA:141,25 +DA:142,25 +DA:143,25 +DA:144,25 +DA:147,27 +DA:151,6541 +DA:152,6541 +DA:153,34 +DA:155,6541 +DA:156,6541 +DA:160,6453 +DA:161,6453 +DA:162,6453 +DA:163,6453 +DA:164,6453 +DA:165,6453 +DA:166,6453 +DA:167,1 +DA:169,6452 +DA:174,6538 +DA:175,6538 +DA:178,6538 +DA:179,24 +DA:181,6538 +DA:185,821 +DA:186,821 +DA:187,821 +DA:188,821 +DA:189,821 +DA:190,821 +DA:191,1 +DA:192,820 +DA:197,858 +DA:198,858 +DA:199,858 +DA:203,20596 +DA:204,9093 +DA:206,11503 +DA:207,11503 +DA:210,38739 +DA:211,38735 +DA:212,25 +DA:213,25 +DA:214,25 +DA:218,11499 +DA:220,11499 +DA:221,96 +DA:222,4 +DA:224,92 +DA:225,92 +DA:231,25863 +DA:235,6533 +DA:236,6533 +DA:237,6533 +DA:241,38739 +DA:242,6156 +DA:244,32583 +DA:245,18770 +DA:246,4954 +DA:247,18770 +DA:250,13813 +DA:251,6541 +DA:252,4 +DA:254,6537 +DA:256,13811 +DA:257,6453 +DA:260,7358 +DA:261,24 +DA:263,7334 +DA:264,860 +DA:265,2 +DA:267,858 +DA:268,859 +DA:269,821 +DA:273,6512 +DA:274,6511 +DA:275,1 +DA:276,1 +DA:279,6510 +DA:280,1581 +DA:284,6537 +DA:286,1 +DA:302,6512 +DA:303,6512 +DA:304,6512 +DA:305,6508 +DA:306,1 +DA:308,2 +DA:313,248 +DA:314,158 +DA:319,6448 +DA:321,6448 +DA:322,820 +DA:323,6393 +DA:327,6393 +DA:328,6393 +DA:331,6448 +DA:332,6448 +DA:334,6448 +DA:335,6336 +DA:336,11830 +DA:337,156 +DA:340,112 +DA:341,199 +DA:342,53 +DA:347,265 +DA:348,214 +DA:349,265 +DA:355,47 +DA:356,47 +DA:364,84 +DA:365,84 +DA:369,37 +DA:374,87 +DA:375,87 +DA:377,87 +DA:378,38 +DA:379,48 +DA:384,48 +DA:385,48 +DA:388,87 +DA:389,31 +DA:390,39 +DA:393,56 +DA:394,106 +DA:399,5 +DA:401,5 +LF:222 +LH:222 +BRDA:14,0,0,6566 +BRDA:14,0,1,1 +BRDA:61,1,0,122 +BRDA:61,1,1,5 +BRDA:63,2,0,122 +BRDA:63,2,1,22 +BRDA:68,3,0,122 +BRDA:68,3,1,115 +BRDA:69,4,0,122 +BRDA:69,4,1,121 +BRDA:70,5,0,122 +BRDA:70,5,1,121 +BRDA:71,6,0,122 +BRDA:71,6,1,121 +BRDA:73,7,0,3 +BRDA:73,7,1,119 +BRDA:77,8,0,5 +BRDA:77,8,1,117 +BRDA:78,9,0,4 +BRDA:78,9,1,1 +BRDA:94,10,0,41 +BRDA:94,10,1,81 +BRDA:98,11,0,122 +BRDA:98,11,1,122 +BRDA:113,12,0,21 +BRDA:113,12,1,79 +BRDA:121,13,0,1 +BRDA:121,13,1,127 +BRDA:124,14,0,27 +BRDA:124,14,1,100 +BRDA:133,15,0,1 +BRDA:133,15,1,26 +BRDA:137,16,0,2 +BRDA:137,16,1,25 +BRDA:152,17,0,34 +BRDA:152,17,1,6507 +BRDA:162,18,0,1 +BRDA:162,18,1,6452 +BRDA:166,19,0,1 +BRDA:166,19,1,6452 +BRDA:178,20,0,24 +BRDA:178,20,1,6514 +BRDA:190,21,0,1 +BRDA:190,21,1,820 +BRDA:203,22,0,9093 +BRDA:203,22,1,11503 +BRDA:208,23,0,50238 +BRDA:208,23,1,49694 +BRDA:211,24,0,25 +BRDA:211,24,1,38710 +BRDA:220,25,0,96 +BRDA:220,25,1,11403 +BRDA:220,26,0,11499 +BRDA:220,26,1,11363 +BRDA:220,26,2,97 +BRDA:221,27,0,4 +BRDA:221,27,1,92 +BRDA:231,28,0,25863 +BRDA:231,28,1,25863 +BRDA:231,28,2,25792 +BRDA:241,29,0,6156 +BRDA:241,29,1,32583 +BRDA:244,30,0,18770 +BRDA:244,30,1,13813 +BRDA:245,31,0,4954 +BRDA:245,31,1,13816 +BRDA:245,32,0,18770 +BRDA:245,32,1,9951 +BRDA:250,33,0,6541 +BRDA:250,33,1,7272 +BRDA:251,34,0,4 +BRDA:251,34,1,6537 +BRDA:256,35,0,6453 +BRDA:256,35,1,7358 +BRDA:260,36,0,24 +BRDA:260,36,1,7334 +BRDA:263,37,0,860 +BRDA:263,37,1,6474 +BRDA:263,38,0,7334 +BRDA:263,38,1,7332 +BRDA:263,38,2,1680 +BRDA:264,39,0,2 +BRDA:264,39,1,858 +BRDA:268,40,0,821 +BRDA:268,40,1,38 +BRDA:274,41,0,1 +BRDA:274,41,1,6510 +BRDA:279,42,0,1581 +BRDA:279,42,1,4929 +BRDA:279,43,0,6510 +BRDA:279,43,1,1581 +BRDA:313,44,0,158 +BRDA:313,44,1,90 +BRDA:313,45,0,248 +BRDA:313,45,1,177 +BRDA:321,46,0,820 +BRDA:321,46,1,5628 +BRDA:323,47,0,14 +BRDA:323,47,1,6379 +BRDA:324,48,0,14 +BRDA:324,48,1,4 +BRDA:327,49,0,18 +BRDA:327,49,1,6375 +BRDA:334,50,0,6336 +BRDA:334,50,1,112 +BRDA:336,51,0,156 +BRDA:336,51,1,11674 +BRDA:341,52,0,53 +BRDA:341,52,1,146 +BRDA:347,53,0,214 +BRDA:347,53,1,51 +BRDA:364,54,0,1 +BRDA:364,54,1,83 +BRDA:377,55,0,38 +BRDA:377,55,1,49 +BRDA:379,56,0,14 +BRDA:379,56,1,34 +BRDA:380,57,0,14 +BRDA:380,57,1,4 +BRDA:384,58,0,4 +BRDA:384,58,1,44 +BRDA:388,59,0,31 +BRDA:388,59,1,56 +BRF:123 +BRH:123 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/parse.js +FN:61,(anonymous_0) +FN:64,(anonymous_1) +FN:71,(anonymous_2) +FN:103,(anonymous_3) +FN:128,(anonymous_4) +FN:157,(anonymous_5) +FN:169,(anonymous_6) +FN:177,(anonymous_7) +FN:194,(anonymous_8) +FN:198,(anonymous_9) +FN:216,(anonymous_10) +FN:227,(anonymous_11) +FN:234,(anonymous_12) +FN:262,(anonymous_13) +FN:268,(anonymous_14) +FN:290,(anonymous_15) +FN:291,(anonymous_16) +FN:293,(anonymous_17) +FN:316,(anonymous_18) +FN:321,(anonymous_19) +FN:326,(anonymous_20) +FN:342,(anonymous_21) +FN:370,(anonymous_22) +FN:405,(anonymous_23) +FNF:24 +FNH:24 +FNDA:2032,(anonymous_0) +FNDA:742,(anonymous_1) +FNDA:589,(anonymous_2) +FNDA:6101,(anonymous_3) +FNDA:475,(anonymous_4) +FNDA:4299,(anonymous_5) +FNDA:1272,(anonymous_6) +FNDA:2947,(anonymous_7) +FNDA:9,(anonymous_8) +FNDA:2194,(anonymous_9) +FNDA:475,(anonymous_10) +FNDA:4328,(anonymous_11) +FNDA:455,(anonymous_12) +FNDA:2,(anonymous_13) +FNDA:669590,(anonymous_14) +FNDA:20164,(anonymous_15) +FNDA:2,(anonymous_16) +FNDA:226,(anonymous_17) +FNDA:6,(anonymous_18) +FNDA:652869,(anonymous_19) +FNDA:3449,(anonymous_20) +FNDA:655942,(anonymous_21) +FNDA:655553,(anonymous_22) +FNDA:718,(anonymous_23) +DA:23,9 +DA:24,9 +DA:25,9 +DA:26,9 +DA:27,9 +DA:28,9 +DA:29,9 +DA:30,9 +DA:31,9 +DA:33,9 +DA:34,9 +DA:35,9 +DA:36,9 +DA:37,9 +DA:38,9 +DA:39,9 +DA:40,9 +DA:41,9 +DA:42,9 +DA:43,9 +DA:44,9 +DA:45,9 +DA:46,9 +DA:47,9 +DA:48,9 +DA:49,9 +DA:50,9 +DA:51,9 +DA:52,9 +DA:53,9 +DA:54,9 +DA:55,9 +DA:56,9 +DA:57,9 +DA:58,9 +DA:59,9 +DA:61,2032 +DA:63,9 +DA:65,742 +DA:66,742 +DA:68,742 +DA:69,134 +DA:71,608 +DA:72,589 +DA:73,589 +DA:74,589 +DA:75,589 +DA:78,742 +DA:79,742 +DA:80,742 +DA:83,742 +DA:84,742 +DA:86,742 +DA:87,742 +DA:88,742 +DA:89,742 +DA:90,742 +DA:91,742 +DA:92,742 +DA:93,742 +DA:94,742 +DA:95,742 +DA:96,742 +DA:97,742 +DA:98,36 +DA:99,742 +DA:100,34 +DA:104,6101 +DA:106,6101 +DA:107,1834 +DA:108,4267 +DA:109,160 +DA:110,4107 +DA:111,40 +DA:113,4067 +DA:114,4067 +DA:115,40 +DA:116,4027 +DA:117,40 +DA:119,3987 +DA:121,3987 +DA:122,759 +DA:123,260 +DA:124,260 +DA:125,260 +DA:126,499 +DA:127,455 +DA:128,475 +DA:129,455 +DA:133,3228 +DA:134,3228 +DA:135,3228 +DA:136,1070 +DA:137,1070 +DA:139,2158 +DA:140,1028 +DA:142,1130 +DA:143,1130 +DA:146,2158 +DA:147,1675 +DA:148,1675 +DA:150,483 +DA:158,4299 +DA:160,4299 +DA:161,1653 +DA:162,1653 +DA:163,2646 +DA:164,490 +DA:166,2156 +DA:167,2156 +DA:168,2150 +DA:169,1288 +DA:170,1288 +DA:174,4293 +DA:178,2947 +DA:180,2941 +DA:188,2478 +DA:189,2478 +DA:190,2478 +DA:191,2468 +DA:192,516 +DA:194,10 +DA:200,2194 +DA:201,2194 +DA:202,2194 +DA:205,2194 +DA:207,2194 +DA:208,2121 +DA:209,2121 +DA:210,2121 +DA:213,2194 +DA:217,475 +DA:218,475 +DA:221,475 +DA:222,455 +DA:224,475 +DA:228,4328 +DA:229,3815 +DA:231,513 +DA:235,455 +DA:236,455 +DA:239,351 +DA:240,351 +DA:243,44 +DA:244,44 +DA:248,40 +DA:249,40 +DA:250,40 +DA:253,20 +DA:254,20 +DA:255,20 +DA:263,2 +DA:264,2 +DA:265,2 +DA:269,669590 +DA:270,1 +DA:273,669589 +DA:274,944 +DA:275,224 +DA:276,224 +DA:278,944 +DA:279,224 +DA:280,224 +DA:282,720 +DA:283,947 +DA:284,493 +DA:286,720 +DA:287,227 +DA:288,227 +DA:289,227 +DA:290,20164 +DA:291,227 +DA:292,2 +DA:293,227 +DA:294,226 +DA:295,226 +DA:297,227 +DA:301,669138 +DA:302,669138 +DA:303,33586 +DA:305,635552 +DA:306,669132 +DA:310,669132 +DA:315,669132 +DA:316,63 +DA:318,669132 +DA:322,652869 +DA:323,652866 +DA:327,3449 +DA:328,709 +DA:329,709 +DA:330,709 +DA:331,2 +DA:332,2 +DA:334,2 +DA:335,1 +DA:336,2 +DA:338,709 +DA:343,655942 +DA:344,10 +DA:345,655932 +DA:346,381 +DA:348,655551 +DA:349,655551 +DA:350,652859 +DA:351,652859 +DA:352,652859 +DA:353,652859 +DA:355,2692 +DA:358,655545 +DA:359,2 +DA:360,2 +DA:361,2 +DA:363,655545 +DA:366,655936 +DA:367,3068 +DA:373,655553 +DA:374,655553 +DA:375,655553 +DA:376,8295 +DA:378,6101 +DA:379,6095 +DA:380,6095 +DA:384,1719 +DA:385,1719 +DA:388,475 +DA:389,475 +DA:397,655547 +DA:398,652863 +DA:399,1 +DA:401,652862 +DA:406,718 +DA:407,717 +DA:408,113 +DA:410,604 +DA:411,604 +LF:236 +LH:236 +BRDA:65,0,0,742 +BRDA:65,0,1,22 +BRDA:68,1,0,134 +BRDA:68,1,1,608 +BRDA:79,2,0,742 +BRDA:79,2,1,462 +BRDA:80,3,0,290 +BRDA:80,3,1,452 +BRDA:97,4,0,36 +BRDA:97,4,1,706 +BRDA:99,5,0,34 +BRDA:99,5,1,708 +BRDA:106,6,0,1834 +BRDA:106,6,1,4267 +BRDA:108,7,0,160 +BRDA:108,7,1,4107 +BRDA:110,8,0,40 +BRDA:110,8,1,4067 +BRDA:114,9,0,40 +BRDA:114,9,1,4027 +BRDA:114,10,0,4067 +BRDA:114,10,1,248 +BRDA:116,11,0,40 +BRDA:116,11,1,3987 +BRDA:116,12,0,4027 +BRDA:116,12,1,3819 +BRDA:121,13,0,759 +BRDA:121,13,1,3228 +BRDA:122,14,0,260 +BRDA:122,14,1,499 +BRDA:126,15,0,455 +BRDA:126,15,1,44 +BRDA:134,16,0,3228 +BRDA:134,16,1,3226 +BRDA:135,17,0,1070 +BRDA:135,17,1,2158 +BRDA:137,18,0,382 +BRDA:137,18,1,688 +BRDA:139,19,0,1028 +BRDA:139,19,1,1130 +BRDA:146,20,0,1675 +BRDA:146,20,1,483 +BRDA:160,21,0,1653 +BRDA:160,21,1,2646 +BRDA:163,22,0,490 +BRDA:163,22,1,2156 +BRDA:168,23,0,1288 +BRDA:168,23,1,862 +BRDA:180,24,0,2478 +BRDA:180,24,1,463 +BRDA:189,25,0,2478 +BRDA:189,25,1,825 +BRDA:189,25,2,167 +BRDA:190,26,0,2468 +BRDA:190,26,1,10 +BRDA:191,27,0,516 +BRDA:191,27,1,1952 +BRDA:202,28,0,583 +BRDA:202,28,1,1611 +BRDA:202,29,0,2194 +BRDA:202,29,1,593 +BRDA:207,30,0,2121 +BRDA:207,30,1,73 +BRDA:221,31,0,455 +BRDA:221,31,1,20 +BRDA:228,32,0,3815 +BRDA:228,32,1,513 +BRDA:228,33,0,4328 +BRDA:228,33,1,3916 +BRDA:236,34,0,351 +BRDA:236,34,1,351 +BRDA:236,34,2,44 +BRDA:236,34,3,40 +BRDA:236,34,4,40 +BRDA:236,34,5,20 +BRDA:248,35,0,40 +BRDA:248,35,1,40 +BRDA:253,36,0,20 +BRDA:253,36,1,20 +BRDA:269,37,0,1 +BRDA:269,37,1,669589 +BRDA:273,38,0,944 +BRDA:273,38,1,668645 +BRDA:273,39,0,669589 +BRDA:273,39,1,944 +BRDA:274,40,0,224 +BRDA:274,40,1,720 +BRDA:278,41,0,224 +BRDA:278,41,1,720 +BRDA:282,42,0,1667 +BRDA:282,42,1,1174 +BRDA:283,43,0,493 +BRDA:283,43,1,454 +BRDA:286,44,0,227 +BRDA:286,44,1,493 +BRDA:297,45,0,113 +BRDA:297,45,1,114 +BRDA:302,46,0,33586 +BRDA:302,46,1,635552 +BRDA:310,47,0,190 +BRDA:310,47,1,668942 +BRDA:311,48,0,61606 +BRDA:311,48,1,607336 +BRDA:315,49,0,63 +BRDA:315,49,1,669069 +BRDA:315,50,0,669132 +BRDA:315,50,1,253 +BRDA:322,51,0,652866 +BRDA:322,51,1,3 +BRDA:322,52,0,652869 +BRDA:322,52,1,652866 +BRDA:323,53,0,652864 +BRDA:323,53,1,2 +BRDA:327,54,0,709 +BRDA:327,54,1,2740 +BRDA:327,55,0,3449 +BRDA:327,55,1,1094 +BRDA:327,55,2,710 +BRDA:330,56,0,2 +BRDA:330,56,1,707 +BRDA:330,57,0,709 +BRDA:330,57,1,255 +BRDA:331,58,0,1 +BRDA:331,58,1,1 +BRDA:334,59,0,1 +BRDA:334,59,1,1 +BRDA:343,60,0,10 +BRDA:343,60,1,655932 +BRDA:345,61,0,381 +BRDA:345,61,1,655551 +BRDA:345,62,0,655932 +BRDA:345,62,1,382 +BRDA:349,63,0,652859 +BRDA:349,63,1,2692 +BRDA:358,64,0,655547 +BRDA:358,64,1,652864 +BRDA:358,64,2,2 +BRDA:366,65,0,3068 +BRDA:366,65,1,652868 +BRDA:366,66,0,655936 +BRDA:366,66,1,652872 +BRDA:375,67,0,663842 +BRDA:375,67,1,8295 +BRDA:376,68,0,6101 +BRDA:376,68,1,670 +BRDA:376,68,2,1719 +BRDA:376,68,3,475 +BRDA:397,69,0,652863 +BRDA:397,69,1,2684 +BRDA:398,70,0,1 +BRDA:398,70,1,652862 +BRDA:406,71,0,717 +BRDA:406,71,1,1 +BRDA:407,72,0,113 +BRDA:407,72,1,604 +BRF:155 +BRH:155 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/pax.js +FN:6,(anonymous_0) +FN:25,(anonymous_1) +FN:71,(anonymous_2) +FN:91,(anonymous_3) +FN:112,(anonymous_4) +FN:114,(anonymous_5) +FN:115,(anonymous_6) +FN:117,(anonymous_7) +FN:123,(anonymous_8) +FNF:9 +FNH:9 +FNDA:435,(anonymous_0) +FNDA:34,(anonymous_1) +FNDA:34,(anonymous_2) +FNDA:510,(anonymous_3) +FNDA:401,(anonymous_4) +FNDA:401,(anonymous_5) +FNDA:1,(anonymous_6) +FNDA:401,(anonymous_7) +FNDA:2259,(anonymous_8) +DA:2,11 +DA:3,11 +DA:7,435 +DA:8,435 +DA:9,435 +DA:10,435 +DA:11,435 +DA:12,435 +DA:13,435 +DA:14,435 +DA:15,435 +DA:16,435 +DA:17,435 +DA:18,435 +DA:19,435 +DA:20,435 +DA:21,435 +DA:22,435 +DA:26,34 +DA:27,34 +DA:28,1 +DA:30,33 +DA:33,33 +DA:34,33 +DA:37,33 +DA:38,16896 +DA:41,33 +DA:61,33 +DA:64,33 +DA:65,8949 +DA:68,33 +DA:72,34 +DA:92,510 +DA:93,204 +DA:94,306 +DA:96,306 +DA:100,306 +DA:104,306 +DA:105,306 +DA:106,30 +DA:107,306 +DA:108,306 +DA:112,401 +DA:114,11 +DA:115,401 +DA:117,11 +DA:118,401 +DA:123,11 +DA:124,2259 +DA:128,2259 +DA:129,5 +DA:131,2254 +DA:132,2254 +DA:133,2254 +DA:134,2254 +DA:135,1 +DA:137,2253 +DA:138,2253 +DA:142,2253 +DA:145,11 +LF:60 +LH:60 +BRDA:7,0,0,435 +BRDA:7,0,1,85 +BRDA:8,1,0,435 +BRDA:8,1,1,435 +BRDA:9,2,0,435 +BRDA:9,2,1,411 +BRDA:10,3,0,435 +BRDA:10,3,1,85 +BRDA:11,4,0,435 +BRDA:11,4,1,369 +BRDA:12,5,0,435 +BRDA:12,5,1,410 +BRDA:13,6,0,435 +BRDA:13,6,1,435 +BRDA:14,7,0,435 +BRDA:14,7,1,368 +BRDA:15,8,0,435 +BRDA:15,8,1,2 +BRDA:16,9,0,435 +BRDA:16,9,1,363 +BRDA:17,10,0,435 +BRDA:17,10,1,371 +BRDA:18,11,0,435 +BRDA:18,11,1,373 +BRDA:19,12,0,435 +BRDA:19,12,1,86 +BRDA:20,13,0,435 +BRDA:20,13,1,86 +BRDA:21,14,0,435 +BRDA:21,14,1,86 +BRDA:22,15,0,435 +BRDA:22,15,1,389 +BRDA:27,16,0,1 +BRDA:27,16,1,33 +BRDA:46,17,0,33 +BRDA:46,17,1,33 +BRDA:47,18,0,33 +BRDA:47,18,1,6 +BRDA:48,19,0,33 +BRDA:48,19,1,6 +BRDA:50,20,0,33 +BRDA:50,20,1,5 +BRDA:51,21,0,1 +BRDA:51,21,1,32 +BRDA:53,22,0,33 +BRDA:53,22,1,7 +BRDA:54,23,0,33 +BRDA:54,23,1,32 +BRDA:57,24,0,33 +BRDA:57,24,1,6 +BRDA:58,25,0,33 +BRDA:58,25,1,6 +BRDA:92,26,0,204 +BRDA:92,26,1,306 +BRDA:92,27,0,510 +BRDA:92,27,1,306 +BRDA:94,28,0,82 +BRDA:94,28,1,224 +BRDA:97,29,0,78 +BRDA:97,29,1,228 +BRDA:97,30,0,306 +BRDA:97,30,1,280 +BRDA:97,30,2,254 +BRDA:105,31,0,30 +BRDA:105,31,1,276 +BRDA:115,32,0,1 +BRDA:115,32,1,400 +BRDA:128,33,0,5 +BRDA:128,33,1,2254 +BRDA:134,34,0,1 +BRDA:134,34,1,2253 +BRDA:138,35,0,685 +BRDA:138,35,1,1568 +BRDA:140,36,0,1084 +BRDA:140,36,1,484 +BRF:75 +BRH:75 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/read-entry.js +FN:7,(anonymous_0) +FN:66,(anonymous_1) +FN:85,(anonymous_2) +FNF:3 +FNH:3 +FNDA:4004,(anonymous_0) +FNDA:2222,(anonymous_1) +FNDA:457,(anonymous_2) +DA:2,11 +DA:3,11 +DA:5,11 +DA:6,11 +DA:8,4004 +DA:9,4004 +DA:10,4004 +DA:11,4004 +DA:12,4004 +DA:13,4004 +DA:14,4004 +DA:15,4004 +DA:16,4004 +DA:17,4004 +DA:18,4004 +DA:29,3241 +DA:37,760 +DA:38,760 +DA:43,3 +DA:46,4004 +DA:47,4004 +DA:48,4004 +DA:49,3720 +DA:50,4004 +DA:51,4004 +DA:52,4004 +DA:53,4004 +DA:54,4004 +DA:55,4004 +DA:56,4004 +DA:57,4004 +DA:58,4004 +DA:59,4004 +DA:60,4004 +DA:62,4004 +DA:63,4004 +DA:67,2222 +DA:68,2222 +DA:69,2 +DA:71,2220 +DA:72,2220 +DA:73,2220 +DA:74,2220 +DA:75,2220 +DA:76,673 +DA:78,1547 +DA:79,132 +DA:82,1415 +DA:86,457 +DA:89,6384 +DA:91,2657 +LF:51 +LH:51 +BRDA:18,0,0,1502 +BRDA:18,0,1,1502 +BRDA:18,0,2,1565 +BRDA:18,0,3,1710 +BRDA:18,0,4,1712 +BRDA:18,0,5,1714 +BRDA:18,0,6,3239 +BRDA:18,0,7,3241 +BRDA:18,0,8,3241 +BRDA:18,0,9,3241 +BRDA:18,0,10,41 +BRDA:18,0,11,121 +BRDA:18,0,12,121 +BRDA:18,0,13,165 +BRDA:18,0,14,760 +BRDA:18,0,15,760 +BRDA:18,0,16,3 +BRDA:48,1,0,3720 +BRDA:48,1,1,284 +BRDA:62,2,0,412 +BRDA:62,2,1,3592 +BRDA:63,3,0,45 +BRDA:63,3,1,3959 +BRDA:68,4,0,2 +BRDA:68,4,1,2220 +BRDA:75,5,0,673 +BRDA:75,5,1,1547 +BRDA:78,6,0,132 +BRDA:78,6,1,1415 +BRDA:89,7,0,2657 +BRDA:89,7,1,3727 +BRDA:89,8,0,6384 +BRDA:89,8,1,2702 +BRDA:89,8,2,2701 +BRDA:90,9,0,2701 +BRDA:90,9,1,89 +BRF:36 +BRH:36 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/replace.js +FN:20,(anonymous_0) +FN:38,(anonymous_1) +FN:92,(anonymous_2) +FN:101,(anonymous_3) +FN:105,(anonymous_4) +FN:106,(anonymous_5) +FN:108,(anonymous_6) +FN:119,(anonymous_7) +FN:156,(anonymous_8) +FN:159,(anonymous_9) +FN:168,(anonymous_10) +FN:171,(anonymous_11) +FN:191,(anonymous_12) +FN:192,(anonymous_13) +FN:198,(anonymous_14) +FN:206,(anonymous_15) +FN:213,(anonymous_16) +FN:214,(anonymous_17) +FNF:18 +FNH:18 +FNDA:70,(anonymous_0) +FNDA:26,(anonymous_1) +FNDA:18,(anonymous_2) +FNDA:41,(anonymous_3) +FNDA:37,(anonymous_4) +FNDA:37,(anonymous_5) +FNDA:4,(anonymous_6) +FNDA:112,(anonymous_7) +FNDA:41,(anonymous_8) +FNDA:45,(anonymous_9) +FNDA:39,(anonymous_10) +FNDA:37,(anonymous_11) +FNDA:18,(anonymous_12) +FNDA:19,(anonymous_13) +FNDA:3,(anonymous_14) +FNDA:34,(anonymous_15) +FNDA:3,(anonymous_16) +FNDA:1,(anonymous_17) +DA:4,3 +DA:5,3 +DA:6,3 +DA:7,3 +DA:8,3 +DA:9,3 +DA:10,3 +DA:18,3 +DA:20,3 +DA:21,70 +DA:23,70 +DA:24,1 +DA:26,69 +DA:27,1 +DA:29,68 +DA:30,1 +DA:32,67 +DA:34,67 +DA:38,3 +DA:39,26 +DA:41,26 +DA:45,26 +DA:46,26 +DA:47,26 +DA:49,4 +DA:50,2 +DA:52,2 +DA:55,24 +DA:56,22 +DA:58,22 +DA:59,61 +DA:60,63 +DA:64,61 +DA:65,2 +DA:67,59 +DA:68,2 +DA:71,55 +DA:72,55 +DA:73,8 +DA:74,47 +DA:75,47 +DA:76,2 +DA:79,45 +DA:80,45 +DA:81,28 +DA:83,18 +DA:85,18 +DA:87,26 +DA:88,8 +DA:92,3 +DA:93,18 +DA:97,18 +DA:98,18 +DA:101,3 +DA:102,41 +DA:103,41 +DA:105,41 +DA:106,37 +DA:107,37 +DA:108,4 +DA:110,33 +DA:113,37 +DA:114,37 +DA:115,8 +DA:117,29 +DA:118,29 +DA:119,29 +DA:120,112 +DA:121,2 +DA:122,110 +DA:123,110 +DA:124,6 +DA:129,104 +DA:130,2 +DA:133,102 +DA:134,4 +DA:136,98 +DA:137,98 +DA:138,13 +DA:140,85 +DA:141,85 +DA:142,4 +DA:144,81 +DA:145,81 +DA:146,4 +DA:148,77 +DA:149,46 +DA:150,77 +DA:151,77 +DA:153,29 +DA:156,41 +DA:157,41 +DA:158,41 +DA:159,41 +DA:160,45 +DA:161,4 +DA:162,4 +DA:165,41 +DA:166,2 +DA:168,39 +DA:169,39 +DA:170,2 +DA:171,37 +DA:172,37 +DA:173,4 +DA:174,33 +DA:178,33 +DA:179,33 +DA:180,33 +DA:181,33 +DA:185,41 +DA:188,41 +DA:191,3 +DA:192,18 +DA:193,19 +DA:194,1 +DA:198,3 +DA:201,18 +DA:203,18 +DA:206,3 +DA:207,34 +DA:208,33 +DA:209,33 +DA:210,1 +DA:213,3 +DA:214,1 +DA:216,32 +DA:218,33 +LF:128 +LH:128 +BRDA:23,0,0,1 +BRDA:23,0,1,69 +BRDA:26,1,0,1 +BRDA:26,1,1,68 +BRDA:29,2,0,1 +BRDA:29,2,1,67 +BRDA:29,3,0,68 +BRDA:29,3,1,68 +BRDA:29,3,2,68 +BRDA:34,4,0,26 +BRDA:34,4,1,41 +BRDA:49,5,0,2 +BRDA:49,5,1,2 +BRDA:64,6,0,2 +BRDA:64,6,1,59 +BRDA:64,7,0,61 +BRDA:64,7,1,16 +BRDA:64,7,2,2 +BRDA:67,8,0,2 +BRDA:67,8,1,57 +BRDA:72,9,0,8 +BRDA:72,9,1,47 +BRDA:75,10,0,2 +BRDA:75,10,1,45 +BRDA:80,11,0,28 +BRDA:80,11,1,17 +BRDA:87,12,0,8 +BRDA:87,12,1,18 +BRDA:107,13,0,4 +BRDA:107,13,1,33 +BRDA:114,14,0,8 +BRDA:114,14,1,29 +BRDA:120,15,0,2 +BRDA:120,15,1,110 +BRDA:123,16,0,6 +BRDA:123,16,1,104 +BRDA:123,17,0,110 +BRDA:123,17,1,12 +BRDA:129,18,0,2 +BRDA:129,18,1,102 +BRDA:129,19,0,104 +BRDA:129,19,1,27 +BRDA:129,19,2,2 +BRDA:133,20,0,4 +BRDA:133,20,1,98 +BRDA:137,21,0,13 +BRDA:137,21,1,85 +BRDA:141,22,0,4 +BRDA:141,22,1,81 +BRDA:145,23,0,4 +BRDA:145,23,1,77 +BRDA:148,24,0,46 +BRDA:148,24,1,31 +BRDA:160,25,0,4 +BRDA:160,25,1,41 +BRDA:160,26,0,45 +BRDA:160,26,1,6 +BRDA:160,26,2,4 +BRDA:165,27,0,2 +BRDA:165,27,1,39 +BRDA:169,28,0,2 +BRDA:169,28,1,37 +BRDA:172,29,0,4 +BRDA:172,29,1,33 +BRDA:188,30,0,24 +BRDA:188,30,1,17 +BRDA:193,31,0,1 +BRDA:193,31,1,18 +BRDA:209,32,0,1 +BRDA:209,32,1,32 +BRF:70 +BRH:70 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/types.js +FN:44,(anonymous_0) +FNF:1 +FNH:1 +FNDA:294,(anonymous_0) +DA:3,14 +DA:44,294 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/unpack.js +FN:37,(anonymous_0) +FN:43,(anonymous_1) +FN:47,(anonymous_2) +FN:117,(anonymous_3) +FN:120,(anonymous_4) +FN:129,(anonymous_5) +FN:168,(anonymous_6) +FN:194,(anonymous_7) +FN:207,(anonymous_8) +FN:222,(anonymous_9) +FN:233,(anonymous_10) +FN:237,(anonymous_11) +FN:241,(anonymous_12) +FN:247,(anonymous_13) +FN:250,(anonymous_14) +FN:257,(anonymous_15) +FN:260,(anonymous_16) +FN:277,(anonymous_17) +FN:279,(anonymous_18) +FN:284,(anonymous_19) +FN:305,(anonymous_20) +FN:310,(anonymous_21) +FN:314,(anonymous_22) +FN:318,(anonymous_23) +FN:322,(anonymous_24) +FN:327,(anonymous_25) +FN:333,(anonymous_26) +FN:335,(anonymous_27) +FN:338,(anonymous_28) +FN:348,(anonymous_29) +FN:350,(anonymous_30) +FN:352,(anonymous_31) +FN:357,(anonymous_32) +FN:379,(anonymous_33) +FN:381,(anonymous_34) +FN:391,(anonymous_35) +FN:395,(anonymous_36) +FN:425,(anonymous_37) +FN:428,(anonymous_38) +FN:441,(anonymous_39) +FN:449,(anonymous_40) +FN:465,(anonymous_41) +FN:483,(anonymous_42) +FN:502,(anonymous_43) +FNF:44 +FNH:44 +FNDA:60,(anonymous_0) +FNDA:134,(anonymous_1) +FNDA:109,(anonymous_2) +FNDA:571,(anonymous_3) +FNDA:473,(anonymous_4) +FNDA:571,(anonymous_5) +FNDA:571,(anonymous_6) +FNDA:39,(anonymous_7) +FNDA:451,(anonymous_8) +FNDA:473,(anonymous_9) +FNDA:30,(anonymous_10) +FNDA:30,(anonymous_11) +FNDA:221,(anonymous_12) +FNDA:2,(anonymous_13) +FNDA:421,(anonymous_14) +FNDA:219,(anonymous_15) +FNDA:219,(anonymous_16) +FNDA:97,(anonymous_17) +FNDA:97,(anonymous_18) +FNDA:171,(anonymous_19) +FNDA:6,(anonymous_20) +FNDA:21,(anonymous_21) +FNDA:19,(anonymous_22) +FNDA:354,(anonymous_23) +FNDA:364,(anonymous_24) +FNDA:4,(anonymous_25) +FNDA:354,(anonymous_26) +FNDA:354,(anonymous_27) +FNDA:342,(anonymous_28) +FNDA:2,(anonymous_29) +FNDA:5,(anonymous_30) +FNDA:6,(anonymous_31) +FNDA:528,(anonymous_32) +FNDA:21,(anonymous_33) +FNDA:21,(anonymous_34) +FNDA:59,(anonymous_35) +FNDA:200,(anonymous_36) +FNDA:93,(anonymous_37) +FNDA:6,(anonymous_38) +FNDA:86,(anonymous_39) +FNDA:86,(anonymous_40) +FNDA:76,(anonymous_41) +FNDA:276,(anonymous_42) +FNDA:19,(anonymous_43) +DA:3,3 +DA:4,3 +DA:5,3 +DA:6,3 +DA:7,3 +DA:8,3 +DA:9,3 +DA:10,3 +DA:11,3 +DA:13,3 +DA:14,3 +DA:15,3 +DA:16,3 +DA:17,3 +DA:18,3 +DA:19,3 +DA:20,3 +DA:21,3 +DA:22,3 +DA:23,3 +DA:24,3 +DA:25,3 +DA:26,3 +DA:27,3 +DA:28,3 +DA:29,3 +DA:30,3 +DA:31,3 +DA:32,3 +DA:33,3 +DA:34,3 +DA:37,3 +DA:38,60 +DA:44,134 +DA:45,4 +DA:47,134 +DA:48,109 +DA:49,109 +DA:52,134 +DA:54,134 +DA:55,134 +DA:57,134 +DA:58,134 +DA:60,134 +DA:62,134 +DA:64,9 +DA:65,2 +DA:66,7 +DA:67,1 +DA:69,6 +DA:70,6 +DA:71,6 +DA:73,125 +DA:74,125 +DA:75,125 +DA:79,131 +DA:80,119 +DA:82,12 +DA:84,131 +DA:86,131 +DA:90,131 +DA:93,131 +DA:96,131 +DA:99,131 +DA:104,131 +DA:108,131 +DA:110,131 +DA:111,131 +DA:112,131 +DA:113,131 +DA:115,131 +DA:116,131 +DA:117,571 +DA:121,473 +DA:122,98 +DA:123,98 +DA:124,98 +DA:125,98 +DA:130,571 +DA:131,144 +DA:132,144 +DA:133,9 +DA:134,135 +DA:137,562 +DA:138,545 +DA:139,545 +DA:140,2 +DA:141,2 +DA:146,543 +DA:147,2 +DA:148,2 +DA:149,2 +DA:154,560 +DA:155,3 +DA:156,3 +DA:160,560 +DA:161,2 +DA:163,558 +DA:165,560 +DA:169,571 +DA:170,11 +DA:172,560 +DA:174,560 +DA:177,179 +DA:178,140 +DA:185,554 +DA:190,6 +DA:198,39 +DA:199,12 +DA:201,27 +DA:202,27 +DA:203,27 +DA:208,451 +DA:225,473 +DA:234,30 +DA:238,30 +DA:242,221 +DA:243,221 +DA:247,221 +DA:249,221 +DA:250,221 +DA:251,421 +DA:252,1 +DA:253,1 +DA:256,421 +DA:257,219 +DA:260,221 +DA:261,219 +DA:262,192 +DA:263,192 +DA:266,219 +DA:267,10 +DA:268,10 +DA:271,219 +DA:274,221 +DA:278,97 +DA:279,97 +DA:280,97 +DA:281,3 +DA:283,94 +DA:284,94 +DA:285,171 +DA:286,94 +DA:287,94 +DA:291,94 +DA:292,73 +DA:293,73 +DA:296,94 +DA:297,4 +DA:298,4 +DA:301,94 +DA:306,6 +DA:307,6 +DA:311,21 +DA:315,19 +DA:319,354 +DA:323,364 +DA:324,364 +DA:328,4 +DA:329,4 +DA:334,354 +DA:335,354 +DA:336,354 +DA:337,12 +DA:338,342 +DA:339,342 +DA:340,2 +DA:341,340 +DA:342,318 +DA:343,22 +DA:344,16 +DA:345,11 +DA:346,9 +DA:348,2 +DA:350,5 +DA:352,6 +DA:358,528 +DA:359,1 +DA:361,527 +DA:365,314 +DA:368,19 +DA:371,21 +DA:375,173 +DA:381,21 +DA:382,21 +DA:383,1 +DA:384,20 +DA:385,20 +DA:392,59 +DA:396,200 +DA:397,200 +DA:398,9 +DA:399,191 +DA:400,191 +DA:401,17 +DA:402,2 +DA:403,15 +DA:404,2 +DA:406,13 +DA:407,13 +DA:408,6 +DA:409,3 +DA:410,2 +DA:412,3 +DA:414,7 +DA:415,12 +DA:417,1 +DA:421,174 +DA:426,93 +DA:428,93 +DA:429,6 +DA:430,6 +DA:435,93 +DA:436,93 +DA:438,1 +DA:441,92 +DA:442,86 +DA:443,86 +DA:445,1 +DA:449,92 +DA:450,86 +DA:451,86 +DA:452,58 +DA:454,85 +DA:455,12 +DA:457,82 +DA:459,4 +DA:466,76 +DA:467,76 +DA:468,76 +DA:469,1 +DA:470,75 +DA:471,56 +DA:472,56 +DA:475,75 +DA:476,4 +DA:477,4 +DA:480,75 +DA:484,276 +DA:485,276 +DA:498,4 +DA:503,19 +DA:504,19 +DA:505,17 +DA:507,2 +DA:512,3 +DA:513,3 +LF:247 +LH:247 +BRDA:38,0,0,24 +BRDA:38,0,1,36 +BRDA:39,1,0,26 +BRDA:39,1,1,10 +BRDA:44,2,0,4 +BRDA:44,2,1,130 +BRDA:60,3,0,134 +BRDA:60,3,1,134 +BRDA:62,4,0,9 +BRDA:62,4,1,125 +BRDA:62,5,0,134 +BRDA:62,5,1,126 +BRDA:64,6,0,2 +BRDA:64,6,1,7 +BRDA:64,7,0,9 +BRDA:64,7,1,8 +BRDA:66,8,0,1 +BRDA:66,8,1,6 +BRDA:79,9,0,119 +BRDA:79,9,1,12 +BRDA:79,10,0,131 +BRDA:79,10,1,125 +BRDA:80,11,0,119 +BRDA:80,11,1,119 +BRDA:84,12,0,11 +BRDA:84,12,1,120 +BRDA:84,13,0,131 +BRDA:84,13,1,126 +BRDA:84,13,2,11 +BRDA:86,14,0,11 +BRDA:86,14,1,120 +BRDA:86,15,0,131 +BRDA:86,15,1,126 +BRDA:86,15,2,11 +BRDA:90,16,0,131 +BRDA:90,16,1,128 +BRDA:110,17,0,131 +BRDA:110,17,1,11 +BRDA:111,18,0,131 +BRDA:111,18,1,129 +BRDA:113,19,0,1 +BRDA:113,19,1,130 +BRDA:115,20,0,131 +BRDA:115,20,1,131 +BRDA:116,21,0,131 +BRDA:116,21,1,127 +BRDA:121,22,0,98 +BRDA:121,22,1,375 +BRDA:121,23,0,473 +BRDA:121,23,1,178 +BRDA:130,24,0,144 +BRDA:130,24,1,427 +BRDA:132,25,0,9 +BRDA:132,25,1,135 +BRDA:137,26,0,545 +BRDA:137,26,1,17 +BRDA:139,27,0,2 +BRDA:139,27,1,543 +BRDA:146,28,0,2 +BRDA:146,28,1,541 +BRDA:154,29,0,3 +BRDA:154,29,1,557 +BRDA:156,30,0,2 +BRDA:156,30,1,1 +BRDA:160,31,0,2 +BRDA:160,31,1,558 +BRDA:169,32,0,11 +BRDA:169,32,1,560 +BRDA:174,33,0,179 +BRDA:174,33,1,179 +BRDA:174,33,2,514 +BRDA:174,33,3,514 +BRDA:174,33,4,514 +BRDA:174,33,5,533 +BRDA:174,33,6,554 +BRDA:174,33,7,2 +BRDA:174,33,8,4 +BRDA:174,33,9,6 +BRDA:177,34,0,140 +BRDA:177,34,1,39 +BRDA:198,35,0,12 +BRDA:198,35,1,27 +BRDA:225,36,0,473 +BRDA:225,36,1,34 +BRDA:225,36,2,31 +BRDA:225,36,3,23 +BRDA:225,36,4,15 +BRDA:225,36,5,455 +BRDA:225,36,6,12 +BRDA:225,36,7,447 +BRDA:225,36,8,4 +BRDA:242,37,0,221 +BRDA:242,37,1,30 +BRDA:251,38,0,1 +BRDA:251,38,1,420 +BRDA:256,39,0,219 +BRDA:256,39,1,202 +BRDA:261,40,0,192 +BRDA:261,40,1,27 +BRDA:261,41,0,219 +BRDA:261,41,1,193 +BRDA:263,42,0,192 +BRDA:263,42,1,156 +BRDA:266,43,0,10 +BRDA:266,43,1,209 +BRDA:278,44,0,97 +BRDA:278,44,1,20 +BRDA:280,45,0,3 +BRDA:280,45,1,94 +BRDA:285,46,0,94 +BRDA:285,46,1,77 +BRDA:291,47,0,73 +BRDA:291,47,1,21 +BRDA:291,48,0,94 +BRDA:291,48,1,74 +BRDA:293,49,0,73 +BRDA:293,49,1,71 +BRDA:296,50,0,4 +BRDA:296,50,1,90 +BRDA:336,51,0,12 +BRDA:336,51,1,342 +BRDA:339,52,0,2 +BRDA:339,52,1,340 +BRDA:339,53,0,342 +BRDA:339,53,1,27 +BRDA:339,53,2,26 +BRDA:339,53,3,1 +BRDA:341,54,0,318 +BRDA:341,54,1,22 +BRDA:341,55,0,340 +BRDA:341,55,1,25 +BRDA:341,55,2,6 +BRDA:341,55,3,5 +BRDA:343,56,0,16 +BRDA:343,56,1,6 +BRDA:344,57,0,11 +BRDA:344,57,1,5 +BRDA:345,58,0,9 +BRDA:345,58,1,2 +BRDA:345,59,0,11 +BRDA:345,59,1,8 +BRDA:358,60,0,1 +BRDA:358,60,1,527 +BRDA:361,61,0,314 +BRDA:361,61,1,314 +BRDA:361,61,2,314 +BRDA:361,61,3,19 +BRDA:361,61,4,21 +BRDA:361,61,5,173 +BRDA:361,61,6,173 +BRDA:382,62,0,1 +BRDA:382,62,1,20 +BRDA:397,63,0,9 +BRDA:397,63,1,191 +BRDA:401,64,0,2 +BRDA:401,64,1,15 +BRDA:401,65,0,17 +BRDA:401,65,1,16 +BRDA:401,65,2,1 +BRDA:403,66,0,2 +BRDA:403,66,1,13 +BRDA:403,67,0,15 +BRDA:403,67,1,4 +BRDA:403,67,2,3 +BRDA:407,68,0,6 +BRDA:407,68,1,7 +BRDA:408,69,0,3 +BRDA:408,69,1,3 +BRDA:409,70,0,2 +BRDA:409,70,1,1 +BRDA:409,71,0,3 +BRDA:409,71,1,2 +BRDA:426,72,0,93 +BRDA:426,72,1,30 +BRDA:451,73,0,58 +BRDA:451,73,1,28 +BRDA:451,74,0,86 +BRDA:451,74,1,59 +BRDA:452,75,0,58 +BRDA:452,75,1,31 +BRDA:454,76,0,12 +BRDA:454,76,1,73 +BRDA:466,77,0,76 +BRDA:466,77,1,19 +BRDA:468,78,0,1 +BRDA:468,78,1,75 +BRDA:470,79,0,56 +BRDA:470,79,1,19 +BRDA:470,80,0,75 +BRDA:470,80,1,57 +BRDA:472,81,0,56 +BRDA:472,81,1,52 +BRDA:475,82,0,4 +BRDA:475,82,1,71 +BRF:194 +BRH:194 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/update.js +FN:9,(anonymous_0) +FN:27,(anonymous_1) +FN:33,(anonymous_2) +FN:35,(anonymous_3) +FNF:4 +FNH:4 +FNDA:36,(anonymous_0) +FNDA:33,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:24,(anonymous_3) +DA:5,2 +DA:6,2 +DA:9,2 +DA:10,36 +DA:12,36 +DA:13,1 +DA:15,35 +DA:16,1 +DA:18,34 +DA:19,1 +DA:21,33 +DA:23,33 +DA:24,33 +DA:27,2 +DA:28,33 +DA:30,33 +DA:31,32 +DA:33,33 +DA:34,2 +DA:35,24 +LF:20 +LH:20 +BRDA:12,0,0,1 +BRDA:12,0,1,35 +BRDA:15,1,0,1 +BRDA:15,1,1,34 +BRDA:18,2,0,1 +BRDA:18,2,1,33 +BRDA:18,3,0,34 +BRDA:18,3,1,34 +BRDA:18,3,2,34 +BRDA:30,4,0,32 +BRDA:30,4,1,1 +BRDA:33,5,0,1 +BRDA:33,5,1,32 +BRDA:34,6,0,2 +BRDA:34,6,1,1 +BRF:15 +BRH:15 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/warn-mixin.js +FN:2,(anonymous_0) +FN:3,(anonymous_1) +FNF:2 +FNH:2 +FNDA:27,(anonymous_0) +FNDA:333,(anonymous_1) +DA:2,27 +DA:4,333 +DA:5,184 +DA:6,149 +DA:7,2 +DA:9,147 +DA:10,147 +DA:11,147 +LF:8 +LH:8 +BRDA:4,0,0,184 +BRDA:4,0,1,149 +BRDA:6,1,0,2 +BRDA:6,1,1,147 +BRF:4 +BRH:4 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/winchars.js +FN:14,(anonymous_0) +FN:17,(anonymous_1) +FN:18,(anonymous_2) +FN:21,(anonymous_3) +FN:21,(anonymous_4) +FN:22,(anonymous_5) +FN:22,(anonymous_6) +FNF:7 +FNH:7 +FNDA:45,(anonymous_0) +FNDA:45,(anonymous_1) +FNDA:45,(anonymous_2) +FNDA:6,(anonymous_3) +FNDA:30,(anonymous_4) +FNDA:4,(anonymous_5) +FNDA:20,(anonymous_6) +DA:6,9 +DA:14,9 +DA:15,45 +DA:17,45 +DA:18,45 +DA:20,9 +DA:21,30 +DA:22,20 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/isaacs/dev/js/tar/lib/write-entry.js +FN:29,(anonymous_0) +FN:77,(anonymous_1) +FN:78,(anonymous_2) +FN:85,(anonymous_3) +FN:95,(anonymous_4) +FN:105,(anonymous_5) +FN:144,(anonymous_6) +FN:152,(anonymous_7) +FN:153,(anonymous_8) +FN:160,(anonymous_9) +FN:166,(anonymous_10) +FN:174,(anonymous_11) +FN:192,(anonymous_12) +FN:193,(anonymous_13) +FN:200,(anonymous_14) +FN:207,(anonymous_15) +FN:208,(anonymous_16) +FN:210,(anonymous_17) +FN:215,(anonymous_18) +FN:219,(anonymous_19) +FN:250,(anonymous_20) +FN:264,(anonymous_21) +FN:268,(anonymous_22) +FN:272,(anonymous_23) +FN:276,(anonymous_24) +FN:280,(anonymous_25) +FN:292,(anonymous_26) +FN:298,(anonymous_27) +FN:377,(anonymous_28) +FN:385,(anonymous_29) +FN:395,(anonymous_30) +FNF:31 +FNH:31 +FNDA:6570,(anonymous_0) +FNDA:34,(anonymous_1) +FNDA:34,(anonymous_2) +FNDA:6566,(anonymous_3) +FNDA:6566,(anonymous_4) +FNDA:6563,(anonymous_5) +FNDA:867,(anonymous_6) +FNDA:32,(anonymous_7) +FNDA:32,(anonymous_8) +FNDA:32,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:5664,(anonymous_11) +FNDA:5568,(anonymous_12) +FNDA:5568,(anonymous_13) +FNDA:5617,(anonymous_14) +FNDA:7336,(anonymous_15) +FNDA:7336,(anonymous_16) +FNDA:1,(anonymous_17) +FNDA:5566,(anonymous_18) +FNDA:7393,(anonymous_19) +FNDA:5565,(anonymous_20) +FNDA:99,(anonymous_21) +FNDA:20,(anonymous_22) +FNDA:2,(anonymous_23) +FNDA:53,(anonymous_24) +FNDA:59,(anonymous_25) +FNDA:51,(anonymous_26) +FNDA:33,(anonymous_27) +FNDA:52,(anonymous_28) +FNDA:29,(anonymous_29) +FNDA:6566,(anonymous_30) +DA:2,6 +DA:3,6 +DA:4,6 +DA:5,6 +DA:6,6 +DA:7,6 +DA:9,6 +DA:10,6 +DA:11,6 +DA:12,6 +DA:13,6 +DA:14,6 +DA:15,6 +DA:16,6 +DA:17,6 +DA:18,6 +DA:19,6 +DA:20,6 +DA:21,6 +DA:22,6 +DA:23,6 +DA:24,6 +DA:25,6 +DA:26,6 +DA:28,6 +DA:30,6570 +DA:31,6570 +DA:32,6570 +DA:33,1 +DA:34,6569 +DA:36,6569 +DA:38,6569 +DA:39,6569 +DA:40,6569 +DA:41,6569 +DA:42,6569 +DA:43,6569 +DA:44,6569 +DA:45,6569 +DA:46,6569 +DA:47,6569 +DA:49,6569 +DA:50,6515 +DA:52,6569 +DA:55,4 +DA:56,4 +DA:57,2 +DA:60,6567 +DA:61,6567 +DA:62,2 +DA:63,2 +DA:66,6567 +DA:68,6567 +DA:69,1 +DA:71,6567 +DA:72,6513 +DA:74,54 +DA:78,34 +DA:79,34 +DA:80,1 +DA:81,33 +DA:86,6566 +DA:87,6566 +DA:88,6566 +DA:89,902 +DA:90,6566 +DA:91,6566 +DA:92,6566 +DA:96,6566 +DA:97,5664 +DA:98,867 +DA:99,34 +DA:101,1 +DA:106,6563 +DA:107,4 +DA:109,6563 +DA:126,6563 +DA:127,17 +DA:141,6563 +DA:145,867 +DA:146,859 +DA:147,867 +DA:148,867 +DA:149,867 +DA:153,32 +DA:154,32 +DA:155,1 +DA:156,31 +DA:161,32 +DA:162,32 +DA:163,32 +DA:167,1 +DA:168,1 +DA:169,1 +DA:170,1 +DA:171,1 +DA:175,5664 +DA:176,7 +DA:177,7 +DA:178,2 +DA:179,2 +DA:180,1 +DA:182,6 +DA:185,5663 +DA:186,5663 +DA:187,42 +DA:189,5621 +DA:193,5568 +DA:194,5568 +DA:195,2 +DA:196,5566 +DA:201,5617 +DA:202,5617 +DA:203,5617 +DA:204,5617 +DA:208,7336 +DA:209,7336 +DA:210,1 +DA:211,7335 +DA:216,5566 +DA:220,7393 +DA:221,2 +DA:222,2 +DA:223,2 +DA:224,2 +DA:225,2 +DA:229,7392 +DA:230,5614 +DA:231,1700449 +DA:232,1700449 +DA:233,1700449 +DA:237,7392 +DA:239,7392 +DA:240,7392 +DA:241,7392 +DA:242,7392 +DA:244,7392 +DA:246,7392 +DA:247,5614 +DA:248,2 +DA:249,5614 +DA:250,5614 +DA:251,5614 +DA:254,1778 +DA:255,1754 +DA:256,1754 +DA:258,1778 +DA:259,1778 +DA:265,99 +DA:269,20 +DA:273,2 +DA:277,53 +DA:281,59 +DA:282,59 +DA:283,59 +DA:284,58 +DA:285,57 +DA:287,59 +DA:288,2 +DA:293,51 +DA:297,6 +DA:299,33 +DA:300,33 +DA:301,33 +DA:302,33 +DA:303,33 +DA:304,33 +DA:305,33 +DA:307,33 +DA:308,33 +DA:309,33 +DA:310,0 +DA:312,33 +DA:313,33 +DA:314,33 +DA:315,26 +DA:316,33 +DA:317,33 +DA:318,33 +DA:319,33 +DA:320,33 +DA:321,33 +DA:322,33 +DA:323,33 +DA:324,33 +DA:326,33 +DA:327,27 +DA:329,33 +DA:330,2 +DA:331,2 +DA:335,1 +DA:338,32 +DA:339,32 +DA:341,32 +DA:357,32 +DA:358,14 +DA:373,32 +DA:374,32 +DA:378,52 +DA:379,52 +DA:380,1 +DA:381,51 +DA:382,51 +DA:386,29 +DA:387,22 +DA:388,29 +DA:392,6 +DA:393,6 +DA:395,6 +DA:396,6566 +DA:401,6 +LF:211 +LH:210 +BRDA:30,0,0,6570 +BRDA:30,0,1,2 +BRDA:32,1,0,1 +BRDA:32,1,1,6569 +BRDA:38,2,0,6569 +BRDA:38,2,1,6569 +BRDA:39,3,0,6569 +BRDA:39,3,1,37 +BRDA:40,4,0,6569 +BRDA:40,4,1,6563 +BRDA:41,5,0,6569 +BRDA:41,5,1,53 +BRDA:42,6,0,6569 +BRDA:42,6,1,55 +BRDA:44,7,0,6569 +BRDA:44,7,1,4 +BRDA:49,8,0,6515 +BRDA:49,8,1,54 +BRDA:52,9,0,4 +BRDA:52,9,1,6565 +BRDA:52,10,0,6569 +BRDA:52,10,1,6564 +BRDA:60,11,0,6567 +BRDA:60,11,1,6565 +BRDA:61,12,0,2 +BRDA:61,12,1,6565 +BRDA:66,13,0,6567 +BRDA:66,13,1,54 +BRDA:68,14,0,1 +BRDA:68,14,1,6566 +BRDA:71,15,0,6513 +BRDA:71,15,1,54 +BRDA:79,16,0,1 +BRDA:79,16,1,33 +BRDA:88,17,0,902 +BRDA:88,17,1,5664 +BRDA:96,18,0,5664 +BRDA:96,18,1,867 +BRDA:96,18,2,34 +BRDA:96,18,3,1 +BRDA:106,19,0,4 +BRDA:106,19,1,6559 +BRDA:106,20,0,6563 +BRDA:106,20,1,867 +BRDA:115,21,0,10 +BRDA:115,21,1,6553 +BRDA:116,22,0,10 +BRDA:116,22,1,6553 +BRDA:118,23,0,6 +BRDA:118,23,1,6557 +BRDA:120,24,0,10 +BRDA:120,24,1,6553 +BRDA:121,25,0,6552 +BRDA:121,25,1,1 +BRDA:122,26,0,10 +BRDA:122,26,1,6553 +BRDA:123,27,0,10 +BRDA:123,27,1,6553 +BRDA:126,28,0,17 +BRDA:126,28,1,6546 +BRDA:126,29,0,6563 +BRDA:126,29,1,18 +BRDA:128,30,0,4 +BRDA:128,30,1,13 +BRDA:129,31,0,4 +BRDA:129,31,1,13 +BRDA:130,32,0,4 +BRDA:130,32,1,13 +BRDA:131,33,0,2 +BRDA:131,33,1,15 +BRDA:135,34,0,4 +BRDA:135,34,1,13 +BRDA:136,35,0,4 +BRDA:136,35,1,13 +BRDA:137,36,0,4 +BRDA:137,36,1,13 +BRDA:138,37,0,4 +BRDA:138,37,1,13 +BRDA:139,38,0,4 +BRDA:139,38,1,13 +BRDA:145,39,0,859 +BRDA:145,39,1,8 +BRDA:154,40,0,1 +BRDA:154,40,1,31 +BRDA:175,41,0,7 +BRDA:175,41,1,5657 +BRDA:177,42,0,2 +BRDA:177,42,1,5 +BRDA:179,43,0,1 +BRDA:179,43,1,1 +BRDA:186,44,0,42 +BRDA:186,44,1,5621 +BRDA:194,45,0,2 +BRDA:194,45,1,5566 +BRDA:209,46,0,1 +BRDA:209,46,1,7335 +BRDA:220,47,0,2 +BRDA:220,47,1,7391 +BRDA:220,48,0,7393 +BRDA:220,48,1,2 +BRDA:229,49,0,5614 +BRDA:229,49,1,1778 +BRDA:230,50,0,1706063 +BRDA:230,50,1,1700456 +BRDA:237,51,0,7338 +BRDA:237,51,1,54 +BRDA:237,52,0,7392 +BRDA:237,52,1,7369 +BRDA:246,53,0,5614 +BRDA:246,53,1,1778 +BRDA:247,54,0,2 +BRDA:247,54,1,5612 +BRDA:254,55,0,1754 +BRDA:254,55,1,24 +BRDA:287,56,0,2 +BRDA:287,56,1,57 +BRDA:299,57,0,33 +BRDA:299,57,1,4 +BRDA:309,58,0,0 +BRDA:309,58,1,33 +BRDA:309,59,0,33 +BRDA:309,59,1,2 +BRDA:314,60,0,26 +BRDA:314,60,1,7 +BRDA:316,61,0,1 +BRDA:316,61,1,32 +BRDA:317,62,0,1 +BRDA:317,62,1,32 +BRDA:318,63,0,1 +BRDA:318,63,1,32 +BRDA:319,64,0,1 +BRDA:319,64,1,32 +BRDA:321,65,0,0 +BRDA:321,65,1,33 +BRDA:322,66,0,1 +BRDA:322,66,1,32 +BRDA:323,67,0,1 +BRDA:323,67,1,32 +BRDA:326,68,0,27 +BRDA:326,68,1,6 +BRDA:329,69,0,2 +BRDA:329,69,1,31 +BRDA:329,70,0,33 +BRDA:329,70,1,3 +BRDA:347,71,0,1 +BRDA:347,71,1,31 +BRDA:348,72,0,1 +BRDA:348,72,1,31 +BRDA:350,73,0,0 +BRDA:350,73,1,32 +BRDA:352,74,0,1 +BRDA:352,74,1,31 +BRDA:353,75,0,1 +BRDA:353,75,1,31 +BRDA:354,76,0,1 +BRDA:354,76,1,31 +BRDA:357,77,0,14 +BRDA:357,77,1,18 +BRDA:357,78,0,32 +BRDA:357,78,1,14 +BRDA:359,79,0,1 +BRDA:359,79,1,13 +BRDA:360,80,0,1 +BRDA:360,80,1,13 +BRDA:361,81,0,1 +BRDA:361,81,1,13 +BRDA:362,82,0,0 +BRDA:362,82,1,14 +BRDA:366,83,0,1 +BRDA:366,83,1,13 +BRDA:367,84,0,1 +BRDA:367,84,1,13 +BRDA:368,85,0,1 +BRDA:368,85,1,13 +BRDA:369,86,0,1 +BRDA:369,86,1,13 +BRDA:370,87,0,1 +BRDA:370,87,1,13 +BRDA:379,88,0,1 +BRDA:379,88,1,51 +BRDA:386,89,0,22 +BRDA:386,89,1,7 +BRDA:396,90,0,5664 +BRDA:396,90,1,902 +BRDA:397,91,0,867 +BRDA:397,91,1,35 +BRDA:398,92,0,34 +BRDA:398,92,1,1 +BRF:188 +BRH:184 +end_of_record diff --git a/node_modules/tar/examples/extracter.js b/node_modules/tar/examples/extracter.js new file mode 100644 index 00000000..f6253a72 --- /dev/null +++ b/node_modules/tar/examples/extracter.js @@ -0,0 +1,19 @@ +var tar = require("../tar.js") + , fs = require("fs") + + +function onError(err) { + console.error('An error occurred:', err) +} + +function onEnd() { + console.log('Extracted!') +} + +var extractor = tar.Extract({path: __dirname + "/extract"}) + .on('error', onError) + .on('end', onEnd); + +fs.createReadStream(__dirname + "/../test/fixtures/c.tar") + .on('error', onError) + .pipe(extractor); diff --git a/node_modules/tar/examples/packer.js b/node_modules/tar/examples/packer.js new file mode 100644 index 00000000..039969ce --- /dev/null +++ b/node_modules/tar/examples/packer.js @@ -0,0 +1,24 @@ +var tar = require("../tar.js") + , fstream = require("fstream") + , fs = require("fs") + +var dirDest = fs.createWriteStream('dir.tar') + + +function onError(err) { + console.error('An error occurred:', err) +} + +function onEnd() { + console.log('Packed!') +} + +var packer = tar.Pack({ noProprietary: true }) + .on('error', onError) + .on('end', onEnd); + +// This must be a "directory" +fstream.Reader({ path: __dirname, type: "Directory" }) + .on('error', onError) + .pipe(packer) + .pipe(dirDest) diff --git a/node_modules/tar/examples/reader.js b/node_modules/tar/examples/reader.js new file mode 100644 index 00000000..39f3f088 --- /dev/null +++ b/node_modules/tar/examples/reader.js @@ -0,0 +1,36 @@ +var tar = require("../tar.js") + , fs = require("fs") + +fs.createReadStream(__dirname + "/../test/fixtures/c.tar") + .pipe(tar.Parse()) + .on("extendedHeader", function (e) { + console.error("extended pax header", e.props) + e.on("end", function () { + console.error("extended pax fields:", e.fields) + }) + }) + .on("ignoredEntry", function (e) { + console.error("ignoredEntry?!?", e.props) + }) + .on("longLinkpath", function (e) { + console.error("longLinkpath entry", e.props) + e.on("end", function () { + console.error("value=%j", e.body.toString()) + }) + }) + .on("longPath", function (e) { + console.error("longPath entry", e.props) + e.on("end", function () { + console.error("value=%j", e.body.toString()) + }) + }) + .on("entry", function (e) { + console.error("entry", e.props) + e.on("data", function (c) { + console.error(" >>>" + c.toString().replace(/\n/g, "\\n")) + }) + e.on("end", function () { + console.error(" << (http://blog.izs.me/)", + "name": "tar", + "description": "tar for node", + "version": "2.2.2", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-tar.git" + }, + "main": "tar.js", + "scripts": { + "test": "tap test/*.js" + }, + "dependencies": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + }, + "devDependencies": { + "graceful-fs": "^4.1.2", + "rimraf": "1.x", + "tap": "0.x", + "mkdirp": "^0.5.0" + }, + "license": "ISC" +} diff --git a/node_modules/tar/tar.js b/node_modules/tar/tar.js new file mode 100644 index 00000000..a81298b9 --- /dev/null +++ b/node_modules/tar/tar.js @@ -0,0 +1,173 @@ +// field paths that every tar file must have. +// header is padded to 512 bytes. +var f = 0 + , fields = {} + , path = fields.path = f++ + , mode = fields.mode = f++ + , uid = fields.uid = f++ + , gid = fields.gid = f++ + , size = fields.size = f++ + , mtime = fields.mtime = f++ + , cksum = fields.cksum = f++ + , type = fields.type = f++ + , linkpath = fields.linkpath = f++ + , headerSize = 512 + , blockSize = 512 + , fieldSize = [] + +fieldSize[path] = 100 +fieldSize[mode] = 8 +fieldSize[uid] = 8 +fieldSize[gid] = 8 +fieldSize[size] = 12 +fieldSize[mtime] = 12 +fieldSize[cksum] = 8 +fieldSize[type] = 1 +fieldSize[linkpath] = 100 + +// "ustar\0" may introduce another bunch of headers. +// these are optional, and will be nulled out if not present. + +var ustar = fields.ustar = f++ + , ustarver = fields.ustarver = f++ + , uname = fields.uname = f++ + , gname = fields.gname = f++ + , devmaj = fields.devmaj = f++ + , devmin = fields.devmin = f++ + , prefix = fields.prefix = f++ + , fill = fields.fill = f++ + +// terminate fields. +fields[f] = null + +fieldSize[ustar] = 6 +fieldSize[ustarver] = 2 +fieldSize[uname] = 32 +fieldSize[gname] = 32 +fieldSize[devmaj] = 8 +fieldSize[devmin] = 8 +fieldSize[prefix] = 155 +fieldSize[fill] = 12 + +// nb: prefix field may in fact be 130 bytes of prefix, +// a null char, 12 bytes for atime, 12 bytes for ctime. +// +// To recognize this format: +// 1. prefix[130] === ' ' or '\0' +// 2. atime and ctime are octal numeric values +// 3. atime and ctime have ' ' in their last byte + +var fieldEnds = {} + , fieldOffs = {} + , fe = 0 +for (var i = 0; i < f; i ++) { + fieldOffs[i] = fe + fieldEnds[i] = (fe += fieldSize[i]) +} + +// build a translation table of field paths. +Object.keys(fields).forEach(function (f) { + if (fields[f] !== null) fields[fields[f]] = f +}) + +// different values of the 'type' field +// paths match the values of Stats.isX() functions, where appropriate +var types = + { 0: "File" + , "\0": "OldFile" // like 0 + , "": "OldFile" + , 1: "Link" + , 2: "SymbolicLink" + , 3: "CharacterDevice" + , 4: "BlockDevice" + , 5: "Directory" + , 6: "FIFO" + , 7: "ContiguousFile" // like 0 + // posix headers + , g: "GlobalExtendedHeader" // k=v for the rest of the archive + , x: "ExtendedHeader" // k=v for the next file + // vendor-specific stuff + , A: "SolarisACL" // skip + , D: "GNUDumpDir" // like 5, but with data, which should be skipped + , I: "Inode" // metadata only, skip + , K: "NextFileHasLongLinkpath" // data = link path of next file + , L: "NextFileHasLongPath" // data = path of next file + , M: "ContinuationFile" // skip + , N: "OldGnuLongPath" // like L + , S: "SparseFile" // skip + , V: "TapeVolumeHeader" // skip + , X: "OldExtendedHeader" // like x + } + +Object.keys(types).forEach(function (t) { + types[types[t]] = types[types[t]] || t +}) + +// values for the mode field +var modes = + { suid: 04000 // set uid on extraction + , sgid: 02000 // set gid on extraction + , svtx: 01000 // set restricted deletion flag on dirs on extraction + , uread: 0400 + , uwrite: 0200 + , uexec: 0100 + , gread: 040 + , gwrite: 020 + , gexec: 010 + , oread: 4 + , owrite: 2 + , oexec: 1 + , all: 07777 + } + +var numeric = + { mode: true + , uid: true + , gid: true + , size: true + , mtime: true + , devmaj: true + , devmin: true + , cksum: true + , atime: true + , ctime: true + , dev: true + , ino: true + , nlink: true + } + +Object.keys(modes).forEach(function (t) { + modes[modes[t]] = modes[modes[t]] || t +}) + +var knownExtended = + { atime: true + , charset: true + , comment: true + , ctime: true + , gid: true + , gname: true + , linkpath: true + , mtime: true + , path: true + , realtime: true + , security: true + , size: true + , uid: true + , uname: true } + + +exports.fields = fields +exports.fieldSize = fieldSize +exports.fieldOffs = fieldOffs +exports.fieldEnds = fieldEnds +exports.types = types +exports.modes = modes +exports.numeric = numeric +exports.headerSize = headerSize +exports.blockSize = blockSize +exports.knownExtended = knownExtended + +exports.Pack = require("./lib/pack.js") +exports.Parse = require("./lib/parse.js") +exports.Extract = require("./lib/extract.js") diff --git a/node_modules/tar/test/00-setup-fixtures.js b/node_modules/tar/test/00-setup-fixtures.js new file mode 100644 index 00000000..1524ff7a --- /dev/null +++ b/node_modules/tar/test/00-setup-fixtures.js @@ -0,0 +1,53 @@ +// the fixtures have some weird stuff that is painful +// to include directly in the repo for various reasons. +// +// So, unpack the fixtures with the system tar first. +// +// This means, of course, that it'll only work if you +// already have a tar implementation, and some of them +// will not properly unpack the fixtures anyway. +// +// But, since usually those tests will fail on Windows +// and other systems with less capable filesystems anyway, +// at least this way we don't cause inconveniences by +// merely cloning the repo or installing the package. + +var tap = require("tap") +, child_process = require("child_process") +, rimraf = require("rimraf") +, test = tap.test +, path = require("path") + +test("clean fixtures", function (t) { + rimraf(path.resolve(__dirname, "fixtures"), function (er) { + t.ifError(er, "rimraf ./fixtures/") + t.end() + }) +}) + +test("clean tmp", function (t) { + rimraf(path.resolve(__dirname, "tmp"), function (er) { + t.ifError(er, "rimraf ./tmp/") + t.end() + }) +}) + +test("extract fixtures", function (t) { + var c = child_process.spawn("tar" + ,["xzvf", "fixtures.tgz"] + ,{ cwd: __dirname }) + + c.stdout.on("data", errwrite) + c.stderr.on("data", errwrite) + function errwrite (chunk) { + process.stderr.write(chunk) + } + + c.on("exit", function (code) { + t.equal(code, 0, "extract fixtures should exit with 0") + if (code) { + t.comment("Note, all tests from here on out will fail because of this.") + } + t.end() + }) +}) diff --git a/node_modules/tar/test/cb-never-called-1.0.1.tgz b/node_modules/tar/test/cb-never-called-1.0.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9e7014d85abe48a54cb6b4e1ec032df9a2073034 GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/node_modules/tar/test/dir-normalization.js b/node_modules/tar/test/dir-normalization.js new file mode 100644 index 00000000..9719c42f --- /dev/null +++ b/node_modules/tar/test/dir-normalization.js @@ -0,0 +1,177 @@ +// Set the umask, so that it works the same everywhere. +process.umask(parseInt('22', 8)) + +var fs = require('fs') +var path = require('path') + +var fstream = require('fstream') +var test = require('tap').test + +var tar = require('../tar.js') +var file = path.resolve(__dirname, 'dir-normalization.tar') +var target = path.resolve(__dirname, 'tmp/dir-normalization-test') +var ee = 0 + +var expectEntries = [ + { path: 'fixtures/', + mode: '755', + type: '5', + linkpath: '' + }, + { path: 'fixtures/a/', + mode: '755', + type: '5', + linkpath: '' + }, + { path: 'fixtures/the-chumbler', + mode: '755', + type: '2', + linkpath: path.resolve(target, 'a/b/c/d/the-chumbler'), + }, + { path: 'fixtures/a/b/', + mode: '755', + type: '5', + linkpath: '' + }, + { path: 'fixtures/a/x', + mode: '644', + type: '0', + linkpath: '' + }, + { path: 'fixtures/a/b/c/', + mode: '755', + type: '5', + linkpath: '' + }, + { path: 'fixtures/a/b/c/y', + mode: '755', + type: '2', + linkpath: '../../x', + } +] + +var ef = 0 +var expectFiles = [ + { path: '', + mode: '40755', + type: 'Directory', + depth: 0, + linkpath: undefined + }, + { path: '/fixtures', + mode: '40755', + type: 'Directory', + depth: 1, + linkpath: undefined + }, + { path: '/fixtures/a', + mode: '40755', + type: 'Directory', + depth: 2, + linkpath: undefined + }, + { path: '/fixtures/a/b', + mode: '40755', + type: 'Directory', + depth: 3, + linkpath: undefined + }, + { path: '/fixtures/a/b/c', + mode: '40755', + type: 'Directory', + depth: 4, + linkpath: undefined + }, + { path: '/fixtures/a/b/c/y', + mode: '120755', + type: 'SymbolicLink', + depth: 5, + linkpath: '../../x' + }, + { path: '/fixtures/a/x', + mode: '100644', + type: 'File', + depth: 3, + linkpath: undefined + }, + { path: '/fixtures/the-chumbler', + mode: '120755', + type: 'SymbolicLink', + depth: 2, + linkpath: path.resolve(target, 'a/b/c/d/the-chumbler') + } +] + +test('preclean', function (t) { + require('rimraf').sync(path.join(__dirname, '/tmp/dir-normalization-test')) + t.pass('cleaned!') + t.end() +}) + +test('extract test', function (t) { + var extract = tar.Extract(target) + var inp = fs.createReadStream(file) + + inp.pipe(extract) + + extract.on('end', function () { + t.equal(ee, expectEntries.length, 'should see ' + expectEntries.length + ' entries') + + // should get no more entries after end + extract.removeAllListeners('entry') + extract.on('entry', function (e) { + t.fail('Should not get entries after end!') + }) + + next() + }) + + extract.on('entry', function (entry) { + var mode = entry.props.mode & (~parseInt('22', 8)) + var found = { + path: entry.path, + mode: mode.toString(8), + type: entry.props.type, + linkpath: entry.props.linkpath, + } + + var wanted = expectEntries[ee++] + t.equivalent(found, wanted, 'tar entry ' + ee + ' ' + (wanted && wanted.path)) + }) + + function next () { + var r = fstream.Reader({ + path: target, + type: 'Directory', + sort: 'alpha' + }) + + r.on('ready', function () { + foundEntry(r) + }) + + r.on('end', finish) + + function foundEntry (entry) { + var p = entry.path.substr(target.length) + var mode = entry.props.mode & (~parseInt('22', 8)) + var found = { + path: p, + mode: mode.toString(8), + type: entry.props.type, + depth: entry.props.depth, + linkpath: entry.props.linkpath + } + + var wanted = expectFiles[ef++] + t.equivalent(found, wanted, 'unpacked file ' + ef + ' ' + (wanted && wanted.path)) + + entry.on('entry', foundEntry) + } + + function finish () { + t.equal(ef, expectFiles.length, 'should have ' + ef + ' items') + t.end() + } + } +}) diff --git a/node_modules/tar/test/dir-normalization.tar b/node_modules/tar/test/dir-normalization.tar new file mode 100644 index 0000000000000000000000000000000000000000..3c4845356cecb20939b415830a5fa9717fb91341 GIT binary patch literal 4608 zcmeHJS&qUm4DC^J0f_Cy&3Qtn6-dKR7m2w&PN6j7t4Me>Xkt~0n?~MVp55+r8K=G- zY^5gv5SUE`972tqikXFmnFvea&It?*4!@B>h$+50` z-pt$IGqpQZU1J+8}SF0 zCIB7{5IUmDkd5|W8~bGygDd>M_5W1rH{-sT+lc?%|G~}t525gXDWB^4;D59iEk}ZX z?bE#9F#qrUKRCf3v;xZQ7XGjNZ*)4qOZ=A~MLp$ne2HwSHsX(c~XH?({YrM8z literal 0 HcmV?d00001 diff --git a/node_modules/tar/test/error-on-broken.js b/node_modules/tar/test/error-on-broken.js new file mode 100644 index 00000000..e484920f --- /dev/null +++ b/node_modules/tar/test/error-on-broken.js @@ -0,0 +1,33 @@ +var fs = require('fs') +var path = require('path') +var zlib = require('zlib') + +var tap = require('tap') + +var tar = require('../tar.js') + +var file = path.join(__dirname, 'cb-never-called-1.0.1.tgz') +var target = path.join(__dirname, 'tmp/extract-test') + +tap.test('preclean', function (t) { + require('rimraf').sync(__dirname + '/tmp/extract-test') + t.pass('cleaned!') + t.end() +}) + +tap.test('extract test', function (t) { + var extract = tar.Extract(target) + var inp = fs.createReadStream(file) + + inp.pipe(zlib.createGunzip()).pipe(extract) + + extract.on('error', function (er) { + t.equal(er.message, 'unexpected eof', 'error noticed') + t.end() + }) + + extract.on('end', function () { + t.fail('shouldn\'t reach this point due to errors') + t.end() + }) +}) diff --git a/node_modules/tar/test/extract-move.js b/node_modules/tar/test/extract-move.js new file mode 100644 index 00000000..45400cd9 --- /dev/null +++ b/node_modules/tar/test/extract-move.js @@ -0,0 +1,132 @@ +// Set the umask, so that it works the same everywhere. +process.umask(parseInt('22', 8)) + +var tap = require("tap") + , tar = require("../tar.js") + , fs = require("fs") + , gfs = require("graceful-fs") + , path = require("path") + , file = path.resolve(__dirname, "fixtures/dir.tar") + , target = path.resolve(__dirname, "tmp/extract-test") + , index = 0 + , fstream = require("fstream") + , rimraf = require("rimraf") + , mkdirp = require("mkdirp") + + , ee = 0 + , expectEntries = [ + { + "path" : "dir/", + "mode" : "750", + "type" : "5", + "depth" : undefined, + "size" : 0, + "linkpath" : "", + "nlink" : undefined, + "dev" : undefined, + "ino" : undefined + }, + { + "path" : "dir/sub/", + "mode" : "750", + "type" : "5", + "depth" : undefined, + "size" : 0, + "linkpath" : "", + "nlink" : undefined, + "dev" : undefined, + "ino" : undefined + } ] + +function slow (fs, method, t1, t2) { + var orig = fs[method] + if (!orig) return null + fs[method] = function () { + var args = [].slice.call(arguments) + console.error("slow", method, args[0]) + var cb = args.pop() + + setTimeout(function () { + orig.apply(fs, args.concat(function(er, data) { + setTimeout(function() { + cb(er, data) + }, t2) + })) + }, t1) + } +} + +// Make sure we get the graceful-fs that fstream is using. +var gfs2 +try { + gfs2 = require("fstream/node_modules/graceful-fs") +} catch (er) {} + +var slowMethods = ["chown", "chmod", "utimes", "lutimes"] +slowMethods.forEach(function (method) { + var t1 = 500 + var t2 = 0 + slow(fs, method, t1, t2) + slow(gfs, method, t1, t2) + if (gfs2) { + slow(gfs2, method, t1, t2) + } +}) + + + +// The extract class basically just pipes the input +// to a Reader, and then to a fstream.DirWriter + +// So, this is as much a test of fstream.Reader and fstream.Writer +// as it is of tar.Extract, but it sort of makes sense. + +tap.test("preclean", function (t) { + rimraf.sync(target) + /mkdirp.sync(target) + t.pass("cleaned!") + t.end() +}) + +tap.test("extract test", function (t) { + var extract = tar.Extract(target) + var inp = fs.createReadStream(file) + + // give it a weird buffer size to try to break in odd places + inp.bufferSize = 1234 + + inp.pipe(extract) + + extract.on("end", function () { + rimraf.sync(target) + + t.equal(ee, expectEntries.length, "should see "+ee+" entries") + + // should get no more entries after end + extract.removeAllListeners("entry") + extract.on("entry", function (e) { + t.fail("Should not get entries after end!") + }) + + t.end() + }) + + + extract.on("entry", function (entry) { + var found = + { path: entry.path + , mode: entry.props.mode.toString(8) + , type: entry.props.type + , depth: entry.props.depth + , size: entry.props.size + , linkpath: entry.props.linkpath + , nlink: entry.props.nlink + , dev: entry.props.dev + , ino: entry.props.ino + } + + var wanted = expectEntries[ee ++] + + t.equivalent(found, wanted, "tar entry " + ee + " " + wanted.path) + }) +}) diff --git a/node_modules/tar/test/extract.js b/node_modules/tar/test/extract.js new file mode 100644 index 00000000..eca4e7cc --- /dev/null +++ b/node_modules/tar/test/extract.js @@ -0,0 +1,367 @@ +// Set the umask, so that it works the same everywhere. +process.umask(parseInt('22', 8)) + +var tap = require("tap") + , tar = require("../tar.js") + , fs = require("fs") + , path = require("path") + , file = path.resolve(__dirname, "fixtures/c.tar") + , target = path.resolve(__dirname, "tmp/extract-test") + , index = 0 + , fstream = require("fstream") + + , ee = 0 + , expectEntries = +[ { path: 'c.txt', + mode: '644', + type: '0', + depth: undefined, + size: 513, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'cc.txt', + mode: '644', + type: '0', + depth: undefined, + size: 513, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '0', + depth: undefined, + size: 100, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'Ω.txt', + mode: '644', + type: '0', + depth: undefined, + size: 2, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'Ω.txt', + mode: '644', + type: '0', + depth: undefined, + size: 2, + linkpath: '', + nlink: 1, + dev: 234881026, + ino: 51693379 }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '0', + depth: undefined, + size: 200, + linkpath: '', + nlink: 1, + dev: 234881026, + ino: 51681874 }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '0', + depth: undefined, + size: 201, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', + mode: '777', + type: '2', + depth: undefined, + size: 0, + linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: '200-hard', + mode: '644', + type: '0', + depth: undefined, + size: 200, + linkpath: '', + nlink: 2, + dev: 234881026, + ino: 51681874 }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '1', + depth: undefined, + size: 0, + linkpath: path.resolve(target, '200-hard'), + nlink: 2, + dev: 234881026, + ino: 51681874 } ] + + , ef = 0 + , expectFiles = +[ { path: '', + mode: '40755', + type: 'Directory', + depth: 0, + linkpath: undefined }, + { path: '/200-hard', + mode: '100644', + type: 'File', + depth: 1, + size: 200, + linkpath: undefined, + nlink: 2 }, + { path: '/200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', + mode: '120777', + type: 'SymbolicLink', + depth: 1, + size: 200, + linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + nlink: 1 }, + { path: '/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '100644', + type: 'Link', + depth: 1, + size: 200, + linkpath: path.join(target, '200-hard'), + nlink: 2 }, + { path: '/c.txt', + mode: '100644', + type: 'File', + depth: 1, + size: 513, + linkpath: undefined, + nlink: 1 }, + { path: '/cc.txt', + mode: '100644', + type: 'File', + depth: 1, + size: 513, + linkpath: undefined, + nlink: 1 }, + { path: '/r', + mode: '40755', + type: 'Directory', + depth: 1, + linkpath: undefined }, + { path: '/r/e', + mode: '40755', + type: 'Directory', + depth: 2, + linkpath: undefined }, + { path: '/r/e/a', + mode: '40755', + type: 'Directory', + depth: 3, + linkpath: undefined }, + { path: '/r/e/a/l', + mode: '40755', + type: 'Directory', + depth: 4, + linkpath: undefined }, + { path: '/r/e/a/l/l', + mode: '40755', + type: 'Directory', + depth: 5, + linkpath: undefined }, + { path: '/r/e/a/l/l/y', + mode: '40755', + type: 'Directory', + depth: 6, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-', + mode: '40755', + type: 'Directory', + depth: 7, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d', + mode: '40755', + type: 'Directory', + depth: 8, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e', + mode: '40755', + type: 'Directory', + depth: 9, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e', + mode: '40755', + type: 'Directory', + depth: 10, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p', + mode: '40755', + type: 'Directory', + depth: 11, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-', + mode: '40755', + type: 'Directory', + depth: 12, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f', + mode: '40755', + type: 'Directory', + depth: 13, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o', + mode: '40755', + type: 'Directory', + depth: 14, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l', + mode: '40755', + type: 'Directory', + depth: 15, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d', + mode: '40755', + type: 'Directory', + depth: 16, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e', + mode: '40755', + type: 'Directory', + depth: 17, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r', + mode: '40755', + type: 'Directory', + depth: 18, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-', + mode: '40755', + type: 'Directory', + depth: 19, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p', + mode: '40755', + type: 'Directory', + depth: 20, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a', + mode: '40755', + type: 'Directory', + depth: 21, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t', + mode: '40755', + type: 'Directory', + depth: 22, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h', + mode: '40755', + type: 'Directory', + depth: 23, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '100644', + type: 'File', + depth: 24, + size: 100, + linkpath: undefined, + nlink: 1 }, + { path: '/Ω.txt', + mode: '100644', + type: 'File', + depth: 1, + size: 2, + linkpath: undefined, + nlink: 1 } ] + + + +// The extract class basically just pipes the input +// to a Reader, and then to a fstream.DirWriter + +// So, this is as much a test of fstream.Reader and fstream.Writer +// as it is of tar.Extract, but it sort of makes sense. + +tap.test("preclean", function (t) { + require("rimraf").sync(__dirname + "/tmp/extract-test") + t.pass("cleaned!") + t.end() +}) + +tap.test("extract test", function (t) { + var extract = tar.Extract(target) + var inp = fs.createReadStream(file) + + // give it a weird buffer size to try to break in odd places + inp.bufferSize = 1234 + + inp.pipe(extract) + + extract.on("end", function () { + t.equal(ee, expectEntries.length, "should see "+ee+" entries") + + // should get no more entries after end + extract.removeAllListeners("entry") + extract.on("entry", function (e) { + t.fail("Should not get entries after end!") + }) + + next() + }) + + extract.on("entry", function (entry) { + var found = + { path: entry.path + , mode: entry.props.mode.toString(8) + , type: entry.props.type + , depth: entry.props.depth + , size: entry.props.size + , linkpath: entry.props.linkpath + , nlink: entry.props.nlink + , dev: entry.props.dev + , ino: entry.props.ino + } + + var wanted = expectEntries[ee ++] + + t.equivalent(found, wanted, "tar entry " + ee + " " + wanted.path) + }) + + function next () { + var r = fstream.Reader({ path: target + , type: "Directory" + // this is just to encourage consistency + , sort: "alpha" }) + + r.on("ready", function () { + foundEntry(r) + }) + + r.on("end", finish) + + function foundEntry (entry) { + var p = entry.path.substr(target.length) + var found = + { path: p + , mode: entry.props.mode.toString(8) + , type: entry.props.type + , depth: entry.props.depth + , size: entry.props.size + , linkpath: entry.props.linkpath + , nlink: entry.props.nlink + } + + var wanted = expectFiles[ef ++] + + t.has(found, wanted, "unpacked file " + ef + " " + wanted.path) + + entry.on("entry", foundEntry) + } + + function finish () { + t.equal(ef, expectFiles.length, "should have "+ef+" items") + t.end() + } + } +}) diff --git a/node_modules/tar/test/fixtures.tgz b/node_modules/tar/test/fixtures.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f1676023afa2bba2aa18b5508c92f03e1d0816c6 GIT binary patch literal 19352 zcmdS9Wm8?>6E%oKa0>)?hoHgXLLj)iOK^9Wixb@4-2;JO!GpWILvVM$XZZb}7gIGe zUtnIH+O<#h+1^?)mpt7>+4-uRLlz3qxI~Dff#Gk#6 z`g-rTn_<`NkGgSqh`9%iyIO+RJMIEk@Q^cjEPzS$QFJLbkvahQFp1Gi?M1xtX z_d_3jPIjl>+%+o^H;key?OVfX3E8v2FgIk&q5@J)^5h?H8?w4%1l*k;@LW8A*KOPe z2m})_YIt^yV27?Sb9o}&8YLHw}wmBaI#s5;w$~1gL}Yl8$kSfR+T&Wf?T=;vdl4$nrcnE0Smw^kG$rI+igCu zLr{XYa&G{kKrnW&uV)Zm056SzBh^q4DFok3neK>2dnOF*v9)P(VIXSxruX3R_(6<} zOZDyM+Urp`x)%;WHfqw~UlV|((9x}_0fV6Gd7)s-8b8Iyj6dV=FE|k7SbKGn(HT^^ z)#XFd>jGa=?AGFLS4E*@QNW1Z$Q|ykv(g=BFX*Wsx?zg(0`LaBgj=IE_Wi($#wNW= zsOzqY_94)b9n`KM(7@!i*G@qTGS7a5nPO`&8Hxx?HJ_Gs!6KRIcU9CIXw9oVS zaHGn2ODfpk4(T4xmN)?#5wf70ksW$_I+pa)A=&N+ErhZ;zaOTE3v1zIS}$30$99_@ zb#iRJNa!r%r72#Uo2unZQ3}G@roGZvMz_6UPggT$oZ&9C#MNJTEnx0o>7^3(ga*-0 z&|(RQ5v%!l@f?}!_P4aUe|2XDn?Mi3*r3P46Qlh9V>}CRA zNt_D6UCg|6b#Tv={{aM$OtzmQ$i&Yf7iIx&i#I_l@h5^OhV5nYfI{AjKXEfz1ce5@z7!Ei78)mBhq_n%2+n=ux$t?fCf*hcr8^+}NV~}t0I|P;l~Dfy z!P1AX08Kyxu($y+Y>8+@)w&bh(9{}u_Nj(4Ujc>yYM_@la&?%B6_turyY$u2@C7Ki z>{{J++UgDrJ_)=BW)`g6JJY#8KLD>o53tw3D;snh2o7LH?m=^eY+@U^sAij6@eoCg zkH_?3)Vt4Z*h_A7gvEms*^r9@fY@H{SLyQhOQ~PLr_8c^m+W6 zlrdDj_DAr1kbw4f7X2lu)tdOTJ+eBX@l1;u?E88w$R9$A)^86lIoi1RR&Q1rArGd{eH6$HSpvF zphwMqYsS@TeAefy_J-C#%>?2!(}CsK(bvhQe_#uM6`q@?pN%Z91eOzx%h4)7d56K} z)Y>XP9eIg+MkFab6~VjxnM+BoY1%4Zx=r3HKSCDP%_@HsDh**J8G*6><~JvS-j5}W zzN>y}rrh9r%-$m-a*1~eCCjaY{4WI0Chrb*X9B!|^Ez45U3nMx9@%|hqVgKF`s-r!h3v08+ywa|;0oDPc?XrN()H-=WDK=y zYaai@>}TjqOax|hLM@tiXH#C5pD3I`W*?@g?R}KHX+&_+UXGkWX;7aZlAJxXSl*cx zS*GW$`UZnO^uK)BKz6l^dSx}sl1Qpa^#+1uSF~LmnY(|A(wN?|1xcWw5zz3P!XGbX!q*-V*b{#S=Ws@+bDjMqk5mR zjb|;MQs=`KY3kmnTUYzAgWsv)(G8PGVimd8_qS2d+csIGooYB7qs$E z8qKum8fe9z76`L9-#PvjK?QY-b|}l)`zd|C4?)Yy-$!6Y;d`A+A@xA{o}Vktxsgwy zoqqc4KkmMe6m5e2jhguA|+(eH*iS?hzyIMn+ z*2>F;9VRY<+KhECR6w;$kdWCzOCC^eK?4a7Uxwsj*i2qfYtIB9Ji+y%+tD{y;QP1e z`|!*1-wv?f5AXS?iz0#SV`herWGe_@YUeXDa_PUs2~Rq~;?TQPYo3Kf3i zz<-779Bf06Qb8L<@Y$qZ9>^Q%l>Ue4G>6=*i}+H@LkU9n%wtq2r4 z&#xwgbmf|^$iYsa7@p&r=mtL$WkG}?rn(krh*giCv#S|G{h4&`XCJoOfL<32oY8zO zQlQ29&yX7?JdBB2^7R5-gfm$|)W%Ck|I|qwjDe&U21RC{5t3J}t$P|NmVocL+8ZvX z@9;*5@cyf>rQ9^-5z1!?ZOk|`D=IEEySb!I_CoH@KUfDyXp$Gk+r;Rra`-! zj0UZ?_`V$-(;BbcvphCA{EylZO-QQovUdy|4w*%v^%Nm=LAB>D*I!)3##;t#V zcQ1#fZS3oy&zBIV+ORF3FXyeVT?^mfJ%lTndN~%rZbdF^7%edU-&fNIfy*>DMkS=5 zB2JS}KyEh((s@kEt3{)RqWQTnruDh&O#P7zMN=62AnH)=<3cv@ruC`+=v~dLMa^zo z%Sa1g^ap9J&UN(pNxev6GfRK3Kx;9=fZr_ixV z(x3w`A`sma*0_xyvpxGm3S4%GwwrjDz(NP{m-A>O{M5bxY7Pzaiyj2SuXY45KD`E| z!eE4+X$r+XeEdHucqp6>k^Cp#T$t&NHUI;>gt0=sE1&ED2uMo_%uEi!-|vGfHc@{01*RPWf;3OmcKDu@q4D`r~G_ z(cEfdB8)Dxe8|Rcw$&nDOk;}!Y+gW~kii^451AKm=;+x4SMvd&f3I;Fc=G>fCJHGY zv93XawV43cpe67!%BJw191>o~x=y17u+AJ`0N-_20YniO;WGecsI%O=*cuEYTNie# z)1u!4c5u7z{(%;Nh{C2QfCXNI1x);os8>UWsq3y)G6$A&v^7Xv2j5j5l!KIP5H-cq zh2#bm)_D|wCx&uy_%g7I zhQO3;_N&K#5-&8U3GnvX;2+0JbarZeLmcoY-vt@N#Pv-;bSZ7^BaMZHWf6}{AIHbh zrg}Px@lB<@8%BSEaa-=tE+27*iMCAsoaCGXVZdb&_Ul5p2ej^zzZOq-5!>U1tbIo( z%H{qV6h^G^=)*3(+=_v~wQl;y|9YjlvvG?FVRnAF zx-snu-~?f$))jXqriYcbVp;Lai=f z7LWwI%QDBh-25|8bwe;s6!)8egGnwV?GC_ZjizE1c_TyYYy+$qE|o_7|EJmKo7;AG|CH~k3w3D?x9E0F z3KI8Ac*p&BPG3Zxxbzx&kO7^nM^H6MWAo~CbWI!?x_!>;g-Ky^%Ijv>rl8D&<}ko+ ze8>LO)zPs7y@`dSoEow>+JpZ~@!z;KL@Q%HAB? z?p;$|4`WPDlLU^H;3-~PzR?twcq6r^GPayPVaXZ$5P@VzCtq7SNSZ`Cc~VsD;f+V> zOHgm8(cKe^_Z*r}tA1;a;}YuSPG$y=-cZ0R3-J1qy@k-WBn9{O5N}cx2lw^#^7FRy z#udOhocCr;-VyfG&bsQU~7jK=$3BDXX#V z5|YBb^8=U__EqasEAjr`GGkhAyP)o#v)+}CZOW)}8{VqNcL-u&zmwmGn@2K8;KI=-m!&T{tS+)ga26y*a5X?0&iWY?>yGgvkxeHcLrci?Y$}zH1+|a zNVc1$H+j;h=U^S=z2`+mk-33|yeD9{a zci$n8{f>Xx%33GVpxAqN1`_N&_y=%wFN06eKoby*W$>@GzII^u7Em#|hhS7f?qi!( zzaXv%i2AC#bSt`l_3X)j1u?(!zJO?faD&x(us$;H+eLREEaJ%reu#jKfFYeW`|_U` zZb3m@vdLQD5HaCG(iC`+zLo0p*i7NCZiOtKfDF3-%C_u04?^$z(SBF~N07DM86q6s z85)rr<-U=5sskV^#Ls{W1JsEKq^mSohn)PnsmRm9Vvq+GTC|-+Li)D}@9QU|fKZ#> z89U7#DC4<%_a>puerSK*^6HnbD=nP>S)=~j=3c-JutPA}tNxfe~;2BRqT5#}dMsM5r|8?n=XVw51`#Q*3`Pl-PV5$y+?;#JpXb66s zuK`r@o!+m~ssC*o6aRTX^OzQJuCMZ+sexC+W=K?c#tArlW9x1abQRQH18{65-gR*z zxAZ(CChP(w-6bcWKScj62Xj{eUF0!sK;RdgLmedIoy-yUe}XUWaUI|89DE{@0NFsM zYOufVe=mmz{>Sw{e?yw1KWrGi^+3CxbfLb7ZBRI>lvChz(hz%ElDPlU_Lv*j78+RLYcK15!Fyrw!z6z$$w`>R-O&B|%F{bhq5hog z04W$UeDp7_!8Q?HhwhEE{c7|;=n()KS{df@p@eSH46p|Amudq35H+=@vU2kn+SwAj zE4&0p(S<%bw>)UKKizKko)0#Me;01|d^_&{=?QpU9Hhlz#JPiHKYPC-1D=E=fVxNa642WUvph;I>V8~GfQLR^emR^tS?_)0nWH#e zJ-4_!dFfbh_IYNtk-Ah)aEl-7bK)NA8l8w#)jG2sTS8oJwpBXvTDCcDn!kX8iyN8< zocN=i#-6Qm7hJgE=a1vl_^>*?G1%b*{vPnxuUjB^`K^`kijzO)i$u0(*`|!G0Pr z{1+;^@g$>2+9CXSyFa;Ob&5DCe!xXimh+*Su=-fIX0p^2T8maoCPJMOt`v_g?lvNz zdE!}22fk4I@Gm*2=bRHkYhb*+xx$-?RT=!b?_t*eVD9+spO5`5ruV?7SXSD#TlU|a zotQvYjLQztfs3i+QOAQn1lqNQD}`p|xTS4840q&&uczdt4VrVdh8i8X*z1)GSOSfH zL>smDyHHd(LSwi}`6&V?=ND}22{YM!ka0|6(mhdt5P(oh#Xf9YI8hob4Th7yvGmFp z;kkYNxfAaE%MlG_{$sJ_90OJMqqKjbC}`j@OR0!f8I==;5s_5%3#~+AeII0jE+MYo zDH0CFMOu}CEEK`;w2QEFX$5SCMk;aXx0cu4;zb(3_}rT$YHo$)OKAhI5;J9}2wNjD z!fpH{j28Gwfw};#;lq&Asq+w|Pz!O8frkgAm^?7L~UGScl-?lo9__q4Y(A47B zpAJ_zT}^kjueFbwSv}rwwo@e;sb53I(QX?yttxn$9@D@(=5-kD!pK~Esfqyuf@=WA zTgZjiJe~j36VFKm??(BTo9)@v;EuTCgtL_g!+TZ$vYvfW06Xw-r%dd}`|S7x>j3e! zY*ZSodqMw~A2et>DqMPpc`KmUC?!Svac8qHsmn_-vy>Qp-uCw4DIsfvNS;<}|UqE1v1L5t(E0Zf+zv7>t?j)BRv`v89t0CVGmO=E&Mli>C zS!nCy<+GeO)r;yZQAR9$MdLo*bp7{^TDt{SskIRzs3OJU;9)CaA-<1q5$^O*7N9Z~lZ(I&w`Y4jg4DnaUm_ zn$q-85%$sxEyk6;y0f3Ta4gU~!;=$JVK8(VV_4*$$V(OYj}?suJhqS6XL1IL zI-f8ImvB!n<;~Vj4~mjA=`OIxavM+~8uu*N$Ct&YzWxY!l-5bOsMRn?*TeTXzf)AM zY6qRo|Xx!Lp#{p33m01t-HZw~2f7we9*ssbILy%RT$N?Devedw-hN zmAF0M#h=c}jS+7K;h|0aK$0?lIFzDXY4G`7He~MslRI*Sn;P6FO+^`bTwZX-S@>qW z0lywtK(O^U8SgmbQ$1A`Nq~eaVxDlPz!D&Zx19vy{1Z2&?SIGBuTA!^4o^!39e%GG znvxQ=39~R*7E_v<)8e={Ex72-5Ht-V{A7f*vYqS|j2Sd6B#HrJs(#f7`np(%MdU8M zjIAil(WHpzV1<<+_lqa=F)e90Z))bt+NgwWc-N`FaI((UFog+~_c=bXFHs;(`tW0q zS#ZdemGSLAO^FcF-i2mgsN61Wkr%pNVm|N>)M%34D;}y>mB?ngt}jE}-%J#hsb8PJ zg<|G?sjO8~m=j+}LWSX>tG`SXl&)KrP!T*F1>uvKuiFF7Hbn{{G}$M&ynuObi4&+1GJ>z4JkX_I5AxKSjk1d= z(9~6Oh;a}{YBrnqPLL5*j#xioG7m9lhMTNhtk8cNY+BuzVoB0 zhir`hasHztJ!ptjHv30W6qZg~lh}H+SOyJE3}$Q-ugoAF!8f7l+8Qep8)3HCn>N(h zsQ@TRDBh9u$+cfnZqIGVe;p-*sBybSI{0JlgNMKF{7M+GB8~$@Ai#3h@yBtcmX!(i8g_ke4V56?ZEzGLR8k1ghRaTHS&5_x?g$ z#Qvk~W|MENd;nYG*JEg>(dfT86(lWQbC|7e!E_-}KRL_#zXYH@+kK9-<>>jacqVtfd~w70vFyopsz0`P^V+|8jqp^S zT~JBkxJG`-F@u&F)f0d0#(4j!y)}qltWbOP@ zAJTksj6=pJv)9d>GYnIo_QE?Ob|d%G`VzROz2|6k z6l-NpVtAXHu_O;7d6z;~o1U7?{}Q;*F^gCK1jjKpZ8aIke{q*s4N|!rkunY*8ut;Z zL$_>4yZ$tXS!(df&}J-bSkhP~nhy|V@9EyOjDKE!Dwe)pC4o!ec^10NdY)mO^OtU< zqu0*o{LU{vA+To}zM|AN+t3iT$w$%ick;^o=7a^ehFmsxM{_d0HSm?60F;IPOxMfF zIbatnUSgUuC6s#)Q3Fq@gu%TIm&6e@So(f%zXtbDXDx#Nbg1L8%rd?Zs7B7*KnN@o zm4$PQ2aP@}vJIoinIc1vt`p^uYlcmHspz3c>9ti~cImcMEoLUrwRW+LaBuz;E_2A( z+(b`>#px%qWK=)t@+`|h_8M|?dZ~)1`$|wYG2D`9OKZFZ1j%Z0V6 z$XWk~^;0mR6hd_Q;PDfHc)!_gX+`erEyKU-|>^{|+m*+&>F2P~+ubElv&U+s; zMOT;j`(EF#-|hcKD5t|pQn3(uDllY-t&_pRD*Rd&>*Wh#IPVs`(jzhK?u++PJ?nFk zsKQxNQAVBF`E9#CVppX=7?%)6hcn3Nhks<5Y|Meq-1I~_mM)aITOCfslr1Q4`k4Vn zo_FL>Mxadlp;a!UHxw!v;2cL@VG&^!Pm++mETuJhL`P_m6a3dfQ=uEg%Z{(Sa>TJ% zH%h(4b>L^vU?r-`;&R~XY?y*lUiHs7_2nWmZq&Cc+5N_o4*hcVpY?V2KUd4pInoBw z*Dv#EGKstlA9Oj1YUTM9qnq@Y`u!w)Hh=#LlF{TVN6{Z9A+jg}4up}QZsY_JKR)L(fx%d$j-tX>- zDaxr;2{IYl$t%Aj+7Yw(wb@-;A3nz*$3%E1E)?9N5FCBDUoX|yY1kr zfWQ{f>0_j8AgNcqau@?YJ<>3bmWCRbAHtBEc%7TAupMYDyhiPwj8m+t>4`~YjtlR_wW9rJw#o-CuSAhgo)2pHC-F*A&z*s{N2g~rsor5|9DN$wLrN^N`zCH{## z0!?mI(KswjWMRQjGM5e)D94iW;~(YPc$$j@sB|^F$EgsP`T4UwX-tfb#bdRV;A$iBXvzM3@=aFWUEX%|J*ygV$I^db3N@n%O(m^UGhrL383yT z`fv;-6G}Tyb0jxdo-VRPD4t6A6~20;OzN{o`~VT_EKfnk*OdTvp(I=Wfd(rJuN0O9 zO!GR!ejfTqa_mEeZsh=hh@cN17>xfY(q1`jc*iLJrU%ZwePcLUG8cuF9c85<0GuNi z3WV88IL`xuI(Lo|b{+i2=;sN%!mtpSZM3E>f84c|fLsfKIyqQKB30N*kg6!{>z%d!r1){}Y= z8j0E&5CNZpIxi^}5Sn1wbAZF_+NJ+Ai-(Ns2gvm9w}n*FUK(2NQqgolH{>4;uS z_{_9R8KALTb#FaqsieTzXtWcGq7xAt6VZ{>xUWac#oNPr_}$r68O4**_s*#OQ)6-p z(V`NGQa4{5iI@16BlsnU>F8v|N7$xtRfv?}?efaczWPd@%d10)C9D|Yc3dLyJ|uoc z9J|^xt&=e}f%E)4AG-vM{O~a=B=V)OLLL#be+<}xKazE+tEionvTi0Yfi9u3BIf^{ z6UXt~)3)y18FhrztLv<*S@cUWB;M{@Z-Wx!2~mVdsl~{bj3CKea9T#?kE(L{2g~@% zhPGsu%JKch+FVb?WNAjl=wwoqp3iJBc?8?Nz7j2El*Z4tiVbv@@b0doV?g8`+VL0u z+va-7wsHNhFK}_OV9ktOs&vX&f_gB=U)A1)3L=vlRPm2#SFPj+ldfpf-w1IBAZ#=B zfq{y4Gm$gYqfaGT0jQdKPum>mN{C4*LhdDmJx&#+ck4+3>6y% z&s8(>scOiSKIas!i}Vn4orh&_(p3a~&ukYeTH~50X}t}L=t085xv}kvOuO#Wel?03W#B+I5zE`mmtNej&8T)u4H zT6JUpm*}aKgs+2W;sM$>81aVq(M%JG6er@Gm^OroJNgB(JvQ1VxDg#hxc*HSjE2-P-IvS38)>j0J~r-4EMVr0D9wX7ONy7J7};c@0ixt4`}QXi9= z69xU^G6hn%YI%~2;0@E2TjF`Mb@c<8@p$gY|tS%CF&IzAJ z0-{;AvH`_1l4np-Nv@u-jYH&c5_fr6DIh}CN>96-f%K)l<59m@70pPTCae-$F1s;X zxgE43SW5K+s$q1Xm|kWUE2_))v5&aL`HDA6&C7Jfq{=tiJY_qJ{Y4gWCo&b>ztQ|} z$Sf6z$Q}1U%rm$kE$@<>tu&Y#76I^Ge>01rPU@%8rr&1hOEiu<16U4L)W^9hh`!-#dYW<& zrTqDTS>G_V_Eptq3WY3gi}=!V)y_isvd=Tr zDmb)dZg9`DDnfRp;TI38hX&NbsK}~V97!Cj!!nMCMAMFu5ggD>34ZkqIb&wGO8~qGk&OP&Czw7>2bj=cw?jRLV2V)~clR z(ql!59qI)^FUt@bPi0PP`7tmP(zQ*gsNS#fTwj-zt{TKtx_(41LWR$Pw#3sjCkd!b z{`2*K@gOi%o~XI-ho2DFV-=`aNYz|Moje#qi*8+rnK<01Q77dNaM>xTNim9B!(eK=HML^A)x3%H+M7O|#ks`KF@1WTf11NaDF#O3w6;G^ zT414+x~Qn&4dg_9D4lZZYTe~mPENYEU1+q$^b$O`-hZSq59z?Z$0ZyTWzsL8mVM4v z6>vIGO-yRshj=1Qi6{g&Lk@9sBeYEksGV+B~^hc#-$OB(9oM6oU=_4G&{z;S#+Flj4tNFw%yhtD;xMtB;UiY z(O^1E$l>b^)S0U*jCPl7u4CrmMz^g_@O+kAb+8;LmMq?jh|W|XM%!txx0;*AGBV=Y zvndnZ%T|-SGJeHnjI7Z5iHol>8~*5M=;Hvbd2MoL`kYF8g^ZP%c`!&F2A>vgnjp-! z?`|<*(sieWAeKpOre}>;NjhBKKkCe;0$Za=nVu724r(}L2M!e$>%=_MZ{%cq4qc-z z9eapX^OQJ>KlvMfL*qU-qb^noJeT%K(f1l-Z92>^2oXZxIMTH$h9r_dxb5|LhG_4| zPPcPkm5CADQ~et+oIc$t*!M3ASwwvh%?SI*XM-Xbz2o;<*fBaY7EY^1wD+uv;0@N2 zQ&Lp=>!XUQ;z6wmlVYj$y#d>-xSDg^=5tEKQNEP}rHiC2PGY37DuduZ)cGFYcJ$jQ2T$qFN1R~j)R z*iow<%zeGs<^w?{7lp(@+zMtvT%#(pt3@^284;4y?pKWPxxW8gJ9OckTf7!WBFpG) zL`EtPu1!Tv(G+7RR%Y_uj!jnP922WVWxg}$U$5JzVbidm`wR!&6!6A}x6JCvpy;nF zBEXAMh?j;Zx*V>N25d0w^a~-lT{p&S^TARz|Ds6eQ-5)&|3OWX9he%|pitR-HxkNa zCh6B?X~fT79b7n$i`->hV5GjsG$Ibd7sxyC(b7l&w@fYLZr3b6R=^M*Z)2ydA;{(}^Sj*9>93*Q8ZbBv;x=vvVu& zA8wL+z#>vR&1B@;G`rtwWey2z$`Pm03V9%zMT=OKXO>S;BkttPc4$ktYPg1!P9E!T z-Pz%dkfem`VJta|_72Y94Ywr8VvLwfu=?}kuFMTKljaTKru`u-hE|31{MC8ftK%<> zYVm15tMl`J{%QH!f?MqFg7PtUfg1HO!}D`acJp42-~h94K|S<^S8`X?c9*a7wK$$< zptP4Hkqx7vkK*9O)5QZnIE(#y)=d1oCN^fw`s7wxTW%j2ZLH5%r}vcITqNk1NGK-D z->TSsmeub1zfYhiO{>}hJ~k4ErNU~H$&!JpG#52If>jcHGub?UjV_rWWjj5rRf@f4 z!^rctY(p ze*P>EP=@pF709C>gwG1JKCWI~xm>XZ59hH_#eRoff@U7B0;Tf&n-eZO`*v3$Zoh%? z{h5_v;G#hRK;<1>6X0YOGe+fTR$2~C%2tqbjzu6i!1f`iN>^i(GUH*W7mdU4&M`NG zgGDLtVV$3)7$9dr>6OwL^h3}lj6|nPSP%Q$<>xl#=}Uaa6BT54}ucX2MhdqzujElZsA9FIEh=8R(FK2=V%N(UAJk}LCzOY?5d?N_riEKjCCJM@nPrcJ z2$eXoJ0&9$vo*1P(A8)NU?|*;NxxbN)bv`@)KE72_Bhfn6XSLi!?Ls@ugdb$(lSz* zV6kRZQzH=0CYS$MAo#OWR-JW%ZlFYKU-nYL2WPUk^jq2H;1R_6_GbTHv4nt@Wl_hQ z<>PTdBgM@b#v8G|AE!_%U0~lZFUj}hDo|@(P3XYe*Q3268(z6^FWA_63s-qrZmUBg z(%)<(t$xL-L@)!RLg^(bZY40ClRB zFUny;U6kwYsS3@ma9Dh#Z7zk3bJET!p*3EVHy6jmRgs43O$Req!^w)u56iqtFe3QU zygRPEDe!vnWrh*DnSN4kv27o5HE2*mJY@!#(NHTV0{FhV7u&c@qGhaU*Qftu;~$v7 z|By({5usl35jMvC-Y3}xC7T4HKsuq7!0EGWxak2sEQ)D~e{5U_x)8n;&rmfb|)$&Jai0u(|?f#W{ zgJe{6m2JP`p0}no=bLWhAMCV^9;;C8FTGZpWpG9z&9_+uvw1Lwjd<#GRw| z3=;4DXsmH~l?y74_kP!vA8vpE*D-EphDMoXT&+AOQFqTZFJFI=w^rWGYJdAis7)~- zvxVQEhRvJEIf6|sbBNSXEnSsaVRS25VPWPr8(R@Mv*VoXhdDSK(c#B2flysH@`-8h za8H29Np(PTzO)nfP6aJ*`O|vT~?fQr_ zCnil$`PU9^*_=C~>PJ_ziAI zgjUL`!Y`O9>U{J8(hNBiR&{IjIYy_f(;FX^4R5v^ZrdK)YGy_U+Us*e>^tS+OA00f(%Zcd*t*9co@s+l$UqLf} z{ru;)QBWS&03mET>Q@}r98Z0HL$j8}+4NSau8EM-*xB6kw(sP462tHcjc)>vO?v#aFEqkcDk=pTb%S3V~!g#GMlXtQ_M`r}yarJjf8 zt4O0e{1NVXu#t%;@wF*oGs(S8!;W{qU9T+qp`q|@Oh@apt!OwtTx5STa!wt#MWrh9 z&&2Oc=9{*$K9$zTDXSJ@TEvl5cT4KO(Pxx=aeA|^@uUS+1Mv>7cmZTqKp}<1l>0cT zO9%_lK0~%ANlCFD^*iHmIpigC&C@nM)Y&w|hJU-AeSCRxc}DZ(e6wozg5X4R-NO*C zx?J(VeuJILgoHQ<9T?Ji2?q>IR)eqv4A3UEb$s`JDrG`{UlZIc|8XWmQRrH3Sy?QW zD;0PQ=KZC(r2I|y4^B)!NlEghlgj5d36CEm<%}qA2kwp%8h!+hb)Pb9T@oEqV|wW& zsD4(<9;h+^8!}ZgT_tbO_VB{^e}0cE>BPI5XgRHr4GTM`PJ2XuQg7!}@-bwoXw*%2 zZ!R?<(Mg4qFEe#A<$66DI@L-_KTrFppw@ZcCrn1A%e6<^_|`7>E9n5Eg;PuOcQC4F zc1212(Lr-laGEz+j(3IHE^p&e^)cpNv@&JOpVjYN6Y{;#4Kyej=3?j}%TQ**&cyL} z(D3>VRddzHOx4s~6*^y^MW#`uEuspvA(^&&_V7Qgn$~y%nO^+quorP#Rjlm^Rc_iP zkk;+*YZ72Cb>J{_LY+YLFKvuX)?0_N9D^>Br4c#?vg6WjzWb5AR`vQOn^o8VTffc` z*aFRuhX-%0-XRfPPPd-R+%+?gwDM=ga8_AzjYf3c=d3;UlH?uh}ewaGIN>366b9ET0w?`)3c#{le=nU5?~9w@2$&l0T$YQA?}G zmXM}qPYYN5L^tdU7E{ZL7-uqZxRgV&i=tAW;xM)nyQ3GjiR8H>wXTb@{a*U1u`<)Z zLA$JZ)-)?*?NN>)TFOX@A@~V-N-Bn0M)>xs~vpA7LY5wvp&AT>RzCjOU zMLRxIA_d|eSHUM4-_Y>y;o_cx&Kpv98$5B}>}%>Qp7$UrQf%^JDpK5TNtvb_)XDU< zz0n^$+=Yy?C$3B8EwFS|uDY0zFpVx^94J*#L&3r(2KhO+%M=q<6fYnoR>;KalL{!9 zD;fm|*g4F-ggKq>C?b9Fb?%KEz_xh z!`sU9S7ah=9S z0XRmaZ_Tr^rrxSgq&nJq1D477zF%N8g-rRzoQL#~7?L`fl4u16g~U-Kjh^igaVq|} zCZ*A!R~E%*oG0BDxAXj@@cmX+H`4yFt7le^bEu4qH?Dl-R@ow^$#a-*l7Pk`3>mJL zLG(iQ`#hK2;T+ua&$%j>A>44J{r-7?Y;bn(n;maLso>x`g1(xD*;kJjA(z~}H+|FU zw?+Fey}zAPlj00Upl(YyBbPD9mT#Ji;Eq!asmY(YomCVjKO^Ml3dNOxXm>(irQn|kxMx4Yi*B&k(r zCPQe}@~1Ej%`WMOle=x*^C?jcms-bF3EW=L&?*jvlZxy9% z7J;oor9fV#d%tVBOrLd*^1Z26SEmSjy?%`k9jxxujk`xWP*QkCWyr6o=pzJBTr1XmtA9*a zdwav9s^QQ7468(C)Y>`F?4C+9Ph*TMtt=eYZiNXe^mQ8jQ@76@z6-z9 z)xFahF*Y|Mb&t^uk4s=^$+NiP95sEPS^y%YFB@)jkHg2W*)guIBYaVGRgeIC5yL-C zKX|C^ir)B`I+?1`%V)EjZGq;FxNMX#Fly9kwKT`HSfbWef~za?u`PP(?4ONz&+dQS zbMTDm%4ThX4yjdtnZ2q++ z;e>r0Daoz8m7<|GpDto%bIOQ)OvM-@?EDDlo)VEcL0i)9md$;1iefcmwQl$0e&J(z zxLWyKez6GC@h>i;eMF`4A}U7H)?2jJ?N`ff%AioOk`e23dV1DE1siZrHquS$ip<+j zGHb@aTh^)x58mTtELR!VvVJMHajK!8nb6J2D{((htC}uWSK}cyFhN%P|4v0b8VNh3 zHL56TcUqLHxDGKVe7mU_BTdz&0%B@2zX+&281y62xjXArEZ_AiH+ylE%Rj&TZU zl3(f)(TsMv4O4Tr-um?_SCLrny!6zxiO*5oJNW&4SaH27^3y5D)+tPl#*wZ^+x2X3 zr|KK?t0viD&Jp+&S+nZ=a+o5BUEEUOZ4;(r^;$F0xkrCLTKB7FIWty>06XqPUU@ER z=VmZbe+sR<{9t9Ze)#v3u2({~;5uaY7ZFkd!FJGbX;6Z<1wG_1_Wu>?2^IEHc0u=< ztyE(Lc*9(SQX|-{-amIyl2y(618p^9d%%oWlh~%1qD)t>n$$>MKwR3cH)M1(?%72m zDZ%ryK4XbyYG{|MHS;-#r%eT)pGo~S%QdYOsg`qpj>lK@(M0Pw4Xb*v2%W^{a z;tq=M@`__Bg`FC&j_c}9;$&H|PcAB3-e^sUoBgxC9qQqtz@nV{7iGO6Rq7VdtAUm0 z!SR5X>6*}evqD``Q;m|-Cw#^Wt*VRX%vCdV$qWLMGpMpe$JrTHT|+|crQbNc#w6Iu zc#1XCVaYkwrP?D7it2OiYK$g%fPQH{KltR`6T0N*iU$ep=&rd;cC9<(+$0W?ZqT4p zMQY91b$D{}L>45&(_1so5*7{T2SK0DP)H3CY^DfZb&6xj#?JWdO~B>f7^H@&_mj#) zB+b*r*Djx$Ws3+nMo&bf0`vYz#actah^P<&s;t;hmZ)>?2L`+;d0;YOl(>U%*X z|9EDK{TY)e>Iahf&dc&L*P-D;L6fo}UD1`V;HX`N%g=Dq9Xm@zKa9k*!u@?Nht_J(i}@4PiS z8+=!rxhG*u$u!}E%`Q0h*KD?1MQqjy5I6?L%9y3CLQGe{+v5}?k} zR_^QlVW%lm%Z_M zDIy&PVCs?A&v5<1DPBQf23ROC!UtH3VLE~(25KCqWy(W7tZc2r({^6>+00etbnKfg ztR;r*X*3Ij$c%5|pYrk?b68xC{Aar=0$!Vnm!NjdN7YSrGL1>1Hd-?+d0E<@AG$Q_ zgUKZww5T|8HW=}h>SdX8IznYfih37Xb(Xu=%E%bJ@4W zRLBRTAmH!aIRR14E;GAN-h?J=pw6b}DGJ1I+2GE5L|6?UygYJ;d4=%6TSUc=F)J5m zU^~?IgXEn6m`Geq%4@R9(|TS@;^G#)8G0WJJaD!jNe}xa-+a{c0i|>$X4I8$Q%(#9 zVpDg{;z_i;14BgHci6FyC}6TYMJ(l%c#U%)g2ncMx}ZiY+c#6)bXg&F)*@}Vema#2 z-Q9BPC~k3)PslmB z(i-+FSLqt5jr2XIK^daixLVsdCRAB8vaeBR1Lg8DXkeDC`jYkN2-saF7t9>BpFD4JkrKp$KA zAL@2H+T7=td2fHniTr5BwPpvVCMvwr99iMeii$Xu81{Q=%fuK83Ql;>8VHJl^6Di6 zgXC9gTW)iu(+NC1;Zq!F;2}a;0!js>P0lSt(?5I^=bFJVp1g$yBn^6zPK{Q8ij1;J zE&M7U)lFBkhp=D%55F2SV`}D>*@rI&NBiQ}PX}KDL z@n)2OSK9)#-C5m?+XI9Lho1~2=GPxT9qk>?`0n+WceB3Q{c`jktEiS=-cmaRo`L@} z{BQT|+s}K4hp#q1q{FBFGrU%DG$rTo8<%^cE#eocI0d8O<>S-IWc1V4*7xtyvZ}3r{Jk|fpWMC;&-0Qf5|6yN z-A;Ugf8)j~{Y$_5zVQ7d@j@>S!ccgD7l+X!aen)z=L6kR4PEIMY1%1fKL?NXdY9ng zp$Pr&Jpq_*ys6-2oep^QHv&)4eIhUY$lH$Mot+&YKTG+uFo?IqD2aA9f>4#s>t^3x z`boRp4*YH7CgH?j&|89T0Re*`KfHr_1+Oc;T|9ip@!giD-L6RiE|4};x{*M>X oml~`&|2uHtz<~n?4jede;J|?c2M!!Kc-Zj&1MZ2imH?Oo0D?ENMF0Q* literal 0 HcmV?d00001 diff --git a/node_modules/tar/test/header.js b/node_modules/tar/test/header.js new file mode 100644 index 00000000..8ea6f795 --- /dev/null +++ b/node_modules/tar/test/header.js @@ -0,0 +1,183 @@ +var tap = require("tap") +var TarHeader = require("../lib/header.js") +var tar = require("../tar.js") +var fs = require("fs") + + +var headers = + { "a.txt file header": + [ "612e747874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303430312031313635313336303333332030313234353100203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true + , path: 'a.txt' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 257 + , mtime: 1319493851 + , cksum: 5417 + , type: '0' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } + ] + + , "omega pax": // the extended header from omega tar. + [ "5061784865616465722fcea92e74787400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303137302031313534333731303631312030313530353100207800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true + , path: 'PaxHeader/Ω.txt' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 120 + , mtime: 1301254537 + , cksum: 6697 + , type: 'x' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } ] + + , "omega file header": + [ "cea92e7478740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303030322031313534333731303631312030313330373200203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true + , path: 'Ω.txt' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 2 + , mtime: 1301254537 + , cksum: 5690 + , type: '0' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } ] + + , "foo.js file header": + [ "666f6f2e6a730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303030342031313534333637303734312030313236313700203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true + , path: 'foo.js' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 4 + , mtime: 1301246433 + , cksum: 5519 + , type: '0' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } + ] + + , "b.txt file header": + [ "622e747874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030313030302031313635313336303637372030313234363100203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true + , path: 'b.txt' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 512 + , mtime: 1319494079 + , cksum: 5425 + , type: '0' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } + ] + + , "deep nested file": + [ "636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363633030303634342000303537373631200030303030323420003030303030303030313434203131363532313531353333203034333331340020300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075737461720030306973616163730000000000000000000000000000000000000000000000000000737461666600000000000000000000000000000000000000000000000000000030303030303020003030303030302000722f652f612f6c2f6c2f792f2d2f642f652f652f702f2d2f662f6f2f6c2f642f652f722f2d2f702f612f742f680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true, + path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 100 + , mtime: 1319687003 + , cksum: 18124 + , type: '0' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } + ] + } + +tap.test("parsing", function (t) { + Object.keys(headers).forEach(function (name) { + var h = headers[name] + , header = new Buffer(h[0], "hex") + , expect = h[1] + , parsed = new TarHeader(header) + + // console.error(parsed) + t.has(parsed, expect, "parse " + name) + }) + t.end() +}) + +tap.test("encoding", function (t) { + Object.keys(headers).forEach(function (name) { + var h = headers[name] + , expect = new Buffer(h[0], "hex") + , encoded = TarHeader.encode(h[1]) + + // might have slightly different bytes, since the standard + // isn't very strict, but should have the same semantics + // checkSum will be different, but cksumValid will be true + + var th = new TarHeader(encoded) + delete h[1].block + delete h[1].needExtended + delete h[1].cksum + t.has(th, h[1], "fields "+name) + }) + t.end() +}) + +// test these manually. they're a bit rare to find in the wild +tap.test("parseNumeric tests", function (t) { + var parseNumeric = TarHeader.parseNumeric + , numbers = + { "303737373737373700": 2097151 + , "30373737373737373737373700": 8589934591 + , "303030303036343400": 420 + , "800000ffffffffffff": 281474976710655 + , "ffffff000000000001": -281474976710654 + , "ffffff000000000000": -281474976710655 + , "800000000000200000": 2097152 + , "8000000000001544c5": 1393861 + , "ffffffffffff1544c5": -15383354 } + Object.keys(numbers).forEach(function (n) { + var b = new Buffer(n, "hex") + t.equal(parseNumeric(b), numbers[n], n + " === " + numbers[n]) + }) + t.end() +}) diff --git a/node_modules/tar/test/link-file-entry-collision.js b/node_modules/tar/test/link-file-entry-collision.js new file mode 100644 index 00000000..cb3e2d5e --- /dev/null +++ b/node_modules/tar/test/link-file-entry-collision.js @@ -0,0 +1,39 @@ +// Set the umask, so that it works the same everywhere. +process.umask(parseInt('22', 8)) + +var tap = require("tap") + , tar = require("../tar.js") + , fs = require("fs") + , path = require("path") + , file = path.resolve(__dirname, "link-file-entry-collision/bad-link.tar") + , target = path.resolve(__dirname, "tmp/link-file-entry-collision") + , index = 0 + , fstream = require("fstream") + , mkdirp = require("mkdirp") + , rimraf = require("rimraf") + +tap.test("preclean", function (t) { + rimraf.sync(target) + t.pass("cleaned!") + t.end() +}) + +tap.test("extract test", function (t) { + var extract = tar.Extract(target) + var inp = fs.createReadStream(file) + inp.pipe(extract) + + extract.on("end", function () { + t.equal(fs.readFileSync(target + "/bad-link-target", "utf8"), + "this should remain the same\n") + t.equal(fs.readFileSync(target + "/a.txt", "utf8"), + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") + t.end() + }) +}) + +tap.test("cleanup", function (t) { + rimraf.sync(target) + t.pass("cleaned!") + t.end() +}) diff --git a/node_modules/tar/test/link-file-entry-collision/bad-link.hex b/node_modules/tar/test/link-file-entry-collision/bad-link.hex new file mode 100644 index 00000000..99f5db0d --- /dev/null +++ b/node_modules/tar/test/link-file-entry-collision/bad-link.hex @@ -0,0 +1,25 @@ +-- header for the link target -- +6261642d6c696e6b2d74617267657400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000303030363434200030303037363520003030303032342000303030303030303030333420313334363636353530353620303134333731002030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # bad-link-target.....................................................................................000644..000765..000024..00000000034.13466655056.014371..0................................................................................................... +00757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # .ustar.00isaacs..........................staff...........................000000..000000......................................................................................................................................................................... + +-- link target file contents (should not be overwritten) -- +746869732073686f756c642072656d61696e207468652073616d650a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # this.should.remain.the.same..................................................................................................................................................................................................................................... +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # ................................................................................................................................................................................................................................................................ + +-- header for the link named a.txt -- +612e74787400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003030303634342000303030373635200030303030323420003030303030303030303030203133343636363535303536203031353334320020316261642d6c696e6b2d746172676574000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # a.txt...............................................................................................000644..000765..000024..00000000000.13466655056.015342..1bad-link-target.................................................................................... +00757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # .ustar.00isaacs..........................staff...........................000000..000000......................................................................................................................................................................... + +-- header for file entry which attempts to overwrite the link -- +612e7478740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000303030363434200030353737363120003030303032342000303030303030303034303120313136353133363033333320303132343531002030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # a.txt...............................................................................................000644..057761..000024..00000000401.11651360333.012451..0................................................................................................... +00757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # .ustar.00isaacs..........................staff...........................000000..000000......................................................................................................................................................................... + +-- contents that threaten to overwrite the link target -- +61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161 # aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +61000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # a............................................................................................................................................................................................................................................................... + +-- tar eof -- +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # ................................................................................................................................................................................................................................................................ +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # ................................................................................................................................................................................................................................................................ +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # ................................................................................................................................................................................................................................................................ +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # ................................................................................................................................................................................................................................................................ diff --git a/node_modules/tar/test/link-file-entry-collision/bad-link.tar b/node_modules/tar/test/link-file-entry-collision/bad-link.tar new file mode 100644 index 0000000000000000000000000000000000000000..be0b0d2f73a2cdca26771554090aca269bfcfc69 GIT binary patch literal 3584 zcmeHH+X{m)4E1?mksoj*wvFFYr%stVuod?C3-dvyu%}f7o0r^5I638{uw~k{!z1-} zyjMO6VTj0DLn1zB^YNI?xs=3|22z@tjX}eJq*YD{UmvH zFX<+lH<_11giZgT1>dv|T=Sf|62_{x?Et>1z}ddK929bd^+yKm)xW~1egP@c_^p4@ z%eVfG(pdsj>~Ne;uK!*C-{d*d_Wo-mAYwy`Q7I+&Khq}O|3yFnBYSoW$ZZ@Q8Hfx- I29C_Y8xFy>h5!Hn literal 0 HcmV?d00001 diff --git a/node_modules/tar/test/pack-no-proprietary.js b/node_modules/tar/test/pack-no-proprietary.js new file mode 100644 index 00000000..d4b03a1f --- /dev/null +++ b/node_modules/tar/test/pack-no-proprietary.js @@ -0,0 +1,886 @@ +// This is exactly like test/pack.js, except that it's excluding +// any proprietary headers. +// +// This loses some information about the filesystem, but creates +// tarballs that are supported by more versions of tar, especially +// old non-spec-compliant copies of gnutar. + +// the symlink file is excluded from git, because it makes +// windows freak the hell out. +var fs = require("fs") + , path = require("path") + , symlink = path.resolve(__dirname, "fixtures/symlink") +try { fs.unlinkSync(symlink) } catch (e) {} +fs.symlinkSync("./hardlink-1", symlink) +process.on("exit", function () { + fs.unlinkSync(symlink) +}) + +var tap = require("tap") + , tar = require("../tar.js") + , pkg = require("../package.json") + , Pack = tar.Pack + , fstream = require("fstream") + , Reader = fstream.Reader + , Writer = fstream.Writer + , input = path.resolve(__dirname, "fixtures/") + , target = path.resolve(__dirname, "tmp/pack.tar") + , uid = process.getuid ? process.getuid() : 0 + , gid = process.getgid ? process.getgid() : 0 + + , entries = + + // the global header and root fixtures/ dir are going to get + // a different date each time, so omit that bit. + // Also, dev/ino values differ across machines, so that's not + // included. + [ [ 'entry', + { path: 'fixtures/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/200cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + uid: uid, + gid: gid, + size: 200 } ] + + , [ 'entry', + { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + size: 200, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/a.txt', + mode: 420, + uid: uid, + gid: gid, + size: 257, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/b.txt', + mode: 420, + uid: uid, + gid: gid, + size: 512, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/c.txt', + mode: 420, + uid: uid, + gid: gid, + size: 513, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/cc.txt', + mode: 420, + uid: uid, + gid: gid, + size: 513, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/dir/', + mode: 488, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/dir/sub/', + mode: 488, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/foo.js', + mode: 420, + uid: uid, + gid: gid, + size: 4, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/hardlink-1', + mode: 420, + uid: uid, + gid: gid, + size: 200, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/hardlink-2', + mode: 420, + uid: uid, + gid: gid, + size: 0, + type: '1', + linkpath: 'fixtures/hardlink-1', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/omega.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/omega.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/star.4.html', + mode: 420, + uid: uid, + gid: gid, + size: 54081, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/packtest/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'fixtures/packtest/Ω.txt', + uid: uid, + gid: gid, + size: 2 } ] + + , [ 'entry', + { path: 'fixtures/packtest/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + size: 100, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/symlink', + uid: uid, + gid: gid, + size: 0, + type: '2', + linkpath: 'hardlink-1', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: "fixtures/Ω.txt" + , uid: uid + , gid: gid + , size: 2 } ] + + , [ 'entry', + { path: 'fixtures/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + ] + + +// first, make sure that the hardlinks are actually hardlinks, or this +// won't work. Git has a way of replacing them with a copy. +var hard1 = path.resolve(__dirname, "fixtures/hardlink-1") + , hard2 = path.resolve(__dirname, "fixtures/hardlink-2") + , fs = require("fs") + +try { fs.unlinkSync(hard2) } catch (e) {} +fs.linkSync(hard1, hard2) + +tap.test("with global header", { timeout: 10000 }, function (t) { + runTest(t, true) +}) + +tap.test("without global header", { timeout: 10000 }, function (t) { + runTest(t, false) +}) + +function alphasort (a, b) { + return a === b ? 0 + : a.toLowerCase() > b.toLowerCase() ? 1 + : a.toLowerCase() < b.toLowerCase() ? -1 + : a > b ? 1 + : -1 +} + + +function runTest (t, doGH) { + var reader = Reader({ path: input + , filter: function () { + return !this.path.match(/\.(tar|hex)$/) + } + , sort: alphasort + }) + + var props = doGH ? pkg : {} + props.noProprietary = true + var pack = Pack(props) + var writer = Writer(target) + + // global header should be skipped regardless, since it has no content. + var entry = 0 + + t.ok(reader, "reader ok") + t.ok(pack, "pack ok") + t.ok(writer, "writer ok") + + pack.pipe(writer) + + var parse = tar.Parse() + t.ok(parse, "parser should be ok") + + pack.on("data", function (c) { + // console.error("PACK DATA") + if (c.length !== 512) { + // this one is too noisy, only assert if it'll be relevant + t.equal(c.length, 512, "parser should emit data in 512byte blocks") + } + parse.write(c) + }) + + pack.on("end", function () { + // console.error("PACK END") + t.pass("parser ends") + parse.end() + }) + + pack.on("error", function (er) { + t.fail("pack error", er) + }) + + parse.on("error", function (er) { + t.fail("parse error", er) + }) + + writer.on("error", function (er) { + t.fail("writer error", er) + }) + + reader.on("error", function (er) { + t.fail("reader error", er) + }) + + parse.on("*", function (ev, e) { + var wanted = entries[entry++] + if (!wanted) { + t.fail("unexpected event: "+ev) + return + } + t.equal(ev, wanted[0], "event type should be "+wanted[0]) + + if (ev !== wanted[0] || e.path !== wanted[1].path) { + console.error("wanted", wanted) + console.error([ev, e.props]) + e.on("end", function () { + console.error(e.fields) + throw "break" + }) + } + + t.has(e.props, wanted[1], "properties "+wanted[1].path) + if (wanted[2]) { + e.on("end", function () { + if (!e.fields) { + t.ok(e.fields, "should get fields") + } else { + t.has(e.fields, wanted[2], "should get expected fields") + } + }) + } + }) + + reader.pipe(pack) + + writer.on("close", function () { + t.equal(entry, entries.length, "should get all expected entries") + t.pass("it finished") + t.end() + }) + +} diff --git a/node_modules/tar/test/pack.js b/node_modules/tar/test/pack.js new file mode 100644 index 00000000..0f16c07b --- /dev/null +++ b/node_modules/tar/test/pack.js @@ -0,0 +1,952 @@ + +// the symlink file is excluded from git, because it makes +// windows freak the hell out. +var fs = require("fs") + , path = require("path") + , symlink = path.resolve(__dirname, "fixtures/symlink") +try { fs.unlinkSync(symlink) } catch (e) {} +fs.symlinkSync("./hardlink-1", symlink) +process.on("exit", function () { + fs.unlinkSync(symlink) +}) + + +var tap = require("tap") + , tar = require("../tar.js") + , pkg = require("../package.json") + , Pack = tar.Pack + , fstream = require("fstream") + , Reader = fstream.Reader + , Writer = fstream.Writer + , input = path.resolve(__dirname, "fixtures/") + , target = path.resolve(__dirname, "tmp/pack.tar") + , uid = process.getuid ? process.getuid() : 0 + , gid = process.getgid ? process.getgid() : 0 + + , entries = + + // the global header and root fixtures/ dir are going to get + // a different date each time, so omit that bit. + // Also, dev/ino values differ across machines, so that's not + // included. + [ [ 'globalExtendedHeader', + { path: 'PaxHeader/', + mode: 438, + uid: 0, + gid: 0, + type: 'g', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { "NODETAR.author": pkg.author, + "NODETAR.name": pkg.name, + "NODETAR.description": pkg.description, + "NODETAR.version": pkg.version, + "NODETAR.repository.type": pkg.repository.type, + "NODETAR.repository.url": pkg.repository.url, + "NODETAR.main": pkg.main, + "NODETAR.scripts.test": pkg.scripts.test } ] + + , [ 'entry', + { path: 'fixtures/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/200cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'NODETAR.depth': '1', + 'NODETAR.type': 'File', + nlink: 1, + uid: uid, + gid: gid, + size: 200, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + size: 200, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '', + 'NODETAR.depth': '1', + 'NODETAR.type': 'File', + nlink: 1, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/a.txt', + mode: 420, + uid: uid, + gid: gid, + size: 257, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/b.txt', + mode: 420, + uid: uid, + gid: gid, + size: 512, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/c.txt', + mode: 420, + uid: uid, + gid: gid, + size: 513, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/cc.txt', + mode: 420, + uid: uid, + gid: gid, + size: 513, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/dir/', + mode: 488, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/dir/sub/', + mode: 488, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + + , [ 'entry', + { path: 'fixtures/foo.js', + mode: 420, + uid: uid, + gid: gid, + size: 4, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/hardlink-1', + mode: 420, + uid: uid, + gid: gid, + size: 200, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/hardlink-2', + mode: 420, + uid: uid, + gid: gid, + size: 0, + type: '1', + linkpath: 'fixtures/hardlink-1', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/omega.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/omega.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/star.4.html', + mode: 420, + uid: uid, + gid: gid, + size: 54081, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/packtest/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'fixtures/packtest/Ω.txt', + 'NODETAR.depth': '2', + 'NODETAR.type': 'File', + nlink: 1, + uid: uid, + gid: gid, + size: 2, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/packtest/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '', + 'NODETAR.depth': '2', + 'NODETAR.type': 'File', + nlink: 1, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/r/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + size: 100, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/symlink', + uid: uid, + gid: gid, + size: 0, + type: '2', + linkpath: 'hardlink-1', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: "fixtures/Ω.txt" + , "NODETAR.depth": "1" + , "NODETAR.type": "File" + , nlink: 1 + , uid: uid + , gid: gid + , size: 2 + , "NODETAR.blksize": "4096" + , "NODETAR.blocks": "8" } ] + + , [ 'entry', + { path: 'fixtures/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '', + 'NODETAR.depth': '1', + 'NODETAR.type': 'File', + nlink: 1, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + ] + + +// first, make sure that the hardlinks are actually hardlinks, or this +// won't work. Git has a way of replacing them with a copy. +var hard1 = path.resolve(__dirname, "fixtures/hardlink-1") + , hard2 = path.resolve(__dirname, "fixtures/hardlink-2") + , fs = require("fs") + +try { fs.unlinkSync(hard2) } catch (e) {} +fs.linkSync(hard1, hard2) + +tap.test("with global header", { timeout: 10000 }, function (t) { + runTest(t, true) +}) + +tap.test("without global header", { timeout: 10000 }, function (t) { + runTest(t, false) +}) + +tap.test("with from base", { timeout: 10000 }, function (t) { + runTest(t, true, true) +}) + +function alphasort (a, b) { + return a === b ? 0 + : a.toLowerCase() > b.toLowerCase() ? 1 + : a.toLowerCase() < b.toLowerCase() ? -1 + : a > b ? 1 + : -1 +} + + +function runTest (t, doGH, doFromBase) { + var reader = Reader({ path: input + , filter: function () { + return !this.path.match(/\.(tar|hex)$/) + } + , sort: alphasort + }) + + var props = doGH ? pkg : {} + if(doFromBase) props.fromBase = true; + + var pack = Pack(props) + var writer = Writer(target) + + // skip the global header if we're not doing that. + var entry = doGH ? 0 : 1 + + t.ok(reader, "reader ok") + t.ok(pack, "pack ok") + t.ok(writer, "writer ok") + + pack.pipe(writer) + + var parse = tar.Parse() + t.ok(parse, "parser should be ok") + + pack.on("data", function (c) { + // console.error("PACK DATA") + if (c.length !== 512) { + // this one is too noisy, only assert if it'll be relevant + t.equal(c.length, 512, "parser should emit data in 512byte blocks") + } + parse.write(c) + }) + + pack.on("end", function () { + // console.error("PACK END") + t.pass("parser ends") + parse.end() + }) + + pack.on("error", function (er) { + t.fail("pack error", er) + }) + + parse.on("error", function (er) { + t.fail("parse error", er) + }) + + writer.on("error", function (er) { + t.fail("writer error", er) + }) + + reader.on("error", function (er) { + t.fail("reader error", er) + }) + + parse.on("*", function (ev, e) { + var wanted = entries[entry++] + if (!wanted) { + t.fail("unexpected event: "+ev) + return + } + t.equal(ev, wanted[0], "event type should be "+wanted[0]) + + if(doFromBase) { + if(wanted[1].path.indexOf('fixtures/') && wanted[1].path.length == 100) + wanted[1].path = wanted[1].path.replace('fixtures/', '') + 'ccccccccc' + + if(wanted[1]) wanted[1].path = wanted[1].path.replace('fixtures/', '').replace('//', '/') + if(wanted[1].path == '') wanted[1].path = '/' + if(wanted[2] && wanted[2].path) wanted[2].path = wanted[2].path.replace('fixtures', '').replace(/^\//, '') + + wanted[1].linkpath = wanted[1].linkpath.replace('fixtures/', '') + } + + if (ev !== wanted[0] || e.path !== wanted[1].path) { + console.error("wanted", wanted) + console.error([ev, e.props]) + e.on("end", function () { + console.error(e.fields) + throw "break" + }) + } + + + t.has(e.props, wanted[1], "properties "+wanted[1].path) + if (wanted[2]) { + e.on("end", function () { + if (!e.fields) { + t.ok(e.fields, "should get fields") + } else { + t.has(e.fields, wanted[2], "should get expected fields") + } + }) + } + }) + + reader.pipe(pack) + + writer.on("close", function () { + t.equal(entry, entries.length, "should get all expected entries") + t.pass("it finished") + t.end() + }) + +} diff --git a/node_modules/tar/test/parse-discard.js b/node_modules/tar/test/parse-discard.js new file mode 100644 index 00000000..da01a65c --- /dev/null +++ b/node_modules/tar/test/parse-discard.js @@ -0,0 +1,29 @@ +var tap = require("tap") + , tar = require("../tar.js") + , fs = require("fs") + , path = require("path") + , file = path.resolve(__dirname, "fixtures/c.tar") + +tap.test("parser test", function (t) { + var parser = tar.Parse() + var total = 0 + var dataTotal = 0 + + parser.on("end", function () { + + t.equals(total-513,dataTotal,'should have discarded only c.txt') + + t.end() + }) + + fs.createReadStream(file) + .pipe(parser) + .on('entry',function(entry){ + if(entry.path === 'c.txt') entry.abort() + + total += entry.size; + entry.on('data',function(data){ + dataTotal += data.length + }) + }) +}) diff --git a/node_modules/tar/test/parse.js b/node_modules/tar/test/parse.js new file mode 100644 index 00000000..f765a501 --- /dev/null +++ b/node_modules/tar/test/parse.js @@ -0,0 +1,359 @@ +var tap = require("tap") + , tar = require("../tar.js") + , fs = require("fs") + , path = require("path") + , file = path.resolve(__dirname, "fixtures/c.tar") + , index = 0 + + , expect = +[ [ 'entry', + { path: 'c.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 513, + mtime: new Date('Wed, 26 Oct 2011 01:10:58 GMT'), + cksum: 5422, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'entry', + { path: 'cc.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 513, + mtime: new Date('Wed, 26 Oct 2011 01:11:02 GMT'), + cksum: 5525, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'entry', + { path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('Thu, 27 Oct 2011 03:43:23 GMT'), + cksum: 18124, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'entry', + { path: 'Ω.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 2, + mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + cksum: 5695, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/Ω.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 120, + mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + cksum: 6702, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'Ω.txt', + ctime: 1319737909, + atime: 1319739061, + dev: 234881026, + ino: 51693379, + nlink: 1 } ], + [ 'entry', + { path: 'Ω.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 2, + mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + cksum: 5695, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + atime: new Date('Thu, 27 Oct 2011 18:11:01 GMT'), + dev: 234881026, + ino: 51693379, + nlink: 1 }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 353, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 14488, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + ctime: 1319686868, + atime: 1319741254, + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 1 } ], + [ 'entry', + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 200, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 14570, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + atime: new Date('Thu, 27 Oct 2011 18:47:34 GMT'), + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 1 }, + undefined ], + [ 'longPath', + { path: '././@LongLink', + mode: 0, + uid: 0, + gid: 0, + size: 201, + mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'), + cksum: 4976, + type: 'L', + linkpath: '', + ustar: false }, + '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' ], + [ 'entry', + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 1000, + gid: 1000, + size: 201, + mtime: new Date('Thu, 27 Oct 2011 22:21:50 GMT'), + cksum: 14086, + type: '0', + linkpath: '', + ustar: false }, + undefined ], + [ 'longLinkpath', + { path: '././@LongLink', + mode: 0, + uid: 0, + gid: 0, + size: 201, + mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'), + cksum: 4975, + type: 'K', + linkpath: '', + ustar: false }, + '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' ], + [ 'longPath', + { path: '././@LongLink', + mode: 0, + uid: 0, + gid: 0, + size: 201, + mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'), + cksum: 4976, + type: 'L', + linkpath: '', + ustar: false }, + '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL' ], + [ 'entry', + { path: '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', + mode: 511, + uid: 1000, + gid: 1000, + size: 0, + mtime: new Date('Fri, 28 Oct 2011 23:05:17 GMT'), + cksum: 21603, + type: '2', + linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + ustar: false }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/200-hard', + mode: 420, + uid: 24561, + gid: 20, + size: 143, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 6533, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { ctime: 1320617144, + atime: 1320617232, + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 } ], + [ 'entry', + { path: '200-hard', + mode: 420, + uid: 24561, + gid: 20, + size: 200, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 5526, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Sun, 06 Nov 2011 22:05:44 GMT'), + atime: new Date('Sun, 06 Nov 2011 22:07:12 GMT'), + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 353, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 14488, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + ctime: 1320617144, + atime: 1320617406, + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 } ], + [ 'entry', + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 0, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 15173, + type: '1', + linkpath: '200-hard', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Sun, 06 Nov 2011 22:05:44 GMT'), + atime: new Date('Sun, 06 Nov 2011 22:10:06 GMT'), + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 }, + undefined ] ] + + +tap.test("parser test", function (t) { + var parser = tar.Parse() + + parser.on("end", function () { + t.equal(index, expect.length, "saw all expected events") + t.end() + }) + + fs.createReadStream(file) + .pipe(parser) + .on("*", function (ev, entry) { + var wanted = expect[index] + if (!wanted) { + return t.fail("Unexpected event: " + ev) + } + var result = [ev, entry.props] + entry.on("end", function () { + result.push(entry.fields || entry.body) + + t.equal(ev, wanted[0], index + " event type") + t.equivalent(entry.props, wanted[1], wanted[1].path + " entry properties") + if (wanted[2]) { + t.equivalent(result[2], wanted[2], "metadata values") + } + index ++ + }) + }) +}) diff --git a/node_modules/tar/test/zz-cleanup.js b/node_modules/tar/test/zz-cleanup.js new file mode 100644 index 00000000..a00ff7fa --- /dev/null +++ b/node_modules/tar/test/zz-cleanup.js @@ -0,0 +1,20 @@ +// clean up the fixtures + +var tap = require("tap") +, rimraf = require("rimraf") +, test = tap.test +, path = require("path") + +test("clean fixtures", function (t) { + rimraf(path.resolve(__dirname, "fixtures"), function (er) { + t.ifError(er, "rimraf ./fixtures/") + t.end() + }) +}) + +test("clean tmp", function (t) { + rimraf(path.resolve(__dirname, "tmp"), function (er) { + t.ifError(er, "rimraf ./tmp/") + t.end() + }) +}) diff --git a/node_modules/through2-filter/LICENSE b/node_modules/through2-filter/LICENSE new file mode 100644 index 00000000..540900f1 --- /dev/null +++ b/node_modules/through2-filter/LICENSE @@ -0,0 +1,9 @@ +(The MIT License) + +Copyright (c) Bryce B. Baril + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/through2-filter/README.md b/node_modules/through2-filter/README.md new file mode 100644 index 00000000..9ad00b92 --- /dev/null +++ b/node_modules/through2-filter/README.md @@ -0,0 +1,79 @@ +through2-filter +=============== + +[![NPM](https://nodei.co/npm/through2-filter.png)](https://nodei.co/npm/through2-filter/) + +This is a super thin wrapper around [through2](http://npm.im/through2) that works like `Array.prototype.filter` but for streams. + +For when through2 is just too verbose :wink: + +Note you will **NOT** be able to alter the content of the chunks. This is intended for filtering only. If you want to modify the stream content, use either `through2` or `through2-map`. + +```js +var filter = require("through2-filter") + +var skip = filter(function (chunk) { + // skip buffers longer than 100 + return chunk.length < 100 +}) + +// vs. with through2: +var skip = through2(function (chunk, encoding, callback) { + // skip buffers longer than 100 + if (chunk.length < 100) this.push(chunk) + return callback() +}) + +// Then use your filter: +source.pipe(skip).pipe(sink) + +// Additionally accepts `wantStrings` argument to conver buffers into strings +var alphanum = new RegExp("^[A-Za-z0-1]+$") +var scrub = filter({wantStrings: true}, function (str) { + return alphanum.exec(str) +}) + +// Works like `Array.prototype.filter` meaning you can specify a function that +// takes up to two* arguments: fn(element, index) +var skip10 = filter(function (element, index) { + return index > 10 +}) +``` + +*Differences from `Array.prototype.filter`: + * No third `array` callback argument. That would require realizing the entire stream, which is generally counter-productive to stream operations. + * `Array.prototype.filter` doesn't modify the source Array, which is somewhat nonsensical when applied to streams. + +API +--- + +`require("through2-filter")([options], fn)` +--- + +Create a `through2-filter` instance that will call `fn(chunk)`. If `fn(chunk)` returns "true" the chunk will be passed downstream. Otherwise it will be dropped. + +`require("through2-filter").ctor([options], fn)` +--- + +Create a `through2-filter` Type that can be instantiated via `new Type()` or `Type()` to create reusable spies. + +`require("through2-filter").obj([options], fn)` +--- + +Create a `through2-filter` that defaults to `objectMode = true`. + +`require("through2-filter").objCtor([options], fn)` +--- + +Create a `through2-filter` Type that defaults to `objectMode = true`. + +Options +------- + + * wantStrings: Automatically call chunk.toString() for the super lazy. + * all other through2 options + +LICENSE +======= + +MIT diff --git a/node_modules/through2-filter/index.js b/node_modules/through2-filter/index.js new file mode 100644 index 00000000..9026f6d5 --- /dev/null +++ b/node_modules/through2-filter/index.js @@ -0,0 +1,50 @@ +"use strict"; + +module.exports = make +module.exports.ctor = ctor +module.exports.objCtor = objCtor +module.exports.obj = obj + +var through2 = require("through2") +var xtend = require("xtend") + +function ctor(options, fn) { + if (typeof options == "function") { + fn = options + options = {} + } + + var Filter = through2.ctor(options, function (chunk, encoding, callback) { + if (this.options.wantStrings) chunk = chunk.toString() + try { + if (fn.call(this, chunk, this._index++)) this.push(chunk) + return callback() + } catch (e) { + return callback(e) + } + }) + Filter.prototype._index = 0 + return Filter +} + +function objCtor(options, fn) { + if (typeof options === "function") { + fn = options + options = {} + } + options = xtend({objectMode: true, highWaterMark: 16}, options) + return ctor(options, fn) +} + +function make(options, fn) { + return ctor(options, fn)() +} + +function obj(options, fn) { + if (typeof options === "function") { + fn = options + options = {} + } + options = xtend({objectMode: true, highWaterMark: 16}, options) + return make(options, fn) +} diff --git a/node_modules/through2-filter/node_modules/through2/LICENSE.md b/node_modules/through2-filter/node_modules/through2/LICENSE.md new file mode 100644 index 00000000..a2429b63 --- /dev/null +++ b/node_modules/through2-filter/node_modules/through2/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License (MIT) + +**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/through2-filter/node_modules/through2/README.md b/node_modules/through2-filter/node_modules/through2/README.md new file mode 100644 index 00000000..b5e44c7b --- /dev/null +++ b/node_modules/through2-filter/node_modules/through2/README.md @@ -0,0 +1,134 @@ +# through2 + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node streams.Transform (Streams2/3) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +Note: As 2.x.x this module starts using **Streams3** instead of Stream2. To continue using a Streams2 version use `npm install through2@0` to fetch the latest version of 0.x.x. More information about Streams2 vs Streams3 and recommendations see the article **[Why I don't use Node's core 'stream' module](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html)**. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (var i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) + .on('finish', () => doSomethingSpecial()) +``` + +Or object streams: + +```js +var all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + var data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', (data) => { + all.push(data) + }) + .on('end', () => { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## API + +through2([ options, ] [ transformFunction ] [, flushFunction ]) + +Consult the **[stream.Transform](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + (chunk, enc, cb) => { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + ) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + (chunk, enc, cb) => cb(null, chunk), // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +through2.ctor([ options, ] transformFunction[, flushFunction ]) + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +var FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit == "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +var converter = new FToC() +// Or: +var converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +var converter = FToC({objectMode: true}) +``` + +## See Also + + - [through2-map](https://github.com/brycebaril/through2-map) - Array.prototype.map analog for streams. + - [through2-filter](https://github.com/brycebaril/through2-filter) - Array.prototype.filter analog for streams. + - [through2-reduce](https://github.com/brycebaril/through2-reduce) - Array.prototype.reduce analog for streams. + - [through2-spy](https://github.com/brycebaril/through2-spy) - Wrapper for simple stream.PassThrough spies. + - the [mississippi stream utility collection](https://github.com/maxogden/mississippi) includes `through2` as well as many more useful stream modules similar to this one + +## License + +**through2** is Copyright (c) Rod Vagg [@rvagg](https://twitter.com/rvagg) and additional contributors and licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/through2-filter/node_modules/through2/package.json b/node_modules/through2-filter/node_modules/through2/package.json new file mode 100644 index 00000000..15960b63 --- /dev/null +++ b/node_modules/through2-filter/node_modules/through2/package.json @@ -0,0 +1,33 @@ +{ + "name": "through2", + "version": "2.0.5", + "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise", + "main": "through2.js", + "scripts": { + "test": "node test/test.js | faucet" + }, + "repository": { + "type": "git", + "url": "https://github.com/rvagg/through2.git" + }, + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "author": "Rod Vagg (https://github.com/rvagg)", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "devDependencies": { + "bl": "~2.0.1", + "faucet": "0.0.1", + "nyc": "~13.1.0", + "safe-buffer": "~5.1.2", + "stream-spigot": "~3.0.6", + "tape": "~4.9.1" + } +} diff --git a/node_modules/through2-filter/node_modules/through2/through2.js b/node_modules/through2-filter/node_modules/through2/through2.js new file mode 100644 index 00000000..6baa6a1e --- /dev/null +++ b/node_modules/through2-filter/node_modules/through2/through2.js @@ -0,0 +1,96 @@ +var Transform = require('readable-stream').Transform + , inherits = require('util').inherits + , xtend = require('xtend') + +function DestroyableTransform(opts) { + Transform.call(this, opts) + this._destroyed = false +} + +inherits(DestroyableTransform, Transform) + +DestroyableTransform.prototype.destroy = function(err) { + if (this._destroyed) return + this._destroyed = true + + var self = this + process.nextTick(function() { + if (err) + self.emit('error', err) + self.emit('close') + }) +} + +// a noop _transform function +function noop (chunk, enc, callback) { + callback(null, chunk) +} + + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return function (options, transform, flush) { + if (typeof options == 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform != 'function') + transform = noop + + if (typeof flush != 'function') + flush = null + + return construct(options, transform, flush) + } +} + + +// main export, just make me a transform stream! +module.exports = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(options) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) + + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +module.exports.ctor = through2(function (options, transform, flush) { + function Through2 (override) { + if (!(this instanceof Through2)) + return new Through2(override) + + this.options = xtend(options, override) + + DestroyableTransform.call(this, this.options) + } + + inherits(Through2, DestroyableTransform) + + Through2.prototype._transform = transform + + if (flush) + Through2.prototype._flush = flush + + return Through2 +}) + + +module.exports.obj = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) diff --git a/node_modules/through2-filter/package.json b/node_modules/through2-filter/package.json new file mode 100644 index 00000000..92e076b2 --- /dev/null +++ b/node_modules/through2-filter/package.json @@ -0,0 +1,48 @@ +{ + "name": "through2-filter", + "version": "3.0.0", + "description": "A through2 to create an Array.prototype.filter analog for streams.", + "files": [ + "index.js" + ], + "directories": { + "test": "test" + }, + "scripts": { + "test": "node test/" + }, + "repository": { + "type": "git", + "url": "git@github.com:brycebaril/through2-filter.git" + }, + "keywords": [ + "streams", + "through", + "through2", + "filter" + ], + "author": "Bryce B. Baril", + "license": "MIT", + "jshintConfig": { + "asi": true, + "globalstrict": true, + "validthis": true, + "eqnull": true, + "node": true, + "loopfunc": true, + "newcap": false, + "eqeqeq": false + }, + "bugs": { + "url": "https://github.com/brycebaril/through2-filter/issues" + }, + "devDependencies": { + "tape": "^4.0.0", + "stream-spigot": "^3.0.5", + "concat-stream": "^1.4.7" + }, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } +} diff --git a/node_modules/through2/LICENSE.md b/node_modules/through2/LICENSE.md new file mode 100644 index 00000000..a2429b63 --- /dev/null +++ b/node_modules/through2/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License (MIT) + +**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/through2/README.md b/node_modules/through2/README.md new file mode 100644 index 00000000..1e077996 --- /dev/null +++ b/node_modules/through2/README.md @@ -0,0 +1,140 @@ +# through2 + +![Build & Test](https://github.com/rvagg/through2/workflows/Build%20&%20Test/badge.svg) + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node.js streams.Transform (Streams2/3) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (let i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) + .on('finish', () => doSomethingSpecial()) +``` + +Or object streams: + +```js +const all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + const data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', (data) => { + all.push(data) + }) + .on('end', () => { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## Do you need this? + +Since Node.js introduced [Simplified Stream Construction](https://nodejs.org/api/stream.html#stream_simplified_construction), many uses of **through2** have become redundant. Consider whether you really need to use **through2** or just want to use the `'readable-stream'` package, or the core `'stream'` package (which is derived from `'readable-stream'`): + +```js +const { Transform } = require('readable-stream') + +const transformer = new Transform({ + transform(chunk, enc, callback) { + // ... + } +}) +``` + +## API + +through2([ options, ] [ transformFunction ] [, flushFunction ]) + +Consult the **[stream.Transform](https://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + (chunk, enc, cb) => { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + (chunk, enc, cb) => cb(null, chunk), // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +through2.ctor([ options, ] transformFunction[, flushFunction ]) + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +const FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit == "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +const converter = new FToC() +// Or: +const converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +const converter = FToC({objectMode: true}) +``` + +## License + +**through2** is Copyright © Rod Vagg and additional contributors and licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/through2/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/through2/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 00000000..f478d58d --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/through2/node_modules/readable-stream/GOVERNANCE.md b/node_modules/through2/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 00000000..16ffb93f --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/through2/node_modules/readable-stream/LICENSE b/node_modules/through2/node_modules/readable-stream/LICENSE new file mode 100644 index 00000000..2873b3b2 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" diff --git a/node_modules/through2/node_modules/readable-stream/README.md b/node_modules/through2/node_modules/readable-stream/README.md new file mode 100644 index 00000000..6f035ab1 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/README.md @@ -0,0 +1,106 @@ +# readable-stream + +***Node.js core streams for userland*** [![Build Status](https://travis-ci.com/nodejs/readable-stream.svg?branch=master)](https://travis-ci.com/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readabe-stream.svg)](https://saucelabs.com/u/readabe-stream) + +```bash +npm install --save readable-stream +``` + +This package is a mirror of the streams implementations in Node.js. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v10.19.0/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +## Version 3.x.x + +v3.x.x of `readable-stream` is a cut from Node 10. This version supports Node 6, 8, and 10, as well as evergreen browsers, IE 11 and latest Safari. The breaking changes introduced by v3 are composed by the combined breaking changes in [Node v9](https://nodejs.org/en/blog/release/v9.0.0/) and [Node v10](https://nodejs.org/en/blog/release/v10.0.0/), as follows: + +1. Error codes: https://github.com/nodejs/node/pull/13310, + https://github.com/nodejs/node/pull/13291, + https://github.com/nodejs/node/pull/16589, + https://github.com/nodejs/node/pull/15042, + https://github.com/nodejs/node/pull/15665, + https://github.com/nodejs/readable-stream/pull/344 +2. 'readable' have precedence over flowing + https://github.com/nodejs/node/pull/18994 +3. make virtual methods errors consistent + https://github.com/nodejs/node/pull/18813 +4. updated streams error handling + https://github.com/nodejs/node/pull/18438 +5. writable.end should return this. + https://github.com/nodejs/node/pull/18780 +6. readable continues to read when push('') + https://github.com/nodejs/node/pull/18211 +7. add custom inspect to BufferList + https://github.com/nodejs/node/pull/17907 +8. always defer 'readable' with nextTick + https://github.com/nodejs/node/pull/17979 + +## Version 2.x.x +v2.x.x of `readable-stream` is a cut of the stream module from Node 8 (there have been no semver-major changes from Node 4 to 8). This version supports all Node.js versions from 0.8, as well as evergreen browsers and IE 10 & 11. + +### Big Thanks + +Cross-browser Testing Platform and Open Source <3 Provided by [Sauce Labs][sauce] + +# Usage + +You can swap your `require('stream')` with `require('readable-stream')` +without any changes, if you are just using one of the main classes and +functions. + +```js +const { + Readable, + Writable, + Transform, + Duplex, + pipeline, + finished +} = require('readable-stream') +```` + +Note that `require('stream')` will return `Stream`, while +`require('readable-stream')` will return `Readable`. We discourage using +whatever is exported directly, but rather use one of the properties as +shown in the example above. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> +* **Yoshua Wyuts** ([@yoshuawuyts](https://github.com/yoshuawuyts)) <yoshuawuyts@gmail.com> + +[sauce]: https://saucelabs.com diff --git a/node_modules/through2/node_modules/readable-stream/errors-browser.js b/node_modules/through2/node_modules/readable-stream/errors-browser.js new file mode 100644 index 00000000..fb8e73e1 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/errors-browser.js @@ -0,0 +1,127 @@ +'use strict'; + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error; + } + + function getMessage(arg1, arg2, arg3) { + if (typeof message === 'string') { + return message; + } else { + return message(arg1, arg2, arg3); + } + } + + var NodeError = + /*#__PURE__*/ + function (_Base) { + _inheritsLoose(NodeError, _Base); + + function NodeError(arg1, arg2, arg3) { + return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; + } + + return NodeError; + }(Base); + + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + codes[code] = NodeError; +} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js + + +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + var len = expected.length; + expected = expected.map(function (i) { + return String(i); + }); + + if (len > 2) { + return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1]; + } else if (len === 2) { + return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); + } else { + return "of ".concat(thing, " ").concat(expected[0]); + } + } else { + return "of ".concat(thing, " ").concat(String(expected)); + } +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + + +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith + + +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + + return str.substring(this_len - search.length, this_len) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes + + +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"'; +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + var determiner; + + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + var msg; + + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } else { + var type = includes(name, '.') ? 'property' : 'argument'; + msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } + + msg += ". Received type ".concat(typeof actual); + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented'; +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg; +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); +module.exports.codes = codes; diff --git a/node_modules/through2/node_modules/readable-stream/errors.js b/node_modules/through2/node_modules/readable-stream/errors.js new file mode 100644 index 00000000..8471526d --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/errors.js @@ -0,0 +1,116 @@ +'use strict'; + +const codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error + } + + function getMessage (arg1, arg2, arg3) { + if (typeof message === 'string') { + return message + } else { + return message(arg1, arg2, arg3) + } + } + + class NodeError extends Base { + constructor (arg1, arg2, arg3) { + super(getMessage(arg1, arg2, arg3)); + } + } + + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + + codes[code] = NodeError; +} + +// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + const len = expected.length; + expected = expected.map((i) => String(i)); + if (len > 2) { + return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` + + expected[len - 1]; + } else if (len === 2) { + return `one of ${thing} ${expected[0]} or ${expected[1]}`; + } else { + return `of ${thing} ${expected[0]}`; + } + } else { + return `of ${thing} ${String(expected)}`; + } +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + return str.substring(this_len - search.length, this_len) === search; +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"' +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + let determiner; + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + let msg; + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`; + } else { + const type = includes(name, '.') ? 'property' : 'argument'; + msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`; + } + + msg += `. Received type ${typeof actual}`; + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented' +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); + +module.exports.codes = codes; diff --git a/node_modules/through2/node_modules/readable-stream/experimentalWarning.js b/node_modules/through2/node_modules/readable-stream/experimentalWarning.js new file mode 100644 index 00000000..78e84149 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/experimentalWarning.js @@ -0,0 +1,17 @@ +'use strict' + +var experimentalWarnings = new Set(); + +function emitExperimentalWarning(feature) { + if (experimentalWarnings.has(feature)) return; + var msg = feature + ' is an experimental feature. This feature could ' + + 'change at any time'; + experimentalWarnings.add(feature); + process.emitWarning(msg, 'ExperimentalWarning'); +} + +function noop() {} + +module.exports.emitExperimentalWarning = process.emitWarning + ? emitExperimentalWarning + : noop; diff --git a/node_modules/through2/node_modules/readable-stream/package.json b/node_modules/through2/node_modules/readable-stream/package.json new file mode 100644 index 00000000..0b0c4bd2 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/package.json @@ -0,0 +1,68 @@ +{ + "name": "readable-stream", + "version": "3.6.0", + "description": "Streams3, a user-land copy of the stream library from Node.js", + "main": "readable.js", + "engines": { + "node": ">= 6" + }, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "devDependencies": { + "@babel/cli": "^7.2.0", + "@babel/core": "^7.2.0", + "@babel/polyfill": "^7.0.0", + "@babel/preset-env": "^7.2.0", + "airtap": "0.0.9", + "assert": "^1.4.0", + "bl": "^2.0.0", + "deep-strict-equal": "^0.2.0", + "events.once": "^2.0.2", + "glob": "^7.1.2", + "gunzip-maybe": "^1.4.1", + "hyperquest": "^2.1.3", + "lolex": "^2.6.0", + "nyc": "^11.0.0", + "pump": "^3.0.0", + "rimraf": "^2.6.2", + "tap": "^12.0.0", + "tape": "^4.9.0", + "tar-fs": "^1.16.2", + "util-promisify": "^2.1.0" + }, + "scripts": { + "test": "tap -J --no-esm test/parallel/*.js test/ours/*.js", + "ci": "TAP=1 tap --no-esm test/parallel/*.js test/ours/*.js | tee test.tap", + "test-browsers": "airtap --sauce-connect --loopback airtap.local -- test/browser.js", + "test-browser-local": "airtap --open --local -- test/browser.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "update-browser-errors": "babel -o errors-browser.js errors.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream" + }, + "keywords": [ + "readable", + "stream", + "pipe" + ], + "browser": { + "util": false, + "worker_threads": false, + "./errors": "./errors-browser.js", + "./readable.js": "./readable-browser.js", + "./lib/internal/streams/from.js": "./lib/internal/streams/from-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "license": "MIT" +} diff --git a/node_modules/through2/node_modules/readable-stream/readable-browser.js b/node_modules/through2/node_modules/readable-stream/readable-browser.js new file mode 100644 index 00000000..adbf60de --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,9 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); +exports.finished = require('./lib/internal/streams/end-of-stream.js'); +exports.pipeline = require('./lib/internal/streams/pipeline.js'); diff --git a/node_modules/through2/node_modules/readable-stream/readable.js b/node_modules/through2/node_modules/readable-stream/readable.js new file mode 100644 index 00000000..9e0ca120 --- /dev/null +++ b/node_modules/through2/node_modules/readable-stream/readable.js @@ -0,0 +1,16 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream.Readable; + Object.assign(module.exports, Stream); + module.exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); + exports.finished = require('./lib/internal/streams/end-of-stream.js'); + exports.pipeline = require('./lib/internal/streams/pipeline.js'); +} diff --git a/node_modules/through2/node_modules/string_decoder/LICENSE b/node_modules/through2/node_modules/string_decoder/LICENSE new file mode 100644 index 00000000..778edb20 --- /dev/null +++ b/node_modules/through2/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + diff --git a/node_modules/through2/node_modules/string_decoder/README.md b/node_modules/through2/node_modules/string_decoder/README.md new file mode 100644 index 00000000..5fd58315 --- /dev/null +++ b/node_modules/through2/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/through2/node_modules/string_decoder/package.json b/node_modules/through2/node_modules/string_decoder/package.json new file mode 100644 index 00000000..b2bb1411 --- /dev/null +++ b/node_modules/through2/node_modules/string_decoder/package.json @@ -0,0 +1,34 @@ +{ + "name": "string_decoder", + "version": "1.3.0", + "description": "The string_decoder module from Node core", + "main": "lib/string_decoder.js", + "files": [ + "lib" + ], + "dependencies": { + "safe-buffer": "~5.2.0" + }, + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "scripts": { + "test": "tap test/parallel/*.js && node test/verify-dependencies", + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT" +} diff --git a/node_modules/through2/package.json b/node_modules/through2/package.json new file mode 100644 index 00000000..a5ca5329 --- /dev/null +++ b/node_modules/through2/package.json @@ -0,0 +1,38 @@ +{ + "name": "through2", + "version": "4.0.2", + "description": "A tiny wrapper around Node.js streams.Transform (Streams2/3) to avoid explicit subclassing noise", + "main": "through2.js", + "scripts": { + "test:node": "hundreds mocha test/test.js", + "test:browser": "node -e 'process.exit(process.version.startsWith(\"v8.\") ? 0 : 1)' || polendina --cleanup --runner=mocha test/test.js", + "test": "npm run lint && npm run test:node && npm run test:browser", + "lint": "standard", + "coverage": "c8 --reporter=text --reporter=html mocha test/test.js && npx st -d coverage -p 8888" + }, + "repository": { + "type": "git", + "url": "https://github.com/rvagg/through2.git" + }, + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "author": "Rod Vagg (https://github.com/rvagg)", + "license": "MIT", + "dependencies": { + "readable-stream": "3" + }, + "devDependencies": { + "bl": "^4.0.2", + "buffer": "^5.6.0", + "chai": "^4.2.0", + "hundreds": "~0.0.7", + "mocha": "^7.2.0", + "polendina": "^1.0.0", + "standard": "^14.3.4", + "stream-spigot": "^3.0.6" + } +} diff --git a/node_modules/through2/through2.js b/node_modules/through2/through2.js new file mode 100644 index 00000000..925da9d3 --- /dev/null +++ b/node_modules/through2/through2.js @@ -0,0 +1,83 @@ +const { Transform } = require('readable-stream') + +function inherits (fn, sup) { + fn.super_ = sup + fn.prototype = Object.create(sup.prototype, { + constructor: { value: fn, enumerable: false, writable: true, configurable: true } + }) +} + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return (options, transform, flush) => { + if (typeof options === 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform !== 'function') { + // noop + transform = (chunk, enc, cb) => cb(null, chunk) + } + + if (typeof flush !== 'function') { + flush = null + } + + return construct(options, transform, flush) + } +} + +// main export, just make me a transform stream! +const make = through2((options, transform, flush) => { + const t2 = new Transform(options) + + t2._transform = transform + + if (flush) { + t2._flush = flush + } + + return t2 +}) + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +const ctor = through2((options, transform, flush) => { + function Through2 (override) { + if (!(this instanceof Through2)) { + return new Through2(override) + } + + this.options = Object.assign({}, options, override) + + Transform.call(this, this.options) + + this._transform = transform + if (flush) { + this._flush = flush + } + } + + inherits(Through2, Transform) + + return Through2 +}) + +const obj = through2(function (options, transform, flush) { + const t2 = new Transform(Object.assign({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) { + t2._flush = flush + } + + return t2 +}) + +module.exports = make +module.exports.ctor = ctor +module.exports.obj = obj diff --git a/node_modules/time-stamp/LICENSE b/node_modules/time-stamp/LICENSE new file mode 100644 index 00000000..83b56e70 --- /dev/null +++ b/node_modules/time-stamp/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/time-stamp/README.md b/node_modules/time-stamp/README.md new file mode 100644 index 00000000..a12d3e15 --- /dev/null +++ b/node_modules/time-stamp/README.md @@ -0,0 +1,132 @@ +# time-stamp [![NPM version](https://img.shields.io/npm/v/time-stamp.svg?style=flat)](https://www.npmjs.com/package/time-stamp) [![NPM monthly downloads](https://img.shields.io/npm/dm/time-stamp.svg?style=flat)](https://npmjs.org/package/time-stamp) [![NPM total downloads](https://img.shields.io/npm/dt/time-stamp.svg?style=flat)](https://npmjs.org/package/time-stamp) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/time-stamp.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/time-stamp) + +> Get a formatted timestamp. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save time-stamp +``` + +## Usage + +```js +var timestamp = require('time-stamp'); + +timestamp(); +//=> 2017:05:14 + +timestamp('YYYYMMDD'); +//=> 20170514 + +timestamp('YYYYMMDD:ss'); +//=> 20170514:26 + +timestamp('YYYY/MM/DD:mm:ss'); +//=> 2017/05/14:52:26 + +timestamp('YYYY:MM:DD'); +//=> 2017:05:14 + +timestamp('[YYYY:MM:DD]'); +//=> [2017:05:14] + +timestamp('YYYY/MM/DD'); +//=> 2017/05/14 + +timestamp('YYYY:MM'); +//=> 2017:05 + +timestamp('YYYY'); +//=> 2017 + +timestamp('MM'); +//=> 05 + +timestamp('DD'); +//=> 14 + +timestamp('HH'); +//=> 20 + +timestamp('mm'); +//=> 52 + +timestamp('ss'); +//=> 26 + +timestamp('ms'); +//=> 481 +``` + +**Valid patterns** + +* `YYYY`: full year (ex: **2017**) +* `MM`: month (ex: **04**) +* `DD`: day (ex: **01**) +* `HH`: hours (ex: **12**) +* `mm`: minutes (ex: **59**) +* `ss`: seconds (ex: **09**) +* `ms`: milliseconds (ex: **532**) + +## About + +### Related projects + +* [days](https://www.npmjs.com/package/days): Days of the week. | [homepage](https://github.com/jonschlinkert/days "Days of the week.") +* [iso-week](https://www.npmjs.com/package/iso-week): Get the ISO week of the year. | [homepage](https://github.com/jonschlinkert/iso-week "Get the ISO week of the year.") +* [month](https://www.npmjs.com/package/month): Get the name or number of the current month or any month of the year. | [homepage](https://github.com/datetime/month "Get the name or number of the current month or any month of the year.") +* [months](https://www.npmjs.com/package/months): Months of the year. | [homepage](https://github.com/jonschlinkert/months "Months of the year.") +* [o-clock](https://www.npmjs.com/package/o-clock): Simple javascript utility for displaying the time in 12-hour clock format. | [homepage](https://github.com/jonschlinkert/o-clock "Simple javascript utility for displaying the time in 12-hour clock format.") +* [seconds](https://www.npmjs.com/package/seconds): Get the number of seconds for a minute, hour, day and week. | [homepage](https://github.com/jonschlinkert/seconds "Get the number of seconds for a minute, hour, day and week.") +* [week](https://www.npmjs.com/package/week): Get the current week number. | [homepage](https://github.com/datetime/week "Get the current week number.") +* [weekday](https://www.npmjs.com/package/weekday): Get the name and number of the current weekday. Or get the name of the… [more](https://github.com/datetime/weekday) | [homepage](https://github.com/datetime/weekday "Get the name and number of the current weekday. Or get the name of the weekday for a given number.") +* [year](https://www.npmjs.com/package/year): Simple utility to get the current year with 2 or 4 digits. | [homepage](https://github.com/jonschlinkert/year "Simple utility to get the current year with 2 or 4 digits.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 21 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [evocateur](https://github.com/evocateur) | +| 1 | [mendenhallmagic](https://github.com/mendenhallmagic) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on May 14, 2017._ \ No newline at end of file diff --git a/node_modules/time-stamp/index.js b/node_modules/time-stamp/index.js new file mode 100644 index 00000000..0c930482 --- /dev/null +++ b/node_modules/time-stamp/index.js @@ -0,0 +1,56 @@ +/*! + * time-stamp + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +/** + * Parse the given pattern and return a formatted + * timestamp. + * + * @param {String} `pattern` Date pattern. + * @param {Date} `date` Date object. + * @return {String} + */ + +module.exports = function(pattern, date) { + if (typeof pattern !== 'string') { + date = pattern; + pattern = 'YYYY:MM:DD'; + } + + if (!date) date = new Date(); + + function timestamp() { + var regex = /(?=(YYYY|YY|MM|DD|HH|mm|ss|ms))\1([:\/]*)/; + var match = regex.exec(pattern); + + if (match) { + var increment = method(match[1]); + var val = '00' + String(date[increment[0]]() + (increment[2] || 0)); + var res = val.slice(-increment[1]) + (match[2] || ''); + pattern = pattern.replace(match[0], res); + timestamp(); + } + } + + timestamp(pattern); + return pattern; +}; + +function method(key) { + return ({ + YYYY: ['getFullYear', 4], + YY: ['getFullYear', 2], + // getMonth is zero-based, thus the extra increment field + MM: ['getMonth', 2, 1], + DD: ['getDate', 2], + HH: ['getHours', 2], + mm: ['getMinutes', 2], + ss: ['getSeconds', 2], + ms: ['getMilliseconds', 3] + })[key]; +} diff --git a/node_modules/time-stamp/package.json b/node_modules/time-stamp/package.json new file mode 100644 index 00000000..395030f2 --- /dev/null +++ b/node_modules/time-stamp/package.json @@ -0,0 +1,77 @@ +{ + "name": "time-stamp", + "description": "Get a formatted timestamp.", + "version": "1.1.0", + "homepage": "https://github.com/jonschlinkert/time-stamp", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Daniel Stockman (http://evocateur.org)", + "Drew (https://github.com/mendenhallmagic)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "jonschlinkert/time-stamp", + "bugs": { + "url": "https://github.com/jonschlinkert/time-stamp/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "gulp-format-md": "^0.1.12", + "mocha": "^3.4.1", + "pad-left": "^2.1.0" + }, + "keywords": [ + "console", + "date", + "format", + "formatting", + "log", + "pretty", + "stamp", + "terminal", + "time", + "time-stamp" + ], + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "helpers": { + "timestamp": "./index.js" + }, + "related": { + "list": [ + "days", + "iso-week", + "month", + "months", + "o-clock", + "seconds", + "week", + "weekday", + "year" + ] + }, + "reflinks": [ + "verb" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/timers-ext/.editorconfig b/node_modules/timers-ext/.editorconfig new file mode 100644 index 00000000..c24a6cd1 --- /dev/null +++ b/node_modules/timers-ext/.editorconfig @@ -0,0 +1,14 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = tab + +[{*.json,*.yml}] +indent_style = space +indent_size = 2 diff --git a/node_modules/timers-ext/CHANGELOG.md b/node_modules/timers-ext/CHANGELOG.md new file mode 100644 index 00000000..8522ceb9 --- /dev/null +++ b/node_modules/timers-ext/CHANGELOG.md @@ -0,0 +1,55 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +## [0.1.7](https://github.com/medikoo/timers-ext/compare/v0.1.6...v0.1.7) (2018-10-04) + + +### Bug Fixes + +* typo in error message ([36720cf](https://github.com/medikoo/timers-ext/commit/36720cf)) + + + + +## [0.1.6](https://github.com/medikoo/timers-ext/compare/v0.1.5...v0.1.6) (2018-10-04) + + +### Features + +* report timeout value on error ([abb4afa](https://github.com/medikoo/timers-ext/commit/abb4afa)) + + + + +## [0.1.5](https://github.com/medikoo/timers-ext/compare/v0.1.4...v0.1.5) (2018-03-13) + + +### Features + +* **promise:** sleep util ([c50d575](https://github.com/medikoo/timers-ext/commit/c50d575)) + + + + +## [0.1.4](https://github.com/medikoo/timers-ext/compare/v0.1.3...v0.1.4) (2018-03-08) + + +### Bug Fixes + +* **promise:** clear timeout on promise resolution ([6301a6b](https://github.com/medikoo/timers-ext/commit/6301a6b)) + + + + + +## [0.1.3](https://github.com/medikoo/timers-ext/compare/v0.1.2...v0.1.3) (2018-03-07) + +### Features + +* **promise:** promise.timeout method ([3f52d27](https://github.com/medikoo/timers-ext/commit/3f52d27)) + +## Changelog for previous versions + +See `CHANGES` file diff --git a/node_modules/timers-ext/CHANGES b/node_modules/timers-ext/CHANGES new file mode 100644 index 00000000..28781d49 --- /dev/null +++ b/node_modules/timers-ext/CHANGES @@ -0,0 +1,26 @@ +For recent changelog see CHANGELOG.md + +----- + + +v0.1.2 -- 2017.04.03 +* `throttle` util + +v0.1.1 -- 2017.03.15 +* Workaround IE8 resolution issue +* Support any callable objects as callbacks +* Improve documentation +* Fix spelling of LICENSE +* Configure lint scripts +* Update dependencies + +v0.1.0 -- 2014.04.27 +First production ready version +- Depend strictly on npm hosted package versions +- Full documentation +- Add `once` (moved from next-tick project) +- Make timeout value optional in delay +- Rename MAX_VALUE into MAX_TIMEOUT + +v0.0.0 -- 2013.08.27 +Initial (dev) version diff --git a/node_modules/timers-ext/LICENSE b/node_modules/timers-ext/LICENSE new file mode 100644 index 00000000..923b7f65 --- /dev/null +++ b/node_modules/timers-ext/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2013-2018, Mariusz Nowak, @medikoo, medikoo.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/timers-ext/README.md b/node_modules/timers-ext/README.md new file mode 100644 index 00000000..5a438d40 --- /dev/null +++ b/node_modules/timers-ext/README.md @@ -0,0 +1,69 @@ +[![Build status][nix-build-image]][nix-build-url] +[![Windows status][win-build-image]][win-build-url] +![Transpilation status][transpilation-image] +[![npm version][npm-image]][npm-url] + +# timers-ext + +## Timers extensions + +### Installation + + $ npm install timers-ext + +To port it to Browser or any other (non CJS) environment, use your favorite CJS bundler. No favorite yet? Try: [Browserify](http://browserify.org/), [Webmake](https://github.com/medikoo/modules-webmake) or [Webpack](http://webpack.github.io/) + +### API + +#### MAX*TIMEOUT *(timers-ext/max-timeout)\_ + +Maximum possible timeout value in milliseconds. It equals to maximum positive value for 32bit signed integer, so _2³¹ (2147483647)_, which makes it around 24.9 days + +#### delay(fn[, timeout]) _(timers-ext/delay)_ + +Returns function which when invoked will call _fn_ function after specified +_timeout_. If _timeout_ is not provided [nextTick](https://github.com/medikoo/next-tick/#next-tick) propagation is used. + +#### once(fn[, timeout]) _(timers-ext/once)_ + +Makes sure to execute _fn_ function only once after a defined interval of time (debounce). If _timeout_ is not provided [nextTick](https://github.com/medikoo/next-tick/#next-tick) propagation is used. + +```javascript +var nextTick = require("next-tick"); +var logFoo = function() { + console.log("foo"); +}; +var logFooOnce = require("timers-ext/once")(logFoo); + +logFooOnce(); +logFooOnce(); // ignored, logFoo will be logged only once +logFooOnce(); // ignored + +nextTick(function() { + logFooOnce(); // Invokes another log (as tick passed) + logFooOnce(); // ignored + logFooOnce(); // ignored +}); +``` + +#### validTimeout(timeout) _(timers-ext/valid-timeout)_ + +Validates timeout value. +For `NaN` resolved _timeout_ `0` is returned. +If _timeout_ resolves to a number: + +- for _timeout < 0_ `0` is returned +- for _0 >= timeout <= [MAX_TIMEOUT](#max_timeout-timers-extmax-timeout)_, `timeout` value is returned +- for _timeout > [MAX_TIMEOUT](#max_timeout-timers-extmax-timeout)_ exception is thrown + +### Tests + + $ npm test + +[nix-build-image]: https://semaphoreci.com/api/v1/medikoo-org/timers-ext/branches/master/shields_badge.svg +[nix-build-url]: https://semaphoreci.com/medikoo-org/timers-ext +[win-build-image]: https://ci.appveyor.com/api/projects/status/2i5nerowov2ho3o9?svg=true +[win-build-url]: https://ci.appveyor.com/project/medikoo/timers-ext +[transpilation-image]: https://img.shields.io/badge/transpilation-free-brightgreen.svg +[npm-image]: https://img.shields.io/npm/v/timers-ext.svg +[npm-url]: https://www.npmjs.com/package/timers-ext diff --git a/node_modules/timers-ext/delay.js b/node_modules/timers-ext/delay.js new file mode 100644 index 00000000..187a5d79 --- /dev/null +++ b/node_modules/timers-ext/delay.js @@ -0,0 +1,21 @@ +"use strict"; + +var callable = require("es5-ext/object/valid-callable") + , nextTick = require("next-tick") + , validTimeout = require("./valid-timeout"); + +var apply = Function.prototype.apply; + +module.exports = function (fn/*, timeout*/) { + var delay, timeout = arguments[1]; + callable(fn); + if (timeout === undefined) { + delay = nextTick; + } else { + timeout = validTimeout(timeout); + delay = setTimeout; + } + return function () { + return delay(apply.bind(fn, this, arguments), timeout); + }; +}; diff --git a/node_modules/timers-ext/max-timeout.js b/node_modules/timers-ext/max-timeout.js new file mode 100644 index 00000000..399dab2c --- /dev/null +++ b/node_modules/timers-ext/max-timeout.js @@ -0,0 +1,3 @@ +"use strict"; + +module.exports = 2147483647; diff --git a/node_modules/timers-ext/once.js b/node_modules/timers-ext/once.js new file mode 100644 index 00000000..1e1decca --- /dev/null +++ b/node_modules/timers-ext/once.js @@ -0,0 +1,42 @@ +// It's actually "debounce" + +"use strict"; + +var isValue = require("es5-ext/object/is-value") + , callable = require("es5-ext/object/valid-callable") + , nextTick = require("next-tick") + , validTimeout = require("./valid-timeout"); + +var apply = Function.prototype.apply; + +module.exports = function (fn/*, timeout*/) { + var scheduled, run, context, args, delay, timeout = arguments[1], handle; + callable(fn); + if (isValue(timeout)) { + timeout = validTimeout(timeout); + delay = setTimeout; + } else { + delay = nextTick; + } + run = function () { + if (!scheduled) return; // IE8 tends to not clear immediate timeouts properly + scheduled = false; + handle = null; + apply.call(fn, context, args); + context = null; + args = null; + }; + return function () { + if (scheduled) { + if (!isValue(handle)) { + // 'nextTick' based, no room for debounce + return; + } + clearTimeout(handle); + } + scheduled = true; + context = this; + args = arguments; + handle = delay(run, timeout); + }; +}; diff --git a/node_modules/timers-ext/package.json b/node_modules/timers-ext/package.json new file mode 100644 index 00000000..f7cf9c47 --- /dev/null +++ b/node_modules/timers-ext/package.json @@ -0,0 +1,42 @@ +{ + "name": "timers-ext", + "version": "0.1.7", + "description": "Timers extensions", + "author": "Mariusz Nowak (http://www.medikoo.com/)", + "repository": { + "type": "git", + "url": "git://github.com/medikoo/timers-ext.git" + }, + "keywords": [ + "timeout", + "delay", + "interval", + "time", + "timer", + "timers" + ], + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + }, + "devDependencies": { + "eslint": "^5.6.1", + "eslint-config-medikoo-es5": "^1.7.2", + "tad": "^0.2.8" + }, + "eslintConfig": { + "extends": "medikoo-es5", + "root": true, + "globals": { + "clearInterval": true, + "clearTimeout": true, + "setInterval": true, + "setTimeout": true + } + }, + "scripts": { + "lint": "eslint --ignore-path=.gitignore .", + "test": "node node_modules/tad/bin/tad" + }, + "license": "ISC" +} diff --git a/node_modules/timers-ext/promise/.eslintrc.json b/node_modules/timers-ext/promise/.eslintrc.json new file mode 100644 index 00000000..95a62429 --- /dev/null +++ b/node_modules/timers-ext/promise/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "globals": { "Promise": true } +} diff --git a/node_modules/timers-ext/promise/sleep.js b/node_modules/timers-ext/promise/sleep.js new file mode 100644 index 00000000..5e5c07a5 --- /dev/null +++ b/node_modules/timers-ext/promise/sleep.js @@ -0,0 +1,21 @@ +"use strict"; + +var isValue = require("es5-ext/object/is-value") + , isPromise = require("es5-ext/object/is-promise") + , nextTick = require("next-tick") + , ensureTimeout = require("../valid-timeout"); + +module.exports = function (/* timeout */) { + var Constructor = isPromise(this) ? this.constructor : Promise; + var timeout = arguments[0]; + if (isValue(timeout)) timeout = ensureTimeout(timeout); + return new Constructor(function (resolve) { + if (isValue(timeout)) { + setTimeout(function () { + resolve(); + }, timeout); + } else { + nextTick(resolve); + } + }); +}; diff --git a/node_modules/timers-ext/promise_/timeout.js b/node_modules/timers-ext/promise_/timeout.js new file mode 100644 index 00000000..cf1a5368 --- /dev/null +++ b/node_modules/timers-ext/promise_/timeout.js @@ -0,0 +1,43 @@ +"use strict"; + +var customError = require("es5-ext/error/custom") + , isValue = require("es5-ext/object/is-value") + , ensurePromise = require("es5-ext/object/ensure-promise") + , nextTick = require("next-tick") + , ensureTimeout = require("../valid-timeout"); + +module.exports = function (/* timeout */) { + ensurePromise(this); + var timeout = arguments[0]; + if (isValue(timeout)) timeout = ensureTimeout(timeout); + return new this.constructor( + function (resolve, reject) { + var isSettled = false, timeoutId; + var timeoutCallback = function () { + if (isSettled) return; + reject( + customError( + "Operation timeout (exceeded " + + (isValue(timeout) ? timeout + "ms" : "tick") + + ")", + "PROMISE_TIMEOUT" + ) + ); + }; + if (isValue(timeout)) timeoutId = setTimeout(timeoutCallback, timeout); + else nextTick(timeoutCallback); + this.then( + function (value) { + isSettled = true; + clearTimeout(timeoutId); + resolve(value); + }, + function (reason) { + isSettled = true; + clearTimeout(timeoutId); + reject(reason); + } + ); + }.bind(this) + ); +}; diff --git a/node_modules/timers-ext/test/.eslintrc.json b/node_modules/timers-ext/test/.eslintrc.json new file mode 100644 index 00000000..78875946 --- /dev/null +++ b/node_modules/timers-ext/test/.eslintrc.json @@ -0,0 +1,6 @@ +{ + "rules": { + "id-length": "off", + "no-shadow": "off" + } +} diff --git a/node_modules/timers-ext/test/delay.js b/node_modules/timers-ext/test/delay.js new file mode 100644 index 00000000..01f00c19 --- /dev/null +++ b/node_modules/timers-ext/test/delay.js @@ -0,0 +1,27 @@ +"use strict"; + +module.exports = function (t, a, d) { + var data + , count = 0 + , x = function (a, b, c) { + data = [this, a, b, c, ++count]; + } + , y = t(x, 200) + , z = {}; + + a(data, undefined, "Setup"); + y.call(z, 111, "foo", false); + a(data, undefined, "Immediately"); + setTimeout(function () { + a(data, undefined, "100ms"); + setTimeout(function () { + a.deep(data, [z, 111, "foo", false, 1], "250ms"); + data = null; + clearTimeout(y()); + setTimeout(function () { + a(data, null, "Clear"); + d(); + }, 300); + }, 150); + }, 100); +}; diff --git a/node_modules/timers-ext/test/max-timeout.js b/node_modules/timers-ext/test/max-timeout.js new file mode 100644 index 00000000..c0e7997a --- /dev/null +++ b/node_modules/timers-ext/test/max-timeout.js @@ -0,0 +1,13 @@ +"use strict"; + +module.exports = function (t, a, d) { + var invoked, id; + id = setTimeout(function () { + invoked = true; +}, t); + setTimeout(function () { + a(invoked, undefined); + clearTimeout(id); + d(); + }, 100); +}; diff --git a/node_modules/timers-ext/test/once.js b/node_modules/timers-ext/test/once.js new file mode 100644 index 00000000..afdbbf8b --- /dev/null +++ b/node_modules/timers-ext/test/once.js @@ -0,0 +1,42 @@ +"use strict"; + +module.exports = function (t, a, d) { + var called = 0, fn = t(function () { + ++called; +}); + + fn(); + fn(); + fn(); + setTimeout(function () { + a(called, 1); + + called = 0; + fn = t(function () { + ++called; +}, 50); + fn(); + fn(); + fn(); + + setTimeout(function () { + fn(); + fn(); + + setTimeout(function () { + fn(); + fn(); + + setTimeout(function () { + fn(); + fn(); + + setTimeout(function () { + a(called, 1); + d(); + }, 70); + }, 30); + }, 30); + }, 30); + }, 10); +}; diff --git a/node_modules/timers-ext/test/promise/sleep.js b/node_modules/timers-ext/test/promise/sleep.js new file mode 100644 index 00000000..1c7e796c --- /dev/null +++ b/node_modules/timers-ext/test/promise/sleep.js @@ -0,0 +1,34 @@ +"use strict"; + +var delay = require("../../delay"); + +module.exports = function (t, a) { + if (typeof Promise !== "function") return null; + return { + Tick: function (d) { + var isInvoked = false; + t().then(function (result) { + isInvoked = true; + delay(function () { + a(result, undefined); + d(); + })(); + }, delay(d)); + a(isInvoked, false); + }, + Timeout: function (d) { + var isInvoked = false; + t(100).then( + delay(function (result) { + isInvoked = true; + a(result, undefined); + d(); + }), + delay(d) + ); + setTimeout(function () { + a(isInvoked, false); + }, 50); + } + }; +}; diff --git a/node_modules/timers-ext/test/promise_/.eslintrc.json b/node_modules/timers-ext/test/promise_/.eslintrc.json new file mode 100644 index 00000000..95a62429 --- /dev/null +++ b/node_modules/timers-ext/test/promise_/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "globals": { "Promise": true } +} diff --git a/node_modules/timers-ext/test/promise_/timeout.js b/node_modules/timers-ext/test/promise_/timeout.js new file mode 100644 index 00000000..fd4333c7 --- /dev/null +++ b/node_modules/timers-ext/test/promise_/timeout.js @@ -0,0 +1,46 @@ +"use strict"; + +var delay = require("../../delay"); + +module.exports = function (t, a) { + if (typeof Promise !== "function") return null; + return { + Success: function (d) { + var promise = t.call( + new Promise(function (resolve) { + setTimeout(function () { resolve("foo"); }, 20); + }), + 40 + ); + + promise.then( + // Delay to escape error swallowing + delay(function (result) { + a(result, "foo"); + d(); + }), + delay(d) + ); + }, + Timeout: function (d) { + var promise = t.call( + new Promise(function (resolve) { + setTimeout(function () { resolve("foo"); }, 40); + }), + 20 + ); + + promise.then( + // Delay to escape error swallowing + delay(function () { + a.never(); + d(); + }), + delay(function (err) { + a(err.code, "PROMISE_TIMEOUT"); + d(); + }) + ); + } + }; +}; diff --git a/node_modules/timers-ext/test/throttle.js b/node_modules/timers-ext/test/throttle.js new file mode 100644 index 00000000..7a4f65f0 --- /dev/null +++ b/node_modules/timers-ext/test/throttle.js @@ -0,0 +1,41 @@ +"use strict"; + +module.exports = function (t, a, d) { + var called = 0; + var fn = t(function () { + ++called; + }, 200); + + fn(); + a(called, 1); + fn(); + fn(); + a(called, 1); + // Wait 120ms + setTimeout(function () { + a(called, 1); + fn(); + // Wait 120ms + setTimeout(function () { + a(called, 2); + fn(); + fn(); + + // Wait 80ms + setTimeout(function () { + a(called, 2); + + // Wait 120ms + setTimeout(function () { + a(called, 3); + + // Wait 400ms + setTimeout(function () { + a(called, 3); + d(); + }, 400); + }, 120); + }, 80); + }, 120); + }, 120); +}; diff --git a/node_modules/timers-ext/test/valid-timeout.js b/node_modules/timers-ext/test/valid-timeout.js new file mode 100644 index 00000000..01df6c97 --- /dev/null +++ b/node_modules/timers-ext/test/valid-timeout.js @@ -0,0 +1,10 @@ +"use strict"; + +module.exports = function (t, a) { + a(t(NaN), 0, "NaN"); + a(t(-343), 0, "Negative"); + a(t(232342), 232342, "Positive"); + a.throws(function () { + t(1e23); +}, TypeError, "Too large"); +}; diff --git a/node_modules/timers-ext/throttle.js b/node_modules/timers-ext/throttle.js new file mode 100644 index 00000000..16a18dad --- /dev/null +++ b/node_modules/timers-ext/throttle.js @@ -0,0 +1,33 @@ +"use strict"; + +var callable = require("es5-ext/object/valid-callable") + , validTimeout = require("./valid-timeout") + + , apply = Function.prototype.apply; + +module.exports = function (fn, timeout) { + var isScheduled = false, context, args, run; + callable(fn); + timeout = validTimeout(timeout); + run = function () { + var currentContext = context, currentArgs = args; + if (!args) { + isScheduled = false; + return; + } + context = null; + args = null; + setTimeout(run, timeout); + apply.call(fn, currentContext, currentArgs); + }; + return function () { + if (isScheduled) { + context = this; + args = arguments; + return; + } + isScheduled = true; + setTimeout(run, timeout); + apply.call(fn, this, arguments); + }; +}; diff --git a/node_modules/timers-ext/valid-timeout.js b/node_modules/timers-ext/valid-timeout.js new file mode 100644 index 00000000..8b7d0071 --- /dev/null +++ b/node_modules/timers-ext/valid-timeout.js @@ -0,0 +1,10 @@ +"use strict"; + +var toPosInt = require("es5-ext/number/to-pos-integer") + , maxTimeout = require("./max-timeout"); + +module.exports = function (value) { + value = toPosInt(value); + if (value > maxTimeout) throw new TypeError(value + " exceeds maximum possible timeout"); + return value; +}; diff --git a/node_modules/to-absolute-glob/LICENSE b/node_modules/to-absolute-glob/LICENSE new file mode 100644 index 00000000..65251717 --- /dev/null +++ b/node_modules/to-absolute-glob/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2016, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/to-absolute-glob/index.js b/node_modules/to-absolute-glob/index.js new file mode 100644 index 00000000..268fc478 --- /dev/null +++ b/node_modules/to-absolute-glob/index.js @@ -0,0 +1,70 @@ +'use strict'; + +var path = require('path'); +var isNegated = require('is-negated-glob'); +var isAbsolute = require('is-absolute'); + +module.exports = function(glob, options) { + // default options + var opts = options || {}; + + // ensure cwd is absolute + var cwd = path.resolve(opts.cwd ? opts.cwd : process.cwd()); + cwd = unixify(cwd); + + var rootDir = opts.root; + // if `options.root` is defined, ensure it's absolute + if (rootDir) { + rootDir = unixify(rootDir); + if (process.platform === 'win32' || !isAbsolute(rootDir)) { + rootDir = unixify(path.resolve(rootDir)); + } + } + + // trim starting ./ from glob patterns + if (glob.slice(0, 2) === './') { + glob = glob.slice(2); + } + + // when the glob pattern is only a . use an empty string + if (glob.length === 1 && glob === '.') { + glob = ''; + } + + // store last character before glob is modified + var suffix = glob.slice(-1); + + // check to see if glob is negated (and not a leading negated-extglob) + var ing = isNegated(glob); + glob = ing.pattern; + + // make glob absolute + if (rootDir && glob.charAt(0) === '/') { + glob = join(rootDir, glob); + } else if (!isAbsolute(glob) || glob.slice(0, 1) === '\\') { + glob = join(cwd, glob); + } + + // if glob had a trailing `/`, re-add it now in case it was removed + if (suffix === '/' && glob.slice(-1) !== '/') { + glob += '/'; + } + + // re-add leading `!` if it was removed + return ing.negated ? '!' + glob : glob; +}; + +function unixify(filepath) { + return filepath.replace(/\\/g, '/'); +} + +function join(dir, glob) { + if (dir.charAt(dir.length - 1) === '/') { + dir = dir.slice(0, -1); + } + if (glob.charAt(0) === '/') { + glob = glob.slice(1); + } + if (!glob) return dir; + return dir + '/' + glob; +} diff --git a/node_modules/to-absolute-glob/package.json b/node_modules/to-absolute-glob/package.json new file mode 100644 index 00000000..762ab5cd --- /dev/null +++ b/node_modules/to-absolute-glob/package.json @@ -0,0 +1,72 @@ +{ + "name": "to-absolute-glob", + "description": "Make a glob pattern absolute, ensuring that negative globs and patterns with trailing slashes are correctly handled.", + "version": "2.0.2", + "homepage": "https://github.com/jonschlinkert/to-absolute-glob", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Blaine Bublitz (https://twitter.com/BlaineBublitz)", + "Brian Woodward (https://github.com/doowb)", + "Erik Kemperman (https://github.com/erikkemperman)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "jonschlinkert/to-absolute-glob", + "bugs": { + "url": "https://github.com/jonschlinkert/to-absolute-glob/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "devDependencies": { + "gulp-format-md": "^0.1.11", + "mocha": "^3.0.2" + }, + "keywords": [ + "absolute", + "file", + "filepath", + "glob", + "negate", + "negative", + "path", + "pattern", + "resolve", + "to" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "related": { + "list": [ + "has-glob", + "is-glob", + "is-valid-glob" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ] + } +} diff --git a/node_modules/to-absolute-glob/readme.md b/node_modules/to-absolute-glob/readme.md new file mode 100644 index 00000000..d93fbeda --- /dev/null +++ b/node_modules/to-absolute-glob/readme.md @@ -0,0 +1,155 @@ +# to-absolute-glob [![NPM version](https://img.shields.io/npm/v/to-absolute-glob.svg?style=flat)](https://www.npmjs.com/package/to-absolute-glob) [![NPM downloads](https://img.shields.io/npm/dm/to-absolute-glob.svg?style=flat)](https://npmjs.org/package/to-absolute-glob) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/to-absolute-glob.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/to-absolute-glob) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/to-absolute-glob.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/to-absolute-glob) + +> Make a glob pattern absolute, ensuring that negative globs and patterns with trailing slashes are correctly handled. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save to-absolute-glob +``` + +## Usage + +```js +var toAbsGlob = require('to-absolute-glob'); +toAbsGlob('a/*.js'); +//=> '/dev/foo/a/*.js' +``` + +## Examples + +Given the current project folder (cwd) is `/dev/foo/`: + +**makes a path absolute** + +```js +toAbsGlob('a'); +//=> '/dev/foo/a' +``` + +**makes a glob absolute** + +```js +toAbsGlob('a/*.js'); +//=> '/dev/foo/a/*.js' +``` + +**retains trailing slashes** + +```js +toAbsGlob('a/*/'); +//=> '/dev/foo/a/*/' +``` + +**retains trailing slashes with cwd** + +```js +toAbsGlob('./fixtures/whatsgoingon/*/', {cwd: __dirname}); +//=> '/dev/foo/' +``` + +**makes a negative glob absolute** + +```js +toAbsGlob('!a/*.js'); +//=> '!/dev/foo/a/*.js' +``` + +**from a cwd** + +```js +toAbsGlob('a/*.js', {cwd: 'foo'}); +//=> '/dev/foo/foo/a/*.js' +``` + +**makes a negative glob absolute from a cwd** + +```js +toAbsGlob('!a/*.js', {cwd: 'foo'}); +//=> '!/dev/foo/foo/a/*.js' +``` + +**from a root path** + +```js +toAbsGlob('/a/*.js', {root: 'baz'}); +//=> '/dev/foo/baz/a/*.js' +``` + +**from a root slash** + +```js +toAbsGlob('/a/*.js', {root: '/'}); +//=> '/dev/foo/a/*.js' +``` + +**from a negative root path** + +```js +toAbsGlob('!/a/*.js', {root: 'baz'}); +//=> '!/dev/foo/baz/a/*.js' +``` + +**from a negative root slash** + +```js +toAbsGlob('!/a/*.js', {root: '/'}); +//=> '!/dev/foo/a/*.js' +``` + +## About + +### Related projects + +* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.") +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [is-valid-glob](https://www.npmjs.com/package/is-valid-glob): Return true if a value is a valid glob pattern or patterns. | [homepage](https://github.com/jonschlinkert/is-valid-glob "Return true if a value is a valid glob pattern or patterns.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor**
      | +| --- | --- | +| 16 | [doowb](https://github.com/doowb) | +| 15 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [phated](https://github.com/phated) | +| 1 | [erikkemperman](https://github.com/erikkemperman) | + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/to-absolute-glob/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.2.0, on October 17, 2016._ \ No newline at end of file diff --git a/node_modules/to-object-path/LICENSE b/node_modules/to-object-path/LICENSE new file mode 100644 index 00000000..1e49edf8 --- /dev/null +++ b/node_modules/to-object-path/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2016, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/to-object-path/README.md b/node_modules/to-object-path/README.md new file mode 100644 index 00000000..7f3cfb16 --- /dev/null +++ b/node_modules/to-object-path/README.md @@ -0,0 +1,71 @@ +# to-object-path [![NPM version](https://badge.fury.io/js/to-object-path.svg)](http://badge.fury.io/js/to-object-path) + +> Create an object path from a list or array of strings. + +## Install + +Install with [npm](https://www.npmjs.com/) + +```sh +$ npm i to-object-path --save +``` + +## Usage + +```js +var toPath = require('to-object-path'); + +toPath('foo', 'bar', 'baz'); +toPath('foo', ['bar', 'baz']); +//=> 'foo.bar.baz' +``` + +Also supports passing an arguments object (without having to slice args): + +```js +function foo() + return toPath(arguments); +} + +foo('foo', 'bar', 'baz'); +foo('foo', ['bar', 'baz']); +//=> 'foo.bar.baz' +``` + +Visit the [example](./example.js) to see how this could be used in an application. + +## Related projects + +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (` a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value) +* [has-value](https://www.npmjs.com/package/has-value): Returns true if a value exists, false if empty. Works with deeply nested values using… [more](https://www.npmjs.com/package/has-value) | [homepage](https://github.com/jonschlinkert/has-value) +* [omit-value](https://www.npmjs.com/package/omit-value): Omit properties from an object or deeply nested property of an object using object path… [more](https://www.npmjs.com/package/omit-value) | [homepage](https://github.com/jonschlinkert/omit-value) +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value) +* [unset-value](https://www.npmjs.com/package/unset-value): Delete nested properties from an object using dot notation. | [homepage](https://github.com/jonschlinkert/unset-value) + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/to-object-path/issues/new). + +## Author + +**Jon Schlinkert** + ++ [github/jonschlinkert](https://github.com/jonschlinkert) ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2015 Jon Schlinkert +Released under the MIT license. + +*** + +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on October 28, 2015._ \ No newline at end of file diff --git a/node_modules/to-object-path/index.js b/node_modules/to-object-path/index.js new file mode 100644 index 00000000..489f8f68 --- /dev/null +++ b/node_modules/to-object-path/index.js @@ -0,0 +1,33 @@ +/*! + * to-object-path + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var typeOf = require('kind-of'); + +module.exports = function toPath(args) { + if (typeOf(args) !== 'arguments') { + args = arguments; + } + return filter(args).join('.'); +}; + +function filter(arr) { + var len = arr.length; + var idx = -1; + var res = []; + + while (++idx < len) { + var ele = arr[idx]; + if (typeOf(ele) === 'arguments' || Array.isArray(ele)) { + res.push.apply(res, filter(ele)); + } else if (typeof ele === 'string') { + res.push(ele); + } + } + return res; +} diff --git a/node_modules/to-object-path/package.json b/node_modules/to-object-path/package.json new file mode 100644 index 00000000..2fe341b7 --- /dev/null +++ b/node_modules/to-object-path/package.json @@ -0,0 +1,48 @@ +{ + "name": "to-object-path", + "description": "Create an object path from a list or array of strings.", + "version": "0.3.0", + "homepage": "https://github.com/jonschlinkert/to-object-path", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/to-object-path", + "bugs": { + "url": "https://github.com/jonschlinkert/to-object-path/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "kind-of": "^3.0.2" + }, + "devDependencies": { + "base": "^0.6.7", + "mocha": "*" + }, + "keywords": [ + "dot", + "nested", + "notation", + "object", + "path", + "stringify" + ], + "verb": { + "related": { + "list": [ + "get-value", + "set-value", + "has-value", + "omit-value", + "unset-value" + ] + } + } +} diff --git a/node_modules/to-regex-range/LICENSE b/node_modules/to-regex-range/LICENSE new file mode 100644 index 00000000..83b56e70 --- /dev/null +++ b/node_modules/to-regex-range/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/to-regex-range/README.md b/node_modules/to-regex-range/README.md new file mode 100644 index 00000000..2763c5ae --- /dev/null +++ b/node_modules/to-regex-range/README.md @@ -0,0 +1,281 @@ +# to-regex-range [![NPM version](https://img.shields.io/npm/v/to-regex-range.svg?style=flat)](https://www.npmjs.com/package/to-regex-range) [![NPM monthly downloads](https://img.shields.io/npm/dm/to-regex-range.svg?style=flat)](https://npmjs.org/package/to-regex-range) [![NPM total downloads](https://img.shields.io/npm/dt/to-regex-range.svg?style=flat)](https://npmjs.org/package/to-regex-range) [![Linux Build Status](https://img.shields.io/travis/micromatch/to-regex-range.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/to-regex-range) + +> Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save to-regex-range +``` + +Install with [yarn](https://yarnpkg.com): + +```sh +$ yarn add to-regex-range +``` + +
      +What does this do? + +
      + +This libary generates the `source` string to be passed to `new RegExp()` for matching a range of numbers. + +**Example** + +```js +var toRegexRange = require('to-regex-range'); +var regex = new RegExp(toRegexRange('15', '95')); +``` + +A string is returned so that you can do whatever you need with it before passing it to `new RegExp()` (like adding `^` or `$` boundaries, defining flags, or combining it another string). + +
      + +
      + +
      +Why use this library? + +
      + +### Convenience + +Creating regular expressions for matching numbers gets deceptively complicated pretty fast. + +For example, let's say you need a validation regex for matching part of a user-id, postal code, social security number, tax id, etc: + +* regex for matching `1` => `/1/` (easy enough) +* regex for matching `1` through `5` => `/[1-5]/` (not bad...) +* regex for matching `1` or `5` => `/(1|5)/` (still easy...) +* regex for matching `1` through `50` => `/([1-9]|[1-4][0-9]|50)/` (uh-oh...) +* regex for matching `1` through `55` => `/([1-9]|[1-4][0-9]|5[0-5])/` (no prob, I can do this...) +* regex for matching `1` through `555` => `/([1-9]|[1-9][0-9]|[1-4][0-9]{2}|5[0-4][0-9]|55[0-5])/` (maybe not...) +* regex for matching `0001` through `5555` => `/(0{3}[1-9]|0{2}[1-9][0-9]|0[1-9][0-9]{2}|[1-4][0-9]{3}|5[0-4][0-9]{2}|55[0-4][0-9]|555[0-5])/` (okay, I get the point!) + +The numbers are contrived, but they're also really basic. In the real world you might need to generate a regex on-the-fly for validation. + +**Learn more** + +If you're interested in learning more about [character classes](http://www.regular-expressions.info/charclass.html) and other regex features, I personally have always found [regular-expressions.info](http://www.regular-expressions.info/charclass.html) to be pretty useful. + +### Heavily tested + +As of April 27, 2017, this library runs [2,783,483 test assertions](./test/test.js) against generated regex-ranges to provide brute-force verification that results are indeed correct. + +Tests run in ~870ms on my MacBook Pro, 2.5 GHz Intel Core i7. + +### Highly optimized + +Generated regular expressions are highly optimized: + +* duplicate sequences and character classes are reduced using quantifiers +* smart enough to use `?` conditionals when number(s) or range(s) can be positive or negative +* uses fragment caching to avoid processing the same exact string more than once + +
      + +
      + +## Usage + +Add this library to your javascript application with the following line of code + +```js +var toRegexRange = require('to-regex-range'); +``` + +The main export is a function that takes two integers: the `min` value and `max` value (formatted as strings or numbers). + +```js +var source = toRegexRange('15', '95'); +//=> 1[5-9]|[2-8][0-9]|9[0-5] + +var re = new RegExp('^' + source + '$'); +console.log(re.test('14')); //=> false +console.log(re.test('50')); //=> true +console.log(re.test('94')); //=> true +console.log(re.test('96')); //=> false +``` + +## Options + +### options.capture + +**Type**: `boolean` + +**Deafault**: `undefined` + +Wrap the returned value in parentheses when there is more than one regex condition. Useful when you're dynamically generating ranges. + +```js +console.log(toRegexRange('-10', '10')); +//=> -[1-9]|-?10|[0-9] + +console.log(toRegexRange('-10', '10', {capture: true})); +//=> (-[1-9]|-?10|[0-9]) +``` + +### options.shorthand + +**Type**: `boolean` + +**Deafault**: `undefined` + +Use the regex shorthand for `[0-9]`: + +```js +console.log(toRegexRange('0', '999999')); +//=> [0-9]|[1-9][0-9]{1,5} + +console.log(toRegexRange('0', '999999', {shorthand: true})); +//=> \d|[1-9]\d{1,5} +``` + +### options.relaxZeros + +**Type**: `boolean` + +**Default**: `true` + +This option only applies to **negative zero-padded ranges**. By default, when a negative zero-padded range is defined, the number of leading zeros is relaxed using `-0*`. + +```js +console.log(toRegexRange('-001', '100')); +//=> -0*1|0{2}[0-9]|0[1-9][0-9]|100 + +console.log(toRegexRange('-001', '100', {relaxZeros: false})); +//=> -0{2}1|0{2}[0-9]|0[1-9][0-9]|100 +``` + +
      +Why are zeros relaxed for negative zero-padded ranges by default? + +Consider the following. + +```js +var regex = toRegexRange('-001', '100'); +``` + +_Note that `-001` and `100` are both three digits long_. + +In most zero-padding implementations, only a single leading zero is enough to indicate that zero-padding should be applied. Thus, the leading zeros would be "corrected" on the negative range in the example to `-01`, instead of `-001`, to make total length of each string no greater than the length of the largest number in the range (in other words, `-001` is 4 digits, but `100` is only three digits). + +If zeros were not relaxed by default, you might expect the resulting regex of the above pattern to match `-001` - given that it's defined that way in the arguments - _but it wouldn't_. It would, however, match `-01`. This gets even more ambiguous with large ranges, like `-01` to `1000000`. + +Thus, we relax zeros by default to provide a more predictable experience for users. + +
      + +## Examples + +| **Range** | **Result** | **Compile time** | +| --- | --- | --- | +| `toRegexRange('5, 5')` | `5` | _33μs_ | +| `toRegexRange('5, 6')` | `5\|6` | _53μs_ | +| `toRegexRange('29, 51')` | `29\|[34][0-9]\|5[01]` | _699μs_ | +| `toRegexRange('31, 877')` | `3[1-9]\|[4-9][0-9]\|[1-7][0-9]{2}\|8[0-6][0-9]\|87[0-7]` | _711μs_ | +| `toRegexRange('111, 555')` | `11[1-9]\|1[2-9][0-9]\|[2-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]` | _62μs_ | +| `toRegexRange('-10, 10')` | `-[1-9]\|-?10\|[0-9]` | _74μs_ | +| `toRegexRange('-100, -10')` | `-1[0-9]\|-[2-9][0-9]\|-100` | _49μs_ | +| `toRegexRange('-100, 100')` | `-[1-9]\|-?[1-9][0-9]\|-?100\|[0-9]` | _45μs_ | +| `toRegexRange('001, 100')` | `0{2}[1-9]\|0[1-9][0-9]\|100` | _158μs_ | +| `toRegexRange('0010, 1000')` | `0{2}1[0-9]\|0{2}[2-9][0-9]\|0[1-9][0-9]{2}\|1000` | _61μs_ | +| `toRegexRange('1, 2')` | `1\|2` | _10μs_ | +| `toRegexRange('1, 5')` | `[1-5]` | _24μs_ | +| `toRegexRange('1, 10')` | `[1-9]\|10` | _23μs_ | +| `toRegexRange('1, 100')` | `[1-9]\|[1-9][0-9]\|100` | _30μs_ | +| `toRegexRange('1, 1000')` | `[1-9]\|[1-9][0-9]{1,2}\|1000` | _52μs_ | +| `toRegexRange('1, 10000')` | `[1-9]\|[1-9][0-9]{1,3}\|10000` | _47μs_ | +| `toRegexRange('1, 100000')` | `[1-9]\|[1-9][0-9]{1,4}\|100000` | _44μs_ | +| `toRegexRange('1, 1000000')` | `[1-9]\|[1-9][0-9]{1,5}\|1000000` | _49μs_ | +| `toRegexRange('1, 10000000')` | `[1-9]\|[1-9][0-9]{1,6}\|10000000` | _63μs_ | + +## Heads up! + +**Order of arguments** + +When the `min` is larger than the `max`, values will be flipped to create a valid range: + +```js +toRegexRange('51', '29'); +``` + +Is effectively flipped to: + +```js +toRegexRange('29', '51'); +//=> 29|[3-4][0-9]|5[0-1] +``` + +**Steps / increments** + +This library does not support steps (increments). A pr to add support would be welcome. + +## History + +### v2.0.0 - 2017-04-21 + +**New features** + +Adds support for zero-padding! + +### v1.0.0 + +**Optimizations** + +Repeating ranges are now grouped using quantifiers. rocessing time is roughly the same, but the generated regex is much smaller, which should result in faster matching. + +## Attribution + +Inspired by the python library [range-regex](https://github.com/dimka665/range-regex). + +## About + +### Related projects + +* [expand-range](https://www.npmjs.com/package/expand-range): Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. See… [more](https://github.com/jonschlinkert/expand-range) | [homepage](https://github.com/jonschlinkert/expand-range "Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. See the benchmarks. Used by micromatch.") +* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or `step` to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`") +* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.") +* [repeat-element](https://www.npmjs.com/package/repeat-element): Create an array by repeating the given value n times. | [homepage](https://github.com/jonschlinkert/repeat-element "Create an array by repeating the given value n times.") +* [repeat-string](https://www.npmjs.com/package/repeat-string): Repeat the given string n times. Fastest implementation for repeating a string. | [homepage](https://github.com/jonschlinkert/repeat-string "Repeat the given string n times. Fastest implementation for repeating a string.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on April 27, 2017._ \ No newline at end of file diff --git a/node_modules/to-regex-range/index.js b/node_modules/to-regex-range/index.js new file mode 100644 index 00000000..7bb5a743 --- /dev/null +++ b/node_modules/to-regex-range/index.js @@ -0,0 +1,294 @@ +/*! + * to-regex-range + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var repeat = require('repeat-string'); +var isNumber = require('is-number'); +var cache = {}; + +function toRegexRange(min, max, options) { + if (isNumber(min) === false) { + throw new RangeError('toRegexRange: first argument is invalid.'); + } + + if (typeof max === 'undefined' || min === max) { + return String(min); + } + + if (isNumber(max) === false) { + throw new RangeError('toRegexRange: second argument is invalid.'); + } + + options = options || {}; + var relax = String(options.relaxZeros); + var shorthand = String(options.shorthand); + var capture = String(options.capture); + var key = min + ':' + max + '=' + relax + shorthand + capture; + if (cache.hasOwnProperty(key)) { + return cache[key].result; + } + + var a = Math.min(min, max); + var b = Math.max(min, max); + + if (Math.abs(a - b) === 1) { + var result = min + '|' + max; + if (options.capture) { + return '(' + result + ')'; + } + return result; + } + + var isPadded = padding(min) || padding(max); + var positives = []; + var negatives = []; + + var tok = {min: min, max: max, a: a, b: b}; + if (isPadded) { + tok.isPadded = isPadded; + tok.maxLen = String(tok.max).length; + } + + if (a < 0) { + var newMin = b < 0 ? Math.abs(b) : 1; + var newMax = Math.abs(a); + negatives = splitToPatterns(newMin, newMax, tok, options); + a = tok.a = 0; + } + + if (b >= 0) { + positives = splitToPatterns(a, b, tok, options); + } + + tok.negatives = negatives; + tok.positives = positives; + tok.result = siftPatterns(negatives, positives, options); + + if (options.capture && (positives.length + negatives.length) > 1) { + tok.result = '(' + tok.result + ')'; + } + + cache[key] = tok; + return tok.result; +} + +function siftPatterns(neg, pos, options) { + var onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; + var onlyPositive = filterPatterns(pos, neg, '', false, options) || []; + var intersected = filterPatterns(neg, pos, '-?', true, options) || []; + var subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); + return subpatterns.join('|'); +} + +function splitToRanges(min, max) { + min = Number(min); + max = Number(max); + + var nines = 1; + var stops = [max]; + var stop = +countNines(min, nines); + + while (min <= stop && stop <= max) { + stops = push(stops, stop); + nines += 1; + stop = +countNines(min, nines); + } + + var zeros = 1; + stop = countZeros(max + 1, zeros) - 1; + + while (min < stop && stop <= max) { + stops = push(stops, stop); + zeros += 1; + stop = countZeros(max + 1, zeros) - 1; + } + + stops.sort(compare); + return stops; +} + +/** + * Convert a range to a regex pattern + * @param {Number} `start` + * @param {Number} `stop` + * @return {String} + */ + +function rangeToPattern(start, stop, options) { + if (start === stop) { + return {pattern: String(start), digits: []}; + } + + var zipped = zip(String(start), String(stop)); + var len = zipped.length, i = -1; + + var pattern = ''; + var digits = 0; + + while (++i < len) { + var numbers = zipped[i]; + var startDigit = numbers[0]; + var stopDigit = numbers[1]; + + if (startDigit === stopDigit) { + pattern += startDigit; + + } else if (startDigit !== '0' || stopDigit !== '9') { + pattern += toCharacterClass(startDigit, stopDigit); + + } else { + digits += 1; + } + } + + if (digits) { + pattern += options.shorthand ? '\\d' : '[0-9]'; + } + + return { pattern: pattern, digits: [digits] }; +} + +function splitToPatterns(min, max, tok, options) { + var ranges = splitToRanges(min, max); + var len = ranges.length; + var idx = -1; + + var tokens = []; + var start = min; + var prev; + + while (++idx < len) { + var range = ranges[idx]; + var obj = rangeToPattern(start, range, options); + var zeros = ''; + + if (!tok.isPadded && prev && prev.pattern === obj.pattern) { + if (prev.digits.length > 1) { + prev.digits.pop(); + } + prev.digits.push(obj.digits[0]); + prev.string = prev.pattern + toQuantifier(prev.digits); + start = range + 1; + continue; + } + + if (tok.isPadded) { + zeros = padZeros(range, tok); + } + + obj.string = zeros + obj.pattern + toQuantifier(obj.digits); + tokens.push(obj); + start = range + 1; + prev = obj; + } + + return tokens; +} + +function filterPatterns(arr, comparison, prefix, intersection, options) { + var res = []; + + for (var i = 0; i < arr.length; i++) { + var tok = arr[i]; + var ele = tok.string; + + if (options.relaxZeros !== false) { + if (prefix === '-' && ele.charAt(0) === '0') { + if (ele.charAt(1) === '{') { + ele = '0*' + ele.replace(/^0\{\d+\}/, ''); + } else { + ele = '0*' + ele.slice(1); + } + } + } + + if (!intersection && !contains(comparison, 'string', ele)) { + res.push(prefix + ele); + } + + if (intersection && contains(comparison, 'string', ele)) { + res.push(prefix + ele); + } + } + return res; +} + +/** + * Zip strings (`for in` can be used on string characters) + */ + +function zip(a, b) { + var arr = []; + for (var ch in a) arr.push([a[ch], b[ch]]); + return arr; +} + +function compare(a, b) { + return a > b ? 1 : b > a ? -1 : 0; +} + +function push(arr, ele) { + if (arr.indexOf(ele) === -1) arr.push(ele); + return arr; +} + +function contains(arr, key, val) { + for (var i = 0; i < arr.length; i++) { + if (arr[i][key] === val) { + return true; + } + } + return false; +} + +function countNines(min, len) { + return String(min).slice(0, -len) + repeat('9', len); +} + +function countZeros(integer, zeros) { + return integer - (integer % Math.pow(10, zeros)); +} + +function toQuantifier(digits) { + var start = digits[0]; + var stop = digits[1] ? (',' + digits[1]) : ''; + if (!stop && (!start || start === 1)) { + return ''; + } + return '{' + start + stop + '}'; +} + +function toCharacterClass(a, b) { + return '[' + a + ((b - a === 1) ? '' : '-') + b + ']'; +} + +function padding(str) { + return /^-?(0+)\d/.exec(str); +} + +function padZeros(val, tok) { + if (tok.isPadded) { + var diff = Math.abs(tok.maxLen - String(val).length); + switch (diff) { + case 0: + return ''; + case 1: + return '0'; + default: { + return '0{' + diff + '}'; + } + } + } + return val; +} + +/** + * Expose `toRegexRange` + */ + +module.exports = toRegexRange; diff --git a/node_modules/to-regex-range/package.json b/node_modules/to-regex-range/package.json new file mode 100644 index 00000000..6c8e6b1c --- /dev/null +++ b/node_modules/to-regex-range/package.json @@ -0,0 +1,86 @@ +{ + "name": "to-regex-range", + "description": "Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions.", + "version": "2.1.1", + "homepage": "https://github.com/micromatch/to-regex-range", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "micromatch/to-regex-range", + "bugs": { + "url": "https://github.com/micromatch/to-regex-range/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "devDependencies": { + "fill-range": "^3.1.1", + "gulp-format-md": "^0.1.12", + "mocha": "^3.2.0", + "text-table": "^0.2.0", + "time-diff": "^0.3.1" + }, + "keywords": [ + "alpha", + "alphabetical", + "bash", + "brace", + "date", + "expand", + "expansion", + "glob", + "match", + "matches", + "matching", + "number", + "numerical", + "range", + "ranges", + "regex", + "sequence", + "sh", + "to", + "year" + ], + "verb": { + "related": { + "list": [ + "expand-range", + "fill-range", + "micromatch", + "repeat-element", + "repeat-string" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "helpers": [ + "./examples.js" + ], + "reflinks": [ + "0-5", + "0-9", + "1-5", + "1-9" + ] + } +} diff --git a/node_modules/to-regex/LICENSE b/node_modules/to-regex/LICENSE new file mode 100644 index 00000000..7c9987bc --- /dev/null +++ b/node_modules/to-regex/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016-2018, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/to-regex/README.md b/node_modules/to-regex/README.md new file mode 100644 index 00000000..5a28fc33 --- /dev/null +++ b/node_modules/to-regex/README.md @@ -0,0 +1,205 @@ +# to-regex [![NPM version](https://img.shields.io/npm/v/to-regex.svg?style=flat)](https://www.npmjs.com/package/to-regex) [![NPM monthly downloads](https://img.shields.io/npm/dm/to-regex.svg?style=flat)](https://npmjs.org/package/to-regex) [![NPM total downloads](https://img.shields.io/npm/dt/to-regex.svg?style=flat)](https://npmjs.org/package/to-regex) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/to-regex.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/to-regex) + +> Generate a regex from a string or array of strings. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +- [Install](#install) +- [Usage](#usage) +- [Options](#options) + * [options.contains](#optionscontains) + * [options.negate](#optionsnegate) + * [options.nocase](#optionsnocase) + * [options.flags](#optionsflags) + * [options.cache](#optionscache) + * [options.safe](#optionssafe) +- [About](#about) + * [Related projects](#related-projects) + * [Author](#author) + * [License](#license) + +_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_ + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save to-regex +``` + +## Usage + +```js +var toRegex = require('to-regex'); + +console.log(toRegex('foo')); +//=> /^(?:foo)$/ + +console.log(toRegex('foo', {negate: true})); +//=> /^(?:(?:(?!^(?:foo)$).)*)$/ + +console.log(toRegex('foo', {contains: true})); +//=> /(?:foo)/ + +console.log(toRegex(['foo', 'bar'], {negate: true})); +//=> /^(?:(?:(?!^(?:(?:foo)|(?:bar))$).)*)$/ + +console.log(toRegex(['foo', 'bar'], {negate: true, contains: true})); +//=> /^(?:(?:(?!(?:(?:foo)|(?:bar))).)*)$/ +``` + +## Options + +### options.contains + +**Type**: `Boolean` + +**Default**: `undefined` + +Generate a regex that will match any string that _contains_ the given pattern. By default, regex is strict will only return true for exact matches. + +```js +var toRegex = require('to-regex'); +console.log(toRegex('foo', {contains: true})); +//=> /(?:foo)/ +``` + +### options.negate + +**Type**: `Boolean` + +**Default**: `undefined` + +Create a regex that will match everything except the given pattern. + +```js +var toRegex = require('to-regex'); +console.log(toRegex('foo', {negate: true})); +//=> /^(?:(?:(?!^(?:foo)$).)*)$/ +``` + +### options.nocase + +**Type**: `Boolean` + +**Default**: `undefined` + +Adds the `i` flag, to enable case-insensitive matching. + +```js +var toRegex = require('to-regex'); +console.log(toRegex('foo', {nocase: true})); +//=> /^(?:foo)$/i +``` + +Alternatively you can pass the flags you want directly on [options.flags](#options.flags). + +### options.flags + +**Type**: `String` + +**Default**: `undefined` + +Define the flags you want to use on the generated regex. + +```js +var toRegex = require('to-regex'); +console.log(toRegex('foo', {flags: 'gm'})); +//=> /^(?:foo)$/gm +console.log(toRegex('foo', {flags: 'gmi', nocase: true})); //<= handles redundancy +//=> /^(?:foo)$/gmi +``` + +### options.cache + +**Type**: `Boolean` + +**Default**: `true` + +Generated regex is cached based on the provided string and options. As a result, runtime compilation only happens once per pattern (as long as options are also the same), which can result in dramatic speed improvements. + +This also helps with debugging, since adding options and pattern are added to the generated regex. + +**Disable caching** + +```js +toRegex('foo', {cache: false}); +``` + +### options.safe + +**Type**: `Boolean` + +**Default**: `undefined` + +Check the generated regular expression with [safe-regex](https://github.com/substack/safe-regex) and throw an error if the regex is potentially unsafe. + +**Examples** + +```js +console.log(toRegex('(x+x+)+y')); +//=> /^(?:(x+x+)+y)$/ + +// The following would throw an error +toRegex('(x+x+)+y', {safe: true}); +``` + +## About + +
      +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
      + +
      +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
      + +
      +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
      + +### Related projects + +You might also be interested in these projects: + +* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.") +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [path-regex](https://www.npmjs.com/package/path-regex): Regular expression for matching the parts of a file path. | [homepage](https://github.com/regexps/path-regex "Regular expression for matching the parts of a file path.") +* [to-regex-range](https://www.npmjs.com/package/to-regex-range): Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than… [more](https://github.com/micromatch/to-regex-range) | [homepage](https://github.com/micromatch/to-regex-range "Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions.") + +### Author + +**Jon Schlinkert** + +* [linkedin/in/jonschlinkert](https://linkedin.com/in/jonschlinkert) +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on February 24, 2018._ \ No newline at end of file diff --git a/node_modules/to-regex/index.js b/node_modules/to-regex/index.js new file mode 100644 index 00000000..a87d0159 --- /dev/null +++ b/node_modules/to-regex/index.js @@ -0,0 +1,155 @@ +'use strict'; + +var safe = require('safe-regex'); +var define = require('define-property'); +var extend = require('extend-shallow'); +var not = require('regex-not'); +var MAX_LENGTH = 1024 * 64; + +/** + * Session cache + */ + +var cache = {}; + +/** + * Create a regular expression from the given `pattern` string. + * + * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +module.exports = function(patterns, options) { + if (!Array.isArray(patterns)) { + return makeRe(patterns, options); + } + return makeRe(patterns.join('|'), options); +}; + +/** + * Create a regular expression from the given `pattern` string. + * + * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +function makeRe(pattern, options) { + if (pattern instanceof RegExp) { + return pattern; + } + + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + if (pattern.length > MAX_LENGTH) { + throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); + } + + var key = pattern; + // do this before shallow cloning options, it's a lot faster + if (!options || (options && options.cache !== false)) { + key = createKey(pattern, options); + + if (cache.hasOwnProperty(key)) { + return cache[key]; + } + } + + var opts = extend({}, options); + if (opts.contains === true) { + if (opts.negate === true) { + opts.strictNegate = false; + } else { + opts.strict = false; + } + } + + if (opts.strict === false) { + opts.strictOpen = false; + opts.strictClose = false; + } + + var open = opts.strictOpen !== false ? '^' : ''; + var close = opts.strictClose !== false ? '$' : ''; + var flags = opts.flags || ''; + var regex; + + if (opts.nocase === true && !/i/.test(flags)) { + flags += 'i'; + } + + try { + if (opts.negate || typeof opts.strictNegate === 'boolean') { + pattern = not.create(pattern, opts); + } + + var str = open + '(?:' + pattern + ')' + close; + regex = new RegExp(str, flags); + + if (opts.safe === true && safe(regex) === false) { + throw new Error('potentially unsafe regular expression: ' + regex.source); + } + + } catch (err) { + if (opts.strictErrors === true || opts.safe === true) { + err.key = key; + err.pattern = pattern; + err.originalOptions = options; + err.createdOptions = opts; + throw err; + } + + try { + regex = new RegExp('^' + pattern.replace(/(\W)/g, '\\$1') + '$'); + } catch (err) { + regex = /.^/; //<= match nothing + } + } + + if (opts.cache !== false) { + memoize(regex, key, pattern, opts); + } + return regex; +} + +/** + * Memoize generated regex. This can result in dramatic speed improvements + * and simplify debugging by adding options and pattern to the regex. It can be + * disabled by passing setting `options.cache` to false. + */ + +function memoize(regex, key, pattern, options) { + define(regex, 'cached', true); + define(regex, 'pattern', pattern); + define(regex, 'options', options); + define(regex, 'key', key); + cache[key] = regex; +} + +/** + * Create the key to use for memoization. The key is generated + * by iterating over the options and concatenating key-value pairs + * to the pattern string. + */ + +function createKey(pattern, options) { + if (!options) return pattern; + var key = pattern; + for (var prop in options) { + if (options.hasOwnProperty(prop)) { + key += ';' + prop + '=' + String(options[prop]); + } + } + return key; +} + +/** + * Expose `makeRe` + */ + +module.exports.makeRe = makeRe; diff --git a/node_modules/to-regex/node_modules/define-property/CHANGELOG.md b/node_modules/to-regex/node_modules/define-property/CHANGELOG.md new file mode 100644 index 00000000..901c8aae --- /dev/null +++ b/node_modules/to-regex/node_modules/define-property/CHANGELOG.md @@ -0,0 +1,82 @@ +# Release history + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +
      + Guiding Principles + +- Changelogs are for humans, not machines. +- There should be an entry for every single version. +- The same types of changes should be grouped. +- Versions and sections should be linkable. +- The latest version comes first. +- The release date of each versions is displayed. +- Mention whether you follow Semantic Versioning. + +
      + +
      + Types of changes + +Changelog entries are classified using the following labels _(from [keep-a-changelog](http://keepachangelog.com/)_): + +- `Added` for new features. +- `Changed` for changes in existing functionality. +- `Deprecated` for soon-to-be removed features. +- `Removed` for now removed features. +- `Fixed` for any bug fixes. +- `Security` in case of vulnerabilities. + +
      + +## [2.0.0] - 2017-04-20 + +### Changed + +- Now supports data descriptors in addition to accessor descriptors. +- Now uses [Reflect.defineProperty][reflect] when available, otherwise falls back to [Object.defineProperty][object]. + +## [1.0.0] - 2017-04-20 + +- stable release + +## [0.2.5] - 2015-08-31 + +- use is-descriptor + +## [0.2.3] - 2015-08-29 + +- check keys length + +## [0.2.2] - 2015-08-27 + +- ensure val is an object + +## [0.2.1] - 2015-08-27 + +- support functions + +## [0.2.0] - 2015-08-27 + +- support get/set +- update docs + +## [0.1.0] - 2015-08-12 + +- first commit + +[2.0.0]: https://github.com/jonschlinkert/define-property/compare/1.0.0...2.0.0 +[1.0.0]: https://github.com/jonschlinkert/define-property/compare/0.2.5...1.0.0 +[0.2.5]: https://github.com/jonschlinkert/define-property/compare/0.2.3...0.2.5 +[0.2.3]: https://github.com/jonschlinkert/define-property/compare/0.2.2...0.2.3 +[0.2.2]: https://github.com/jonschlinkert/define-property/compare/0.2.1...0.2.2 +[0.2.1]: https://github.com/jonschlinkert/define-property/compare/0.2.0...0.2.1 +[0.2.0]: https://github.com/jonschlinkert/define-property/compare/0.1.3...0.2.0 + +[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog + +[object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty +[reflect]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty diff --git a/node_modules/to-regex/node_modules/define-property/LICENSE b/node_modules/to-regex/node_modules/define-property/LICENSE new file mode 100644 index 00000000..f8de0630 --- /dev/null +++ b/node_modules/to-regex/node_modules/define-property/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2018, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/to-regex/node_modules/define-property/README.md b/node_modules/to-regex/node_modules/define-property/README.md new file mode 100644 index 00000000..f1ee8f92 --- /dev/null +++ b/node_modules/to-regex/node_modules/define-property/README.md @@ -0,0 +1,117 @@ +# define-property [![NPM version](https://img.shields.io/npm/v/define-property.svg?style=flat)](https://www.npmjs.com/package/define-property) [![NPM monthly downloads](https://img.shields.io/npm/dm/define-property.svg?style=flat)](https://npmjs.org/package/define-property) [![NPM total downloads](https://img.shields.io/npm/dt/define-property.svg?style=flat)](https://npmjs.org/package/define-property) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/define-property.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/define-property) + +> Define a non-enumerable property on an object. Uses Reflect.defineProperty when available, otherwise Object.defineProperty. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save define-property +``` + +## Release history + +See [the CHANGELOG](changelog.md) for updates. + +## Usage + +**Params** + +* `object`: The object on which to define the property. +* `key`: The name of the property to be defined or modified. +* `value`: The value or descriptor of the property being defined or modified. + +```js +var define = require('define-property'); +var obj = {}; +define(obj, 'foo', function(val) { + return val.toUpperCase(); +}); + +// by default, defined properties are non-enumberable +console.log(obj); +//=> {} + +console.log(obj.foo('bar')); +//=> 'BAR' +``` + +**defining setters/getters** + +Pass the same properties you would if using [Object.defineProperty](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) or [Reflect.defineProperty](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty). + +```js +define(obj, 'foo', { + set: function() {}, + get: function() {} +}); +``` + +## About + +
      +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
      + +
      +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
      + +
      +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
      + +### Related projects + +You might also be interested in these projects: + +* [assign-deep](https://www.npmjs.com/package/assign-deep): Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target… [more](https://github.com/jonschlinkert/assign-deep) | [homepage](https://github.com/jonschlinkert/assign-deep "Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target (first) object.") +* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow "Extend an object with the properties of additional objects. node.js/javascript util.") +* [merge-deep](https://www.npmjs.com/package/merge-deep): Recursively merge values in a javascript object. | [homepage](https://github.com/jonschlinkert/merge-deep "Recursively merge values in a javascript object.") +* [mixin-deep](https://www.npmjs.com/package/mixin-deep): Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone. | [homepage](https://github.com/jonschlinkert/mixin-deep "Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 28 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [doowb](https://github.com/doowb) | + +### Author + +**Jon Schlinkert** + +* Connect with me on [linkedin/in/jonschlinkert](https://linkedin.com/in/jonschlinkert) +* Follow me on [github/jonschlinkert](https://github.com/jonschlinkert) +* Follow me on [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on January 25, 2018._ \ No newline at end of file diff --git a/node_modules/to-regex/node_modules/define-property/index.js b/node_modules/to-regex/node_modules/define-property/index.js new file mode 100644 index 00000000..0efa0a9e --- /dev/null +++ b/node_modules/to-regex/node_modules/define-property/index.js @@ -0,0 +1,38 @@ +/*! + * define-property + * + * Copyright (c) 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isobject = require('isobject'); +var isDescriptor = require('is-descriptor'); +var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) + ? Reflect.defineProperty + : Object.defineProperty; + +module.exports = function defineProperty(obj, key, val) { + if (!isobject(obj) && typeof obj !== 'function' && !Array.isArray(obj)) { + throw new TypeError('expected an object, function, or array'); + } + + if (typeof key !== 'string') { + throw new TypeError('expected "key" to be a string'); + } + + if (isDescriptor(val)) { + define(obj, key, val); + return obj; + } + + define(obj, key, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); + + return obj; +}; diff --git a/node_modules/to-regex/node_modules/define-property/package.json b/node_modules/to-regex/node_modules/define-property/package.json new file mode 100644 index 00000000..f8fd21cb --- /dev/null +++ b/node_modules/to-regex/node_modules/define-property/package.json @@ -0,0 +1,67 @@ +{ + "name": "define-property", + "description": "Define a non-enumerable property on an object. Uses Reflect.defineProperty when available, otherwise Object.defineProperty.", + "version": "2.0.2", + "homepage": "https://github.com/jonschlinkert/define-property", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "jonschlinkert/define-property", + "bugs": { + "url": "https://github.com/jonschlinkert/define-property/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "keywords": [ + "define", + "define-property", + "enumerable", + "key", + "non", + "non-enumerable", + "object", + "prop", + "property", + "value" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "assign-deep", + "extend-shallow", + "merge-deep", + "mixin-deep" + ] + }, + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/to-regex/node_modules/extend-shallow/LICENSE b/node_modules/to-regex/node_modules/extend-shallow/LICENSE new file mode 100644 index 00000000..99c93691 --- /dev/null +++ b/node_modules/to-regex/node_modules/extend-shallow/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2015, 2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/to-regex/node_modules/extend-shallow/README.md b/node_modules/to-regex/node_modules/extend-shallow/README.md new file mode 100644 index 00000000..dee226f4 --- /dev/null +++ b/node_modules/to-regex/node_modules/extend-shallow/README.md @@ -0,0 +1,97 @@ +# extend-shallow [![NPM version](https://img.shields.io/npm/v/extend-shallow.svg?style=flat)](https://www.npmjs.com/package/extend-shallow) [![NPM monthly downloads](https://img.shields.io/npm/dm/extend-shallow.svg?style=flat)](https://npmjs.org/package/extend-shallow) [![NPM total downloads](https://img.shields.io/npm/dt/extend-shallow.svg?style=flat)](https://npmjs.org/package/extend-shallow) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/extend-shallow.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/extend-shallow) + +> Extend an object with the properties of additional objects. node.js/javascript util. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save extend-shallow +``` + +## Usage + +```js +var extend = require('extend-shallow'); + +extend({a: 'b'}, {c: 'd'}) +//=> {a: 'b', c: 'd'} +``` + +Pass an empty object to shallow clone: + +```js +var obj = {}; +extend(obj, {a: 'b'}, {c: 'd'}) +//=> {a: 'b', c: 'd'} +``` + +## About + +
      +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
      + +
      +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
      + +
      +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
      + +### Related projects + +You might also be interested in these projects: + +* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow "Extend an object with the properties of additional objects. node.js/javascript util.") +* [for-in](https://www.npmjs.com/package/for-in): Iterate over the own and inherited enumerable properties of an object, and return an object… [more](https://github.com/jonschlinkert/for-in) | [homepage](https://github.com/jonschlinkert/for-in "Iterate over the own and inherited enumerable properties of an object, and return an object with properties that evaluate to true from the callback. Exit early by returning `false`. JavaScript/Node.js") +* [for-own](https://www.npmjs.com/package/for-own): Iterate over the own enumerable properties of an object, and return an object with properties… [more](https://github.com/jonschlinkert/for-own) | [homepage](https://github.com/jonschlinkert/for-own "Iterate over the own enumerable properties of an object, and return an object with properties that evaluate to true from the callback. Exit early by returning `false`. JavaScript/Node.js.") +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") +* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 33 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [pdehaan](https://github.com/pdehaan) | + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on November 19, 2017._ \ No newline at end of file diff --git a/node_modules/to-regex/node_modules/extend-shallow/index.js b/node_modules/to-regex/node_modules/extend-shallow/index.js new file mode 100644 index 00000000..c9582f8f --- /dev/null +++ b/node_modules/to-regex/node_modules/extend-shallow/index.js @@ -0,0 +1,60 @@ +'use strict'; + +var isExtendable = require('is-extendable'); +var assignSymbols = require('assign-symbols'); + +module.exports = Object.assign || function(obj/*, objects*/) { + if (obj === null || typeof obj === 'undefined') { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!isObject(obj)) { + obj = {}; + } + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isString(val)) { + val = toObject(val); + } + if (isObject(val)) { + assign(obj, val); + assignSymbols(obj, val); + } + } + return obj; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +function isString(val) { + return (val && typeof val === 'string'); +} + +function toObject(str) { + var obj = {}; + for (var i in str) { + obj[i] = str[i]; + } + return obj; +} + +function isObject(val) { + return (val && typeof val === 'object') || isExtendable(val); +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +function isEnum(obj, key) { + return Object.prototype.propertyIsEnumerable.call(obj, key); +} diff --git a/node_modules/to-regex/node_modules/extend-shallow/package.json b/node_modules/to-regex/node_modules/extend-shallow/package.json new file mode 100644 index 00000000..e5e91053 --- /dev/null +++ b/node_modules/to-regex/node_modules/extend-shallow/package.json @@ -0,0 +1,83 @@ +{ + "name": "extend-shallow", + "description": "Extend an object with the properties of additional objects. node.js/javascript util.", + "version": "3.0.2", + "homepage": "https://github.com/jonschlinkert/extend-shallow", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Peter deHaan (http://about.me/peterdehaan)" + ], + "repository": "jonschlinkert/extend-shallow", + "bugs": { + "url": "https://github.com/jonschlinkert/extend-shallow/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "devDependencies": { + "array-slice": "^1.0.0", + "benchmarked": "^2.0.0", + "for-own": "^1.0.0", + "gulp-format-md": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.1", + "minimist": "^1.2.0", + "mocha": "^3.5.3", + "object-assign": "^4.1.1" + }, + "keywords": [ + "assign", + "clone", + "extend", + "merge", + "obj", + "object", + "object-assign", + "object.assign", + "prop", + "properties", + "property", + "props", + "shallow", + "util", + "utility", + "utils", + "value" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "related": { + "list": [ + "extend-shallow", + "for-in", + "for-own", + "is-plain-object", + "isobject", + "kind-of" + ] + }, + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/to-regex/node_modules/is-extendable/LICENSE b/node_modules/to-regex/node_modules/is-extendable/LICENSE new file mode 100644 index 00000000..c0d7f136 --- /dev/null +++ b/node_modules/to-regex/node_modules/is-extendable/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/to-regex/node_modules/is-extendable/README.md b/node_modules/to-regex/node_modules/is-extendable/README.md new file mode 100644 index 00000000..875b56a7 --- /dev/null +++ b/node_modules/to-regex/node_modules/is-extendable/README.md @@ -0,0 +1,88 @@ +# is-extendable [![NPM version](https://img.shields.io/npm/v/is-extendable.svg?style=flat)](https://www.npmjs.com/package/is-extendable) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-extendable.svg?style=flat)](https://npmjs.org/package/is-extendable) [![NPM total downloads](https://img.shields.io/npm/dt/is-extendable.svg?style=flat)](https://npmjs.org/package/is-extendable) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-extendable.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-extendable) + +> Returns true if a value is a plain object, array or function. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-extendable +``` + +## Usage + +```js +var isExtendable = require('is-extendable'); +``` + +Returns true if the value is any of the following: + +* array +* plain object +* function + +## Notes + +All objects in JavaScript can have keys, but it's a pain to check for this, since we ether need to verify that the value is not `null` or `undefined` and: + +* the value is not a primitive, or +* that the object is a plain object, function or array + +Also note that an `extendable` object is not the same as an [extensible object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible), which is one that (in es6) is not sealed, frozen, or marked as non-extensible using `preventExtensions`. + +## Release history + +### v1.0.0 - 2017/07/20 + +**Breaking changes** + +* No longer considers date, regex or error objects to be extendable + +## About + +### Related projects + +* [assign-deep](https://www.npmjs.com/package/assign-deep): Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target… [more](https://github.com/jonschlinkert/assign-deep) | [homepage](https://github.com/jonschlinkert/assign-deep "Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target (first) object.") +* [is-equal-shallow](https://www.npmjs.com/package/is-equal-shallow): Does a shallow comparison of two objects, returning false if the keys or values differ. | [homepage](https://github.com/jonschlinkert/is-equal-shallow "Does a shallow comparison of two objects, returning false if the keys or values differ.") +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") +* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 20, 2017._ \ No newline at end of file diff --git a/node_modules/to-regex/node_modules/is-extendable/index.d.ts b/node_modules/to-regex/node_modules/is-extendable/index.d.ts new file mode 100644 index 00000000..b96d5075 --- /dev/null +++ b/node_modules/to-regex/node_modules/is-extendable/index.d.ts @@ -0,0 +1,5 @@ +export = isExtendable; + +declare function isExtendable(val: any): boolean; + +declare namespace isExtendable {} diff --git a/node_modules/to-regex/node_modules/is-extendable/index.js b/node_modules/to-regex/node_modules/is-extendable/index.js new file mode 100644 index 00000000..a8b26ad0 --- /dev/null +++ b/node_modules/to-regex/node_modules/is-extendable/index.js @@ -0,0 +1,14 @@ +/*! + * is-extendable + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isPlainObject = require('is-plain-object'); + +module.exports = function isExtendable(val) { + return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); +}; diff --git a/node_modules/to-regex/node_modules/is-extendable/package.json b/node_modules/to-regex/node_modules/is-extendable/package.json new file mode 100644 index 00000000..2aaab65a --- /dev/null +++ b/node_modules/to-regex/node_modules/is-extendable/package.json @@ -0,0 +1,67 @@ +{ + "name": "is-extendable", + "description": "Returns true if a value is a plain object, array or function.", + "version": "1.0.1", + "homepage": "https://github.com/jonschlinkert/is-extendable", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/is-extendable", + "bugs": { + "url": "https://github.com/jonschlinkert/is-extendable/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "index.d.ts" + ], + "main": "index.js", + "types": "index.d.ts", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.4.2" + }, + "keywords": [ + "array", + "assign", + "check", + "date", + "extend", + "extendable", + "extensible", + "function", + "is", + "object", + "regex", + "test" + ], + "verb": { + "related": { + "list": [ + "assign-deep", + "is-equal-shallow", + "is-plain-object", + "isobject", + "kind-of" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/to-regex/package.json b/node_modules/to-regex/package.json new file mode 100644 index 00000000..e4277d31 --- /dev/null +++ b/node_modules/to-regex/package.json @@ -0,0 +1,62 @@ +{ + "name": "to-regex", + "description": "Generate a regex from a string or array of strings.", + "version": "3.0.2", + "homepage": "https://github.com/jonschlinkert/to-regex", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/to-regex", + "bugs": { + "url": "https://github.com/jonschlinkert/to-regex/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "keywords": [ + "match", + "regex", + "regular expression", + "test", + "to" + ], + "verb": { + "toc": { + "method": "preWrite" + }, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "has-glob", + "is-glob", + "path-regex", + "to-regex-range" + ] + }, + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/to-through/LICENSE b/node_modules/to-through/LICENSE new file mode 100644 index 00000000..b8fc7433 --- /dev/null +++ b/node_modules/to-through/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/to-through/README.md b/node_modules/to-through/README.md new file mode 100644 index 00000000..0c02b7cc --- /dev/null +++ b/node_modules/to-through/README.md @@ -0,0 +1,56 @@ +

      + + + +

      + +# to-through + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Wrap a ReadableStream in a TransformStream. + +## Usage + +```js +var from = require('from2'); +var concat = require('concat-stream'); +var toThrough = require('to-through'); + +var readable = from([' ', 'hello', ' ', 'world']); + +// Can be used as a Readable or Transform +var maybeTransform = toThrough(readable); + +from(['hi', ' ', 'there', ',']) + .pipe(maybeTransform) + .pipe(concat(function(result) { + // result.toString() === 'hi there, hello world' + })); +``` + +## API + +### `toThrough(readableStream)` + +Takes a `readableStream` as the only argument and returns a `through2` stream. If the returned stream is piped before `nextTick`, the wrapped `readableStream` will not flow until the upstream is flushed. If the stream is not piped before `nextTick`, it is ended and flushed (acting as a proper readable). + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/to-through.svg +[npm-url]: https://npmjs.com/package/to-through +[npm-image]: http://img.shields.io/npm/v/to-through.svg + +[travis-url]: https://travis-ci.org/gulpjs/to-through +[travis-image]: http://img.shields.io/travis/gulpjs/to-through.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/to-through +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/to-through.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/to-through +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/to-through/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/node_modules/to-through/index.js b/node_modules/to-through/index.js new file mode 100644 index 00000000..c71a6770 --- /dev/null +++ b/node_modules/to-through/index.js @@ -0,0 +1,60 @@ +'use strict'; + +var through = require('through2'); + +function forward(chunk, enc, cb) { + cb(null, chunk); +} + +function toThrough(readable) { + + var opts = { + objectMode: readable._readableState.objectMode, + highWaterMark: readable._readableState.highWaterMark, + }; + + function flush(cb) { + var self = this; + + readable.on('readable', onReadable); + readable.on('end', cb); + + function onReadable() { + var chunk; + while (chunk = readable.read()) { + self.push(chunk); + } + } + } + + var wrapper = through(opts, forward, flush); + + var shouldFlow = true; + wrapper.once('pipe', onPipe); + wrapper.on('newListener', onListener); + readable.on('error', wrapper.emit.bind(wrapper, 'error')); + + function onListener(event) { + // Once we've seen the data or readable event, check if we need to flow + if (event === 'data' || event === 'readable') { + maybeFlow(); + this.removeListener('newListener', onListener); + } + } + + function onPipe() { + // If the wrapper is piped, disable flow + shouldFlow = false; + } + + function maybeFlow() { + // If we need to flow, end the stream which triggers flush + if (shouldFlow) { + wrapper.end(); + } + } + + return wrapper; +} + +module.exports = toThrough; diff --git a/node_modules/to-through/node_modules/through2/LICENSE.md b/node_modules/to-through/node_modules/through2/LICENSE.md new file mode 100644 index 00000000..a2429b63 --- /dev/null +++ b/node_modules/to-through/node_modules/through2/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License (MIT) + +**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/to-through/node_modules/through2/README.md b/node_modules/to-through/node_modules/through2/README.md new file mode 100644 index 00000000..b5e44c7b --- /dev/null +++ b/node_modules/to-through/node_modules/through2/README.md @@ -0,0 +1,134 @@ +# through2 + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node streams.Transform (Streams2/3) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +Note: As 2.x.x this module starts using **Streams3** instead of Stream2. To continue using a Streams2 version use `npm install through2@0` to fetch the latest version of 0.x.x. More information about Streams2 vs Streams3 and recommendations see the article **[Why I don't use Node's core 'stream' module](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html)**. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (var i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) + .on('finish', () => doSomethingSpecial()) +``` + +Or object streams: + +```js +var all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + var data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', (data) => { + all.push(data) + }) + .on('end', () => { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## API + +through2([ options, ] [ transformFunction ] [, flushFunction ]) + +Consult the **[stream.Transform](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + (chunk, enc, cb) => { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + ) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + (chunk, enc, cb) => cb(null, chunk), // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +through2.ctor([ options, ] transformFunction[, flushFunction ]) + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +var FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit == "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +var converter = new FToC() +// Or: +var converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +var converter = FToC({objectMode: true}) +``` + +## See Also + + - [through2-map](https://github.com/brycebaril/through2-map) - Array.prototype.map analog for streams. + - [through2-filter](https://github.com/brycebaril/through2-filter) - Array.prototype.filter analog for streams. + - [through2-reduce](https://github.com/brycebaril/through2-reduce) - Array.prototype.reduce analog for streams. + - [through2-spy](https://github.com/brycebaril/through2-spy) - Wrapper for simple stream.PassThrough spies. + - the [mississippi stream utility collection](https://github.com/maxogden/mississippi) includes `through2` as well as many more useful stream modules similar to this one + +## License + +**through2** is Copyright (c) Rod Vagg [@rvagg](https://twitter.com/rvagg) and additional contributors and licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/to-through/node_modules/through2/package.json b/node_modules/to-through/node_modules/through2/package.json new file mode 100644 index 00000000..15960b63 --- /dev/null +++ b/node_modules/to-through/node_modules/through2/package.json @@ -0,0 +1,33 @@ +{ + "name": "through2", + "version": "2.0.5", + "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise", + "main": "through2.js", + "scripts": { + "test": "node test/test.js | faucet" + }, + "repository": { + "type": "git", + "url": "https://github.com/rvagg/through2.git" + }, + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "author": "Rod Vagg (https://github.com/rvagg)", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "devDependencies": { + "bl": "~2.0.1", + "faucet": "0.0.1", + "nyc": "~13.1.0", + "safe-buffer": "~5.1.2", + "stream-spigot": "~3.0.6", + "tape": "~4.9.1" + } +} diff --git a/node_modules/to-through/node_modules/through2/through2.js b/node_modules/to-through/node_modules/through2/through2.js new file mode 100644 index 00000000..6baa6a1e --- /dev/null +++ b/node_modules/to-through/node_modules/through2/through2.js @@ -0,0 +1,96 @@ +var Transform = require('readable-stream').Transform + , inherits = require('util').inherits + , xtend = require('xtend') + +function DestroyableTransform(opts) { + Transform.call(this, opts) + this._destroyed = false +} + +inherits(DestroyableTransform, Transform) + +DestroyableTransform.prototype.destroy = function(err) { + if (this._destroyed) return + this._destroyed = true + + var self = this + process.nextTick(function() { + if (err) + self.emit('error', err) + self.emit('close') + }) +} + +// a noop _transform function +function noop (chunk, enc, callback) { + callback(null, chunk) +} + + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return function (options, transform, flush) { + if (typeof options == 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform != 'function') + transform = noop + + if (typeof flush != 'function') + flush = null + + return construct(options, transform, flush) + } +} + + +// main export, just make me a transform stream! +module.exports = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(options) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) + + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +module.exports.ctor = through2(function (options, transform, flush) { + function Through2 (override) { + if (!(this instanceof Through2)) + return new Through2(override) + + this.options = xtend(options, override) + + DestroyableTransform.call(this, this.options) + } + + inherits(Through2, DestroyableTransform) + + Through2.prototype._transform = transform + + if (flush) + Through2.prototype._flush = flush + + return Through2 +}) + + +module.exports.obj = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) diff --git a/node_modules/to-through/package.json b/node_modules/to-through/package.json new file mode 100644 index 00000000..a51a47ff --- /dev/null +++ b/node_modules/to-through/package.json @@ -0,0 +1,46 @@ +{ + "name": "to-through", + "version": "2.0.0", + "description": "Wrap a ReadableStream in a TransformStream.", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Blaine Bublitz " + ], + "repository": "gulpjs/to-through", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint index.js test/ && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "through2": "^2.0.3" + }, + "devDependencies": { + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mississippi": "^1.3.0", + "mocha": "^3.2.0" + }, + "keywords": [ + "transform", + "readable", + "through", + "wrap" + ] +} diff --git a/node_modules/tough-cookie/LICENSE b/node_modules/tough-cookie/LICENSE new file mode 100644 index 00000000..22204e87 --- /dev/null +++ b/node_modules/tough-cookie/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2015, Salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/tough-cookie/README.md b/node_modules/tough-cookie/README.md new file mode 100644 index 00000000..656a2555 --- /dev/null +++ b/node_modules/tough-cookie/README.md @@ -0,0 +1,527 @@ +[RFC6265](https://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js + +[![npm package](https://nodei.co/npm/tough-cookie.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/tough-cookie/) + +[![Build Status](https://travis-ci.org/salesforce/tough-cookie.png?branch=master)](https://travis-ci.org/salesforce/tough-cookie) + +# Synopsis + +``` javascript +var tough = require('tough-cookie'); +var Cookie = tough.Cookie; +var cookie = Cookie.parse(header); +cookie.value = 'somethingdifferent'; +header = cookie.toString(); + +var cookiejar = new tough.CookieJar(); +cookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb); +// ... +cookiejar.getCookies('http://example.com/otherpath',function(err,cookies) { + res.headers['cookie'] = cookies.join('; '); +}); +``` + +# Installation + +It's _so_ easy! + +`npm install tough-cookie` + +Why the name? NPM modules `cookie`, `cookies` and `cookiejar` were already taken. + +## Version Support + +Support for versions of node.js will follow that of the [request](https://www.npmjs.com/package/request) module. + +# API + +## tough + +Functions on the module you get from `require('tough-cookie')`. All can be used as pure functions and don't need to be "bound". + +**Note**: prior to 1.0.x, several of these functions took a `strict` parameter. This has since been removed from the API as it was no longer necessary. + +### `parseDate(string)` + +Parse a cookie date string into a `Date`. Parses according to RFC6265 Section 5.1.1, not `Date.parse()`. + +### `formatDate(date)` + +Format a Date into a RFC1123 string (the RFC6265-recommended format). + +### `canonicalDomain(str)` + +Transforms a domain-name into a canonical domain-name. The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265). For the most part, this function is idempotent (can be run again on its output without ill effects). + +### `domainMatch(str,domStr[,canonicalize=true])` + +Answers "does this real domain match the domain in a cookie?". The `str` is the "current" domain-name and the `domStr` is the "cookie" domain-name. Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match". + +The `canonicalize` parameter will run the other two parameters through `canonicalDomain` or not. + +### `defaultPath(path)` + +Given a current request/response path, gives the Path apropriate for storing in a cookie. This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC. + +The `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.). This is the `.pathname` property of node's `uri.parse()` output. + +### `pathMatch(reqPath,cookiePath)` + +Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4. Returns a boolean. + +This is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`. + +### `parse(cookieString[, options])` + +alias for `Cookie.parse(cookieString[, options])` + +### `fromJSON(string)` + +alias for `Cookie.fromJSON(string)` + +### `getPublicSuffix(hostname)` + +Returns the public suffix of this hostname. The public suffix is the shortest domain-name upon which a cookie can be set. Returns `null` if the hostname cannot have cookies set for it. + +For example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`. + +For further information, see http://publicsuffix.org/. This module derives its list from that site. This call is currently a wrapper around [`psl`](https://www.npmjs.com/package/psl)'s [get() method](https://www.npmjs.com/package/psl#pslgetdomain). + +### `cookieCompare(a,b)` + +For use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2). The sort algorithm is, in order of precedence: + +* Longest `.path` +* oldest `.creation` (which has a 1ms precision, same as `Date`) +* lowest `.creationIndex` (to get beyond the 1ms precision) + +``` javascript +var cookies = [ /* unsorted array of Cookie objects */ ]; +cookies = cookies.sort(cookieCompare); +``` + +**Note**: Since JavaScript's `Date` is limited to a 1ms precision, cookies within the same milisecond are entirely possible. This is especially true when using the `now` option to `.setCookie()`. The `.creationIndex` property is a per-process global counter, assigned during construction with `new Cookie()`. This preserves the spirit of the RFC sorting: older cookies go first. This works great for `MemoryCookieStore`, since `Set-Cookie` headers are parsed in order, but may not be so great for distributed systems. Sophisticated `Store`s may wish to set this to some other _logical clock_ such that if cookies A and B are created in the same millisecond, but cookie A is created before cookie B, then `A.creationIndex < B.creationIndex`. If you want to alter the global counter, which you probably _shouldn't_ do, it's stored in `Cookie.cookiesCreated`. + +### `permuteDomain(domain)` + +Generates a list of all possible domains that `domainMatch()` the parameter. May be handy for implementing cookie stores. + +### `permutePath(path)` + +Generates a list of all possible paths that `pathMatch()` the parameter. May be handy for implementing cookie stores. + + +## Cookie + +Exported via `tough.Cookie`. + +### `Cookie.parse(cookieString[, options])` + +Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed. + +The options parameter is not required and currently has only one property: + + * _loose_ - boolean - if `true` enable parsing of key-less cookies like `=abc` and `=`, which are not RFC-compliant. + +If options is not an object, it is ignored, which means you can use `Array#map` with it. + +Here's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response: + +``` javascript +if (res.headers['set-cookie'] instanceof Array) + cookies = res.headers['set-cookie'].map(Cookie.parse); +else + cookies = [Cookie.parse(res.headers['set-cookie'])]; +``` + +_Note:_ in version 2.3.3, tough-cookie limited the number of spaces before the `=` to 256 characters. This limitation has since been removed. +See [Issue 92](https://github.com/salesforce/tough-cookie/issues/92) + +### Properties + +Cookie object properties: + + * _key_ - string - the name or key of the cookie (default "") + * _value_ - string - the value of the cookie (default "") + * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `"Infinity"`). See `setExpires()` + * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie. May also be set to strings `"Infinity"` and `"-Infinity"` for non-expiry and immediate-expiry, respectively. See `setMaxAge()` + * _domain_ - string - the `Domain=` attribute of the cookie + * _path_ - string - the `Path=` of the cookie + * _secure_ - boolean - the `Secure` cookie flag + * _httpOnly_ - boolean - the `HttpOnly` cookie flag + * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside) + * _creation_ - `Date` - when this cookie was constructed + * _creationIndex_ - number - set at construction, used to provide greater sort precision (please see `cookieCompare(a,b)` for a full explanation) + +After a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes: + + * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied) + * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one. + * _creation_ - `Date` - **modified** from construction to when the cookie was added to the jar + * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented. Using `cookiejar.getCookies(...)` will update this attribute. + +### `Cookie([{properties}])` + +Receives an options object that can contain any of the above Cookie properties, uses the default for unspecified properties. + +### `.toString()` + +encode to a Set-Cookie header value. The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`. + +### `.cookieString()` + +encode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '='). + +### `.setExpires(String)` + +sets the expiry based on a date-string passed through `parseDate()`. If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `"Infinity"` (a string) is set. + +### `.setMaxAge(number)` + +sets the maxAge in seconds. Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it JSON serializes correctly. + +### `.expiryTime([now=Date.now()])` + +### `.expiryDate([now=Date.now()])` + +expiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object. Note that in both cases the `now` parameter should be milliseconds. + +Max-Age takes precedence over Expires (as per the RFC). The `.creation` attribute -- or, by default, the `now` parameter -- is used to offset the `.maxAge` attribute. + +If Expires (`.expires`) is set, that's returned. + +Otherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for "Tue, 19 Jan 2038 03:14:07 GMT" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents). + +### `.TTL([now=Date.now()])` + +compute the TTL relative to `now` (milliseconds). The same precedence rules as for `expiryTime`/`expiryDate` apply. + +The "number" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired. Otherwise a time-to-live in milliseconds is returned. + +### `.canonicalizedDomain()` + +### `.cdomain()` + +return the canonicalized `.domain` field. This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters. + +### `.toJSON()` + +For convenience in using `JSON.serialize(cookie)`. Returns a plain-old `Object` that can be JSON-serialized. + +Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are exported in ISO format (`.toISOString()`). + +**NOTE**: Custom `Cookie` properties will be discarded. In tough-cookie 1.x, since there was no `.toJSON` method explicitly defined, all enumerable properties were captured. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array. + +### `Cookie.fromJSON(strOrObj)` + +Does the reverse of `cookie.toJSON()`. If passed a string, will `JSON.parse()` that first. + +Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are parsed via `Date.parse()`, not the tough-cookie `parseDate`, since it's JavaScript/JSON-y timestamps being handled at this layer. + +Returns `null` upon JSON parsing error. + +### `.clone()` + +Does a deep clone of this cookie, exactly implemented as `Cookie.fromJSON(cookie.toJSON())`. + +### `.validate()` + +Status: *IN PROGRESS*. Works for a few things, but is by no means comprehensive. + +validates cookie attributes for semantic correctness. Useful for "lint" checking any Set-Cookie headers you generate. For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct: + +``` javascript +if (cookie.validate() === true) { + // it's tasty +} else { + // yuck! +} +``` + + +## CookieJar + +Exported via `tough.CookieJar`. + +### `CookieJar([store],[options])` + +Simply use `new CookieJar()`. If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used. + +The `options` object can be omitted and can have the following properties: + + * _rejectPublicSuffixes_ - boolean - default `true` - reject cookies with domains like "com" and "co.uk" + * _looseMode_ - boolean - default `false` - accept malformed cookies like `bar` and `=bar`, which have an implied empty name. + This is not in the standard, but is used sometimes on the web and is accepted by (most) browsers. + +Since eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods. + +### `.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))` + +Attempt to set the cookie in the cookie jar. If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through. The cookie will have updated `.creation`, `.lastAccessed` and `.hostOnly` properties. + +The `options` object can be omitted and can have the following properties: + + * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. + * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. + * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies + * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains. `Store` errors aren't ignored by this option. + +As per the RFC, the `.hostOnly` property is set if there was no "Domain=" parameter in the cookie string (or `.domain` was null on the Cookie object). The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case. Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual). + +### `.setCookieSync(cookieOrString, currentUrl, [{options}])` + +Synchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.getCookies(currentUrl, [{options},] cb(err,cookies))` + +Retrieve the list of cookies that can be sent in a Cookie header for the current url. + +If an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed. The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given. + +The `options` object can be omitted and can have the following properties: + + * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. + * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. + * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies + * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store. Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially). + * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the underlying store (the default `MemoryCookieStore` supports it). + +The `.lastAccessed` property of the returned cookies will have been updated. + +### `.getCookiesSync(currentUrl, [{options}])` + +Synchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.getCookieString(...)` + +Accepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback. Simply maps the `Cookie` array via `.cookieString()`. + +### `.getCookieStringSync(...)` + +Synchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.getSetCookieStrings(...)` + +Returns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`. Simply maps the cookie array via `.toString()`. + +### `.getSetCookieStringsSync(...)` + +Synchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.serialize(cb(err,serializedObject))` + +Serialize the Jar if the underlying store supports `.getAllCookies`. + +**NOTE**: Custom `Cookie` properties will be discarded. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array. + +See [Serialization Format]. + +### `.serializeSync()` + +Sync version of .serialize + +### `.toJSON()` + +Alias of .serializeSync() for the convenience of `JSON.stringify(cookiejar)`. + +### `CookieJar.deserialize(serialized, [store], cb(err,object))` + +A new Jar is created and the serialized Cookies are added to the underlying store. Each `Cookie` is added via `store.putCookie` in the order in which they appear in the serialization. + +The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. + +As a convenience, if `serialized` is a string, it is passed through `JSON.parse` first. If that throws an error, this is passed to the callback. + +### `CookieJar.deserializeSync(serialized, [store])` + +Sync version of `.deserialize`. _Note_ that the `store` must be synchronous for this to work. + +### `CookieJar.fromJSON(string)` + +Alias of `.deserializeSync` to provide consistency with `Cookie.fromJSON()`. + +### `.clone([store,]cb(err,newJar))` + +Produces a deep clone of this jar. Modifications to the original won't affect the clone, and vice versa. + +The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. Transferring between store types is supported so long as the source implements `.getAllCookies()` and the destination implements `.putCookie()`. + +### `.cloneSync([store])` + +Synchronous version of `.clone`, returning a new `CookieJar` instance. + +The `store` argument is optional, but must be a _synchronous_ `Store` instance if specified. If not passed, a new instance of `MemoryCookieStore` is used. + +The _source_ and _destination_ must both be synchronous `Store`s. If one or both stores are asynchronous, use `.clone` instead. Recall that `MemoryCookieStore` supports both synchronous and asynchronous API calls. + +### `.removeAllCookies(cb(err))` + +Removes all cookies from the jar. + +This is a new backwards-compatible feature of `tough-cookie` version 2.5, so not all Stores will implement it efficiently. For Stores that do not implement `removeAllCookies`, the fallback is to call `removeCookie` after `getAllCookies`. If `getAllCookies` fails or isn't implemented in the Store, that error is returned. If one or more of the `removeCookie` calls fail, only the first error is returned. + +### `.removeAllCookiesSync()` + +Sync version of `.removeAllCookies()` + +## Store + +Base class for CookieJar stores. Available as `tough.Store`. + +## Store API + +The storage model for each `CookieJar` instance can be replaced with a custom implementation. The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file. The API uses continuation-passing-style to allow for asynchronous stores. + +Stores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`. + +Stores are asynchronous by default, but if `store.synchronous` is set to `true`, then the `*Sync` methods on the of the containing `CookieJar` can be used (however, the continuation-passing style + +All `domain` parameters will have been normalized before calling. + +The Cookie store must have all of the following methods. + +### `store.findCookie(domain, path, key, cb(err,cookie))` + +Retrieve a cookie with the given domain, path and key (a.k.a. name). The RFC maintains that exactly one of these cookies should exist in a store. If the store is using versioning, this means that the latest/newest such cookie should be returned. + +Callback takes an error and the resulting `Cookie` object. If no cookie is found then `null` MUST be passed instead (i.e. not an error). + +### `store.findCookies(domain, path, cb(err,cookies))` + +Locates cookies matching the given domain and path. This is most often called in the context of `cookiejar.getCookies()` above. + +If no cookies are found, the callback MUST be passed an empty array. + +The resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method. However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done. + +As of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`. If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only). + +### `store.putCookie(cookie, cb(err))` + +Adds a new cookie to the store. The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur. + +The `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties. + +Pass an error if the cookie cannot be stored. + +### `store.updateCookie(oldCookie, newCookie, cb(err))` + +Update an existing cookie. The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`. The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store. + +The `.lastAccessed` property will always be different between the two objects (to the precision possible via JavaScript's clock). Both `.creation` and `.creationIndex` are guaranteed to be the same. Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are selected for automatic deletion (e.g., least-recently-used, which is up to the store to implement). + +Stores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie. If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object. + +The `newCookie` and `oldCookie` objects MUST NOT be modified. + +Pass an error if the newCookie cannot be stored. + +### `store.removeCookie(domain, path, key, cb(err))` + +Remove a cookie from the store (see notes on `findCookie` about the uniqueness constraint). + +The implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie. + +### `store.removeCookies(domain, path, cb(err))` + +Removes matching cookies from the store. The `path` parameter is optional, and if missing means all paths in a domain should be removed. + +Pass an error ONLY if removing any existing cookies failed. + +### `store.removeAllCookies(cb(err))` + +_Optional_. Removes all cookies from the store. + +Pass an error if one or more cookies can't be removed. + +**Note**: New method as of `tough-cookie` version 2.5, so not all Stores will implement this, plus some stores may choose not to implement this. + +### `store.getAllCookies(cb(err, cookies))` + +_Optional_. Produces an `Array` of all cookies during `jar.serialize()`. The items in the array can be true `Cookie` objects or generic `Object`s with the [Serialization Format] data structure. + +Cookies SHOULD be returned in creation order to preserve sorting via `compareCookies()`. For reference, `MemoryCookieStore` will sort by `.creationIndex` since it uses true `Cookie` objects internally. If you don't return the cookies in creation order, they'll still be sorted by creation time, but this only has a precision of 1ms. See `compareCookies` for more detail. + +Pass an error if retrieval fails. + +**Note**: not all Stores can implement this due to technical limitations, so it is optional. + +## MemoryCookieStore + +Inherits from `Store`. + +A just-in-memory CookieJar synchronous store implementation, used by default. Despite being a synchronous implementation, it's usable with both the synchronous and asynchronous forms of the `CookieJar` API. Supports serialization, `getAllCookies`, and `removeAllCookies`. + +## Community Cookie Stores + +These are some Store implementations authored and maintained by the community. They aren't official and we don't vouch for them but you may be interested to have a look: + +- [`db-cookie-store`](https://github.com/JSBizon/db-cookie-store): SQL including SQLite-based databases +- [`file-cookie-store`](https://github.com/JSBizon/file-cookie-store): Netscape cookie file format on disk +- [`redis-cookie-store`](https://github.com/benkroeger/redis-cookie-store): Redis +- [`tough-cookie-filestore`](https://github.com/mitsuru/tough-cookie-filestore): JSON on disk +- [`tough-cookie-web-storage-store`](https://github.com/exponentjs/tough-cookie-web-storage-store): DOM localStorage and sessionStorage + + +# Serialization Format + +**NOTE**: if you want to have custom `Cookie` properties serialized, add the property name to `Cookie.serializableProperties`. + +```js + { + // The version of tough-cookie that serialized this jar. + version: 'tough-cookie@1.x.y', + + // add the store type, to make humans happy: + storeType: 'MemoryCookieStore', + + // CookieJar configuration: + rejectPublicSuffixes: true, + // ... future items go here + + // Gets filled from jar.store.getAllCookies(): + cookies: [ + { + key: 'string', + value: 'string', + // ... + /* other Cookie.serializableProperties go here */ + } + ] + } +``` + +# Copyright and License + +BSD-3-Clause: + +```text + Copyright (c) 2015, Salesforce.com, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of Salesforce.com nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +``` diff --git a/node_modules/tough-cookie/package.json b/node_modules/tough-cookie/package.json new file mode 100644 index 00000000..8af9909e --- /dev/null +++ b/node_modules/tough-cookie/package.json @@ -0,0 +1,78 @@ +{ + "author": { + "name": "Jeremy Stashewsky", + "email": "jstash@gmail.com", + "website": "https://github.com/stash" + }, + "contributors": [ + { + "name": "Alexander Savin", + "website": "https://github.com/apsavin" + }, + { + "name": "Ian Livingstone", + "website": "https://github.com/ianlivingstone" + }, + { + "name": "Ivan Nikulin", + "website": "https://github.com/inikulin" + }, + { + "name": "Lalit Kapoor", + "website": "https://github.com/lalitkapoor" + }, + { + "name": "Sam Thompson", + "website": "https://github.com/sambthompson" + }, + { + "name": "Sebastian Mayr", + "website": "https://github.com/Sebmaster" + } + ], + "license": "BSD-3-Clause", + "name": "tough-cookie", + "description": "RFC6265 Cookies and Cookie Jar for node.js", + "keywords": [ + "HTTP", + "cookie", + "cookies", + "set-cookie", + "cookiejar", + "jar", + "RFC6265", + "RFC2965" + ], + "version": "2.5.0", + "homepage": "https://github.com/salesforce/tough-cookie", + "repository": { + "type": "git", + "url": "git://github.com/salesforce/tough-cookie.git" + }, + "bugs": { + "url": "https://github.com/salesforce/tough-cookie/issues" + }, + "main": "./lib/cookie", + "files": [ + "lib" + ], + "scripts": { + "version": "genversion lib/version.js && git add lib/version.js", + "test": "vows test/*_test.js", + "cover": "nyc --reporter=lcov --reporter=html vows test/*_test.js" + }, + "engines": { + "node": ">=0.8" + }, + "devDependencies": { + "async": "^1.4.2", + "genversion": "^2.1.0", + "nyc": "^11.6.0", + "string.prototype.repeat": "^0.2.0", + "vows": "^0.8.2" + }, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } +} diff --git a/node_modules/trim-newlines/index.js b/node_modules/trim-newlines/index.js new file mode 100644 index 00000000..da31efd6 --- /dev/null +++ b/node_modules/trim-newlines/index.js @@ -0,0 +1,13 @@ +'use strict'; + +var fn = module.exports = function (x) { + return fn.end(fn.start(x)); +}; + +fn.start = function (x) { + return x.replace(/^[\r\n]+/, ''); +}; + +fn.end = function (x) { + return x.replace(/[\r\n]+$/, ''); +}; diff --git a/node_modules/trim-newlines/license b/node_modules/trim-newlines/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/trim-newlines/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/trim-newlines/package.json b/node_modules/trim-newlines/package.json new file mode 100644 index 00000000..c0bca903 --- /dev/null +++ b/node_modules/trim-newlines/package.json @@ -0,0 +1,42 @@ +{ + "name": "trim-newlines", + "version": "1.0.0", + "description": "Trim newlines from the start and/or end of a string", + "license": "MIT", + "repository": "sindresorhus/trim-newlines", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "trim", + "newline", + "newlines", + "linebreak", + "lf", + "crlf", + "left", + "right", + "start", + "end", + "string", + "str", + "remove", + "delete", + "strip" + ], + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/trim-newlines/readme.md b/node_modules/trim-newlines/readme.md new file mode 100644 index 00000000..fedb3ca2 --- /dev/null +++ b/node_modules/trim-newlines/readme.md @@ -0,0 +1,46 @@ +# trim-newlines [![Build Status](https://travis-ci.org/sindresorhus/trim-newlines.svg?branch=master)](https://travis-ci.org/sindresorhus/trim-newlines) + +> Trim [newlines](https://en.wikipedia.org/wiki/Newline) from the start and/or end of a string + + +## Install + +``` +$ npm install --save trim-newlines +``` + + +## Usage + +```js +var trimNewlines = require('trim-newlines'); + +trimNewlines('\nunicorn\r\n'); +//=> 'unicorn' +``` + + +## API + +### trimNewlines(input) + +Trim from the start and end of a string. + +### trimNewlines.start(input) + +Trim from the start of a string. + +### trimNewlines.end(input) + +Trim from the end of a string. + + +## Related + +- [trim-left](https://github.com/sindresorhus/trim-left) - Similar to `String#trim()` but removes only whitespace on the left +- [trim-right](https://github.com/sindresorhus/trim-right) - Similar to `String#trim()` but removes only whitespace on the right. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/true-case-path/LICENSE b/node_modules/true-case-path/LICENSE new file mode 100644 index 00000000..8dada3ed --- /dev/null +++ b/node_modules/true-case-path/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/node_modules/true-case-path/README.md b/node_modules/true-case-path/README.md new file mode 100644 index 00000000..69ce326e --- /dev/null +++ b/node_modules/true-case-path/README.md @@ -0,0 +1,52 @@ +# true-case-path + +## Usage + +`trueCasePathSync()` + +## Description + +Given a possibly case-variant version of an existing filesystem path, returns +the case-exact, normalized version as stored in the filesystem. + +If the input path is a globbing *pattern* as defined by the 'glob' npm +package, only the 1st match, if any, is returned. +Only a literal input path guarantees an unambiguous result. + +If no matching path exists, undefined is returned. +On case-SENSITIVE filesystems, a match will also be found, but if case +variations of a given path exist, it is undefined which match is returned. + +## Platforms + +Windows, OSX, and Linux (though note the limitations with case-insensitive filesystems). + +## Limitations + +- Paths starting with `'./'` are acceptable, but paths starting with `'../'` + are not - when in doubt, resolve with `fs.realPathSync()` first. + An initial `'.'` and *interior* `'..'` instances are normalized, but a relative + input path still results in a relative output path. If you want to ensure + an absolute output path, apply `fs.realPathSync()` to the result. +- On Windows, no attempt is made to case-correct the drive letter or UNC-share + component of the path. +- Unicode support: + - Be sure to use UTF8 source-code files (with a BOM on Windows) + - On OSX, the input path is automatically converted to NFD Unicode form + to match how the filesystem stores names, but note that the result will + invariably be NFD too (which makes no difference for ASCII-characters-only + names). + +## Examples + +``` +const trueCasePathSync = require('true-case-path') + +trueCasePathSync('/users/guest') // OSX: -> '/Users/Guest' + +trueCasePathSync('c:\\users\\all users') // Windows: -> 'c:\Users\All Users' +``` + +## Attribution + +The code for this project was sourced from [http://stackoverflow.com/a/33139702/45375](http://stackoverflow.com/a/33139702/45375) diff --git a/node_modules/true-case-path/index.js b/node_modules/true-case-path/index.js new file mode 100644 index 00000000..90cc6702 --- /dev/null +++ b/node_modules/true-case-path/index.js @@ -0,0 +1,32 @@ +'use strict' + +var glob = require('glob') +var path = require('path') + +function trueCasePathSync(fsPath) { + + // Normalize the path so as to resolve . and .. components. + // !! As of Node v4.1.1, a path starting with ../ is NOT resolved relative + // !! to the current dir, and glob.sync() below then fails. + // !! When in doubt, resolve with fs.realPathSync() *beforehand*. + var fsPathNormalized = path.normalize(fsPath) + + // OSX: HFS+ stores filenames in NFD (decomposed normal form) Unicode format, + // so we must ensure that the input path is in that format first. + if (process.platform === 'darwin') fsPathNormalized = fsPathNormalized.normalize('NFD') + + // !! Windows: Curiously, the drive component mustn't be part of a glob, + // !! otherwise glob.sync() will invariably match nothing. + // !! Thus, we remove the drive component and instead pass it in as the 'cwd' + // !! (working dir.) property below. + var pathRoot = path.parse(fsPathNormalized).root + var noDrivePath = fsPathNormalized.slice(Math.max(pathRoot.length - 1, 0)) + + // Perform case-insensitive globbing (on Windows, relative to the drive / + // network share) and return the 1st match, if any. + // Fortunately, glob() with nocase case-corrects the input even if it is + // a *literal* path. + return glob.sync(noDrivePath, { nocase: true, cwd: pathRoot })[0] +} + +module.exports = trueCasePathSync diff --git a/node_modules/true-case-path/package.json b/node_modules/true-case-path/package.json new file mode 100644 index 00000000..f80ae570 --- /dev/null +++ b/node_modules/true-case-path/package.json @@ -0,0 +1,29 @@ +{ + "name": "true-case-path", + "version": "1.0.3", + "description": "Given a possibly case-variant version of an existing filesystem path, returns the case-exact, normalized version as stored in the filesystem.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/barsh/true-case-path.git" + }, + "author": "barsh", + "contributors": [ + { + "name": "Michael Klement", + "email": "mklement0@gmail.com", + "url": "https://github.com/mklement0" + } + ], + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/barsh/true-case-path/issues" + }, + "homepage": "https://github.com/barsh/true-case-path#readme", + "dependencies": { + "glob": "^7.1.2" + } +} diff --git a/node_modules/tunnel-agent/LICENSE b/node_modules/tunnel-agent/LICENSE new file mode 100644 index 00000000..a4a9aee0 --- /dev/null +++ b/node_modules/tunnel-agent/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/tunnel-agent/README.md b/node_modules/tunnel-agent/README.md new file mode 100644 index 00000000..bb533d56 --- /dev/null +++ b/node_modules/tunnel-agent/README.md @@ -0,0 +1,4 @@ +tunnel-agent +============ + +HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module. diff --git a/node_modules/tunnel-agent/index.js b/node_modules/tunnel-agent/index.js new file mode 100644 index 00000000..3ee9abc5 --- /dev/null +++ b/node_modules/tunnel-agent/index.js @@ -0,0 +1,244 @@ +'use strict' + +var net = require('net') + , tls = require('tls') + , http = require('http') + , https = require('https') + , events = require('events') + , assert = require('assert') + , util = require('util') + , Buffer = require('safe-buffer').Buffer + ; + +exports.httpOverHttp = httpOverHttp +exports.httpsOverHttp = httpsOverHttp +exports.httpOverHttps = httpOverHttps +exports.httpsOverHttps = httpsOverHttps + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options) + agent.request = http.request + return agent +} + +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options) + agent.request = http.request + agent.createSocket = createSecureSocket + agent.defaultPort = 443 + return agent +} + +function httpOverHttps(options) { + var agent = new TunnelingAgent(options) + agent.request = https.request + return agent +} + +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options) + agent.request = https.request + agent.createSocket = createSecureSocket + agent.defaultPort = 443 + return agent +} + + +function TunnelingAgent(options) { + var self = this + self.options = options || {} + self.proxyOptions = self.options.proxy || {} + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets + self.requests = [] + self.sockets = [] + + self.on('free', function onFree(socket, host, port) { + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i] + if (pending.host === host && pending.port === port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1) + pending.request.onSocket(socket) + return + } + } + socket.destroy() + self.removeSocket(socket) + }) +} +util.inherits(TunnelingAgent, events.EventEmitter) + +TunnelingAgent.prototype.addRequest = function addRequest(req, options) { + var self = this + + // Legacy API: addRequest(req, host, port, path) + if (typeof options === 'string') { + options = { + host: options, + port: arguments[2], + path: arguments[3] + }; + } + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push({host: options.host, port: options.port, request: req}) + return + } + + // If we are under maxSockets create a new one. + self.createConnection({host: options.host, port: options.port, request: req}) +} + +TunnelingAgent.prototype.createConnection = function createConnection(pending) { + var self = this + + self.createSocket(pending, function(socket) { + socket.on('free', onFree) + socket.on('close', onCloseOrRemove) + socket.on('agentRemove', onCloseOrRemove) + pending.request.onSocket(socket) + + function onFree() { + self.emit('free', socket, pending.host, pending.port) + } + + function onCloseOrRemove(err) { + self.removeSocket(socket) + socket.removeListener('free', onFree) + socket.removeListener('close', onCloseOrRemove) + socket.removeListener('agentRemove', onCloseOrRemove) + } + }) +} + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this + var placeholder = {} + self.sockets.push(placeholder) + + var connectOptions = mergeOptions({}, self.proxyOptions, + { method: 'CONNECT' + , path: options.host + ':' + options.port + , agent: false + } + ) + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {} + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + Buffer.from(connectOptions.proxyAuth).toString('base64') + } + + debug('making CONNECT request') + var connectReq = self.request(connectOptions) + connectReq.useChunkedEncodingByDefault = false // for v0.6 + connectReq.once('response', onResponse) // for v0.6 + connectReq.once('upgrade', onUpgrade) // for v0.6 + connectReq.once('connect', onConnect) // for v0.7 or later + connectReq.once('error', onError) + connectReq.end() + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head) + }) + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners() + socket.removeAllListeners() + + if (res.statusCode === 200) { + assert.equal(head.length, 0) + debug('tunneling connection has established') + self.sockets[self.sockets.indexOf(placeholder)] = socket + cb(socket) + } else { + debug('tunneling socket could not be established, statusCode=%d', res.statusCode) + var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) + error.code = 'ECONNRESET' + options.request.emit('error', error) + self.removeSocket(placeholder) + } + } + + function onError(cause) { + connectReq.removeAllListeners() + + debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) + var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) + error.code = 'ECONNRESET' + options.request.emit('error', error) + self.removeSocket(placeholder) + } +} + +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) return + + this.sockets.splice(pos, 1) + + var pending = this.requests.shift() + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createConnection(pending) + } +} + +function createSecureSocket(options, cb) { + var self = this + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, mergeOptions({}, self.options, + { servername: options.host + , socket: socket + } + )) + self.sockets[self.sockets.indexOf(socket)] = secureSocket + cb(secureSocket) + }) +} + + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i] + if (typeof overrides === 'object') { + var keys = Object.keys(overrides) + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j] + if (overrides[k] !== undefined) { + target[k] = overrides[k] + } + } + } + } + return target +} + + +var debug +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments) + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0] + } else { + args.unshift('TUNNEL:') + } + console.error.apply(console, args) + } +} else { + debug = function() {} +} +exports.debug = debug // for test diff --git a/node_modules/tunnel-agent/package.json b/node_modules/tunnel-agent/package.json new file mode 100644 index 00000000..a271fda9 --- /dev/null +++ b/node_modules/tunnel-agent/package.json @@ -0,0 +1,22 @@ +{ + "author": "Mikeal Rogers (http://www.futurealoof.com)", + "name": "tunnel-agent", + "license": "Apache-2.0", + "description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.", + "version": "0.6.0", + "repository": { + "url": "https://github.com/mikeal/tunnel-agent" + }, + "main": "index.js", + "files": [ + "index.js" + ], + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "devDependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + } +} diff --git a/node_modules/tweetnacl/.npmignore b/node_modules/tweetnacl/.npmignore new file mode 100644 index 00000000..7d98dcbd --- /dev/null +++ b/node_modules/tweetnacl/.npmignore @@ -0,0 +1,4 @@ +.eslintrc +.travis.yml +bower.json +test diff --git a/node_modules/tweetnacl/AUTHORS.md b/node_modules/tweetnacl/AUTHORS.md new file mode 100644 index 00000000..6d74d406 --- /dev/null +++ b/node_modules/tweetnacl/AUTHORS.md @@ -0,0 +1,28 @@ +List of TweetNaCl.js authors +============================ + + Alphabetical order by first name. + Format: Name (GitHub username or URL) + +* AndSDev (@AndSDev) +* Devi Mandiri (@devi) +* Dmitry Chestnykh (@dchest) + +List of authors of third-party public domain code from which TweetNaCl.js code was derived +========================================================================================== + +[TweetNaCl](http://tweetnacl.cr.yp.to/) +-------------------------------------- + +* Bernard van Gastel +* Daniel J. Bernstein +* Peter Schwabe +* Sjaak Smetsers +* Tanja Lange +* Wesley Janssen + + +[Poly1305-donna](https://github.com/floodyberry/poly1305-donna) +-------------------------------------------------------------- + +* Andrew Moon (@floodyberry) diff --git a/node_modules/tweetnacl/CHANGELOG.md b/node_modules/tweetnacl/CHANGELOG.md new file mode 100644 index 00000000..92a4fdc5 --- /dev/null +++ b/node_modules/tweetnacl/CHANGELOG.md @@ -0,0 +1,221 @@ +TweetNaCl.js Changelog +====================== + + +v0.14.5 +------- + +* Fixed incomplete return types in TypeScript typings. +* Replaced COPYING.txt with LICENSE file, which now has public domain dedication + text from The Unlicense. License fields in package.json and bower.json have + been set to "Unlicense". The project was and will be in the public domain -- + this change just makes it easier for automated tools to know about this fact by + using the widely recognized and SPDX-compatible template for public domain + dedication. + + +v0.14.4 +------- + +* Added TypeScript type definitions (contributed by @AndSDev). +* Improved benchmarking code. + + +v0.14.3 +------- + +Fixed a bug in the fast version of Poly1305 and brought it back. + +Thanks to @floodyberry for promptly responding and fixing the original C code: + +> "The issue was not properly detecting if st->h was >= 2^130 - 5, coupled with +> [testing mistake] not catching the failure. The chance of the bug affecting +> anything in the real world is essentially zero luckily, but it's good to have +> it fixed." + +https://github.com/floodyberry/poly1305-donna/issues/2#issuecomment-202698577 + + +v0.14.2 +------- + +Switched Poly1305 fast version back to original (slow) version due to a bug. + + +v0.14.1 +------- + +No code changes, just tweaked packaging and added COPYING.txt. + + +v0.14.0 +------- + +* **Breaking change!** All functions from `nacl.util` have been removed. These + functions are no longer available: + + nacl.util.decodeUTF8 + nacl.util.encodeUTF8 + nacl.util.decodeBase64 + nacl.util.encodeBase64 + + If want to continue using them, you can include + package: + + + + + or + + var nacl = require('tweetnacl'); + nacl.util = require('tweetnacl-util'); + + However it is recommended to use better packages that have wider + compatibility and better performance. Functions from `nacl.util` were never + intended to be robust solution for string conversion and were included for + convenience: cryptography library is not the right place for them. + + Currently calling these functions will throw error pointing to + `tweetnacl-util-js` (in the next version this error message will be removed). + +* Improved detection of available random number generators, making it possible + to use `nacl.randomBytes` and related functions in Web Workers without + changes. + +* Changes to testing (see README). + + +v0.13.3 +------- + +No code changes. + +* Reverted license field in package.json to "Public domain". + +* Fixed typo in README. + + +v0.13.2 +------- + +* Fixed undefined variable bug in fast version of Poly1305. No worries, this + bug was *never* triggered. + +* Specified CC0 public domain dedication. + +* Updated development dependencies. + + +v0.13.1 +------- + +* Exclude `crypto` and `buffer` modules from browserify builds. + + +v0.13.0 +------- + +* Made `nacl-fast` the default version in NPM package. Now + `require("tweetnacl")` will use fast version; to get the original version, + use `require("tweetnacl/nacl.js")`. + +* Cleanup temporary array after generating random bytes. + + +v0.12.2 +------- + +* Improved performance of curve operations, making `nacl.scalarMult`, `nacl.box`, + `nacl.sign` and related functions up to 3x faster in `nacl-fast` version. + + +v0.12.1 +------- + +* Significantly improved performance of Salsa20 (~1.5x faster) and + Poly1305 (~3.5x faster) in `nacl-fast` version. + + +v0.12.0 +------- + +* Instead of using the given secret key directly, TweetNaCl.js now copies it to + a new array in `nacl.box.keyPair.fromSecretKey` and + `nacl.sign.keyPair.fromSecretKey`. + + +v0.11.2 +------- + +* Added new constant: `nacl.sign.seedLength`. + + +v0.11.1 +------- + +* Even faster hash for both short and long inputs (in `nacl-fast`). + + +v0.11.0 +------- + +* Implement `nacl.sign.keyPair.fromSeed` to enable creation of sign key pairs + deterministically from a 32-byte seed. (It behaves like + [libsodium's](http://doc.libsodium.org/public-key_cryptography/public-key_signatures.html) + `crypto_sign_seed_keypair`: the seed becomes a secret part of the secret key.) + +* Fast version now has an improved hash implementation that is 2x-5x faster. + +* Fixed benchmarks, which may have produced incorrect measurements. + + +v0.10.1 +------- + +* Exported undocumented `nacl.lowlevel.crypto_core_hsalsa20`. + + +v0.10.0 +------- + +* **Signature API breaking change!** `nacl.sign` and `nacl.sign.open` now deal + with signed messages, and new `nacl.sign.detached` and + `nacl.sign.detached.verify` are available. + + Previously, `nacl.sign` returned a signature, and `nacl.sign.open` accepted a + message and "detached" signature. This was unlike NaCl's API, which dealt with + signed messages (concatenation of signature and message). + + The new API is: + + nacl.sign(message, secretKey) -> signedMessage + nacl.sign.open(signedMessage, publicKey) -> message | null + + Since detached signatures are common, two new API functions were introduced: + + nacl.sign.detached(message, secretKey) -> signature + nacl.sign.detached.verify(message, signature, publicKey) -> true | false + + (Note that it's `verify`, not `open`, and it returns a boolean value, unlike + `open`, which returns an "unsigned" message.) + +* NPM package now comes without `test` directory to keep it small. + + +v0.9.2 +------ + +* Improved documentation. +* Fast version: increased theoretical message size limit from 2^32-1 to 2^52 + bytes in Poly1305 (and thus, secretbox and box). However this has no impact + in practice since JavaScript arrays or ArrayBuffers are limited to 32-bit + indexes, and most implementations won't allocate more than a gigabyte or so. + (Obviously, there are no tests for the correctness of implementation.) Also, + it's not recommended to use messages that large without splitting them into + smaller packets anyway. + + +v0.9.1 +------ + +* Initial release diff --git a/node_modules/tweetnacl/LICENSE b/node_modules/tweetnacl/LICENSE new file mode 100644 index 00000000..cf1ab25d --- /dev/null +++ b/node_modules/tweetnacl/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md b/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..a8eb4a9a --- /dev/null +++ b/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,20 @@ +# Important! + +If your contribution is not trivial (not a typo fix, etc.), we can only accept +it if you dedicate your copyright for the contribution to the public domain. +Make sure you understand what it means (see http://unlicense.org/)! If you +agree, please add yourself to AUTHORS.md file, and include the following text +to your pull request description or a comment in it: + +------------------------------------------------------------------------------ + + I dedicate any and all copyright interest in this software to the + public domain. I make this dedication for the benefit of the public at + large and to the detriment of my heirs and successors. I intend this + dedication to be an overt act of relinquishment in perpetuity of all + present and future rights to this software under copyright law. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. diff --git a/node_modules/tweetnacl/README.md b/node_modules/tweetnacl/README.md new file mode 100644 index 00000000..ffb6871d --- /dev/null +++ b/node_modules/tweetnacl/README.md @@ -0,0 +1,459 @@ +TweetNaCl.js +============ + +Port of [TweetNaCl](http://tweetnacl.cr.yp.to) / [NaCl](http://nacl.cr.yp.to/) +to JavaScript for modern browsers and Node.js. Public domain. + +[![Build Status](https://travis-ci.org/dchest/tweetnacl-js.svg?branch=master) +](https://travis-ci.org/dchest/tweetnacl-js) + +Demo: + +**:warning: The library is stable and API is frozen, however it has not been +independently reviewed. If you can help reviewing it, please [contact +me](mailto:dmitry@codingrobots.com).** + +Documentation +============= + +* [Overview](#overview) +* [Installation](#installation) +* [Usage](#usage) + * [Public-key authenticated encryption (box)](#public-key-authenticated-encryption-box) + * [Secret-key authenticated encryption (secretbox)](#secret-key-authenticated-encryption-secretbox) + * [Scalar multiplication](#scalar-multiplication) + * [Signatures](#signatures) + * [Hashing](#hashing) + * [Random bytes generation](#random-bytes-generation) + * [Constant-time comparison](#constant-time-comparison) +* [System requirements](#system-requirements) +* [Development and testing](#development-and-testing) +* [Benchmarks](#benchmarks) +* [Contributors](#contributors) +* [Who uses it](#who-uses-it) + + +Overview +-------- + +The primary goal of this project is to produce a translation of TweetNaCl to +JavaScript which is as close as possible to the original C implementation, plus +a thin layer of idiomatic high-level API on top of it. + +There are two versions, you can use either of them: + +* `nacl.js` is the port of TweetNaCl with minimum differences from the + original + high-level API. + +* `nacl-fast.js` is like `nacl.js`, but with some functions replaced with + faster versions. + + +Installation +------------ + +You can install TweetNaCl.js via a package manager: + +[Bower](http://bower.io): + + $ bower install tweetnacl + +[NPM](https://www.npmjs.org/): + + $ npm install tweetnacl + +or [download source code](https://github.com/dchest/tweetnacl-js/releases). + + +Usage +----- + +All API functions accept and return bytes as `Uint8Array`s. If you need to +encode or decode strings, use functions from + or one of the more robust codec +packages. + +In Node.js v4 and later `Buffer` objects are backed by `Uint8Array`s, so you +can freely pass them to TweetNaCl.js functions as arguments. The returned +objects are still `Uint8Array`s, so if you need `Buffer`s, you'll have to +convert them manually; make sure to convert using copying: `new Buffer(array)`, +instead of sharing: `new Buffer(array.buffer)`, because some functions return +subarrays of their buffers. + + +### Public-key authenticated encryption (box) + +Implements *curve25519-xsalsa20-poly1305*. + +#### nacl.box.keyPair() + +Generates a new random key pair for box and returns it as an object with +`publicKey` and `secretKey` members: + + { + publicKey: ..., // Uint8Array with 32-byte public key + secretKey: ... // Uint8Array with 32-byte secret key + } + + +#### nacl.box.keyPair.fromSecretKey(secretKey) + +Returns a key pair for box with public key corresponding to the given secret +key. + +#### nacl.box(message, nonce, theirPublicKey, mySecretKey) + +Encrypt and authenticates message using peer's public key, our secret key, and +the given nonce, which must be unique for each distinct message for a key pair. + +Returns an encrypted and authenticated message, which is +`nacl.box.overheadLength` longer than the original message. + +#### nacl.box.open(box, nonce, theirPublicKey, mySecretKey) + +Authenticates and decrypts the given box with peer's public key, our secret +key, and the given nonce. + +Returns the original message, or `false` if authentication fails. + +#### nacl.box.before(theirPublicKey, mySecretKey) + +Returns a precomputed shared key which can be used in `nacl.box.after` and +`nacl.box.open.after`. + +#### nacl.box.after(message, nonce, sharedKey) + +Same as `nacl.box`, but uses a shared key precomputed with `nacl.box.before`. + +#### nacl.box.open.after(box, nonce, sharedKey) + +Same as `nacl.box.open`, but uses a shared key precomputed with `nacl.box.before`. + +#### nacl.box.publicKeyLength = 32 + +Length of public key in bytes. + +#### nacl.box.secretKeyLength = 32 + +Length of secret key in bytes. + +#### nacl.box.sharedKeyLength = 32 + +Length of precomputed shared key in bytes. + +#### nacl.box.nonceLength = 24 + +Length of nonce in bytes. + +#### nacl.box.overheadLength = 16 + +Length of overhead added to box compared to original message. + + +### Secret-key authenticated encryption (secretbox) + +Implements *xsalsa20-poly1305*. + +#### nacl.secretbox(message, nonce, key) + +Encrypt and authenticates message using the key and the nonce. The nonce must +be unique for each distinct message for this key. + +Returns an encrypted and authenticated message, which is +`nacl.secretbox.overheadLength` longer than the original message. + +#### nacl.secretbox.open(box, nonce, key) + +Authenticates and decrypts the given secret box using the key and the nonce. + +Returns the original message, or `false` if authentication fails. + +#### nacl.secretbox.keyLength = 32 + +Length of key in bytes. + +#### nacl.secretbox.nonceLength = 24 + +Length of nonce in bytes. + +#### nacl.secretbox.overheadLength = 16 + +Length of overhead added to secret box compared to original message. + + +### Scalar multiplication + +Implements *curve25519*. + +#### nacl.scalarMult(n, p) + +Multiplies an integer `n` by a group element `p` and returns the resulting +group element. + +#### nacl.scalarMult.base(n) + +Multiplies an integer `n` by a standard group element and returns the resulting +group element. + +#### nacl.scalarMult.scalarLength = 32 + +Length of scalar in bytes. + +#### nacl.scalarMult.groupElementLength = 32 + +Length of group element in bytes. + + +### Signatures + +Implements [ed25519](http://ed25519.cr.yp.to). + +#### nacl.sign.keyPair() + +Generates new random key pair for signing and returns it as an object with +`publicKey` and `secretKey` members: + + { + publicKey: ..., // Uint8Array with 32-byte public key + secretKey: ... // Uint8Array with 64-byte secret key + } + +#### nacl.sign.keyPair.fromSecretKey(secretKey) + +Returns a signing key pair with public key corresponding to the given +64-byte secret key. The secret key must have been generated by +`nacl.sign.keyPair` or `nacl.sign.keyPair.fromSeed`. + +#### nacl.sign.keyPair.fromSeed(seed) + +Returns a new signing key pair generated deterministically from a 32-byte seed. +The seed must contain enough entropy to be secure. This method is not +recommended for general use: instead, use `nacl.sign.keyPair` to generate a new +key pair from a random seed. + +#### nacl.sign(message, secretKey) + +Signs the message using the secret key and returns a signed message. + +#### nacl.sign.open(signedMessage, publicKey) + +Verifies the signed message and returns the message without signature. + +Returns `null` if verification failed. + +#### nacl.sign.detached(message, secretKey) + +Signs the message using the secret key and returns a signature. + +#### nacl.sign.detached.verify(message, signature, publicKey) + +Verifies the signature for the message and returns `true` if verification +succeeded or `false` if it failed. + +#### nacl.sign.publicKeyLength = 32 + +Length of signing public key in bytes. + +#### nacl.sign.secretKeyLength = 64 + +Length of signing secret key in bytes. + +#### nacl.sign.seedLength = 32 + +Length of seed for `nacl.sign.keyPair.fromSeed` in bytes. + +#### nacl.sign.signatureLength = 64 + +Length of signature in bytes. + + +### Hashing + +Implements *SHA-512*. + +#### nacl.hash(message) + +Returns SHA-512 hash of the message. + +#### nacl.hash.hashLength = 64 + +Length of hash in bytes. + + +### Random bytes generation + +#### nacl.randomBytes(length) + +Returns a `Uint8Array` of the given length containing random bytes of +cryptographic quality. + +**Implementation note** + +TweetNaCl.js uses the following methods to generate random bytes, +depending on the platform it runs on: + +* `window.crypto.getRandomValues` (WebCrypto standard) +* `window.msCrypto.getRandomValues` (Internet Explorer 11) +* `crypto.randomBytes` (Node.js) + +If the platform doesn't provide a suitable PRNG, the following functions, +which require random numbers, will throw exception: + +* `nacl.randomBytes` +* `nacl.box.keyPair` +* `nacl.sign.keyPair` + +Other functions are deterministic and will continue working. + +If a platform you are targeting doesn't implement secure random number +generator, but you somehow have a cryptographically-strong source of entropy +(not `Math.random`!), and you know what you are doing, you can plug it into +TweetNaCl.js like this: + + nacl.setPRNG(function(x, n) { + // ... copy n random bytes into x ... + }); + +Note that `nacl.setPRNG` *completely replaces* internal random byte generator +with the one provided. + + +### Constant-time comparison + +#### nacl.verify(x, y) + +Compares `x` and `y` in constant time and returns `true` if their lengths are +non-zero and equal, and their contents are equal. + +Returns `false` if either of the arguments has zero length, or arguments have +different lengths, or their contents differ. + + +System requirements +------------------- + +TweetNaCl.js supports modern browsers that have a cryptographically secure +pseudorandom number generator and typed arrays, including the latest versions +of: + +* Chrome +* Firefox +* Safari (Mac, iOS) +* Internet Explorer 11 + +Other systems: + +* Node.js + + +Development and testing +------------------------ + +Install NPM modules needed for development: + + $ npm install + +To build minified versions: + + $ npm run build + +Tests use minified version, so make sure to rebuild it every time you change +`nacl.js` or `nacl-fast.js`. + +### Testing + +To run tests in Node.js: + + $ npm run test-node + +By default all tests described here work on `nacl.min.js`. To test other +versions, set environment variable `NACL_SRC` to the file name you want to test. +For example, the following command will test fast minified version: + + $ NACL_SRC=nacl-fast.min.js npm run test-node + +To run full suite of tests in Node.js, including comparing outputs of +JavaScript port to outputs of the original C version: + + $ npm run test-node-all + +To prepare tests for browsers: + + $ npm run build-test-browser + +and then open `test/browser/test.html` (or `test/browser/test-fast.html`) to +run them. + +To run headless browser tests with `tape-run` (powered by Electron): + + $ npm run test-browser + +(If you get `Error: spawn ENOENT`, install *xvfb*: `sudo apt-get install xvfb`.) + +To run tests in both Node and Electron: + + $ npm test + +### Benchmarking + +To run benchmarks in Node.js: + + $ npm run bench + $ NACL_SRC=nacl-fast.min.js npm run bench + +To run benchmarks in a browser, open `test/benchmark/bench.html` (or +`test/benchmark/bench-fast.html`). + + +Benchmarks +---------- + +For reference, here are benchmarks from MacBook Pro (Retina, 13-inch, Mid 2014) +laptop with 2.6 GHz Intel Core i5 CPU (Intel) in Chrome 53/OS X and Xiaomi Redmi +Note 3 smartphone with 1.8 GHz Qualcomm Snapdragon 650 64-bit CPU (ARM) in +Chrome 52/Android: + +| | nacl.js Intel | nacl-fast.js Intel | nacl.js ARM | nacl-fast.js ARM | +| ------------- |:-------------:|:-------------------:|:-------------:|:-----------------:| +| salsa20 | 1.3 MB/s | 128 MB/s | 0.4 MB/s | 43 MB/s | +| poly1305 | 13 MB/s | 171 MB/s | 4 MB/s | 52 MB/s | +| hash | 4 MB/s | 34 MB/s | 0.9 MB/s | 12 MB/s | +| secretbox 1K | 1113 op/s | 57583 op/s | 334 op/s | 14227 op/s | +| box 1K | 145 op/s | 718 op/s | 37 op/s | 368 op/s | +| scalarMult | 171 op/s | 733 op/s | 56 op/s | 380 op/s | +| sign | 77 op/s | 200 op/s | 20 op/s | 61 op/s | +| sign.open | 39 op/s | 102 op/s | 11 op/s | 31 op/s | + +(You can run benchmarks on your devices by clicking on the links at the bottom +of the [home page](https://tweetnacl.js.org)). + +In short, with *nacl-fast.js* and 1024-byte messages you can expect to encrypt and +authenticate more than 57000 messages per second on a typical laptop or more than +14000 messages per second on a $170 smartphone, sign about 200 and verify 100 +messages per second on a laptop or 60 and 30 messages per second on a smartphone, +per CPU core (with Web Workers you can do these operations in parallel), +which is good enough for most applications. + + +Contributors +------------ + +See AUTHORS.md file. + + +Third-party libraries based on TweetNaCl.js +------------------------------------------- + +* [forward-secrecy](https://github.com/alax/forward-secrecy) — Axolotl ratchet implementation +* [nacl-stream](https://github.com/dchest/nacl-stream-js) - streaming encryption +* [tweetnacl-auth-js](https://github.com/dchest/tweetnacl-auth-js) — implementation of [`crypto_auth`](http://nacl.cr.yp.to/auth.html) +* [chloride](https://github.com/dominictarr/chloride) - unified API for various NaCl modules + + +Who uses it +----------- + +Some notable users of TweetNaCl.js: + +* [miniLock](http://minilock.io/) +* [Stellar](https://www.stellar.org/) diff --git a/node_modules/tweetnacl/nacl-fast.js b/node_modules/tweetnacl/nacl-fast.js new file mode 100644 index 00000000..5e4562fe --- /dev/null +++ b/node_modules/tweetnacl/nacl-fast.js @@ -0,0 +1,2388 @@ +(function(nacl) { +'use strict'; + +// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. +// Public domain. +// +// Implementation derived from TweetNaCl version 20140427. +// See for details: http://tweetnacl.cr.yp.to/ + +var gf = function(init) { + var i, r = new Float64Array(16); + if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; + return r; +}; + +// Pluggable, initialized in high-level API below. +var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; + +var _0 = new Uint8Array(16); +var _9 = new Uint8Array(32); _9[0] = 9; + +var gf0 = gf(), + gf1 = gf([1]), + _121665 = gf([0xdb41, 1]), + D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), + D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), + X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), + Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), + I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); + +function ts64(x, i, h, l) { + x[i] = (h >> 24) & 0xff; + x[i+1] = (h >> 16) & 0xff; + x[i+2] = (h >> 8) & 0xff; + x[i+3] = h & 0xff; + x[i+4] = (l >> 24) & 0xff; + x[i+5] = (l >> 16) & 0xff; + x[i+6] = (l >> 8) & 0xff; + x[i+7] = l & 0xff; +} + +function vn(x, xi, y, yi, n) { + var i,d = 0; + for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; + return (1 & ((d - 1) >>> 8)) - 1; +} + +function crypto_verify_16(x, xi, y, yi) { + return vn(x,xi,y,yi,16); +} + +function crypto_verify_32(x, xi, y, yi) { + return vn(x,xi,y,yi,32); +} + +function core_salsa20(o, p, k, c) { + var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, + j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, + j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, + j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, + j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, + j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, + j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, + j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, + j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, + j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, + j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, + j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, + j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, + j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, + j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, + j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; + + var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, + x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, + x15 = j15, u; + + for (var i = 0; i < 20; i += 2) { + u = x0 + x12 | 0; + x4 ^= u<<7 | u>>>(32-7); + u = x4 + x0 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x4 | 0; + x12 ^= u<<13 | u>>>(32-13); + u = x12 + x8 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x1 | 0; + x9 ^= u<<7 | u>>>(32-7); + u = x9 + x5 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x9 | 0; + x1 ^= u<<13 | u>>>(32-13); + u = x1 + x13 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x6 | 0; + x14 ^= u<<7 | u>>>(32-7); + u = x14 + x10 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x14 | 0; + x6 ^= u<<13 | u>>>(32-13); + u = x6 + x2 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x11 | 0; + x3 ^= u<<7 | u>>>(32-7); + u = x3 + x15 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x3 | 0; + x11 ^= u<<13 | u>>>(32-13); + u = x11 + x7 | 0; + x15 ^= u<<18 | u>>>(32-18); + + u = x0 + x3 | 0; + x1 ^= u<<7 | u>>>(32-7); + u = x1 + x0 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x1 | 0; + x3 ^= u<<13 | u>>>(32-13); + u = x3 + x2 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x4 | 0; + x6 ^= u<<7 | u>>>(32-7); + u = x6 + x5 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x6 | 0; + x4 ^= u<<13 | u>>>(32-13); + u = x4 + x7 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x9 | 0; + x11 ^= u<<7 | u>>>(32-7); + u = x11 + x10 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x11 | 0; + x9 ^= u<<13 | u>>>(32-13); + u = x9 + x8 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x14 | 0; + x12 ^= u<<7 | u>>>(32-7); + u = x12 + x15 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x12 | 0; + x14 ^= u<<13 | u>>>(32-13); + u = x14 + x13 | 0; + x15 ^= u<<18 | u>>>(32-18); + } + x0 = x0 + j0 | 0; + x1 = x1 + j1 | 0; + x2 = x2 + j2 | 0; + x3 = x3 + j3 | 0; + x4 = x4 + j4 | 0; + x5 = x5 + j5 | 0; + x6 = x6 + j6 | 0; + x7 = x7 + j7 | 0; + x8 = x8 + j8 | 0; + x9 = x9 + j9 | 0; + x10 = x10 + j10 | 0; + x11 = x11 + j11 | 0; + x12 = x12 + j12 | 0; + x13 = x13 + j13 | 0; + x14 = x14 + j14 | 0; + x15 = x15 + j15 | 0; + + o[ 0] = x0 >>> 0 & 0xff; + o[ 1] = x0 >>> 8 & 0xff; + o[ 2] = x0 >>> 16 & 0xff; + o[ 3] = x0 >>> 24 & 0xff; + + o[ 4] = x1 >>> 0 & 0xff; + o[ 5] = x1 >>> 8 & 0xff; + o[ 6] = x1 >>> 16 & 0xff; + o[ 7] = x1 >>> 24 & 0xff; + + o[ 8] = x2 >>> 0 & 0xff; + o[ 9] = x2 >>> 8 & 0xff; + o[10] = x2 >>> 16 & 0xff; + o[11] = x2 >>> 24 & 0xff; + + o[12] = x3 >>> 0 & 0xff; + o[13] = x3 >>> 8 & 0xff; + o[14] = x3 >>> 16 & 0xff; + o[15] = x3 >>> 24 & 0xff; + + o[16] = x4 >>> 0 & 0xff; + o[17] = x4 >>> 8 & 0xff; + o[18] = x4 >>> 16 & 0xff; + o[19] = x4 >>> 24 & 0xff; + + o[20] = x5 >>> 0 & 0xff; + o[21] = x5 >>> 8 & 0xff; + o[22] = x5 >>> 16 & 0xff; + o[23] = x5 >>> 24 & 0xff; + + o[24] = x6 >>> 0 & 0xff; + o[25] = x6 >>> 8 & 0xff; + o[26] = x6 >>> 16 & 0xff; + o[27] = x6 >>> 24 & 0xff; + + o[28] = x7 >>> 0 & 0xff; + o[29] = x7 >>> 8 & 0xff; + o[30] = x7 >>> 16 & 0xff; + o[31] = x7 >>> 24 & 0xff; + + o[32] = x8 >>> 0 & 0xff; + o[33] = x8 >>> 8 & 0xff; + o[34] = x8 >>> 16 & 0xff; + o[35] = x8 >>> 24 & 0xff; + + o[36] = x9 >>> 0 & 0xff; + o[37] = x9 >>> 8 & 0xff; + o[38] = x9 >>> 16 & 0xff; + o[39] = x9 >>> 24 & 0xff; + + o[40] = x10 >>> 0 & 0xff; + o[41] = x10 >>> 8 & 0xff; + o[42] = x10 >>> 16 & 0xff; + o[43] = x10 >>> 24 & 0xff; + + o[44] = x11 >>> 0 & 0xff; + o[45] = x11 >>> 8 & 0xff; + o[46] = x11 >>> 16 & 0xff; + o[47] = x11 >>> 24 & 0xff; + + o[48] = x12 >>> 0 & 0xff; + o[49] = x12 >>> 8 & 0xff; + o[50] = x12 >>> 16 & 0xff; + o[51] = x12 >>> 24 & 0xff; + + o[52] = x13 >>> 0 & 0xff; + o[53] = x13 >>> 8 & 0xff; + o[54] = x13 >>> 16 & 0xff; + o[55] = x13 >>> 24 & 0xff; + + o[56] = x14 >>> 0 & 0xff; + o[57] = x14 >>> 8 & 0xff; + o[58] = x14 >>> 16 & 0xff; + o[59] = x14 >>> 24 & 0xff; + + o[60] = x15 >>> 0 & 0xff; + o[61] = x15 >>> 8 & 0xff; + o[62] = x15 >>> 16 & 0xff; + o[63] = x15 >>> 24 & 0xff; +} + +function core_hsalsa20(o,p,k,c) { + var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, + j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, + j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, + j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, + j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, + j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, + j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, + j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, + j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, + j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, + j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, + j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, + j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, + j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, + j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, + j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; + + var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, + x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, + x15 = j15, u; + + for (var i = 0; i < 20; i += 2) { + u = x0 + x12 | 0; + x4 ^= u<<7 | u>>>(32-7); + u = x4 + x0 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x4 | 0; + x12 ^= u<<13 | u>>>(32-13); + u = x12 + x8 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x1 | 0; + x9 ^= u<<7 | u>>>(32-7); + u = x9 + x5 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x9 | 0; + x1 ^= u<<13 | u>>>(32-13); + u = x1 + x13 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x6 | 0; + x14 ^= u<<7 | u>>>(32-7); + u = x14 + x10 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x14 | 0; + x6 ^= u<<13 | u>>>(32-13); + u = x6 + x2 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x11 | 0; + x3 ^= u<<7 | u>>>(32-7); + u = x3 + x15 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x3 | 0; + x11 ^= u<<13 | u>>>(32-13); + u = x11 + x7 | 0; + x15 ^= u<<18 | u>>>(32-18); + + u = x0 + x3 | 0; + x1 ^= u<<7 | u>>>(32-7); + u = x1 + x0 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x1 | 0; + x3 ^= u<<13 | u>>>(32-13); + u = x3 + x2 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x4 | 0; + x6 ^= u<<7 | u>>>(32-7); + u = x6 + x5 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x6 | 0; + x4 ^= u<<13 | u>>>(32-13); + u = x4 + x7 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x9 | 0; + x11 ^= u<<7 | u>>>(32-7); + u = x11 + x10 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x11 | 0; + x9 ^= u<<13 | u>>>(32-13); + u = x9 + x8 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x14 | 0; + x12 ^= u<<7 | u>>>(32-7); + u = x12 + x15 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x12 | 0; + x14 ^= u<<13 | u>>>(32-13); + u = x14 + x13 | 0; + x15 ^= u<<18 | u>>>(32-18); + } + + o[ 0] = x0 >>> 0 & 0xff; + o[ 1] = x0 >>> 8 & 0xff; + o[ 2] = x0 >>> 16 & 0xff; + o[ 3] = x0 >>> 24 & 0xff; + + o[ 4] = x5 >>> 0 & 0xff; + o[ 5] = x5 >>> 8 & 0xff; + o[ 6] = x5 >>> 16 & 0xff; + o[ 7] = x5 >>> 24 & 0xff; + + o[ 8] = x10 >>> 0 & 0xff; + o[ 9] = x10 >>> 8 & 0xff; + o[10] = x10 >>> 16 & 0xff; + o[11] = x10 >>> 24 & 0xff; + + o[12] = x15 >>> 0 & 0xff; + o[13] = x15 >>> 8 & 0xff; + o[14] = x15 >>> 16 & 0xff; + o[15] = x15 >>> 24 & 0xff; + + o[16] = x6 >>> 0 & 0xff; + o[17] = x6 >>> 8 & 0xff; + o[18] = x6 >>> 16 & 0xff; + o[19] = x6 >>> 24 & 0xff; + + o[20] = x7 >>> 0 & 0xff; + o[21] = x7 >>> 8 & 0xff; + o[22] = x7 >>> 16 & 0xff; + o[23] = x7 >>> 24 & 0xff; + + o[24] = x8 >>> 0 & 0xff; + o[25] = x8 >>> 8 & 0xff; + o[26] = x8 >>> 16 & 0xff; + o[27] = x8 >>> 24 & 0xff; + + o[28] = x9 >>> 0 & 0xff; + o[29] = x9 >>> 8 & 0xff; + o[30] = x9 >>> 16 & 0xff; + o[31] = x9 >>> 24 & 0xff; +} + +function crypto_core_salsa20(out,inp,k,c) { + core_salsa20(out,inp,k,c); +} + +function crypto_core_hsalsa20(out,inp,k,c) { + core_hsalsa20(out,inp,k,c); +} + +var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); + // "expand 32-byte k" + +function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + mpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i]; + } + return 0; +} + +function crypto_stream_salsa20(c,cpos,b,n,k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < 64; i++) c[cpos+i] = x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < b; i++) c[cpos+i] = x[i]; + } + return 0; +} + +function crypto_stream(c,cpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + var sn = new Uint8Array(8); + for (var i = 0; i < 8; i++) sn[i] = n[i+16]; + return crypto_stream_salsa20(c,cpos,d,sn,s); +} + +function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + var sn = new Uint8Array(8); + for (var i = 0; i < 8; i++) sn[i] = n[i+16]; + return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s); +} + +/* +* Port of Andrew Moon's Poly1305-donna-16. Public domain. +* https://github.com/floodyberry/poly1305-donna +*/ + +var poly1305 = function(key) { + this.buffer = new Uint8Array(16); + this.r = new Uint16Array(10); + this.h = new Uint16Array(10); + this.pad = new Uint16Array(8); + this.leftover = 0; + this.fin = 0; + + var t0, t1, t2, t3, t4, t5, t6, t7; + + t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff; + t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; + t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03; + t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff; + t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff; + this.r[5] = ((t4 >>> 1)) & 0x1ffe; + t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff; + t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81; + t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff; + this.r[9] = ((t7 >>> 5)) & 0x007f; + + this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8; + this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8; + this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8; + this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8; + this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8; + this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8; + this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8; + this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8; +}; + +poly1305.prototype.blocks = function(m, mpos, bytes) { + var hibit = this.fin ? 0 : (1 << 11); + var t0, t1, t2, t3, t4, t5, t6, t7, c; + var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; + + var h0 = this.h[0], + h1 = this.h[1], + h2 = this.h[2], + h3 = this.h[3], + h4 = this.h[4], + h5 = this.h[5], + h6 = this.h[6], + h7 = this.h[7], + h8 = this.h[8], + h9 = this.h[9]; + + var r0 = this.r[0], + r1 = this.r[1], + r2 = this.r[2], + r3 = this.r[3], + r4 = this.r[4], + r5 = this.r[5], + r6 = this.r[6], + r7 = this.r[7], + r8 = this.r[8], + r9 = this.r[9]; + + while (bytes >= 16) { + t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff; + t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; + t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff; + t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff; + t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff; + h5 += ((t4 >>> 1)) & 0x1fff; + t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff; + t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff; + t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff; + h9 += ((t7 >>> 5)) | hibit; + + c = 0; + + d0 = c; + d0 += h0 * r0; + d0 += h1 * (5 * r9); + d0 += h2 * (5 * r8); + d0 += h3 * (5 * r7); + d0 += h4 * (5 * r6); + c = (d0 >>> 13); d0 &= 0x1fff; + d0 += h5 * (5 * r5); + d0 += h6 * (5 * r4); + d0 += h7 * (5 * r3); + d0 += h8 * (5 * r2); + d0 += h9 * (5 * r1); + c += (d0 >>> 13); d0 &= 0x1fff; + + d1 = c; + d1 += h0 * r1; + d1 += h1 * r0; + d1 += h2 * (5 * r9); + d1 += h3 * (5 * r8); + d1 += h4 * (5 * r7); + c = (d1 >>> 13); d1 &= 0x1fff; + d1 += h5 * (5 * r6); + d1 += h6 * (5 * r5); + d1 += h7 * (5 * r4); + d1 += h8 * (5 * r3); + d1 += h9 * (5 * r2); + c += (d1 >>> 13); d1 &= 0x1fff; + + d2 = c; + d2 += h0 * r2; + d2 += h1 * r1; + d2 += h2 * r0; + d2 += h3 * (5 * r9); + d2 += h4 * (5 * r8); + c = (d2 >>> 13); d2 &= 0x1fff; + d2 += h5 * (5 * r7); + d2 += h6 * (5 * r6); + d2 += h7 * (5 * r5); + d2 += h8 * (5 * r4); + d2 += h9 * (5 * r3); + c += (d2 >>> 13); d2 &= 0x1fff; + + d3 = c; + d3 += h0 * r3; + d3 += h1 * r2; + d3 += h2 * r1; + d3 += h3 * r0; + d3 += h4 * (5 * r9); + c = (d3 >>> 13); d3 &= 0x1fff; + d3 += h5 * (5 * r8); + d3 += h6 * (5 * r7); + d3 += h7 * (5 * r6); + d3 += h8 * (5 * r5); + d3 += h9 * (5 * r4); + c += (d3 >>> 13); d3 &= 0x1fff; + + d4 = c; + d4 += h0 * r4; + d4 += h1 * r3; + d4 += h2 * r2; + d4 += h3 * r1; + d4 += h4 * r0; + c = (d4 >>> 13); d4 &= 0x1fff; + d4 += h5 * (5 * r9); + d4 += h6 * (5 * r8); + d4 += h7 * (5 * r7); + d4 += h8 * (5 * r6); + d4 += h9 * (5 * r5); + c += (d4 >>> 13); d4 &= 0x1fff; + + d5 = c; + d5 += h0 * r5; + d5 += h1 * r4; + d5 += h2 * r3; + d5 += h3 * r2; + d5 += h4 * r1; + c = (d5 >>> 13); d5 &= 0x1fff; + d5 += h5 * r0; + d5 += h6 * (5 * r9); + d5 += h7 * (5 * r8); + d5 += h8 * (5 * r7); + d5 += h9 * (5 * r6); + c += (d5 >>> 13); d5 &= 0x1fff; + + d6 = c; + d6 += h0 * r6; + d6 += h1 * r5; + d6 += h2 * r4; + d6 += h3 * r3; + d6 += h4 * r2; + c = (d6 >>> 13); d6 &= 0x1fff; + d6 += h5 * r1; + d6 += h6 * r0; + d6 += h7 * (5 * r9); + d6 += h8 * (5 * r8); + d6 += h9 * (5 * r7); + c += (d6 >>> 13); d6 &= 0x1fff; + + d7 = c; + d7 += h0 * r7; + d7 += h1 * r6; + d7 += h2 * r5; + d7 += h3 * r4; + d7 += h4 * r3; + c = (d7 >>> 13); d7 &= 0x1fff; + d7 += h5 * r2; + d7 += h6 * r1; + d7 += h7 * r0; + d7 += h8 * (5 * r9); + d7 += h9 * (5 * r8); + c += (d7 >>> 13); d7 &= 0x1fff; + + d8 = c; + d8 += h0 * r8; + d8 += h1 * r7; + d8 += h2 * r6; + d8 += h3 * r5; + d8 += h4 * r4; + c = (d8 >>> 13); d8 &= 0x1fff; + d8 += h5 * r3; + d8 += h6 * r2; + d8 += h7 * r1; + d8 += h8 * r0; + d8 += h9 * (5 * r9); + c += (d8 >>> 13); d8 &= 0x1fff; + + d9 = c; + d9 += h0 * r9; + d9 += h1 * r8; + d9 += h2 * r7; + d9 += h3 * r6; + d9 += h4 * r5; + c = (d9 >>> 13); d9 &= 0x1fff; + d9 += h5 * r4; + d9 += h6 * r3; + d9 += h7 * r2; + d9 += h8 * r1; + d9 += h9 * r0; + c += (d9 >>> 13); d9 &= 0x1fff; + + c = (((c << 2) + c)) | 0; + c = (c + d0) | 0; + d0 = c & 0x1fff; + c = (c >>> 13); + d1 += c; + + h0 = d0; + h1 = d1; + h2 = d2; + h3 = d3; + h4 = d4; + h5 = d5; + h6 = d6; + h7 = d7; + h8 = d8; + h9 = d9; + + mpos += 16; + bytes -= 16; + } + this.h[0] = h0; + this.h[1] = h1; + this.h[2] = h2; + this.h[3] = h3; + this.h[4] = h4; + this.h[5] = h5; + this.h[6] = h6; + this.h[7] = h7; + this.h[8] = h8; + this.h[9] = h9; +}; + +poly1305.prototype.finish = function(mac, macpos) { + var g = new Uint16Array(10); + var c, mask, f, i; + + if (this.leftover) { + i = this.leftover; + this.buffer[i++] = 1; + for (; i < 16; i++) this.buffer[i] = 0; + this.fin = 1; + this.blocks(this.buffer, 0, 16); + } + + c = this.h[1] >>> 13; + this.h[1] &= 0x1fff; + for (i = 2; i < 10; i++) { + this.h[i] += c; + c = this.h[i] >>> 13; + this.h[i] &= 0x1fff; + } + this.h[0] += (c * 5); + c = this.h[0] >>> 13; + this.h[0] &= 0x1fff; + this.h[1] += c; + c = this.h[1] >>> 13; + this.h[1] &= 0x1fff; + this.h[2] += c; + + g[0] = this.h[0] + 5; + c = g[0] >>> 13; + g[0] &= 0x1fff; + for (i = 1; i < 10; i++) { + g[i] = this.h[i] + c; + c = g[i] >>> 13; + g[i] &= 0x1fff; + } + g[9] -= (1 << 13); + + mask = (c ^ 1) - 1; + for (i = 0; i < 10; i++) g[i] &= mask; + mask = ~mask; + for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i]; + + this.h[0] = ((this.h[0] ) | (this.h[1] << 13) ) & 0xffff; + this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff; + this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff; + this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff; + this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff; + this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff; + this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff; + this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff; + + f = this.h[0] + this.pad[0]; + this.h[0] = f & 0xffff; + for (i = 1; i < 8; i++) { + f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0; + this.h[i] = f & 0xffff; + } + + mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff; + mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff; + mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff; + mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff; + mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff; + mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff; + mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff; + mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff; + mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff; + mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff; + mac[macpos+10] = (this.h[5] >>> 0) & 0xff; + mac[macpos+11] = (this.h[5] >>> 8) & 0xff; + mac[macpos+12] = (this.h[6] >>> 0) & 0xff; + mac[macpos+13] = (this.h[6] >>> 8) & 0xff; + mac[macpos+14] = (this.h[7] >>> 0) & 0xff; + mac[macpos+15] = (this.h[7] >>> 8) & 0xff; +}; + +poly1305.prototype.update = function(m, mpos, bytes) { + var i, want; + + if (this.leftover) { + want = (16 - this.leftover); + if (want > bytes) + want = bytes; + for (i = 0; i < want; i++) + this.buffer[this.leftover + i] = m[mpos+i]; + bytes -= want; + mpos += want; + this.leftover += want; + if (this.leftover < 16) + return; + this.blocks(this.buffer, 0, 16); + this.leftover = 0; + } + + if (bytes >= 16) { + want = bytes - (bytes % 16); + this.blocks(m, mpos, want); + mpos += want; + bytes -= want; + } + + if (bytes) { + for (i = 0; i < bytes; i++) + this.buffer[this.leftover + i] = m[mpos+i]; + this.leftover += bytes; + } +}; + +function crypto_onetimeauth(out, outpos, m, mpos, n, k) { + var s = new poly1305(k); + s.update(m, mpos, n); + s.finish(out, outpos); + return 0; +} + +function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { + var x = new Uint8Array(16); + crypto_onetimeauth(x,0,m,mpos,n,k); + return crypto_verify_16(h,hpos,x,0); +} + +function crypto_secretbox(c,m,d,n,k) { + var i; + if (d < 32) return -1; + crypto_stream_xor(c,0,m,0,d,n,k); + crypto_onetimeauth(c, 16, c, 32, d - 32, c); + for (i = 0; i < 16; i++) c[i] = 0; + return 0; +} + +function crypto_secretbox_open(m,c,d,n,k) { + var i; + var x = new Uint8Array(32); + if (d < 32) return -1; + crypto_stream(x,0,32,n,k); + if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; + crypto_stream_xor(m,0,c,0,d,n,k); + for (i = 0; i < 32; i++) m[i] = 0; + return 0; +} + +function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) r[i] = a[i]|0; +} + +function car25519(o) { + var i, v, c = 1; + for (i = 0; i < 16; i++) { + v = o[i] + c + 65535; + c = Math.floor(v / 65536); + o[i] = v - c * 65536; + } + o[0] += c-1 + 37 * (c-1); +} + +function sel25519(p, q, b) { + var t, c = ~(b-1); + for (var i = 0; i < 16; i++) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } +} + +function pack25519(o, n) { + var i, j, b; + var m = gf(), t = gf(); + for (i = 0; i < 16; i++) t[i] = n[i]; + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; j++) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; i++) { + m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); + m[i-1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); + b = (m[15]>>16) & 1; + m[14] &= 0xffff; + sel25519(t, m, 1-b); + } + for (i = 0; i < 16; i++) { + o[2*i] = t[i] & 0xff; + o[2*i+1] = t[i]>>8; + } +} + +function neq25519(a, b) { + var c = new Uint8Array(32), d = new Uint8Array(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); +} + +function par25519(a) { + var d = new Uint8Array(32); + pack25519(d, a); + return d[0] & 1; +} + +function unpack25519(o, n) { + var i; + for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); + o[15] &= 0x7fff; +} + +function A(o, a, b) { + for (var i = 0; i < 16; i++) o[i] = a[i] + b[i]; +} + +function Z(o, a, b) { + for (var i = 0; i < 16; i++) o[i] = a[i] - b[i]; +} + +function M(o, a, b) { + var v, c, + t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, + t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, + t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, + t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, + b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7], + b8 = b[8], + b9 = b[9], + b10 = b[10], + b11 = b[11], + b12 = b[12], + b13 = b[13], + b14 = b[14], + b15 = b[15]; + + v = a[0]; + t0 += v * b0; + t1 += v * b1; + t2 += v * b2; + t3 += v * b3; + t4 += v * b4; + t5 += v * b5; + t6 += v * b6; + t7 += v * b7; + t8 += v * b8; + t9 += v * b9; + t10 += v * b10; + t11 += v * b11; + t12 += v * b12; + t13 += v * b13; + t14 += v * b14; + t15 += v * b15; + v = a[1]; + t1 += v * b0; + t2 += v * b1; + t3 += v * b2; + t4 += v * b3; + t5 += v * b4; + t6 += v * b5; + t7 += v * b6; + t8 += v * b7; + t9 += v * b8; + t10 += v * b9; + t11 += v * b10; + t12 += v * b11; + t13 += v * b12; + t14 += v * b13; + t15 += v * b14; + t16 += v * b15; + v = a[2]; + t2 += v * b0; + t3 += v * b1; + t4 += v * b2; + t5 += v * b3; + t6 += v * b4; + t7 += v * b5; + t8 += v * b6; + t9 += v * b7; + t10 += v * b8; + t11 += v * b9; + t12 += v * b10; + t13 += v * b11; + t14 += v * b12; + t15 += v * b13; + t16 += v * b14; + t17 += v * b15; + v = a[3]; + t3 += v * b0; + t4 += v * b1; + t5 += v * b2; + t6 += v * b3; + t7 += v * b4; + t8 += v * b5; + t9 += v * b6; + t10 += v * b7; + t11 += v * b8; + t12 += v * b9; + t13 += v * b10; + t14 += v * b11; + t15 += v * b12; + t16 += v * b13; + t17 += v * b14; + t18 += v * b15; + v = a[4]; + t4 += v * b0; + t5 += v * b1; + t6 += v * b2; + t7 += v * b3; + t8 += v * b4; + t9 += v * b5; + t10 += v * b6; + t11 += v * b7; + t12 += v * b8; + t13 += v * b9; + t14 += v * b10; + t15 += v * b11; + t16 += v * b12; + t17 += v * b13; + t18 += v * b14; + t19 += v * b15; + v = a[5]; + t5 += v * b0; + t6 += v * b1; + t7 += v * b2; + t8 += v * b3; + t9 += v * b4; + t10 += v * b5; + t11 += v * b6; + t12 += v * b7; + t13 += v * b8; + t14 += v * b9; + t15 += v * b10; + t16 += v * b11; + t17 += v * b12; + t18 += v * b13; + t19 += v * b14; + t20 += v * b15; + v = a[6]; + t6 += v * b0; + t7 += v * b1; + t8 += v * b2; + t9 += v * b3; + t10 += v * b4; + t11 += v * b5; + t12 += v * b6; + t13 += v * b7; + t14 += v * b8; + t15 += v * b9; + t16 += v * b10; + t17 += v * b11; + t18 += v * b12; + t19 += v * b13; + t20 += v * b14; + t21 += v * b15; + v = a[7]; + t7 += v * b0; + t8 += v * b1; + t9 += v * b2; + t10 += v * b3; + t11 += v * b4; + t12 += v * b5; + t13 += v * b6; + t14 += v * b7; + t15 += v * b8; + t16 += v * b9; + t17 += v * b10; + t18 += v * b11; + t19 += v * b12; + t20 += v * b13; + t21 += v * b14; + t22 += v * b15; + v = a[8]; + t8 += v * b0; + t9 += v * b1; + t10 += v * b2; + t11 += v * b3; + t12 += v * b4; + t13 += v * b5; + t14 += v * b6; + t15 += v * b7; + t16 += v * b8; + t17 += v * b9; + t18 += v * b10; + t19 += v * b11; + t20 += v * b12; + t21 += v * b13; + t22 += v * b14; + t23 += v * b15; + v = a[9]; + t9 += v * b0; + t10 += v * b1; + t11 += v * b2; + t12 += v * b3; + t13 += v * b4; + t14 += v * b5; + t15 += v * b6; + t16 += v * b7; + t17 += v * b8; + t18 += v * b9; + t19 += v * b10; + t20 += v * b11; + t21 += v * b12; + t22 += v * b13; + t23 += v * b14; + t24 += v * b15; + v = a[10]; + t10 += v * b0; + t11 += v * b1; + t12 += v * b2; + t13 += v * b3; + t14 += v * b4; + t15 += v * b5; + t16 += v * b6; + t17 += v * b7; + t18 += v * b8; + t19 += v * b9; + t20 += v * b10; + t21 += v * b11; + t22 += v * b12; + t23 += v * b13; + t24 += v * b14; + t25 += v * b15; + v = a[11]; + t11 += v * b0; + t12 += v * b1; + t13 += v * b2; + t14 += v * b3; + t15 += v * b4; + t16 += v * b5; + t17 += v * b6; + t18 += v * b7; + t19 += v * b8; + t20 += v * b9; + t21 += v * b10; + t22 += v * b11; + t23 += v * b12; + t24 += v * b13; + t25 += v * b14; + t26 += v * b15; + v = a[12]; + t12 += v * b0; + t13 += v * b1; + t14 += v * b2; + t15 += v * b3; + t16 += v * b4; + t17 += v * b5; + t18 += v * b6; + t19 += v * b7; + t20 += v * b8; + t21 += v * b9; + t22 += v * b10; + t23 += v * b11; + t24 += v * b12; + t25 += v * b13; + t26 += v * b14; + t27 += v * b15; + v = a[13]; + t13 += v * b0; + t14 += v * b1; + t15 += v * b2; + t16 += v * b3; + t17 += v * b4; + t18 += v * b5; + t19 += v * b6; + t20 += v * b7; + t21 += v * b8; + t22 += v * b9; + t23 += v * b10; + t24 += v * b11; + t25 += v * b12; + t26 += v * b13; + t27 += v * b14; + t28 += v * b15; + v = a[14]; + t14 += v * b0; + t15 += v * b1; + t16 += v * b2; + t17 += v * b3; + t18 += v * b4; + t19 += v * b5; + t20 += v * b6; + t21 += v * b7; + t22 += v * b8; + t23 += v * b9; + t24 += v * b10; + t25 += v * b11; + t26 += v * b12; + t27 += v * b13; + t28 += v * b14; + t29 += v * b15; + v = a[15]; + t15 += v * b0; + t16 += v * b1; + t17 += v * b2; + t18 += v * b3; + t19 += v * b4; + t20 += v * b5; + t21 += v * b6; + t22 += v * b7; + t23 += v * b8; + t24 += v * b9; + t25 += v * b10; + t26 += v * b11; + t27 += v * b12; + t28 += v * b13; + t29 += v * b14; + t30 += v * b15; + + t0 += 38 * t16; + t1 += 38 * t17; + t2 += 38 * t18; + t3 += 38 * t19; + t4 += 38 * t20; + t5 += 38 * t21; + t6 += 38 * t22; + t7 += 38 * t23; + t8 += 38 * t24; + t9 += 38 * t25; + t10 += 38 * t26; + t11 += 38 * t27; + t12 += 38 * t28; + t13 += 38 * t29; + t14 += 38 * t30; + // t15 left as is + + // first car + c = 1; + v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; + v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; + v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; + v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; + v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; + v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; + v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; + v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; + v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; + v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; + v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; + v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; + v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; + v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; + v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; + v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; + t0 += c-1 + 37 * (c-1); + + // second car + c = 1; + v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; + v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; + v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; + v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; + v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; + v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; + v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; + v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; + v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; + v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; + v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; + v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; + v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; + v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; + v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; + v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; + t0 += c-1 + 37 * (c-1); + + o[ 0] = t0; + o[ 1] = t1; + o[ 2] = t2; + o[ 3] = t3; + o[ 4] = t4; + o[ 5] = t5; + o[ 6] = t6; + o[ 7] = t7; + o[ 8] = t8; + o[ 9] = t9; + o[10] = t10; + o[11] = t11; + o[12] = t12; + o[13] = t13; + o[14] = t14; + o[15] = t15; +} + +function S(o, a) { + M(o, a, a); +} + +function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 253; a >= 0; a--) { + S(c, c); + if(a !== 2 && a !== 4) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 250; a >= 0; a--) { + S(c, c); + if(a !== 1) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function crypto_scalarmult(q, n, p) { + var z = new Uint8Array(32); + var x = new Float64Array(80), r, i; + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(); + for (i = 0; i < 31; i++) z[i] = n[i]; + z[31]=(n[31]&127)|64; + z[0]&=248; + unpack25519(x,p); + for (i = 0; i < 16; i++) { + b[i]=x[i]; + d[i]=a[i]=c[i]=0; + } + a[0]=d[0]=1; + for (i=254; i>=0; --i) { + r=(z[i>>>3]>>>(i&7))&1; + sel25519(a,b,r); + sel25519(c,d,r); + A(e,a,c); + Z(a,a,c); + A(c,b,d); + Z(b,b,d); + S(d,e); + S(f,a); + M(a,c,a); + M(c,b,e); + A(e,a,c); + Z(a,a,c); + S(b,a); + Z(c,d,f); + M(a,c,_121665); + A(a,a,d); + M(c,c,a); + M(a,d,f); + M(d,b,x); + S(b,e); + sel25519(a,b,r); + sel25519(c,d,r); + } + for (i = 0; i < 16; i++) { + x[i+16]=a[i]; + x[i+32]=c[i]; + x[i+48]=b[i]; + x[i+64]=d[i]; + } + var x32 = x.subarray(32); + var x16 = x.subarray(16); + inv25519(x32,x32); + M(x16,x16,x32); + pack25519(q,x16); + return 0; +} + +function crypto_scalarmult_base(q, n) { + return crypto_scalarmult(q, n, _9); +} + +function crypto_box_keypair(y, x) { + randombytes(x, 32); + return crypto_scalarmult_base(y, x); +} + +function crypto_box_beforenm(k, y, x) { + var s = new Uint8Array(32); + crypto_scalarmult(s, x, y); + return crypto_core_hsalsa20(k, _0, s, sigma); +} + +var crypto_box_afternm = crypto_secretbox; +var crypto_box_open_afternm = crypto_secretbox_open; + +function crypto_box(c, m, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_afternm(c, m, d, n, k); +} + +function crypto_box_open(m, c, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_open_afternm(m, c, d, n, k); +} + +var K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +]; + +function crypto_hashblocks_hl(hh, hl, m, n) { + var wh = new Int32Array(16), wl = new Int32Array(16), + bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7, + bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7, + th, tl, i, j, h, l, a, b, c, d; + + var ah0 = hh[0], + ah1 = hh[1], + ah2 = hh[2], + ah3 = hh[3], + ah4 = hh[4], + ah5 = hh[5], + ah6 = hh[6], + ah7 = hh[7], + + al0 = hl[0], + al1 = hl[1], + al2 = hl[2], + al3 = hl[3], + al4 = hl[4], + al5 = hl[5], + al6 = hl[6], + al7 = hl[7]; + + var pos = 0; + while (n >= 128) { + for (i = 0; i < 16; i++) { + j = 8 * i + pos; + wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3]; + wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7]; + } + for (i = 0; i < 80; i++) { + bh0 = ah0; + bh1 = ah1; + bh2 = ah2; + bh3 = ah3; + bh4 = ah4; + bh5 = ah5; + bh6 = ah6; + bh7 = ah7; + + bl0 = al0; + bl1 = al1; + bl2 = al2; + bl3 = al3; + bl4 = al4; + bl5 = al5; + bl6 = al6; + bl7 = al7; + + // add + h = ah7; + l = al7; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + // Sigma1 + h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32)))); + l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32)))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // Ch + h = (ah4 & ah5) ^ (~ah4 & ah6); + l = (al4 & al5) ^ (~al4 & al6); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // K + h = K[i*2]; + l = K[i*2+1]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // w + h = wh[i%16]; + l = wl[i%16]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + th = c & 0xffff | d << 16; + tl = a & 0xffff | b << 16; + + // add + h = th; + l = tl; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + // Sigma0 + h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32)))); + l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32)))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // Maj + h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2); + l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + bh7 = (c & 0xffff) | (d << 16); + bl7 = (a & 0xffff) | (b << 16); + + // add + h = bh3; + l = bl3; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = th; + l = tl; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + bh3 = (c & 0xffff) | (d << 16); + bl3 = (a & 0xffff) | (b << 16); + + ah1 = bh0; + ah2 = bh1; + ah3 = bh2; + ah4 = bh3; + ah5 = bh4; + ah6 = bh5; + ah7 = bh6; + ah0 = bh7; + + al1 = bl0; + al2 = bl1; + al3 = bl2; + al4 = bl3; + al5 = bl4; + al6 = bl5; + al7 = bl6; + al0 = bl7; + + if (i%16 === 15) { + for (j = 0; j < 16; j++) { + // add + h = wh[j]; + l = wl[j]; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = wh[(j+9)%16]; + l = wl[(j+9)%16]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // sigma0 + th = wh[(j+1)%16]; + tl = wl[(j+1)%16]; + h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7); + l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // sigma1 + th = wh[(j+14)%16]; + tl = wl[(j+14)%16]; + h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6); + l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + wh[j] = (c & 0xffff) | (d << 16); + wl[j] = (a & 0xffff) | (b << 16); + } + } + } + + // add + h = ah0; + l = al0; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[0]; + l = hl[0]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[0] = ah0 = (c & 0xffff) | (d << 16); + hl[0] = al0 = (a & 0xffff) | (b << 16); + + h = ah1; + l = al1; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[1]; + l = hl[1]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[1] = ah1 = (c & 0xffff) | (d << 16); + hl[1] = al1 = (a & 0xffff) | (b << 16); + + h = ah2; + l = al2; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[2]; + l = hl[2]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[2] = ah2 = (c & 0xffff) | (d << 16); + hl[2] = al2 = (a & 0xffff) | (b << 16); + + h = ah3; + l = al3; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[3]; + l = hl[3]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[3] = ah3 = (c & 0xffff) | (d << 16); + hl[3] = al3 = (a & 0xffff) | (b << 16); + + h = ah4; + l = al4; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[4]; + l = hl[4]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[4] = ah4 = (c & 0xffff) | (d << 16); + hl[4] = al4 = (a & 0xffff) | (b << 16); + + h = ah5; + l = al5; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[5]; + l = hl[5]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[5] = ah5 = (c & 0xffff) | (d << 16); + hl[5] = al5 = (a & 0xffff) | (b << 16); + + h = ah6; + l = al6; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[6]; + l = hl[6]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[6] = ah6 = (c & 0xffff) | (d << 16); + hl[6] = al6 = (a & 0xffff) | (b << 16); + + h = ah7; + l = al7; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[7]; + l = hl[7]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[7] = ah7 = (c & 0xffff) | (d << 16); + hl[7] = al7 = (a & 0xffff) | (b << 16); + + pos += 128; + n -= 128; + } + + return n; +} + +function crypto_hash(out, m, n) { + var hh = new Int32Array(8), + hl = new Int32Array(8), + x = new Uint8Array(256), + i, b = n; + + hh[0] = 0x6a09e667; + hh[1] = 0xbb67ae85; + hh[2] = 0x3c6ef372; + hh[3] = 0xa54ff53a; + hh[4] = 0x510e527f; + hh[5] = 0x9b05688c; + hh[6] = 0x1f83d9ab; + hh[7] = 0x5be0cd19; + + hl[0] = 0xf3bcc908; + hl[1] = 0x84caa73b; + hl[2] = 0xfe94f82b; + hl[3] = 0x5f1d36f1; + hl[4] = 0xade682d1; + hl[5] = 0x2b3e6c1f; + hl[6] = 0xfb41bd6b; + hl[7] = 0x137e2179; + + crypto_hashblocks_hl(hh, hl, m, n); + n %= 128; + + for (i = 0; i < n; i++) x[i] = m[b-n+i]; + x[n] = 128; + + n = 256-128*(n<112?1:0); + x[n-9] = 0; + ts64(x, n-8, (b / 0x20000000) | 0, b << 3); + crypto_hashblocks_hl(hh, hl, x, n); + + for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]); + + return 0; +} + +function add(p, q) { + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(), + g = gf(), h = gf(), t = gf(); + + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); +} + +function cswap(p, q, b) { + var i; + for (i = 0; i < 4; i++) { + sel25519(p[i], q[i], b); + } +} + +function pack(r, p) { + var tx = gf(), ty = gf(), zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; +} + +function scalarmult(p, q, s) { + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = (s[(i/8)|0] >> (i&7)) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } +} + +function scalarbase(p, s) { + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); +} + +function crypto_sign_keypair(pk, sk, seeded) { + var d = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()]; + var i; + + if (!seeded) randombytes(sk, 32); + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + scalarbase(p, d); + pack(pk, p); + + for (i = 0; i < 32; i++) sk[i+32] = pk[i]; + return 0; +} + +var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); + +function modL(r, x) { + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = (x[j] + 128) >> 8; + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; j++) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; j++) x[j] -= carry * L[j]; + for (i = 0; i < 32; i++) { + x[i+1] += x[i] >> 8; + r[i] = x[i] & 255; + } +} + +function reduce(r) { + var x = new Float64Array(64), i; + for (i = 0; i < 64; i++) x[i] = r[i]; + for (i = 0; i < 64; i++) r[i] = 0; + modL(r, x); +} + +// Note: difference from C - smlen returned, not passed as argument. +function crypto_sign(sm, m, n, sk) { + var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); + var i, j, x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; + + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + var smlen = n + 64; + for (i = 0; i < n; i++) sm[64 + i] = m[i]; + for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; + + crypto_hash(r, sm.subarray(32), n+32); + reduce(r); + scalarbase(p, r); + pack(sm, p); + + for (i = 32; i < 64; i++) sm[i] = sk[i]; + crypto_hash(h, sm, n + 64); + reduce(h); + + for (i = 0; i < 64; i++) x[i] = 0; + for (i = 0; i < 32; i++) x[i] = r[i]; + for (i = 0; i < 32; i++) { + for (j = 0; j < 32; j++) { + x[i+j] += h[i] * d[j]; + } + } + + modL(sm.subarray(32), x); + return smlen; +} + +function unpackneg(r, p) { + var t = gf(), chk = gf(), num = gf(), + den = gf(), den2 = gf(), den4 = gf(), + den6 = gf(); + + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); + + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); + + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) M(r[0], r[0], I); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) return -1; + + if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); + + M(r[3], r[0], r[1]); + return 0; +} + +function crypto_sign_open(m, sm, n, pk) { + var i, mlen; + var t = new Uint8Array(32), h = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()], + q = [gf(), gf(), gf(), gf()]; + + mlen = -1; + if (n < 64) return -1; + + if (unpackneg(q, pk)) return -1; + + for (i = 0; i < n; i++) m[i] = sm[i]; + for (i = 0; i < 32; i++) m[i+32] = pk[i]; + crypto_hash(h, m, n); + reduce(h); + scalarmult(p, q, h); + + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); + + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; i++) m[i] = 0; + return -1; + } + + for (i = 0; i < n; i++) m[i] = sm[i + 64]; + mlen = n; + return mlen; +} + +var crypto_secretbox_KEYBYTES = 32, + crypto_secretbox_NONCEBYTES = 24, + crypto_secretbox_ZEROBYTES = 32, + crypto_secretbox_BOXZEROBYTES = 16, + crypto_scalarmult_BYTES = 32, + crypto_scalarmult_SCALARBYTES = 32, + crypto_box_PUBLICKEYBYTES = 32, + crypto_box_SECRETKEYBYTES = 32, + crypto_box_BEFORENMBYTES = 32, + crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, + crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, + crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, + crypto_sign_BYTES = 64, + crypto_sign_PUBLICKEYBYTES = 32, + crypto_sign_SECRETKEYBYTES = 64, + crypto_sign_SEEDBYTES = 32, + crypto_hash_BYTES = 64; + +nacl.lowlevel = { + crypto_core_hsalsa20: crypto_core_hsalsa20, + crypto_stream_xor: crypto_stream_xor, + crypto_stream: crypto_stream, + crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, + crypto_stream_salsa20: crypto_stream_salsa20, + crypto_onetimeauth: crypto_onetimeauth, + crypto_onetimeauth_verify: crypto_onetimeauth_verify, + crypto_verify_16: crypto_verify_16, + crypto_verify_32: crypto_verify_32, + crypto_secretbox: crypto_secretbox, + crypto_secretbox_open: crypto_secretbox_open, + crypto_scalarmult: crypto_scalarmult, + crypto_scalarmult_base: crypto_scalarmult_base, + crypto_box_beforenm: crypto_box_beforenm, + crypto_box_afternm: crypto_box_afternm, + crypto_box: crypto_box, + crypto_box_open: crypto_box_open, + crypto_box_keypair: crypto_box_keypair, + crypto_hash: crypto_hash, + crypto_sign: crypto_sign, + crypto_sign_keypair: crypto_sign_keypair, + crypto_sign_open: crypto_sign_open, + + crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, + crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, + crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, + crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, + crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, + crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, + crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, + crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, + crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, + crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, + crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, + crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, + crypto_sign_BYTES: crypto_sign_BYTES, + crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, + crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, + crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, + crypto_hash_BYTES: crypto_hash_BYTES +}; + +/* High-level API */ + +function checkLengths(k, n) { + if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); + if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); +} + +function checkBoxLengths(pk, sk) { + if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); + if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); +} + +function checkArrayTypes() { + var t, i; + for (i = 0; i < arguments.length; i++) { + if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]') + throw new TypeError('unexpected type ' + t + ', use Uint8Array'); + } +} + +function cleanup(arr) { + for (var i = 0; i < arr.length; i++) arr[i] = 0; +} + +// TODO: Completely remove this in v0.15. +if (!nacl.util) { + nacl.util = {}; + nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { + throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js'); + }; +} + +nacl.randomBytes = function(n) { + var b = new Uint8Array(n); + randombytes(b, n); + return b; +}; + +nacl.secretbox = function(msg, nonce, key) { + checkArrayTypes(msg, nonce, key); + checkLengths(key, nonce); + var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); + var c = new Uint8Array(m.length); + for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; + crypto_secretbox(c, m, m.length, nonce, key); + return c.subarray(crypto_secretbox_BOXZEROBYTES); +}; + +nacl.secretbox.open = function(box, nonce, key) { + checkArrayTypes(box, nonce, key); + checkLengths(key, nonce); + var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); + var m = new Uint8Array(c.length); + for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; + if (c.length < 32) return false; + if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; + return m.subarray(crypto_secretbox_ZEROBYTES); +}; + +nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; +nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; +nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; + +nacl.scalarMult = function(n, p) { + checkArrayTypes(n, p); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult(q, n, p); + return q; +}; + +nacl.scalarMult.base = function(n) { + checkArrayTypes(n); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult_base(q, n); + return q; +}; + +nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; +nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; + +nacl.box = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox(msg, nonce, k); +}; + +nacl.box.before = function(publicKey, secretKey) { + checkArrayTypes(publicKey, secretKey); + checkBoxLengths(publicKey, secretKey); + var k = new Uint8Array(crypto_box_BEFORENMBYTES); + crypto_box_beforenm(k, publicKey, secretKey); + return k; +}; + +nacl.box.after = nacl.secretbox; + +nacl.box.open = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox.open(msg, nonce, k); +}; + +nacl.box.open.after = nacl.secretbox.open; + +nacl.box.keyPair = function() { + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); + crypto_box_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.box.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_box_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + crypto_scalarmult_base(pk, secretKey); + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; +nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; +nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; +nacl.box.nonceLength = crypto_box_NONCEBYTES; +nacl.box.overheadLength = nacl.secretbox.overheadLength; + +nacl.sign = function(msg, secretKey) { + checkArrayTypes(msg, secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); + crypto_sign(signedMsg, msg, msg.length, secretKey); + return signedMsg; +}; + +nacl.sign.open = function(signedMsg, publicKey) { + if (arguments.length !== 2) + throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?'); + checkArrayTypes(signedMsg, publicKey); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var tmp = new Uint8Array(signedMsg.length); + var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); + if (mlen < 0) return null; + var m = new Uint8Array(mlen); + for (var i = 0; i < m.length; i++) m[i] = tmp[i]; + return m; +}; + +nacl.sign.detached = function(msg, secretKey) { + var signedMsg = nacl.sign(msg, secretKey); + var sig = new Uint8Array(crypto_sign_BYTES); + for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; + return sig; +}; + +nacl.sign.detached.verify = function(msg, sig, publicKey) { + checkArrayTypes(msg, sig, publicKey); + if (sig.length !== crypto_sign_BYTES) + throw new Error('bad signature size'); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var sm = new Uint8Array(crypto_sign_BYTES + msg.length); + var m = new Uint8Array(crypto_sign_BYTES + msg.length); + var i; + for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; + for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; + return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); +}; + +nacl.sign.keyPair = function() { + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + crypto_sign_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.sign.keyPair.fromSeed = function(seed) { + checkArrayTypes(seed); + if (seed.length !== crypto_sign_SEEDBYTES) + throw new Error('bad seed size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + for (var i = 0; i < 32; i++) sk[i] = seed[i]; + crypto_sign_keypair(pk, sk, true); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; +nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; +nacl.sign.seedLength = crypto_sign_SEEDBYTES; +nacl.sign.signatureLength = crypto_sign_BYTES; + +nacl.hash = function(msg) { + checkArrayTypes(msg); + var h = new Uint8Array(crypto_hash_BYTES); + crypto_hash(h, msg, msg.length); + return h; +}; + +nacl.hash.hashLength = crypto_hash_BYTES; + +nacl.verify = function(x, y) { + checkArrayTypes(x, y); + // Zero length arguments are considered not equal. + if (x.length === 0 || y.length === 0) return false; + if (x.length !== y.length) return false; + return (vn(x, 0, y, 0, x.length) === 0) ? true : false; +}; + +nacl.setPRNG = function(fn) { + randombytes = fn; +}; + +(function() { + // Initialize PRNG if environment provides CSPRNG. + // If not, methods calling randombytes will throw. + var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; + if (crypto && crypto.getRandomValues) { + // Browsers. + var QUOTA = 65536; + nacl.setPRNG(function(x, n) { + var i, v = new Uint8Array(n); + for (i = 0; i < n; i += QUOTA) { + crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); + } + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } else if (typeof require !== 'undefined') { + // Node.js. + crypto = require('crypto'); + if (crypto && crypto.randomBytes) { + nacl.setPRNG(function(x, n) { + var i, v = crypto.randomBytes(n); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } + } +})(); + +})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/node_modules/tweetnacl/nacl-fast.min.js b/node_modules/tweetnacl/nacl-fast.min.js new file mode 100644 index 00000000..8bc47daa --- /dev/null +++ b/node_modules/tweetnacl/nacl-fast.min.js @@ -0,0 +1,2 @@ +!function(r){"use strict";function t(r,t,n,e){r[t]=n>>24&255,r[t+1]=n>>16&255,r[t+2]=n>>8&255,r[t+3]=255&n,r[t+4]=e>>24&255,r[t+5]=e>>16&255,r[t+6]=e>>8&255,r[t+7]=255&e}function n(r,t,n,e,o){var i,h=0;for(i=0;i>>8)-1}function e(r,t,e,o){return n(r,t,e,o,16)}function o(r,t,e,o){return n(r,t,e,o,32)}function i(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,c=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,u=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=c,B=u,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;O<20;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;d=d+i|0,U=U+h|0,E=E+a|0,x=x+f|0,M=M+s|0,m=m+c|0,B=B+u|0,S=S+y|0,K=K+l|0,T=T+w|0,Y=Y+p|0,k=k+v|0,L=L+b|0,z=z+g|0,R=R+_|0,P=P+A|0,r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=U>>>0&255,r[5]=U>>>8&255,r[6]=U>>>16&255,r[7]=U>>>24&255,r[8]=E>>>0&255,r[9]=E>>>8&255,r[10]=E>>>16&255,r[11]=E>>>24&255,r[12]=x>>>0&255,r[13]=x>>>8&255,r[14]=x>>>16&255,r[15]=x>>>24&255,r[16]=M>>>0&255,r[17]=M>>>8&255,r[18]=M>>>16&255,r[19]=M>>>24&255,r[20]=m>>>0&255,r[21]=m>>>8&255,r[22]=m>>>16&255,r[23]=m>>>24&255,r[24]=B>>>0&255,r[25]=B>>>8&255,r[26]=B>>>16&255,r[27]=B>>>24&255,r[28]=S>>>0&255,r[29]=S>>>8&255,r[30]=S>>>16&255,r[31]=S>>>24&255,r[32]=K>>>0&255,r[33]=K>>>8&255,r[34]=K>>>16&255,r[35]=K>>>24&255,r[36]=T>>>0&255,r[37]=T>>>8&255,r[38]=T>>>16&255,r[39]=T>>>24&255,r[40]=Y>>>0&255,r[41]=Y>>>8&255,r[42]=Y>>>16&255,r[43]=Y>>>24&255,r[44]=k>>>0&255,r[45]=k>>>8&255,r[46]=k>>>16&255,r[47]=k>>>24&255,r[48]=L>>>0&255,r[49]=L>>>8&255,r[50]=L>>>16&255,r[51]=L>>>24&255,r[52]=z>>>0&255,r[53]=z>>>8&255,r[54]=z>>>16&255,r[55]=z>>>24&255,r[56]=R>>>0&255,r[57]=R>>>8&255,r[58]=R>>>16&255,r[59]=R>>>24&255,r[60]=P>>>0&255,r[61]=P>>>8&255,r[62]=P>>>16&255,r[63]=P>>>24&255}function h(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,c=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,u=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=c,B=u,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;O<20;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=m>>>0&255,r[5]=m>>>8&255,r[6]=m>>>16&255,r[7]=m>>>24&255,r[8]=Y>>>0&255,r[9]=Y>>>8&255,r[10]=Y>>>16&255,r[11]=Y>>>24&255,r[12]=P>>>0&255,r[13]=P>>>8&255,r[14]=P>>>16&255,r[15]=P>>>24&255,r[16]=B>>>0&255,r[17]=B>>>8&255,r[18]=B>>>16&255,r[19]=B>>>24&255,r[20]=S>>>0&255,r[21]=S>>>8&255,r[22]=S>>>16&255,r[23]=S>>>24&255,r[24]=K>>>0&255,r[25]=K>>>8&255,r[26]=K>>>16&255,r[27]=K>>>24&255,r[28]=T>>>0&255,r[29]=T>>>8&255,r[30]=T>>>16&255,r[31]=T>>>24&255}function a(r,t,n,e){i(r,t,n,e)}function f(r,t,n,e){h(r,t,n,e)}function s(r,t,n,e,o,i,h){var f,s,c=new Uint8Array(16),u=new Uint8Array(64);for(s=0;s<16;s++)c[s]=0;for(s=0;s<8;s++)c[s]=i[s];for(;o>=64;){for(a(u,c,h,ur),s=0;s<64;s++)r[t+s]=n[e+s]^u[s];for(f=1,s=8;s<16;s++)f=f+(255&c[s])|0,c[s]=255&f,f>>>=8;o-=64,t+=64,e+=64}if(o>0)for(a(u,c,h,ur),s=0;s=64;){for(a(s,f,o,ur),h=0;h<64;h++)r[t+h]=s[h];for(i=1,h=8;h<16;h++)i=i+(255&f[h])|0,f[h]=255&i,i>>>=8;n-=64,t+=64}if(n>0)for(a(s,f,o,ur),h=0;h>16&1),i[n-1]&=65535;i[15]=h[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,_(h,i,1-o)}for(n=0;n<16;n++)r[2*n]=255&h[n],r[2*n+1]=h[n]>>8}function d(r,t){var n=new Uint8Array(32),e=new Uint8Array(32);return A(n,r),A(e,t),o(n,0,e,0)}function U(r){var t=new Uint8Array(32);return A(t,r),1&t[0]}function E(r,t){var n;for(n=0;n<16;n++)r[n]=t[2*n]+(t[2*n+1]<<8);r[15]&=32767}function x(r,t,n){for(var e=0;e<16;e++)r[e]=t[e]+n[e]}function M(r,t,n){for(var e=0;e<16;e++)r[e]=t[e]-n[e]}function m(r,t,n){var e,o,i=0,h=0,a=0,f=0,s=0,c=0,u=0,y=0,l=0,w=0,p=0,v=0,b=0,g=0,_=0,A=0,d=0,U=0,E=0,x=0,M=0,m=0,B=0,S=0,K=0,T=0,Y=0,k=0,L=0,z=0,R=0,P=n[0],O=n[1],N=n[2],C=n[3],F=n[4],I=n[5],G=n[6],Z=n[7],j=n[8],q=n[9],V=n[10],X=n[11],D=n[12],H=n[13],J=n[14],Q=n[15];e=t[0],i+=e*P,h+=e*O,a+=e*N,f+=e*C,s+=e*F,c+=e*I,u+=e*G,y+=e*Z,l+=e*j,w+=e*q,p+=e*V,v+=e*X,b+=e*D,g+=e*H,_+=e*J,A+=e*Q,e=t[1],h+=e*P,a+=e*O,f+=e*N,s+=e*C,c+=e*F,u+=e*I,y+=e*G,l+=e*Z,w+=e*j,p+=e*q,v+=e*V,b+=e*X,g+=e*D,_+=e*H,A+=e*J,d+=e*Q,e=t[2],a+=e*P,f+=e*O,s+=e*N,c+=e*C,u+=e*F,y+=e*I,l+=e*G,w+=e*Z,p+=e*j,v+=e*q,b+=e*V,g+=e*X,_+=e*D,A+=e*H,d+=e*J,U+=e*Q,e=t[3],f+=e*P,s+=e*O,c+=e*N,u+=e*C,y+=e*F,l+=e*I,w+=e*G,p+=e*Z,v+=e*j,b+=e*q,g+=e*V,_+=e*X,A+=e*D,d+=e*H,U+=e*J,E+=e*Q,e=t[4],s+=e*P,c+=e*O,u+=e*N,y+=e*C,l+=e*F,w+=e*I,p+=e*G,v+=e*Z,b+=e*j,g+=e*q,_+=e*V,A+=e*X,d+=e*D,U+=e*H,E+=e*J,x+=e*Q,e=t[5],c+=e*P,u+=e*O,y+=e*N,l+=e*C,w+=e*F,p+=e*I,v+=e*G,b+=e*Z,g+=e*j,_+=e*q,A+=e*V,d+=e*X,U+=e*D,E+=e*H,x+=e*J,M+=e*Q,e=t[6],u+=e*P,y+=e*O,l+=e*N,w+=e*C,p+=e*F,v+=e*I,b+=e*G,g+=e*Z,_+=e*j,A+=e*q,d+=e*V,U+=e*X,E+=e*D,x+=e*H,M+=e*J,m+=e*Q,e=t[7],y+=e*P,l+=e*O,w+=e*N,p+=e*C,v+=e*F,b+=e*I,g+=e*G,_+=e*Z,A+=e*j,d+=e*q,U+=e*V,E+=e*X,x+=e*D,M+=e*H,m+=e*J,B+=e*Q,e=t[8],l+=e*P,w+=e*O,p+=e*N,v+=e*C,b+=e*F,g+=e*I,_+=e*G,A+=e*Z,d+=e*j,U+=e*q,E+=e*V,x+=e*X,M+=e*D,m+=e*H,B+=e*J,S+=e*Q,e=t[9],w+=e*P,p+=e*O,v+=e*N,b+=e*C,g+=e*F,_+=e*I,A+=e*G,d+=e*Z,U+=e*j,E+=e*q,x+=e*V,M+=e*X,m+=e*D,B+=e*H,S+=e*J,K+=e*Q,e=t[10],p+=e*P,v+=e*O,b+=e*N,g+=e*C,_+=e*F,A+=e*I,d+=e*G,U+=e*Z,E+=e*j,x+=e*q,M+=e*V,m+=e*X,B+=e*D,S+=e*H,K+=e*J,T+=e*Q,e=t[11],v+=e*P,b+=e*O,g+=e*N,_+=e*C,A+=e*F,d+=e*I,U+=e*G,E+=e*Z,x+=e*j,M+=e*q,m+=e*V,B+=e*X;S+=e*D;K+=e*H,T+=e*J,Y+=e*Q,e=t[12],b+=e*P,g+=e*O,_+=e*N,A+=e*C,d+=e*F,U+=e*I,E+=e*G,x+=e*Z,M+=e*j,m+=e*q,B+=e*V,S+=e*X,K+=e*D,T+=e*H,Y+=e*J,k+=e*Q,e=t[13],g+=e*P,_+=e*O,A+=e*N,d+=e*C,U+=e*F,E+=e*I,x+=e*G,M+=e*Z,m+=e*j,B+=e*q,S+=e*V,K+=e*X,T+=e*D,Y+=e*H,k+=e*J,L+=e*Q,e=t[14],_+=e*P,A+=e*O,d+=e*N,U+=e*C,E+=e*F,x+=e*I,M+=e*G,m+=e*Z,B+=e*j,S+=e*q,K+=e*V,T+=e*X,Y+=e*D,k+=e*H,L+=e*J,z+=e*Q,e=t[15],A+=e*P,d+=e*O,U+=e*N,E+=e*C,x+=e*F,M+=e*I,m+=e*G,B+=e*Z,S+=e*j,K+=e*q,T+=e*V,Y+=e*X,k+=e*D,L+=e*H,z+=e*J,R+=e*Q,i+=38*d,h+=38*U,a+=38*E,f+=38*x,s+=38*M,c+=38*m,u+=38*B,y+=38*S,l+=38*K,w+=38*T,p+=38*Y,v+=38*k,b+=38*L,g+=38*z,_+=38*R,o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),r[0]=i,r[1]=h,r[2]=a,r[3]=f,r[4]=s,r[5]=c,r[6]=u,r[7]=y,r[8]=l,r[9]=w,r[10]=p,r[11]=v,r[12]=b,r[13]=g;r[14]=_;r[15]=A}function B(r,t){m(r,t,t)}function S(r,t){var n,e=$();for(n=0;n<16;n++)e[n]=t[n];for(n=253;n>=0;n--)B(e,e),2!==n&&4!==n&&m(e,e,t);for(n=0;n<16;n++)r[n]=e[n]}function K(r,t){var n,e=$();for(n=0;n<16;n++)e[n]=t[n];for(n=250;n>=0;n--)B(e,e),1!==n&&m(e,e,t);for(n=0;n<16;n++)r[n]=e[n]}function T(r,t,n){var e,o,i=new Uint8Array(32),h=new Float64Array(80),a=$(),f=$(),s=$(),c=$(),u=$(),y=$();for(o=0;o<31;o++)i[o]=t[o];for(i[31]=127&t[31]|64,i[0]&=248,E(h,n),o=0;o<16;o++)f[o]=h[o],c[o]=a[o]=s[o]=0;for(a[0]=c[0]=1,o=254;o>=0;--o)e=i[o>>>3]>>>(7&o)&1,_(a,f,e),_(s,c,e),x(u,a,s),M(a,a,s),x(s,f,c),M(f,f,c),B(c,u),B(y,a),m(a,s,a),m(s,f,u),x(u,a,s),M(a,a,s),B(f,a),M(s,c,y),m(a,s,ir),x(a,a,c),m(s,s,a),m(a,c,y),m(c,f,h),B(f,u),_(a,f,e),_(s,c,e);for(o=0;o<16;o++)h[o+16]=a[o],h[o+32]=s[o],h[o+48]=f[o],h[o+64]=c[o];var l=h.subarray(32),w=h.subarray(16);return S(l,l),m(w,w,l),A(r,w),0}function Y(r,t){return T(r,t,nr)}function k(r,t){return rr(t,32),Y(r,t)}function L(r,t,n){var e=new Uint8Array(32);return T(e,n,t),f(r,tr,e,ur)}function z(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),lr(r,t,n,e,h)}function R(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),wr(r,t,n,e,h)}function P(r,t,n,e){for(var o,i,h,a,f,s,c,u,y,l,w,p,v,b,g,_,A,d,U,E,x,M,m,B,S,K,T=new Int32Array(16),Y=new Int32Array(16),k=r[0],L=r[1],z=r[2],R=r[3],P=r[4],O=r[5],N=r[6],C=r[7],F=t[0],I=t[1],G=t[2],Z=t[3],j=t[4],q=t[5],V=t[6],X=t[7],D=0;e>=128;){for(U=0;U<16;U++)E=8*U+D,T[U]=n[E+0]<<24|n[E+1]<<16|n[E+2]<<8|n[E+3],Y[U]=n[E+4]<<24|n[E+5]<<16|n[E+6]<<8|n[E+7];for(U=0;U<80;U++)if(o=k,i=L,h=z,a=R,f=P,s=O,c=N,u=C,y=F,l=I,w=G,p=Z,v=j,b=q,g=V,_=X,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(P>>>14|j<<18)^(P>>>18|j<<14)^(j>>>9|P<<23),M=(j>>>14|P<<18)^(j>>>18|P<<14)^(P>>>9|j<<23),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=P&O^~P&N,M=j&q^~j&V,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=pr[2*U],M=pr[2*U+1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=T[U%16],M=Y[U%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,A=65535&S|K<<16,d=65535&m|B<<16,x=A,M=d,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(k>>>28|F<<4)^(F>>>2|k<<30)^(F>>>7|k<<25),M=(F>>>28|k<<4)^(k>>>2|F<<30)^(k>>>7|F<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=k&L^k&z^L&z,M=F&I^F&G^I&G,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,u=65535&S|K<<16,_=65535&m|B<<16,x=a,M=p,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=A,M=d,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,a=65535&S|K<<16,p=65535&m|B<<16,L=o,z=i,R=h,P=a,O=f,N=s,C=c,k=u,I=y,G=l,Z=w,j=p,q=v,V=b,X=g,F=_,U%16===15)for(E=0;E<16;E++)x=T[E],M=Y[E],m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=T[(E+9)%16],M=Y[(E+9)%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+1)%16],d=Y[(E+1)%16],x=(A>>>1|d<<31)^(A>>>8|d<<24)^A>>>7,M=(d>>>1|A<<31)^(d>>>8|A<<24)^(d>>>7|A<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+14)%16],d=Y[(E+14)%16],x=(A>>>19|d<<13)^(d>>>29|A<<3)^A>>>6,M=(d>>>19|A<<13)^(A>>>29|d<<3)^(d>>>6|A<<26),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,T[E]=65535&S|K<<16,Y[E]=65535&m|B<<16;x=k,M=F,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[0],M=t[0],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[0]=k=65535&S|K<<16,t[0]=F=65535&m|B<<16,x=L,M=I,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[1],M=t[1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[1]=L=65535&S|K<<16,t[1]=I=65535&m|B<<16,x=z,M=G,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[2],M=t[2],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[2]=z=65535&S|K<<16,t[2]=G=65535&m|B<<16,x=R,M=Z,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[3],M=t[3],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[3]=R=65535&S|K<<16,t[3]=Z=65535&m|B<<16,x=P,M=j,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[4],M=t[4],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[4]=P=65535&S|K<<16,t[4]=j=65535&m|B<<16,x=O,M=q,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[5],M=t[5],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[5]=O=65535&S|K<<16,t[5]=q=65535&m|B<<16,x=N,M=V,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[6],M=t[6],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[6]=N=65535&S|K<<16,t[6]=V=65535&m|B<<16,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[7],M=t[7],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[7]=C=65535&S|K<<16,t[7]=X=65535&m|B<<16,D+=128,e-=128}return e}function O(r,n,e){var o,i=new Int32Array(8),h=new Int32Array(8),a=new Uint8Array(256),f=e;for(i[0]=1779033703,i[1]=3144134277,i[2]=1013904242,i[3]=2773480762,i[4]=1359893119,i[5]=2600822924,i[6]=528734635,i[7]=1541459225,h[0]=4089235720,h[1]=2227873595,h[2]=4271175723,h[3]=1595750129,h[4]=2917565137,h[5]=725511199,h[6]=4215389547,h[7]=327033209,P(i,h,n,e),e%=128,o=0;o=0;--o)e=n[o/8|0]>>(7&o)&1,C(r,t,e),N(t,r),N(r,r),C(r,t,e)}function G(r,t){var n=[$(),$(),$(),$()];b(n[0],fr),b(n[1],sr),b(n[2],or),m(n[3],fr,sr),I(r,n,t)}function Z(r,t,n){var e,o=new Uint8Array(64),i=[$(),$(),$(),$()];for(n||rr(t,32),O(o,t,32),o[0]&=248,o[31]&=127,o[31]|=64,G(i,o),F(r,i),e=0;e<32;e++)t[e+32]=r[e];return 0}function j(r,t){var n,e,o,i;for(e=63;e>=32;--e){for(n=0,o=e-32,i=e-12;o>8,t[o]-=256*n;t[o]+=n,t[e]=0}for(n=0,o=0;o<32;o++)t[o]+=n-(t[31]>>4)*vr[o],n=t[o]>>8,t[o]&=255;for(o=0;o<32;o++)t[o]-=n*vr[o];for(e=0;e<32;e++)t[e+1]+=t[e]>>8,r[e]=255&t[e]}function q(r){var t,n=new Float64Array(64);for(t=0;t<64;t++)n[t]=r[t];for(t=0;t<64;t++)r[t]=0;j(r,n)}function V(r,t,n,e){var o,i,h=new Uint8Array(64),a=new Uint8Array(64),f=new Uint8Array(64),s=new Float64Array(64),c=[$(),$(),$(),$()];O(h,e,32),h[0]&=248,h[31]&=127,h[31]|=64;var u=n+64;for(o=0;o>7&&M(r[0],er,r[0]),m(r[3],r[0],r[1]),0)}function D(r,t,n,e){var i,h,a=new Uint8Array(32),f=new Uint8Array(64),s=[$(),$(),$(),$()],c=[$(),$(),$(),$()];if(h=-1,n<64)return-1;if(X(c,e))return-1;for(i=0;i>>13|n<<3),e=255&r[4]|(255&r[5])<<8,this.r[2]=7939&(n>>>10|e<<6),o=255&r[6]|(255&r[7])<<8,this.r[3]=8191&(e>>>7|o<<9),i=255&r[8]|(255&r[9])<<8,this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,h=255&r[10]|(255&r[11])<<8,this.r[6]=8191&(i>>>14|h<<2),a=255&r[12]|(255&r[13])<<8,this.r[7]=8065&(h>>>11|a<<5),f=255&r[14]|(255&r[15])<<8,this.r[8]=8191&(a>>>8|f<<8),this.r[9]=f>>>5&127,this.pad[0]=255&r[16]|(255&r[17])<<8,this.pad[1]=255&r[18]|(255&r[19])<<8,this.pad[2]=255&r[20]|(255&r[21])<<8,this.pad[3]=255&r[22]|(255&r[23])<<8,this.pad[4]=255&r[24]|(255&r[25])<<8,this.pad[5]=255&r[26]|(255&r[27])<<8,this.pad[6]=255&r[28]|(255&r[29])<<8,this.pad[7]=255&r[30]|(255&r[31])<<8};yr.prototype.blocks=function(r,t,n){for(var e,o,i,h,a,f,s,c,u,y,l,w,p,v,b,g,_,A,d,U=this.fin?0:2048,E=this.h[0],x=this.h[1],M=this.h[2],m=this.h[3],B=this.h[4],S=this.h[5],K=this.h[6],T=this.h[7],Y=this.h[8],k=this.h[9],L=this.r[0],z=this.r[1],R=this.r[2],P=this.r[3],O=this.r[4],N=this.r[5],C=this.r[6],F=this.r[7],I=this.r[8],G=this.r[9];n>=16;)e=255&r[t+0]|(255&r[t+1])<<8,E+=8191&e,o=255&r[t+2]|(255&r[t+3])<<8,x+=8191&(e>>>13|o<<3),i=255&r[t+4]|(255&r[t+5])<<8,M+=8191&(o>>>10|i<<6),h=255&r[t+6]|(255&r[t+7])<<8,m+=8191&(i>>>7|h<<9),a=255&r[t+8]|(255&r[t+9])<<8,B+=8191&(h>>>4|a<<12),S+=a>>>1&8191,f=255&r[t+10]|(255&r[t+11])<<8,K+=8191&(a>>>14|f<<2),s=255&r[t+12]|(255&r[t+13])<<8,T+=8191&(f>>>11|s<<5),c=255&r[t+14]|(255&r[t+15])<<8,Y+=8191&(s>>>8|c<<8),k+=c>>>5|U,u=0,y=u,y+=E*L,y+=x*(5*G),y+=M*(5*I),y+=m*(5*F),y+=B*(5*C),u=y>>>13,y&=8191,y+=S*(5*N),y+=K*(5*O),y+=T*(5*P),y+=Y*(5*R),y+=k*(5*z),u+=y>>>13,y&=8191,l=u,l+=E*z,l+=x*L,l+=M*(5*G),l+=m*(5*I),l+=B*(5*F),u=l>>>13,l&=8191,l+=S*(5*C),l+=K*(5*N),l+=T*(5*O),l+=Y*(5*P),l+=k*(5*R),u+=l>>>13,l&=8191,w=u,w+=E*R,w+=x*z,w+=M*L,w+=m*(5*G),w+=B*(5*I),u=w>>>13,w&=8191,w+=S*(5*F),w+=K*(5*C),w+=T*(5*N),w+=Y*(5*O),w+=k*(5*P),u+=w>>>13,w&=8191,p=u,p+=E*P,p+=x*R,p+=M*z,p+=m*L,p+=B*(5*G),u=p>>>13,p&=8191,p+=S*(5*I),p+=K*(5*F),p+=T*(5*C),p+=Y*(5*N),p+=k*(5*O),u+=p>>>13,p&=8191,v=u,v+=E*O,v+=x*P,v+=M*R,v+=m*z,v+=B*L,u=v>>>13,v&=8191,v+=S*(5*G),v+=K*(5*I),v+=T*(5*F),v+=Y*(5*C),v+=k*(5*N),u+=v>>>13,v&=8191,b=u,b+=E*N,b+=x*O,b+=M*P,b+=m*R,b+=B*z,u=b>>>13,b&=8191,b+=S*L,b+=K*(5*G),b+=T*(5*I),b+=Y*(5*F),b+=k*(5*C),u+=b>>>13,b&=8191,g=u,g+=E*C,g+=x*N,g+=M*O,g+=m*P,g+=B*R,u=g>>>13,g&=8191,g+=S*z,g+=K*L,g+=T*(5*G),g+=Y*(5*I),g+=k*(5*F),u+=g>>>13,g&=8191,_=u,_+=E*F,_+=x*C,_+=M*N,_+=m*O,_+=B*P,u=_>>>13,_&=8191,_+=S*R,_+=K*z,_+=T*L,_+=Y*(5*G),_+=k*(5*I),u+=_>>>13,_&=8191,A=u,A+=E*I,A+=x*F,A+=M*C,A+=m*N,A+=B*O,u=A>>>13,A&=8191,A+=S*P,A+=K*R,A+=T*z,A+=Y*L,A+=k*(5*G),u+=A>>>13,A&=8191,d=u,d+=E*G,d+=x*I,d+=M*F,d+=m*C,d+=B*N,u=d>>>13,d&=8191,d+=S*O,d+=K*P,d+=T*R,d+=Y*z,d+=k*L,u+=d>>>13,d&=8191,u=(u<<2)+u|0,u=u+y|0,y=8191&u,u>>>=13,l+=u,E=y,x=l,M=w,m=p,B=v,S=b,K=g,T=_,Y=A,k=d,t+=16,n-=16;this.h[0]=E,this.h[1]=x,this.h[2]=M,this.h[3]=m,this.h[4]=B,this.h[5]=S,this.h[6]=K,this.h[7]=T,this.h[8]=Y,this.h[9]=k},yr.prototype.finish=function(r,t){var n,e,o,i,h=new Uint16Array(10);if(this.leftover){for(i=this.leftover,this.buffer[i++]=1;i<16;i++)this.buffer[i]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(n=this.h[1]>>>13,this.h[1]&=8191,i=2;i<10;i++)this.h[i]+=n,n=this.h[i]>>>13,this.h[i]&=8191;for(this.h[0]+=5*n,n=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=n,n=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=n,h[0]=this.h[0]+5,n=h[0]>>>13,h[0]&=8191,i=1;i<10;i++)h[i]=this.h[i]+n,n=h[i]>>>13,h[i]&=8191;for(h[9]-=8192,e=(1^n)-1,i=0;i<10;i++)h[i]&=e;for(e=~e,i=0;i<10;i++)this.h[i]=this.h[i]&e|h[i];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),o=this.h[0]+this.pad[0],this.h[0]=65535&o,i=1;i<8;i++)o=(this.h[i]+this.pad[i]|0)+(o>>>16)|0,this.h[i]=65535&o;r[t+0]=this.h[0]>>>0&255,r[t+1]=this.h[0]>>>8&255,r[t+2]=this.h[1]>>>0&255,r[t+3]=this.h[1]>>>8&255,r[t+4]=this.h[2]>>>0&255,r[t+5]=this.h[2]>>>8&255,r[t+6]=this.h[3]>>>0&255,r[t+7]=this.h[3]>>>8&255,r[t+8]=this.h[4]>>>0&255,r[t+9]=this.h[4]>>>8&255,r[t+10]=this.h[5]>>>0&255,r[t+11]=this.h[5]>>>8&255,r[t+12]=this.h[6]>>>0&255,r[t+13]=this.h[6]>>>8&255,r[t+14]=this.h[7]>>>0&255,r[t+15]=this.h[7]>>>8&255},yr.prototype.update=function(r,t,n){var e,o;if(this.leftover){for(o=16-this.leftover,o>n&&(o=n),e=0;e=16&&(o=n-n%16,this.blocks(r,t,o),t+=o,n-=o),n){for(e=0;e=0},r.sign.keyPair=function(){var r=new Uint8Array(Tr),t=new Uint8Array(Yr);return Z(r,t),{publicKey:r,secretKey:t}},r.sign.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==Yr)throw new Error("bad secret key size");for(var t=new Uint8Array(Tr),n=0;n void): void; +} diff --git a/node_modules/tweetnacl/nacl.js b/node_modules/tweetnacl/nacl.js new file mode 100644 index 00000000..f72dd78d --- /dev/null +++ b/node_modules/tweetnacl/nacl.js @@ -0,0 +1,1175 @@ +(function(nacl) { +'use strict'; + +// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. +// Public domain. +// +// Implementation derived from TweetNaCl version 20140427. +// See for details: http://tweetnacl.cr.yp.to/ + +var u64 = function(h, l) { this.hi = h|0 >>> 0; this.lo = l|0 >>> 0; }; +var gf = function(init) { + var i, r = new Float64Array(16); + if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; + return r; +}; + +// Pluggable, initialized in high-level API below. +var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; + +var _0 = new Uint8Array(16); +var _9 = new Uint8Array(32); _9[0] = 9; + +var gf0 = gf(), + gf1 = gf([1]), + _121665 = gf([0xdb41, 1]), + D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), + D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), + X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), + Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), + I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); + +function L32(x, c) { return (x << c) | (x >>> (32 - c)); } + +function ld32(x, i) { + var u = x[i+3] & 0xff; + u = (u<<8)|(x[i+2] & 0xff); + u = (u<<8)|(x[i+1] & 0xff); + return (u<<8)|(x[i+0] & 0xff); +} + +function dl64(x, i) { + var h = (x[i] << 24) | (x[i+1] << 16) | (x[i+2] << 8) | x[i+3]; + var l = (x[i+4] << 24) | (x[i+5] << 16) | (x[i+6] << 8) | x[i+7]; + return new u64(h, l); +} + +function st32(x, j, u) { + var i; + for (i = 0; i < 4; i++) { x[j+i] = u & 255; u >>>= 8; } +} + +function ts64(x, i, u) { + x[i] = (u.hi >> 24) & 0xff; + x[i+1] = (u.hi >> 16) & 0xff; + x[i+2] = (u.hi >> 8) & 0xff; + x[i+3] = u.hi & 0xff; + x[i+4] = (u.lo >> 24) & 0xff; + x[i+5] = (u.lo >> 16) & 0xff; + x[i+6] = (u.lo >> 8) & 0xff; + x[i+7] = u.lo & 0xff; +} + +function vn(x, xi, y, yi, n) { + var i,d = 0; + for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; + return (1 & ((d - 1) >>> 8)) - 1; +} + +function crypto_verify_16(x, xi, y, yi) { + return vn(x,xi,y,yi,16); +} + +function crypto_verify_32(x, xi, y, yi) { + return vn(x,xi,y,yi,32); +} + +function core(out,inp,k,c,h) { + var w = new Uint32Array(16), x = new Uint32Array(16), + y = new Uint32Array(16), t = new Uint32Array(4); + var i, j, m; + + for (i = 0; i < 4; i++) { + x[5*i] = ld32(c, 4*i); + x[1+i] = ld32(k, 4*i); + x[6+i] = ld32(inp, 4*i); + x[11+i] = ld32(k, 16+4*i); + } + + for (i = 0; i < 16; i++) y[i] = x[i]; + + for (i = 0; i < 20; i++) { + for (j = 0; j < 4; j++) { + for (m = 0; m < 4; m++) t[m] = x[(5*j+4*m)%16]; + t[1] ^= L32((t[0]+t[3])|0, 7); + t[2] ^= L32((t[1]+t[0])|0, 9); + t[3] ^= L32((t[2]+t[1])|0,13); + t[0] ^= L32((t[3]+t[2])|0,18); + for (m = 0; m < 4; m++) w[4*j+(j+m)%4] = t[m]; + } + for (m = 0; m < 16; m++) x[m] = w[m]; + } + + if (h) { + for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0; + for (i = 0; i < 4; i++) { + x[5*i] = (x[5*i] - ld32(c, 4*i)) | 0; + x[6+i] = (x[6+i] - ld32(inp, 4*i)) | 0; + } + for (i = 0; i < 4; i++) { + st32(out,4*i,x[5*i]); + st32(out,16+4*i,x[6+i]); + } + } else { + for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0); + } +} + +function crypto_core_salsa20(out,inp,k,c) { + core(out,inp,k,c,false); + return 0; +} + +function crypto_core_hsalsa20(out,inp,k,c) { + core(out,inp,k,c,true); + return 0; +} + +var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); + // "expand 32-byte k" + +function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + if (!b) return 0; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < 64; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + if (m) mpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < b; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; + } + return 0; +} + +function crypto_stream_salsa20(c,cpos,d,n,k) { + return crypto_stream_salsa20_xor(c,cpos,null,0,d,n,k); +} + +function crypto_stream(c,cpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + return crypto_stream_salsa20(c,cpos,d,n.subarray(16),s); +} + +function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,n.subarray(16),s); +} + +function add1305(h, c) { + var j, u = 0; + for (j = 0; j < 17; j++) { + u = (u + ((h[j] + c[j]) | 0)) | 0; + h[j] = u & 255; + u >>>= 8; + } +} + +var minusp = new Uint32Array([ + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 +]); + +function crypto_onetimeauth(out, outpos, m, mpos, n, k) { + var s, i, j, u; + var x = new Uint32Array(17), r = new Uint32Array(17), + h = new Uint32Array(17), c = new Uint32Array(17), + g = new Uint32Array(17); + for (j = 0; j < 17; j++) r[j]=h[j]=0; + for (j = 0; j < 16; j++) r[j]=k[j]; + r[3]&=15; + r[4]&=252; + r[7]&=15; + r[8]&=252; + r[11]&=15; + r[12]&=252; + r[15]&=15; + + while (n > 0) { + for (j = 0; j < 17; j++) c[j] = 0; + for (j = 0; (j < 16) && (j < n); ++j) c[j] = m[mpos+j]; + c[j] = 1; + mpos += j; n -= j; + add1305(h,c); + for (i = 0; i < 17; i++) { + x[i] = 0; + for (j = 0; j < 17; j++) x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j])|0))) | 0) | 0; + } + for (i = 0; i < 17; i++) h[i] = x[i]; + u = 0; + for (j = 0; j < 16; j++) { + u = (u + h[j]) | 0; + h[j] = u & 255; + u >>>= 8; + } + u = (u + h[16]) | 0; h[16] = u & 3; + u = (5 * (u >>> 2)) | 0; + for (j = 0; j < 16; j++) { + u = (u + h[j]) | 0; + h[j] = u & 255; + u >>>= 8; + } + u = (u + h[16]) | 0; h[16] = u; + } + + for (j = 0; j < 17; j++) g[j] = h[j]; + add1305(h,minusp); + s = (-(h[16] >>> 7) | 0); + for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]); + + for (j = 0; j < 16; j++) c[j] = k[j + 16]; + c[16] = 0; + add1305(h,c); + for (j = 0; j < 16; j++) out[outpos+j] = h[j]; + return 0; +} + +function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { + var x = new Uint8Array(16); + crypto_onetimeauth(x,0,m,mpos,n,k); + return crypto_verify_16(h,hpos,x,0); +} + +function crypto_secretbox(c,m,d,n,k) { + var i; + if (d < 32) return -1; + crypto_stream_xor(c,0,m,0,d,n,k); + crypto_onetimeauth(c, 16, c, 32, d - 32, c); + for (i = 0; i < 16; i++) c[i] = 0; + return 0; +} + +function crypto_secretbox_open(m,c,d,n,k) { + var i; + var x = new Uint8Array(32); + if (d < 32) return -1; + crypto_stream(x,0,32,n,k); + if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; + crypto_stream_xor(m,0,c,0,d,n,k); + for (i = 0; i < 32; i++) m[i] = 0; + return 0; +} + +function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) r[i] = a[i]|0; +} + +function car25519(o) { + var c; + var i; + for (i = 0; i < 16; i++) { + o[i] += 65536; + c = Math.floor(o[i] / 65536); + o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0); + o[i] -= (c * 65536); + } +} + +function sel25519(p, q, b) { + var t, c = ~(b-1); + for (var i = 0; i < 16; i++) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } +} + +function pack25519(o, n) { + var i, j, b; + var m = gf(), t = gf(); + for (i = 0; i < 16; i++) t[i] = n[i]; + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; j++) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; i++) { + m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); + m[i-1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); + b = (m[15]>>16) & 1; + m[14] &= 0xffff; + sel25519(t, m, 1-b); + } + for (i = 0; i < 16; i++) { + o[2*i] = t[i] & 0xff; + o[2*i+1] = t[i]>>8; + } +} + +function neq25519(a, b) { + var c = new Uint8Array(32), d = new Uint8Array(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); +} + +function par25519(a) { + var d = new Uint8Array(32); + pack25519(d, a); + return d[0] & 1; +} + +function unpack25519(o, n) { + var i; + for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); + o[15] &= 0x7fff; +} + +function A(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0; +} + +function Z(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0; +} + +function M(o, a, b) { + var i, j, t = new Float64Array(31); + for (i = 0; i < 31; i++) t[i] = 0; + for (i = 0; i < 16; i++) { + for (j = 0; j < 16; j++) { + t[i+j] += a[i] * b[j]; + } + } + for (i = 0; i < 15; i++) { + t[i] += 38 * t[i+16]; + } + for (i = 0; i < 16; i++) o[i] = t[i]; + car25519(o); + car25519(o); +} + +function S(o, a) { + M(o, a, a); +} + +function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 253; a >= 0; a--) { + S(c, c); + if(a !== 2 && a !== 4) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 250; a >= 0; a--) { + S(c, c); + if(a !== 1) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function crypto_scalarmult(q, n, p) { + var z = new Uint8Array(32); + var x = new Float64Array(80), r, i; + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(); + for (i = 0; i < 31; i++) z[i] = n[i]; + z[31]=(n[31]&127)|64; + z[0]&=248; + unpack25519(x,p); + for (i = 0; i < 16; i++) { + b[i]=x[i]; + d[i]=a[i]=c[i]=0; + } + a[0]=d[0]=1; + for (i=254; i>=0; --i) { + r=(z[i>>>3]>>>(i&7))&1; + sel25519(a,b,r); + sel25519(c,d,r); + A(e,a,c); + Z(a,a,c); + A(c,b,d); + Z(b,b,d); + S(d,e); + S(f,a); + M(a,c,a); + M(c,b,e); + A(e,a,c); + Z(a,a,c); + S(b,a); + Z(c,d,f); + M(a,c,_121665); + A(a,a,d); + M(c,c,a); + M(a,d,f); + M(d,b,x); + S(b,e); + sel25519(a,b,r); + sel25519(c,d,r); + } + for (i = 0; i < 16; i++) { + x[i+16]=a[i]; + x[i+32]=c[i]; + x[i+48]=b[i]; + x[i+64]=d[i]; + } + var x32 = x.subarray(32); + var x16 = x.subarray(16); + inv25519(x32,x32); + M(x16,x16,x32); + pack25519(q,x16); + return 0; +} + +function crypto_scalarmult_base(q, n) { + return crypto_scalarmult(q, n, _9); +} + +function crypto_box_keypair(y, x) { + randombytes(x, 32); + return crypto_scalarmult_base(y, x); +} + +function crypto_box_beforenm(k, y, x) { + var s = new Uint8Array(32); + crypto_scalarmult(s, x, y); + return crypto_core_hsalsa20(k, _0, s, sigma); +} + +var crypto_box_afternm = crypto_secretbox; +var crypto_box_open_afternm = crypto_secretbox_open; + +function crypto_box(c, m, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_afternm(c, m, d, n, k); +} + +function crypto_box_open(m, c, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_open_afternm(m, c, d, n, k); +} + +function add64() { + var a = 0, b = 0, c = 0, d = 0, m16 = 65535, l, h, i; + for (i = 0; i < arguments.length; i++) { + l = arguments[i].lo; + h = arguments[i].hi; + a += (l & m16); b += (l >>> 16); + c += (h & m16); d += (h >>> 16); + } + + b += (a >>> 16); + c += (b >>> 16); + d += (c >>> 16); + + return new u64((c & m16) | (d << 16), (a & m16) | (b << 16)); +} + +function shr64(x, c) { + return new u64((x.hi >>> c), (x.lo >>> c) | (x.hi << (32 - c))); +} + +function xor64() { + var l = 0, h = 0, i; + for (i = 0; i < arguments.length; i++) { + l ^= arguments[i].lo; + h ^= arguments[i].hi; + } + return new u64(h, l); +} + +function R(x, c) { + var h, l, c1 = 32 - c; + if (c < 32) { + h = (x.hi >>> c) | (x.lo << c1); + l = (x.lo >>> c) | (x.hi << c1); + } else if (c < 64) { + h = (x.lo >>> c) | (x.hi << c1); + l = (x.hi >>> c) | (x.lo << c1); + } + return new u64(h, l); +} + +function Ch(x, y, z) { + var h = (x.hi & y.hi) ^ (~x.hi & z.hi), + l = (x.lo & y.lo) ^ (~x.lo & z.lo); + return new u64(h, l); +} + +function Maj(x, y, z) { + var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi), + l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo); + return new u64(h, l); +} + +function Sigma0(x) { return xor64(R(x,28), R(x,34), R(x,39)); } +function Sigma1(x) { return xor64(R(x,14), R(x,18), R(x,41)); } +function sigma0(x) { return xor64(R(x, 1), R(x, 8), shr64(x,7)); } +function sigma1(x) { return xor64(R(x,19), R(x,61), shr64(x,6)); } + +var K = [ + new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd), + new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc), + new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019), + new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118), + new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe), + new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2), + new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1), + new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694), + new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3), + new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65), + new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483), + new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5), + new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210), + new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4), + new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725), + new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70), + new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926), + new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df), + new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8), + new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b), + new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001), + new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30), + new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910), + new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8), + new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53), + new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8), + new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb), + new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3), + new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60), + new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec), + new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9), + new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b), + new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207), + new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178), + new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6), + new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b), + new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493), + new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c), + new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a), + new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817) +]; + +function crypto_hashblocks(x, m, n) { + var z = [], b = [], a = [], w = [], t, i, j; + + for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8*i); + + var pos = 0; + while (n >= 128) { + for (i = 0; i < 16; i++) w[i] = dl64(m, 8*i+pos); + for (i = 0; i < 80; i++) { + for (j = 0; j < 8; j++) b[j] = a[j]; + t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i%16]); + b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])); + b[3] = add64(b[3], t); + for (j = 0; j < 8; j++) a[(j+1)%8] = b[j]; + if (i%16 === 15) { + for (j = 0; j < 16; j++) { + w[j] = add64(w[j], w[(j+9)%16], sigma0(w[(j+1)%16]), sigma1(w[(j+14)%16])); + } + } + } + + for (i = 0; i < 8; i++) { + a[i] = add64(a[i], z[i]); + z[i] = a[i]; + } + + pos += 128; + n -= 128; + } + + for (i = 0; i < 8; i++) ts64(x, 8*i, z[i]); + return n; +} + +var iv = new Uint8Array([ + 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08, + 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b, + 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b, + 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1, + 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1, + 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f, + 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b, + 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79 +]); + +function crypto_hash(out, m, n) { + var h = new Uint8Array(64), x = new Uint8Array(256); + var i, b = n; + + for (i = 0; i < 64; i++) h[i] = iv[i]; + + crypto_hashblocks(h, m, n); + n %= 128; + + for (i = 0; i < 256; i++) x[i] = 0; + for (i = 0; i < n; i++) x[i] = m[b-n+i]; + x[n] = 128; + + n = 256-128*(n<112?1:0); + x[n-9] = 0; + ts64(x, n-8, new u64((b / 0x20000000) | 0, b << 3)); + crypto_hashblocks(h, x, n); + + for (i = 0; i < 64; i++) out[i] = h[i]; + + return 0; +} + +function add(p, q) { + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(), + g = gf(), h = gf(), t = gf(); + + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); +} + +function cswap(p, q, b) { + var i; + for (i = 0; i < 4; i++) { + sel25519(p[i], q[i], b); + } +} + +function pack(r, p) { + var tx = gf(), ty = gf(), zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; +} + +function scalarmult(p, q, s) { + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = (s[(i/8)|0] >> (i&7)) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } +} + +function scalarbase(p, s) { + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); +} + +function crypto_sign_keypair(pk, sk, seeded) { + var d = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()]; + var i; + + if (!seeded) randombytes(sk, 32); + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + scalarbase(p, d); + pack(pk, p); + + for (i = 0; i < 32; i++) sk[i+32] = pk[i]; + return 0; +} + +var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); + +function modL(r, x) { + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = (x[j] + 128) >> 8; + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; j++) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; j++) x[j] -= carry * L[j]; + for (i = 0; i < 32; i++) { + x[i+1] += x[i] >> 8; + r[i] = x[i] & 255; + } +} + +function reduce(r) { + var x = new Float64Array(64), i; + for (i = 0; i < 64; i++) x[i] = r[i]; + for (i = 0; i < 64; i++) r[i] = 0; + modL(r, x); +} + +// Note: difference from C - smlen returned, not passed as argument. +function crypto_sign(sm, m, n, sk) { + var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); + var i, j, x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; + + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + var smlen = n + 64; + for (i = 0; i < n; i++) sm[64 + i] = m[i]; + for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; + + crypto_hash(r, sm.subarray(32), n+32); + reduce(r); + scalarbase(p, r); + pack(sm, p); + + for (i = 32; i < 64; i++) sm[i] = sk[i]; + crypto_hash(h, sm, n + 64); + reduce(h); + + for (i = 0; i < 64; i++) x[i] = 0; + for (i = 0; i < 32; i++) x[i] = r[i]; + for (i = 0; i < 32; i++) { + for (j = 0; j < 32; j++) { + x[i+j] += h[i] * d[j]; + } + } + + modL(sm.subarray(32), x); + return smlen; +} + +function unpackneg(r, p) { + var t = gf(), chk = gf(), num = gf(), + den = gf(), den2 = gf(), den4 = gf(), + den6 = gf(); + + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); + + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); + + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) M(r[0], r[0], I); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) return -1; + + if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); + + M(r[3], r[0], r[1]); + return 0; +} + +function crypto_sign_open(m, sm, n, pk) { + var i, mlen; + var t = new Uint8Array(32), h = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()], + q = [gf(), gf(), gf(), gf()]; + + mlen = -1; + if (n < 64) return -1; + + if (unpackneg(q, pk)) return -1; + + for (i = 0; i < n; i++) m[i] = sm[i]; + for (i = 0; i < 32; i++) m[i+32] = pk[i]; + crypto_hash(h, m, n); + reduce(h); + scalarmult(p, q, h); + + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); + + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; i++) m[i] = 0; + return -1; + } + + for (i = 0; i < n; i++) m[i] = sm[i + 64]; + mlen = n; + return mlen; +} + +var crypto_secretbox_KEYBYTES = 32, + crypto_secretbox_NONCEBYTES = 24, + crypto_secretbox_ZEROBYTES = 32, + crypto_secretbox_BOXZEROBYTES = 16, + crypto_scalarmult_BYTES = 32, + crypto_scalarmult_SCALARBYTES = 32, + crypto_box_PUBLICKEYBYTES = 32, + crypto_box_SECRETKEYBYTES = 32, + crypto_box_BEFORENMBYTES = 32, + crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, + crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, + crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, + crypto_sign_BYTES = 64, + crypto_sign_PUBLICKEYBYTES = 32, + crypto_sign_SECRETKEYBYTES = 64, + crypto_sign_SEEDBYTES = 32, + crypto_hash_BYTES = 64; + +nacl.lowlevel = { + crypto_core_hsalsa20: crypto_core_hsalsa20, + crypto_stream_xor: crypto_stream_xor, + crypto_stream: crypto_stream, + crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, + crypto_stream_salsa20: crypto_stream_salsa20, + crypto_onetimeauth: crypto_onetimeauth, + crypto_onetimeauth_verify: crypto_onetimeauth_verify, + crypto_verify_16: crypto_verify_16, + crypto_verify_32: crypto_verify_32, + crypto_secretbox: crypto_secretbox, + crypto_secretbox_open: crypto_secretbox_open, + crypto_scalarmult: crypto_scalarmult, + crypto_scalarmult_base: crypto_scalarmult_base, + crypto_box_beforenm: crypto_box_beforenm, + crypto_box_afternm: crypto_box_afternm, + crypto_box: crypto_box, + crypto_box_open: crypto_box_open, + crypto_box_keypair: crypto_box_keypair, + crypto_hash: crypto_hash, + crypto_sign: crypto_sign, + crypto_sign_keypair: crypto_sign_keypair, + crypto_sign_open: crypto_sign_open, + + crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, + crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, + crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, + crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, + crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, + crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, + crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, + crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, + crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, + crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, + crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, + crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, + crypto_sign_BYTES: crypto_sign_BYTES, + crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, + crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, + crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, + crypto_hash_BYTES: crypto_hash_BYTES +}; + +/* High-level API */ + +function checkLengths(k, n) { + if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); + if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); +} + +function checkBoxLengths(pk, sk) { + if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); + if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); +} + +function checkArrayTypes() { + var t, i; + for (i = 0; i < arguments.length; i++) { + if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]') + throw new TypeError('unexpected type ' + t + ', use Uint8Array'); + } +} + +function cleanup(arr) { + for (var i = 0; i < arr.length; i++) arr[i] = 0; +} + +// TODO: Completely remove this in v0.15. +if (!nacl.util) { + nacl.util = {}; + nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { + throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js'); + }; +} + +nacl.randomBytes = function(n) { + var b = new Uint8Array(n); + randombytes(b, n); + return b; +}; + +nacl.secretbox = function(msg, nonce, key) { + checkArrayTypes(msg, nonce, key); + checkLengths(key, nonce); + var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); + var c = new Uint8Array(m.length); + for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; + crypto_secretbox(c, m, m.length, nonce, key); + return c.subarray(crypto_secretbox_BOXZEROBYTES); +}; + +nacl.secretbox.open = function(box, nonce, key) { + checkArrayTypes(box, nonce, key); + checkLengths(key, nonce); + var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); + var m = new Uint8Array(c.length); + for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; + if (c.length < 32) return false; + if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; + return m.subarray(crypto_secretbox_ZEROBYTES); +}; + +nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; +nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; +nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; + +nacl.scalarMult = function(n, p) { + checkArrayTypes(n, p); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult(q, n, p); + return q; +}; + +nacl.scalarMult.base = function(n) { + checkArrayTypes(n); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult_base(q, n); + return q; +}; + +nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; +nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; + +nacl.box = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox(msg, nonce, k); +}; + +nacl.box.before = function(publicKey, secretKey) { + checkArrayTypes(publicKey, secretKey); + checkBoxLengths(publicKey, secretKey); + var k = new Uint8Array(crypto_box_BEFORENMBYTES); + crypto_box_beforenm(k, publicKey, secretKey); + return k; +}; + +nacl.box.after = nacl.secretbox; + +nacl.box.open = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox.open(msg, nonce, k); +}; + +nacl.box.open.after = nacl.secretbox.open; + +nacl.box.keyPair = function() { + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); + crypto_box_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.box.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_box_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + crypto_scalarmult_base(pk, secretKey); + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; +nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; +nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; +nacl.box.nonceLength = crypto_box_NONCEBYTES; +nacl.box.overheadLength = nacl.secretbox.overheadLength; + +nacl.sign = function(msg, secretKey) { + checkArrayTypes(msg, secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); + crypto_sign(signedMsg, msg, msg.length, secretKey); + return signedMsg; +}; + +nacl.sign.open = function(signedMsg, publicKey) { + if (arguments.length !== 2) + throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?'); + checkArrayTypes(signedMsg, publicKey); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var tmp = new Uint8Array(signedMsg.length); + var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); + if (mlen < 0) return null; + var m = new Uint8Array(mlen); + for (var i = 0; i < m.length; i++) m[i] = tmp[i]; + return m; +}; + +nacl.sign.detached = function(msg, secretKey) { + var signedMsg = nacl.sign(msg, secretKey); + var sig = new Uint8Array(crypto_sign_BYTES); + for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; + return sig; +}; + +nacl.sign.detached.verify = function(msg, sig, publicKey) { + checkArrayTypes(msg, sig, publicKey); + if (sig.length !== crypto_sign_BYTES) + throw new Error('bad signature size'); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var sm = new Uint8Array(crypto_sign_BYTES + msg.length); + var m = new Uint8Array(crypto_sign_BYTES + msg.length); + var i; + for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; + for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; + return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); +}; + +nacl.sign.keyPair = function() { + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + crypto_sign_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.sign.keyPair.fromSeed = function(seed) { + checkArrayTypes(seed); + if (seed.length !== crypto_sign_SEEDBYTES) + throw new Error('bad seed size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + for (var i = 0; i < 32; i++) sk[i] = seed[i]; + crypto_sign_keypair(pk, sk, true); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; +nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; +nacl.sign.seedLength = crypto_sign_SEEDBYTES; +nacl.sign.signatureLength = crypto_sign_BYTES; + +nacl.hash = function(msg) { + checkArrayTypes(msg); + var h = new Uint8Array(crypto_hash_BYTES); + crypto_hash(h, msg, msg.length); + return h; +}; + +nacl.hash.hashLength = crypto_hash_BYTES; + +nacl.verify = function(x, y) { + checkArrayTypes(x, y); + // Zero length arguments are considered not equal. + if (x.length === 0 || y.length === 0) return false; + if (x.length !== y.length) return false; + return (vn(x, 0, y, 0, x.length) === 0) ? true : false; +}; + +nacl.setPRNG = function(fn) { + randombytes = fn; +}; + +(function() { + // Initialize PRNG if environment provides CSPRNG. + // If not, methods calling randombytes will throw. + var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; + if (crypto && crypto.getRandomValues) { + // Browsers. + var QUOTA = 65536; + nacl.setPRNG(function(x, n) { + var i, v = new Uint8Array(n); + for (i = 0; i < n; i += QUOTA) { + crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); + } + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } else if (typeof require !== 'undefined') { + // Node.js. + crypto = require('crypto'); + if (crypto && crypto.randomBytes) { + nacl.setPRNG(function(x, n) { + var i, v = crypto.randomBytes(n); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } + } +})(); + +})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/node_modules/tweetnacl/nacl.min.js b/node_modules/tweetnacl/nacl.min.js new file mode 100644 index 00000000..4484974e --- /dev/null +++ b/node_modules/tweetnacl/nacl.min.js @@ -0,0 +1 @@ +!function(r){"use strict";function n(r,n){return r<>>32-n}function e(r,n){var e=255&r[n+3];return e=e<<8|255&r[n+2],e=e<<8|255&r[n+1],e<<8|255&r[n+0]}function t(r,n){var e=r[n]<<24|r[n+1]<<16|r[n+2]<<8|r[n+3],t=r[n+4]<<24|r[n+5]<<16|r[n+6]<<8|r[n+7];return new sr(e,t)}function o(r,n,e){var t;for(t=0;t<4;t++)r[n+t]=255&e,e>>>=8}function i(r,n,e){r[n]=e.hi>>24&255,r[n+1]=e.hi>>16&255,r[n+2]=e.hi>>8&255,r[n+3]=255&e.hi,r[n+4]=e.lo>>24&255,r[n+5]=e.lo>>16&255,r[n+6]=e.lo>>8&255,r[n+7]=255&e.lo}function a(r,n,e,t,o){var i,a=0;for(i=0;i>>8)-1}function f(r,n,e,t){return a(r,n,e,t,16)}function u(r,n,e,t){return a(r,n,e,t,32)}function c(r,t,i,a,f){var u,c,w,y=new Uint32Array(16),l=new Uint32Array(16),s=new Uint32Array(16),h=new Uint32Array(4);for(u=0;u<4;u++)l[5*u]=e(a,4*u),l[1+u]=e(i,4*u),l[6+u]=e(t,4*u),l[11+u]=e(i,16+4*u);for(u=0;u<16;u++)s[u]=l[u];for(u=0;u<20;u++){for(c=0;c<4;c++){for(w=0;w<4;w++)h[w]=l[(5*c+4*w)%16];for(h[1]^=n(h[0]+h[3]|0,7),h[2]^=n(h[1]+h[0]|0,9),h[3]^=n(h[2]+h[1]|0,13),h[0]^=n(h[3]+h[2]|0,18),w=0;w<4;w++)y[4*c+(c+w)%4]=h[w]}for(w=0;w<16;w++)l[w]=y[w]}if(f){for(u=0;u<16;u++)l[u]=l[u]+s[u]|0;for(u=0;u<4;u++)l[5*u]=l[5*u]-e(a,4*u)|0,l[6+u]=l[6+u]-e(t,4*u)|0;for(u=0;u<4;u++)o(r,4*u,l[5*u]),o(r,16+4*u,l[6+u])}else for(u=0;u<16;u++)o(r,4*u,l[u]+s[u]|0)}function w(r,n,e,t){return c(r,n,e,t,!1),0}function y(r,n,e,t){return c(r,n,e,t,!0),0}function l(r,n,e,t,o,i,a){var f,u,c=new Uint8Array(16),y=new Uint8Array(64);if(!o)return 0;for(u=0;u<16;u++)c[u]=0;for(u=0;u<8;u++)c[u]=i[u];for(;o>=64;){for(w(y,c,a,Br),u=0;u<64;u++)r[n+u]=(e?e[t+u]:0)^y[u];for(f=1,u=8;u<16;u++)f=f+(255&c[u])|0,c[u]=255&f,f>>>=8;o-=64,n+=64,e&&(t+=64)}if(o>0)for(w(y,c,a,Br),u=0;u>>=8}function b(r,n,e,t,o,i){var a,f,u,c,w=new Uint32Array(17),y=new Uint32Array(17),l=new Uint32Array(17),s=new Uint32Array(17),h=new Uint32Array(17);for(u=0;u<17;u++)y[u]=l[u]=0;for(u=0;u<16;u++)y[u]=i[u];for(y[3]&=15,y[4]&=252,y[7]&=15,y[8]&=252,y[11]&=15,y[12]&=252,y[15]&=15;o>0;){for(u=0;u<17;u++)s[u]=0;for(u=0;u<16&&u>>=8;for(c=c+l[16]|0,l[16]=3&c,c=5*(c>>>2)|0,u=0;u<16;u++)c=c+l[u]|0,l[u]=255&c,c>>>=8;c=c+l[16]|0,l[16]=c}for(u=0;u<17;u++)h[u]=l[u];for(v(l,Sr),a=0|-(l[16]>>>7),u=0;u<17;u++)l[u]^=a&(h[u]^l[u]);for(u=0;u<16;u++)s[u]=i[u+16];for(s[16]=0,v(l,s),u=0;u<16;u++)r[n+u]=l[u];return 0}function p(r,n,e,t,o,i){var a=new Uint8Array(16);return b(a,0,e,t,o,i),f(r,n,a,0)}function _(r,n,e,t,o){var i;if(e<32)return-1;for(g(r,0,n,0,e,t,o),b(r,16,r,32,e-32,r),i=0;i<16;i++)r[i]=0;return 0}function A(r,n,e,t,o){var i,a=new Uint8Array(32);if(e<32)return-1;if(h(a,0,32,t,o),0!==p(n,16,n,32,e-32,a))return-1;for(g(r,0,n,0,e,t,o),i=0;i<32;i++)r[i]=0;return 0}function U(r,n){var e;for(e=0;e<16;e++)r[e]=0|n[e]}function E(r){var n,e;for(e=0;e<16;e++)r[e]+=65536,n=Math.floor(r[e]/65536),r[(e+1)*(e<15?1:0)]+=n-1+37*(n-1)*(15===e?1:0),r[e]-=65536*n}function d(r,n,e){for(var t,o=~(e-1),i=0;i<16;i++)t=o&(r[i]^n[i]),r[i]^=t,n[i]^=t}function x(r,n){var e,t,o,i=hr(),a=hr();for(e=0;e<16;e++)a[e]=n[e];for(E(a),E(a),E(a),t=0;t<2;t++){for(i[0]=a[0]-65517,e=1;e<15;e++)i[e]=a[e]-65535-(i[e-1]>>16&1),i[e-1]&=65535;i[15]=a[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,d(a,i,1-o)}for(e=0;e<16;e++)r[2*e]=255&a[e],r[2*e+1]=a[e]>>8}function m(r,n){var e=new Uint8Array(32),t=new Uint8Array(32);return x(e,r),x(t,n),u(e,0,t,0)}function B(r){var n=new Uint8Array(32);return x(n,r),1&n[0]}function S(r,n){var e;for(e=0;e<16;e++)r[e]=n[2*e]+(n[2*e+1]<<8);r[15]&=32767}function K(r,n,e){var t;for(t=0;t<16;t++)r[t]=n[t]+e[t]|0}function T(r,n,e){var t;for(t=0;t<16;t++)r[t]=n[t]-e[t]|0}function Y(r,n,e){var t,o,i=new Float64Array(31);for(t=0;t<31;t++)i[t]=0;for(t=0;t<16;t++)for(o=0;o<16;o++)i[t+o]+=n[t]*e[o];for(t=0;t<15;t++)i[t]+=38*i[t+16];for(t=0;t<16;t++)r[t]=i[t];E(r),E(r)}function L(r,n){Y(r,n,n)}function k(r,n){var e,t=hr();for(e=0;e<16;e++)t[e]=n[e];for(e=253;e>=0;e--)L(t,t),2!==e&&4!==e&&Y(t,t,n);for(e=0;e<16;e++)r[e]=t[e]}function z(r,n){var e,t=hr();for(e=0;e<16;e++)t[e]=n[e];for(e=250;e>=0;e--)L(t,t),1!==e&&Y(t,t,n);for(e=0;e<16;e++)r[e]=t[e]}function R(r,n,e){var t,o,i=new Uint8Array(32),a=new Float64Array(80),f=hr(),u=hr(),c=hr(),w=hr(),y=hr(),l=hr();for(o=0;o<31;o++)i[o]=n[o];for(i[31]=127&n[31]|64,i[0]&=248,S(a,e),o=0;o<16;o++)u[o]=a[o],w[o]=f[o]=c[o]=0;for(f[0]=w[0]=1,o=254;o>=0;--o)t=i[o>>>3]>>>(7&o)&1,d(f,u,t),d(c,w,t),K(y,f,c),T(f,f,c),K(c,u,w),T(u,u,w),L(w,y),L(l,f),Y(f,c,f),Y(c,u,y),K(y,f,c),T(f,f,c),L(u,f),T(c,w,l),Y(f,c,Ar),K(f,f,w),Y(c,c,f),Y(f,w,l),Y(w,u,a),L(u,y),d(f,u,t),d(c,w,t);for(o=0;o<16;o++)a[o+16]=f[o],a[o+32]=c[o],a[o+48]=u[o],a[o+64]=w[o];var s=a.subarray(32),h=a.subarray(16);return k(s,s),Y(h,h,s),x(r,h),0}function P(r,n){return R(r,n,br)}function O(r,n){return gr(n,32),P(r,n)}function F(r,n,e){var t=new Uint8Array(32);return R(t,e,n),y(r,vr,t,Br)}function N(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Kr(r,n,e,t,a)}function C(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Tr(r,n,e,t,a)}function M(){var r,n,e,t=0,o=0,i=0,a=0,f=65535;for(e=0;e>>16,i+=n&f,a+=n>>>16;return o+=t>>>16,i+=o>>>16,a+=i>>>16,new sr(i&f|a<<16,t&f|o<<16)}function G(r,n){return new sr(r.hi>>>n,r.lo>>>n|r.hi<<32-n)}function Z(){var r,n=0,e=0;for(r=0;r>>n|r.lo<>>n|r.hi<>>n|r.hi<>>n|r.lo<=128;){for(a=0;a<16;a++)y[a]=t(n,8*a+l);for(a=0;a<80;a++){for(f=0;f<8;f++)c[f]=w[f];for(o=M(w[7],X(w[4]),q(w[4],w[5],w[6]),Yr[a],y[a%16]),c[7]=M(o,V(w[0]),I(w[0],w[1],w[2])),c[3]=M(c[3],o),f=0;f<8;f++)w[(f+1)%8]=c[f];if(a%16===15)for(f=0;f<16;f++)y[f]=M(y[f],y[(f+9)%16],D(y[(f+1)%16]),H(y[(f+14)%16]))}for(a=0;a<8;a++)w[a]=M(w[a],u[a]),u[a]=w[a];l+=128,e-=128}for(a=0;a<8;a++)i(r,8*a,u[a]);return e}function Q(r,n,e){var t,o=new Uint8Array(64),a=new Uint8Array(256),f=e;for(t=0;t<64;t++)o[t]=Lr[t];for(J(o,n,e),e%=128,t=0;t<256;t++)a[t]=0;for(t=0;t=0;--o)t=e[o/8|0]>>(7&o)&1,$(r,n,t),W(n,r),W(r,r),$(r,n,t)}function er(r,n){var e=[hr(),hr(),hr(),hr()];U(e[0],dr),U(e[1],xr),U(e[2],_r),Y(e[3],dr,xr),nr(r,e,n)}function tr(r,n,e){var t,o=new Uint8Array(64),i=[hr(),hr(),hr(),hr()];for(e||gr(n,32),Q(o,n,32),o[0]&=248,o[31]&=127,o[31]|=64,er(i,o),rr(r,i),t=0;t<32;t++)n[t+32]=r[t];return 0}function or(r,n){var e,t,o,i;for(t=63;t>=32;--t){for(e=0,o=t-32,i=t-12;o>8,n[o]-=256*e;n[o]+=e,n[t]=0}for(e=0,o=0;o<32;o++)n[o]+=e-(n[31]>>4)*kr[o],e=n[o]>>8,n[o]&=255;for(o=0;o<32;o++)n[o]-=e*kr[o];for(t=0;t<32;t++)n[t+1]+=n[t]>>8,r[t]=255&n[t]}function ir(r){var n,e=new Float64Array(64);for(n=0;n<64;n++)e[n]=r[n];for(n=0;n<64;n++)r[n]=0;or(r,e)}function ar(r,n,e,t){var o,i,a=new Uint8Array(64),f=new Uint8Array(64),u=new Uint8Array(64),c=new Float64Array(64),w=[hr(),hr(),hr(),hr()];Q(a,t,32),a[0]&=248,a[31]&=127,a[31]|=64;var y=e+64;for(o=0;o>7&&T(r[0],pr,r[0]),Y(r[3],r[0],r[1]),0)}function ur(r,n,e,t){var o,i,a=new Uint8Array(32),f=new Uint8Array(64),c=[hr(),hr(),hr(),hr()],w=[hr(),hr(),hr(),hr()];if(i=-1,e<64)return-1;if(fr(w,t))return-1;for(o=0;o=0},r.sign.keyPair=function(){var r=new Uint8Array(Vr),n=new Uint8Array(Xr);return tr(r,n),{publicKey:r,secretKey:n}},r.sign.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Xr)throw new Error("bad secret key size");for(var n=new Uint8Array(Vr),e=0;e/dev/null && browserify test/browser/init.js test/*.quick.js | uglifyjs -c -m -o test/browser/_bundle-quick.js 2>/dev/null", + "test": "npm run test-node-all && npm run test-browser", + "bench": "node test/benchmark/bench.js", + "lint": "eslint nacl.js nacl-fast.js test/*.js test/benchmark/*.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/dchest/tweetnacl-js.git" + }, + "keywords": [ + "crypto", + "cryptography", + "curve25519", + "ed25519", + "encrypt", + "hash", + "key", + "nacl", + "poly1305", + "public", + "salsa20", + "signatures" + ], + "author": "TweetNaCl-js contributors", + "license": "Unlicense", + "bugs": { + "url": "https://github.com/dchest/tweetnacl-js/issues" + }, + "homepage": "https://tweetnacl.js.org", + "devDependencies": { + "browserify": "^13.0.0", + "eslint": "^2.2.0", + "faucet": "^0.0.1", + "tap-browser-color": "^0.1.2", + "tape": "^4.4.0", + "tape-run": "^2.1.3", + "tweetnacl-util": "^0.13.3", + "uglify-js": "^2.6.1" + }, + "browser": { + "buffer": false, + "crypto": false + } +} diff --git a/node_modules/type/.editorconfig b/node_modules/type/.editorconfig new file mode 100644 index 00000000..bd6d81ee --- /dev/null +++ b/node_modules/type/.editorconfig @@ -0,0 +1,16 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = tab +trim_trailing_whitespace = true + +[*.md] +indent_size = 2 +indent_style = space +trim_trailing_whitespace = false diff --git a/node_modules/type/CHANGELOG.md b/node_modules/type/CHANGELOG.md new file mode 100644 index 00000000..3054ccc3 --- /dev/null +++ b/node_modules/type/CHANGELOG.md @@ -0,0 +1,90 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [1.2.0](https://github.com/medikoo/type/compare/v1.1.0...v1.2.0) (2019-09-20) + +### Bug Fixes + +- Improve error message so it's not confusing ([97cd6b9](https://github.com/medikoo/type/commit/97cd6b9)) + +### Features + +- 'coerceItem' option for iterable/ensure ([0818860](https://github.com/medikoo/type/commit/0818860)) + +## [1.1.0](https://github.com/medikoo/type/compare/v1.0.3...v1.1.0) (2019-09-20) + +### Features + +- `denyEmpty` option for iterables validation ([301d071](https://github.com/medikoo/type/commit/301d071)) + +### [1.0.3](https://github.com/medikoo/type/compare/v1.0.2...v1.0.3) (2019-08-06) + +### Bug Fixes + +- Recognize custom built ES5 era errors ([6462fac](https://github.com/medikoo/type/commit/6462fac)) + +### [1.0.2](https://github.com/medikoo/type/compare/v1.0.1...v1.0.2) (2019-08-06) + +### Bug Fixes + +- Recognize host errors (e.g. DOMException) ([96ef399](https://github.com/medikoo/type/commit/96ef399)) + +## [1.0.1](https://github.com/medikoo/type/compare/v1.0.0...v1.0.1) (2019-04-08) + +# 1.0.0 (2019-04-05) + +### Bug Fixes + +- ensure 'is' functions can't crash ([59ceb78](https://github.com/medikoo/type/commit/59ceb78)) + +### Features + +- array-length/coerce ([af8ddec](https://github.com/medikoo/type/commit/af8ddec)) +- array-length/ensure ([d313eb6](https://github.com/medikoo/type/commit/d313eb6)) +- array-like/ensure ([45f1ddd](https://github.com/medikoo/type/commit/45f1ddd)) +- array-like/is ([9a026a5](https://github.com/medikoo/type/commit/9a026a5)) +- array/ensure ([9db1515](https://github.com/medikoo/type/commit/9db1515)) +- array/is ([9672839](https://github.com/medikoo/type/commit/9672839)) +- date/ensure ([44e25a0](https://github.com/medikoo/type/commit/44e25a0)) +- date/is ([0316558](https://github.com/medikoo/type/commit/0316558)) +- ensure to not crash ([3998348](https://github.com/medikoo/type/commit/3998348)) +- ensure/number ([134b5cb](https://github.com/medikoo/type/commit/134b5cb)) +- error/ensure ([d5c8a30](https://github.com/medikoo/type/commit/d5c8a30)) +- error/is-error ([4d6b899](https://github.com/medikoo/type/commit/4d6b899)) +- finite/coerce ([accaad1](https://github.com/medikoo/type/commit/accaad1)) +- finite/ensure ([51e4174](https://github.com/medikoo/type/commit/51e4174)) +- function/ensure ([b624c9a](https://github.com/medikoo/type/commit/b624c9a)) +- function/is ([dab8026](https://github.com/medikoo/type/commit/dab8026)) +- integer/coerce ([89dea2e](https://github.com/medikoo/type/commit/89dea2e)) +- integer/ensure ([44a7071](https://github.com/medikoo/type/commit/44a7071)) +- iterable/ensure ([3d48841](https://github.com/medikoo/type/commit/3d48841)) +- iterable/is ([cf09513](https://github.com/medikoo/type/commit/cf09513)) +- lib/is-to-string-tag-supported ([c8c001d](https://github.com/medikoo/type/commit/c8c001d)) +- natural-number/coerce ([d08fdd9](https://github.com/medikoo/type/commit/d08fdd9)) +- natural-number/ensure ([6c24d12](https://github.com/medikoo/type/commit/6c24d12)) +- number/coerce ([86ccf08](https://github.com/medikoo/type/commit/86ccf08)) +- object/ensure ([a9e8eed](https://github.com/medikoo/type/commit/a9e8eed)) +- object/is ([d2d7251](https://github.com/medikoo/type/commit/d2d7251)) +- plain-function/ensure ([5186518](https://github.com/medikoo/type/commit/5186518)) +- plain-function/is ([51bc791](https://github.com/medikoo/type/commit/51bc791)) +- plain-object/ensure ([91cf5e5](https://github.com/medikoo/type/commit/91cf5e5)) +- plain-object/is ([4dcf393](https://github.com/medikoo/type/commit/4dcf393)) +- promise/ensure ([8d096a4](https://github.com/medikoo/type/commit/8d096a4)) +- promise/is ([a00de02](https://github.com/medikoo/type/commit/a00de02)) +- prototype/is ([b23bdcc](https://github.com/medikoo/type/commit/b23bdcc)) +- reg-exp/ensure ([6f7bbcb](https://github.com/medikoo/type/commit/6f7bbcb)) +- reg-exp/is ([9728519](https://github.com/medikoo/type/commit/9728519)) +- safe-integer/coerce ([b8549c4](https://github.com/medikoo/type/commit/b8549c4)) +- safe-integer/ensure ([a70ef3f](https://github.com/medikoo/type/commit/a70ef3f)) +- string/coerce ([b25c71f](https://github.com/medikoo/type/commit/b25c71f)) +- string/ensure ([b62577d](https://github.com/medikoo/type/commit/b62577d)) +- support 'default' in resolveException ([e08332a](https://github.com/medikoo/type/commit/e08332a)) +- switch config to ES3 based ([37606d9](https://github.com/medikoo/type/commit/37606d9)) +- thenable/ensure ([6762c0d](https://github.com/medikoo/type/commit/6762c0d)) +- thenable/is ([2711d70](https://github.com/medikoo/type/commit/2711d70)) +- time-value/coerce ([27fd109](https://github.com/medikoo/type/commit/27fd109)) +- time-value/ensure ([1f6a8ea](https://github.com/medikoo/type/commit/1f6a8ea)) +- **string/coerce:** restrict toString acceptance ([2a87100](https://github.com/medikoo/type/commit/2a87100)) +- value/ensure ([dd6d8cb](https://github.com/medikoo/type/commit/dd6d8cb)) +- value/is ([fdf4763](https://github.com/medikoo/type/commit/fdf4763)) diff --git a/node_modules/type/LICENSE b/node_modules/type/LICENSE new file mode 100644 index 00000000..5d6924b4 --- /dev/null +++ b/node_modules/type/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2019, Mariusz Nowak, @medikoo, medikoo.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/type/README.md b/node_modules/type/README.md new file mode 100644 index 00000000..d662b7ab --- /dev/null +++ b/node_modules/type/README.md @@ -0,0 +1,761 @@ +[![*nix build status][nix-build-image]][nix-build-url] +[![Windows build status][win-build-image]][win-build-url] +[![Tests coverage][cov-image]][cov-url] +[![npm version][npm-image]][npm-url] + +# type + +## Runtime validation and processing of JavaScript types + +- Respects language nature and acknowledges its quirks +- Allows coercion in restricted forms (rejects clearly invalid input, normalizes permissible type deviations) +- No transpilation implied, written to work in all ECMAScript 3+ engines + +### Example usage + +Bulletproof input arguments normalization and validation: + +```javascript +const ensureString = require('type/string/ensure') + , ensureDate = require('type/date/ensure') + , ensureNaturalNumber = require('type/natural-number/ensure') + , isObject = require('type/object/is'); + +module.exports = (path, options = { min: 0 }) { + path = ensureString(path, { errorMessage: "%v is not a path" }); + if (!isObject(options)) options = {}; + const min = ensureNaturalNumber(options.min, { default: 0 }) + , max = ensureNaturalNumber(options.max, { isOptional: true }) + , startTime = ensureDate(options.startTime, { isOptional: true }); + + // ...logic +}; +``` + +### Installation + +```bash +npm install type +``` + +## Utilities + +Serves following kind of utilities: + +##### `*/coerce` + +Restricted coercion into primitive type. Returns coerced value or `null` if value is not coercible per rules. + +##### `*/is` + +Object type/kind confirmation, returns either `true` or `false`. + +##### `*/ensure` + +Value validation. Returns input value (in primitive cases possibly coerced) or if value doesn't meet the constraints throws `TypeError` . + +Each `*/ensure` utility, accepts following options (eventually passed with second argument): + +- `isOptional` - Makes `null` or `undefined` accepted as valid value. In such case instead of `TypeError` being thrown, `null` is returned. +- `default` - A value to be returned if `null` or `undefined` is passed as an input value. +- `errorMessage` - Custom error message (`%v` can be used as a placeholder for input value) + +--- + +### Value + +_Value_, any value that's neither `null` nor `undefined` . + +#### `value/is` + +Confirms whether passed argument is a _value_ + +```javascript +const isValue = require("type/value/is"); + +isValue({}); // true +isValue(null); // false +``` + +#### `value/ensure` + +Ensures if given argument is a _value_. If it's a value it is returned back, if not `TypeError` is thrown + +```javascript +const ensureValue = require("type/value/ensure"); + +const obj = {}; + +ensureValue(obj); // obj +ensureValue(null); // Thrown TypeError: Cannot use null +``` + +--- + +### Object + +_Object_, any non-primitive value + +#### `object/is` + +Confirms if passed value is an object + +```javascript +const isObject = require("type/object/is"); + +isObject({}); // true +isObject(true); // false +isObject(null); // false +``` + +#### `object/ensure` + +If given argument is an object, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensureObject = require("type/object/ensure"); + +const obj = {}; + +ensureObject(obj); // obj +ensureString(null); // Thrown TypeError: null is not an object +``` + +--- + +### String + +_string_ primitive + +#### `string/coerce` + +Restricted string coercion. Returns string presentation for every value that follows below constraints + +- is implicitly coercible to string +- is neither`null` nor `undefined` +- its `toString` method is not `Object.prototype.toString` + +For all other values `null` is returned + +```javascript +const coerceToString = require("type/string/coerce"); + +coerceToString(12); // "12" +coerceToString(undefined); // null +``` + +#### `string/ensure` + +If given argument is a string coercible value (via [`string/coerce`](#stringcoerce)) returns result string. +Otherwise `TypeError` is thrown. + +```javascript +const ensureString = require("type/string/ensure"); + +ensureString(12); // "12" +ensureString(null); // Thrown TypeError: null is not a string +``` + +--- + +### Number + +_number_ primitive + +#### `number/coerce` + +Restricted number coercion. Returns number presentation for every value that follows below constraints + +- is implicitly coercible to number +- is neither `null` nor `undefined` +- is not `NaN` and doesn't coerce to `NaN` + +For all other values `null` is returned + +```javascript +const coerceToNumber = require("type/number/coerce"); + +coerceToNumber("12"); // 12 +coerceToNumber({}); // null +coerceToNumber(null); // null +``` + +#### `number/ensure` + +If given argument is a number coercible value (via [`number/coerce`](#numbercoerce)) returns result number. +Otherwise `TypeError` is thrown. + +```javascript +const ensureNumber = require("type/number/ensure"); + +ensureNumber(12); // "12" +ensureNumber(null); // Thrown TypeError: null is not a number +``` + +--- + +#### Finite Number + +Finite _number_ primitive + +##### `finite/coerce` + +Follows [`number/coerce`](#numbercoerce) additionally rejecting `Infinity` and `-Infinity` values (`null` is returned if given values coerces to them) + +```javascript +const coerceToFinite = require("type/finite/coerce"); + +coerceToFinite("12"); // 12 +coerceToFinite(Infinity); // null +coerceToFinite(null); // null +``` + +##### `finite/ensure` + +If given argument is a finite number coercible value (via [`finite/coerce`](#finitecoerce)) returns result number. +Otherwise `TypeError` is thrown. + +```javascript +const ensureFinite = require("type/finite/ensure"); + +ensureFinite(12); // "12" +ensureFinite(null); // Thrown TypeError: null is not a finite number +``` + +--- + +#### Integer Number + +Integer _number_ primitive + +##### `integer/coerce` + +Follows [`finite/coerce`](#finitecoerce) additionally stripping decimal part from the number + +```javascript +const coerceToInteger = require("type/integer/coerce"); + +coerceToInteger("12.95"); // 12 +coerceToInteger(Infinity); // null +coerceToInteger(null); // null +``` + +##### `integer/ensure` + +If given argument is an integer coercible value (via [`integer/coerce`](#integercoerce)) returns result number. +Otherwise `TypeError` is thrown. + +```javascript +const ensureInteger = require("type/integer/ensure"); + +ensureInteger(12.93); // "12" +ensureInteger(null); // Thrown TypeError: null is not an integer +``` + +--- + +#### Safe Integer Number + +Safe integer _number_ primitive + +##### `safe-integer/coerce` + +Follows [`integer/coerce`](#integercoerce) but returns `null` in place of values which are beyond `Number.MIN_SAFE_INTEGER` and `Number.MAX_SAFE_INTEGER` range. + +```javascript +const coerceToSafeInteger = require("type/safe-integer/coerce"); + +coerceToInteger("12.95"); // 12 +coerceToInteger(9007199254740992); // null +coerceToInteger(null); // null +``` + +##### `safe-integer/ensure` + +If given argument is a safe integer coercible value (via [`safe-integer/coerce`](#safe-integercoerce)) returns result number. +Otherwise `TypeError` is thrown. + +```javascript +const ensureSafeInteger = require("type/safe-integer/ensure"); + +ensureSafeInteger(12.93); // "12" +ensureSafeInteger(9007199254740992); // Thrown TypeError: null is not a safe integer +``` + +--- + +#### Natural Number + +Natural _number_ primitive + +##### `natural-number/coerce` + +Follows [`integer/coerce`](#integercoerce) but returns `null` for values below `0` + +```javascript +const coerceToNaturalNumber = require("type/natural-number/coerce"); + +coerceToNaturalNumber("12.95"); // 12 +coerceToNaturalNumber(-120); // null +coerceToNaturalNumber(null); // null +``` + +##### `natural-number/ensure` + +If given argument is a natural number coercible value (via [`natural-number/coerce`](#natural-numbercoerce)) returns result number. +Otherwise `TypeError` is thrown. + +```javascript +const ensureNaturalNumber = require("type/natural-number/ensure"); + +ensureNaturalNumber(12.93); // "12" +ensureNaturalNumber(-230); // Thrown TypeError: null is not a natural number +``` + +--- + +### Plain Object + +A _plain object_ + +- Inherits directly from `Object.prototype` or `null` +- Is not a constructor's `prototype` property + +#### `plain-object/is` + +Confirms if given object is a _plain object_ + +```javascript +const isPlainObject = require("type/plain-object/is"); + +isPlainObject({}); // true +isPlainObject(Object.create(null)); // true +isPlainObject([]); // false +``` + +#### `plain-object/ensure` + +If given argument is a plain object it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensurePlainObject = require("type/plain-object/ensure"); + +ensurePlainObject({}); // {} +ensureArray("foo"); // Thrown TypeError: foo is not a plain object +``` + +--- + +### Array + +_Array_ instance + +#### `array/is` + +Confirms if given object is a native array + +```javascript +const isArray = require("type/array/is"); + +isArray([]); // true +isArray({}); // false +isArray("foo"); // false +``` + +#### `array/ensure` + +If given argument is an array, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensureArray = require("type/array/ensure"); + +ensureArray(["foo"]); // ["foo"] +ensureArray("foo"); // Thrown TypeError: foo is not an array +``` + +--- + +#### Array Like + +_Array-like_ value (any value with `length` property) + +#### `array-like/is` + +Restricted _array-like_ confirmation. Returns true for every value that meets following contraints + +- is an _object_ (or with `allowString` option, a _string_) +- is not a _function_ +- Exposes `length` that meets [`array-length`](#array-lengthcoerce) constraints + +```javascript +const isArrayLike = require("type/array-like/is"); + +isArrayLike([]); // true +isArrayLike({}); // false +isArrayLike({ length: 0 }); // true +isArrayLike("foo"); // false +isArrayLike("foo", { allowString: true }); // true +``` + +#### `array-like/ensure` + +If given argument is an _array-like_, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensureArrayLike = require("type/array-like/ensure"); + +ensureArrayLike({ length: 0 }); // { length: 0 } +ensureArrayLike("foo", { allowString: true }); // "foo" +ensureArrayLike({}); // Thrown TypeError: null is not an iterable +``` + +--- + +#### Array length + +_number_ primitive that conforms as valid _array length_ + +##### `array-length/coerce` + +Follows [`safe-integer/coerce`](#safe-integercoerce) but returns `null` in place of values which are below `0` + +```javascript +const coerceToArrayLength = require("type/safe-integer/coerce"); + +coerceToArrayLength("12.95"); // 12 +coerceToArrayLength(9007199254740992); // null +coerceToArrayLength(null); // null +``` + +##### `array-length/ensure` + +If given argument is an _array length_ coercible value (via [`array-length/coerce`](#array-lengthcoerce)) returns result number. +Otherwise `TypeError` is thrown. + +```javascript +const ensureArrayLength = require("type/array-length/ensure"); + +ensureArrayLength(12.93); // "12" +ensureArrayLength(9007199254740992); // Thrown TypeError: null is not a valid array length +``` + +--- + +### Iterable + +Value which implements _iterable_ protocol + +#### `iterable/is` + +Confirms if given object is an _iterable_ and is not a _string_ (unless `allowString` option is passed) + +```javascript +const isIterable = require("type/iterable/is"); + +isIterable([]); // true +isIterable({}); // false +isIterable("foo"); // false +isIterable("foo", { allowString: true }); // true +``` + +Supports also `denyEmpty` option + +```javascript +isIterable([], { denyEmpty: true }); // false +isIterable(["foo"], { denyEmpty: true }); // true +``` + +#### `iterable/ensure` + +If given argument is an _iterable_, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensureIterable = require("type/iterable/ensure"); + +ensureIterable([]); // [] +ensureIterable("foo", { allowString: true }); // "foo" +ensureIterable({}); // Thrown TypeError: null is not expected iterable +``` + +Additionally items can be coreced with `coerceItem` option. Note that in this case: + +- A newly created array with coerced values is returned +- Validation crashes if any of the items is not coercible + +```javascript +ensureIterable(new Set(["foo", 12])); // ["foo", "12"] + +ensureIterable(new Set(["foo", {}])); // Thrown TypeError: Set({ "foo", {} }) is not expected iterable +``` + +--- + +### Date + +_Date_ instance + +#### `date/is` + +Confirms if given object is a native date, and is not an _Invalid Date_ + +```javascript +const isDate = require("type/date/is"); + +isDate(new Date()); // true +isDate(new Date("Invalid date")); // false +isDate(Date.now()); // false +isDate("foo"); // false +``` + +#### `date/ensure` + +If given argument is a date object, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensureDate = require("type/date/ensure"); + +const date = new Date(); +ensureDate(date); // date +ensureDate(123123); // Thrown TypeError: 123123 is not a date object +``` + +--- + +### Time value + +_number_ primitive which is a valid _time value_ (as used internally in _Date_ instances) + +#### `time-value/coerce` + +Follows [`integer/coerce`](#integercoerce) but returns `null` in place of values which go beyond 100 000 0000 days from unix epoch + +```javascript +const coerceToTimeValue = require("type/time-value/coerce"); + +coerceToTimeValue(12312312); // true +coerceToTimeValue(Number.MAX_SAFE_INTEGER); // false +coerceToTimeValue("foo"); // false +``` + +##### `time-value/ensure` + +If given argument is a _time value_ coercible value (via [`time-value/coerce`](#time-valuecoerce)) returns result number. +Otherwise `TypeError` is thrown. + +```javascript +const ensureTimeValue = require("type/time-value/ensure"); + +ensureTimeValue(12.93); // "12" +ensureTimeValue(Number.MAX_SAFE_INTEGER); // Thrown TypeError: null is not a natural number +``` + +--- + +### Function + +_Function_ instance + +#### `function/is` + +Confirms if given object is a native function + +```javascript +const isFunction = require("type/function/is"); + +isFunction(function () {}); // true +isFunction(() => {}); // true +isFunction(class {}); // true +isFunction("foo"); // false +``` + +#### `function/ensure` + +If given argument is a function object, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensureFunction = require("type/function/ensure"); + +const fn = function () {}; +ensureFunction(fn); // fn +ensureFunction(/foo/); // Thrown TypeError: /foo/ is not a function +``` + +--- + +#### Plain Function + +A _Function_ instance that is not a _Class_ + +##### `plain-function/is` + +Confirms if given object is a _plain function_ + +```javascript +const isPlainFunction = require("type/plain-function/is"); + +isPlainFunction(function () {}); // true +isPlainFunction(() => {}); // true +isPlainFunction(class {}); // false +isPlainFunction("foo"); // false +``` + +##### `plain-function/ensure` + +If given argument is a _plain function_ object, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensurePlainFunction = require("type/function/ensure"); + +const fn = function () {}; +ensurePlainFunction(fn); // fn +ensurePlainFunction(class {}); // Thrown TypeError: class is not a plain function +``` + +--- + +### RegExp + +_RegExp_ instance + +#### `reg-exp/is` + +Confirms if given object is a native regular expression object + +```javascript +const isRegExp = require("type/reg-exp/is"); + +isRegExp(/foo/); +isRegExp({}); // false +isRegExp("foo"); // false +``` + +#### `reg-exp/ensure` + +If given argument is a regular expression object, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensureRegExp = require("type/reg-exp/ensure"); + +ensureRegExp(/foo/); // /foo/ +ensureRegExp("foo"); // Thrown TypeError: null is not a regular expression object +``` + +--- + +### Promise + +_Promise_ instance + +#### `promise/is` + +Confirms if given object is a native _promise_ + +```javascript +const isPromise = require("type/promise/is"); + +isPromise(Promise.resolve()); // true +isPromise({ then: () => {} }); // false +isPromise({}); // false +``` + +##### `promise/ensure` + +If given argument is a promise, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensurePromise = require("type/promise/ensure"); + +const promise = Promise.resolve(); +ensurePromise(promise); // promise +eensurePromise({}); // Thrown TypeError: [object Object] is not a promise +``` + +--- + +#### Thenable + +_Thenable_ object (an object with `then` method) + +##### `thenable/is` + +Confirms if given object is a _thenable_ + +```javascript +const isThenable = require("type/thenable/is"); + +isThenable(Promise.resolve()); // true +isThenable({ then: () => {} }); // true +isThenable({}); // false +``` + +##### `thenable/ensure` + +If given argument is a _thenable_ object, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensureThenable = require("type/thenable/ensure"); + +const promise = Promise.resolve(); +ensureThenable(promise); // promise +ensureThenable({}); // Thrown TypeError: [object Object] is not a thenable object +``` + +--- + +### Error + +_Error_ instance + +#### `error/is` + +Confirms if given object is a native error object + +```javascript +const isError = require("type/error/is"); + +isError(new Error()); // true +isError({ message: "Fake error" }); // false +``` + +#### `error/ensure` + +If given argument is an error object, it is returned back. Otherwise `TypeError` is thrown. + +```javascript +const ensureError = require("type/error/ensure"); + +const someError = new Error("Some error"); +ensureError(someError); // someError +ensureError({ message: "Fake error" }); // Thrown TypeError: [object Object] is not an error object +``` + +--- + +### Prototype + +Some constructor's `prototype` property + +#### `prototype/is` + +Confirms if given object serves as a _prototype_ property + +```javascript +const isPrototype = require("type/prototype/is"); + +isPrototype({}); // false +isPrototype(Object.prototype); // true +isPrototype(Array.prototype); // true +``` + +### Tests + + $ npm test + +[nix-build-image]: https://semaphoreci.com/api/v1/medikoo-org/type/branches/master/shields_badge.svg +[nix-build-url]: https://semaphoreci.com/medikoo-org/type +[win-build-image]: https://ci.appveyor.com/api/projects/status/8nrtluuwsb5k9l8d?svg=true +[win-build-url]: https://ci.appveyor.com/api/project/medikoo/type +[cov-image]: https://img.shields.io/codecov/c/github/medikoo/type.svg +[cov-url]: https://codecov.io/gh/medikoo/type +[npm-image]: https://img.shields.io/npm/v/type.svg +[npm-url]: https://www.npmjs.com/package/type diff --git a/node_modules/type/array-length/coerce.js b/node_modules/type/array-length/coerce.js new file mode 100644 index 00000000..3dbbf977 --- /dev/null +++ b/node_modules/type/array-length/coerce.js @@ -0,0 +1,10 @@ +"use strict"; + +var coerceToSafeInteger = require("../safe-integer/coerce"); + +module.exports = function (value) { + value = coerceToSafeInteger(value); + if (!value) return value; + if (value < 0) return null; + return value; +}; diff --git a/node_modules/type/array-length/ensure.js b/node_modules/type/array-length/ensure.js new file mode 100644 index 00000000..ee0b5566 --- /dev/null +++ b/node_modules/type/array-length/ensure.js @@ -0,0 +1,10 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , coerce = require("./coerce"); + +module.exports = function (value/*, options*/) { + var coerced = coerce(value); + if (coerced !== null) return coerced; + return resolveException(value, "%v is not a valid array length", arguments[1]); +}; diff --git a/node_modules/type/array-like/ensure.js b/node_modules/type/array-like/ensure.js new file mode 100644 index 00000000..f3c9b504 --- /dev/null +++ b/node_modules/type/array-like/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value, arguments[1])) return value; + return resolveException(value, "%v is not an array like value", arguments[1]); +}; diff --git a/node_modules/type/array-like/is.js b/node_modules/type/array-like/is.js new file mode 100644 index 00000000..7778fede --- /dev/null +++ b/node_modules/type/array-like/is.js @@ -0,0 +1,21 @@ +"use strict"; + +var coerceToArrayLength = require("../array-length/coerce") + , isObject = require("../object/is"); + +module.exports = function (value/*, options*/) { + if (!isObject(value)) { + var options = arguments[1]; + if (isObject(options) && options.allowString && typeof value === "string") return true; + return false; + } + + if (typeof value === "function") return false; + + var length; + try { length = value.length; } + catch (error) { return false; } + + if (coerceToArrayLength(length) === null) return false; + return true; +}; diff --git a/node_modules/type/array/ensure.js b/node_modules/type/array/ensure.js new file mode 100644 index 00000000..5474a78c --- /dev/null +++ b/node_modules/type/array/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "%v is not an array object", arguments[1]); +}; diff --git a/node_modules/type/array/is.js b/node_modules/type/array/is.js new file mode 100644 index 00000000..13fd8d39 --- /dev/null +++ b/node_modules/type/array/is.js @@ -0,0 +1,27 @@ +"use strict"; + +var isPrototype = require("../prototype/is"); + +var isArray; +if (typeof Array.isArray === "function") { + isArray = Array.isArray; +} else { + var objectToString = Object.prototype.toString, objectTaggedString = objectToString.call([]); + isArray = function (value) { return objectToString.call(value) === objectTaggedString; }; +} + +module.exports = function (value) { + if (!isArray(value)) return false; + + // Sanity check (reject objects which do not expose common Array interface) + if (!hasOwnProperty.call(value, "length")) return false; + try { + if (typeof value.length !== "number") return false; + if (typeof value.push !== "function") return false; + if (typeof value.splice !== "function") return false; + } catch (error) { + return false; + } + + return !isPrototype(value); +}; diff --git a/node_modules/type/date/ensure.js b/node_modules/type/date/ensure.js new file mode 100644 index 00000000..b249a67a --- /dev/null +++ b/node_modules/type/date/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "%v is not a date object", arguments[1]); +}; diff --git a/node_modules/type/date/is.js b/node_modules/type/date/is.js new file mode 100644 index 00000000..0754085f --- /dev/null +++ b/node_modules/type/date/is.js @@ -0,0 +1,26 @@ +"use strict"; + +var isPrototype = require("../prototype/is"); + +var dateValueOf = Date.prototype.valueOf; + +module.exports = function (value) { + if (!value) return false; + + try { + // Sanity check (reject objects which do not expose common Date interface) + if (typeof value.getFullYear !== "function") return false; + if (typeof value.getTimezoneOffset !== "function") return false; + if (typeof value.setFullYear !== "function") return false; + + // Ensure its native Date object (has [[DateValue]] slot) + dateValueOf.call(value); + } catch (error) { + return false; + } + + // Ensure it hosts valid date + if (isNaN(value)) return false; + + return !isPrototype(value); +}; diff --git a/node_modules/type/error/ensure.js b/node_modules/type/error/ensure.js new file mode 100644 index 00000000..a304f59c --- /dev/null +++ b/node_modules/type/error/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "%v is not an error object", arguments[1]); +}; diff --git a/node_modules/type/error/is.js b/node_modules/type/error/is.js new file mode 100644 index 00000000..bf04c808 --- /dev/null +++ b/node_modules/type/error/is.js @@ -0,0 +1,45 @@ +"use strict"; + +var isPrototype = require("../prototype/is") + , isPlainObject = require("../plain-object/is"); + +var objectToString = Object.prototype.toString; + +// Recognize host specific errors (e.g. DOMException) +var errorTaggedStringRe = /^\[object .*(?:Error|Exception)\]$/ + , errorNameRe = /^[^\s]*(?:Error|Exception)$/; + +module.exports = function (value) { + if (!value) return false; + + var name; + // Sanity check (reject objects which do not expose common Error interface) + try { + name = value.name; + if (typeof name !== "string") return false; + if (typeof value.message !== "string") return false; + } catch (error) { + return false; + } + + // Ensure its a native-like Error object + // (has [[ErrorData]] slot, or was created to resemble one) + // Note: It's not a 100% bulletproof check of confirming that as: + // - In ES2015+ string tag can be overriden via Symbol.toStringTag property + // - Host errors do not share native error tag. Still we rely on assumption that + // tag for each error will end either with `Error` or `Exception` string + // - In pre ES2015 era, no custom errors will share the error tag. + if (!errorTaggedStringRe.test(objectToString.call(value))) { + // Definitely not an ES2015 error instance, but could still be an error + // (created via e.g. CustomError.prototype = Object.create(Error.prototype)) + try { + if (name !== value.constructor.name) return false; + } catch (error) { + return false; + } + if (!errorNameRe.test(name)) return false; + if (isPlainObject(value)) return false; + } + + return !isPrototype(value); +}; diff --git a/node_modules/type/finite/coerce.js b/node_modules/type/finite/coerce.js new file mode 100644 index 00000000..a3783be5 --- /dev/null +++ b/node_modules/type/finite/coerce.js @@ -0,0 +1,8 @@ +"use strict"; + +var coerceToNumber = require("../number/coerce"); + +module.exports = function (value) { + value = coerceToNumber(value); + return isFinite(value) ? value : null; +}; diff --git a/node_modules/type/finite/ensure.js b/node_modules/type/finite/ensure.js new file mode 100644 index 00000000..0f899d1e --- /dev/null +++ b/node_modules/type/finite/ensure.js @@ -0,0 +1,10 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , coerce = require("./coerce"); + +module.exports = function (value/*, options*/) { + var coerced = coerce(value); + if (coerced !== null) return coerced; + return resolveException(value, "%v is not a finite number", arguments[1]); +}; diff --git a/node_modules/type/function/ensure.js b/node_modules/type/function/ensure.js new file mode 100644 index 00000000..b560ae93 --- /dev/null +++ b/node_modules/type/function/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "%v is not a function", arguments[1]); +}; diff --git a/node_modules/type/function/is.js b/node_modules/type/function/is.js new file mode 100644 index 00000000..981990a7 --- /dev/null +++ b/node_modules/type/function/is.js @@ -0,0 +1,19 @@ +"use strict"; + +var isPrototype = require("../prototype/is"); + +module.exports = function (value) { + if (typeof value !== "function") return false; + + if (!hasOwnProperty.call(value, "length")) return false; + + try { + if (typeof value.length !== "number") return false; + if (typeof value.call !== "function") return false; + if (typeof value.apply !== "function") return false; + } catch (error) { + return false; + } + + return !isPrototype(value); +}; diff --git a/node_modules/type/integer/coerce.js b/node_modules/type/integer/coerce.js new file mode 100644 index 00000000..cba5e17e --- /dev/null +++ b/node_modules/type/integer/coerce.js @@ -0,0 +1,11 @@ +"use strict"; + +var coerceToFinite = require("../finite/coerce"); + +var abs = Math.abs, floor = Math.floor; + +module.exports = function (value) { + value = coerceToFinite(value); + if (!value) return value; + return (value > 0 ? 1 : -1) * floor(abs(value)); +}; diff --git a/node_modules/type/integer/ensure.js b/node_modules/type/integer/ensure.js new file mode 100644 index 00000000..a6c97d09 --- /dev/null +++ b/node_modules/type/integer/ensure.js @@ -0,0 +1,10 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , coerce = require("./coerce"); + +module.exports = function (value/*, options*/) { + var coerced = coerce(value); + if (coerced !== null) return coerced; + return resolveException(value, "%v is not an integer", arguments[1]); +}; diff --git a/node_modules/type/iterable/ensure.js b/node_modules/type/iterable/ensure.js new file mode 100644 index 00000000..60fc9128 --- /dev/null +++ b/node_modules/type/iterable/ensure.js @@ -0,0 +1,29 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , isValue = require("../value/is") + , is = require("./is"); + +var resolveCoercedValue = function (value, coerceItem) { + var coercedValue = []; + var iterator = value[Symbol.iterator](); + var item; + while (!(item = iterator.next()).done) { + var newItemValue = coerceItem(item.value); + if (!isValue(newItemValue)) throw new Error("Stop propagation"); + coercedValue.push(newItemValue); + } + return coercedValue; +}; +module.exports = function (value/*, options*/) { + var options = arguments[1]; + if (is(value, options)) { + if (!options) return value; + if (typeof options.coerceItem !== "function") return value; + try { return resolveCoercedValue(value, options.coerceItem); } + catch (error) { + // Ignore, let validation error propagate + } + } + return resolveException(value, "%v is not expected iterable value", options); +}; diff --git a/node_modules/type/iterable/is.js b/node_modules/type/iterable/is.js new file mode 100644 index 00000000..d35408cd --- /dev/null +++ b/node_modules/type/iterable/is.js @@ -0,0 +1,32 @@ +// Polyfills friendly, therefore ES5 syntax + +"use strict"; + +var isObject = require("../object/is"); + +var iteratorSymbol = Symbol.iterator; + +if (!iteratorSymbol) { + throw new Error("Cannot initialize iterator/is due to Symbol.iterator not being implemented"); +} + +module.exports = function (value/*, options*/) { + var options = arguments[1]; + if (!isObject(value)) { + if (!isObject(options) || !options.allowString || typeof value !== "string") return false; + } + try { + if (typeof value[iteratorSymbol] !== "function") return false; + } catch (error) { + return false; + } + if (!options) return true; + if (options.denyEmpty) { + try { + if (value[iteratorSymbol]().next().done) return false; + } catch (error) { + return false; + } + } + return true; +}; diff --git a/node_modules/type/natural-number/coerce.js b/node_modules/type/natural-number/coerce.js new file mode 100644 index 00000000..4b7931c5 --- /dev/null +++ b/node_modules/type/natural-number/coerce.js @@ -0,0 +1,10 @@ +"use strict"; + +var coerceToInteger = require("../integer/coerce"); + +module.exports = function (value) { + value = coerceToInteger(value); + if (!value) return value; + if (value < 0) return null; + return value; +}; diff --git a/node_modules/type/natural-number/ensure.js b/node_modules/type/natural-number/ensure.js new file mode 100644 index 00000000..ec307bf6 --- /dev/null +++ b/node_modules/type/natural-number/ensure.js @@ -0,0 +1,10 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , coerce = require("./coerce"); + +module.exports = function (value/*, options*/) { + var coerced = coerce(value); + if (coerced !== null) return coerced; + return resolveException(value, "%v is not a natural number", arguments[1]); +}; diff --git a/node_modules/type/number/coerce.js b/node_modules/type/number/coerce.js new file mode 100644 index 00000000..1bb15125 --- /dev/null +++ b/node_modules/type/number/coerce.js @@ -0,0 +1,14 @@ +"use strict"; + +var isValue = require("../value/is"); + +module.exports = function (value) { + if (!isValue(value)) return null; + try { + value = +value; // Ensure implicit coercion + } catch (error) { + return null; + } + if (isNaN(value)) return null; + return value; +}; diff --git a/node_modules/type/number/ensure.js b/node_modules/type/number/ensure.js new file mode 100644 index 00000000..ada44204 --- /dev/null +++ b/node_modules/type/number/ensure.js @@ -0,0 +1,10 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , coerce = require("./coerce"); + +module.exports = function (value/*, options*/) { + var coerced = coerce(value); + if (coerced !== null) return coerced; + return resolveException(value, "%v is not a number", arguments[1]); +}; diff --git a/node_modules/type/object/ensure.js b/node_modules/type/object/ensure.js new file mode 100644 index 00000000..95ae5df3 --- /dev/null +++ b/node_modules/type/object/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "%v is not an object", arguments[1]); +}; diff --git a/node_modules/type/object/is.js b/node_modules/type/object/is.js new file mode 100644 index 00000000..a254dcbc --- /dev/null +++ b/node_modules/type/object/is.js @@ -0,0 +1,11 @@ +"use strict"; + +var isValue = require("../value/is"); + +// prettier-ignore +var possibleTypes = { "object": true, "function": true, "undefined": true /* document.all */ }; + +module.exports = function (value) { + if (!isValue(value)) return false; + return hasOwnProperty.call(possibleTypes, typeof value); +}; diff --git a/node_modules/type/package.json b/node_modules/type/package.json new file mode 100644 index 00000000..2fba3cea --- /dev/null +++ b/node_modules/type/package.json @@ -0,0 +1,96 @@ +{ + "name": "type", + "version": "1.2.0", + "description": "Runtime validation and processing of JavaScript types", + "author": "Mariusz Nowak (https://www.medikoo.com/)", + "keywords": [ + "type", + "coercion" + ], + "repository": "medikoo/type", + "devDependencies": { + "chai": "^4.2.0", + "eslint": "^6.4.0", + "eslint-config-medikoo": "^2.5.1", + "git-list-updated": "^1.2.1", + "husky": "^3.0.5", + "lint-staged": "^9.2.5", + "mocha": "^6.2.0", + "nyc": "^14.1.1", + "prettier-elastic": "^1.18.2" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.js": [ + "eslint" + ], + "*.{css,html,js,json,md,yaml,yml}": [ + "prettier -c" + ] + }, + "eslintConfig": { + "extends": "medikoo/es3", + "root": true, + "globals": { + "Map": true, + "Promise": true, + "Set": true, + "Symbol": true + }, + "overrides": [ + { + "files": "test/**/*.js", + "env": { + "mocha": true + }, + "rules": { + "no-eval": "off", + "no-new-wrappers": "off" + } + }, + { + "files": [ + "string/coerce.js", + "number/coerce.js" + ], + "rules": { + "no-implicit-coercion": "off" + } + }, + { + "files": "plain-object/is.js", + "rules": { + "no-proto": "off" + } + } + ] + }, + "prettier": { + "printWidth": 100, + "tabWidth": 4, + "overrides": [ + { + "files": [ + "*.md" + ], + "options": { + "tabWidth": 2 + } + } + ] + }, + "scripts": { + "coverage": "nyc --reporter=lcov --reporter=html --reporter=text-summary npm test", + "check-coverage": "npm run coverage && nyc check-coverage --statements 80 --function 80 --branches 80 --lines 80", + "lint": "eslint --ignore-path=.gitignore .", + "lint-updated": "pipe-git-updated --ext=js -- eslint --ignore-pattern '!*'", + "prettier-check-updated": "pipe-git-updated --ext=css --ext=html --ext=js --ext=json --ext=md --ext=yaml --ext=yml -- prettier -c", + "prettify": "prettier --write --ignore-path .gitignore '**/*.{css,html,js,json,md,yaml,yml}'", + "test": "mocha --recursive" + }, + "license": "ISC" +} diff --git a/node_modules/type/plain-function/ensure.js b/node_modules/type/plain-function/ensure.js new file mode 100644 index 00000000..811eae6f --- /dev/null +++ b/node_modules/type/plain-function/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "%v is not a plain function", arguments[1]); +}; diff --git a/node_modules/type/plain-function/is.js b/node_modules/type/plain-function/is.js new file mode 100644 index 00000000..b55d4fff --- /dev/null +++ b/node_modules/type/plain-function/is.js @@ -0,0 +1,11 @@ +"use strict"; + +var isFunction = require("../function/is"); + +var classRe = /^\s*class[\s{/}]/, functionToString = Function.prototype.toString; + +module.exports = function (value) { + if (!isFunction(value)) return false; + if (classRe.test(functionToString.call(value))) return false; + return true; +}; diff --git a/node_modules/type/plain-object/ensure.js b/node_modules/type/plain-object/ensure.js new file mode 100644 index 00000000..61fe68f2 --- /dev/null +++ b/node_modules/type/plain-object/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "%v is not a plain object", arguments[1]); +}; diff --git a/node_modules/type/plain-object/is.js b/node_modules/type/plain-object/is.js new file mode 100644 index 00000000..50d6713c --- /dev/null +++ b/node_modules/type/plain-object/is.js @@ -0,0 +1,28 @@ +"use strict"; + +var isObject = require("../object/is") + , isPrototype = require("../prototype/is"); + +var getPrototypeOf; +if (typeof Object.getPrototypeOf === "function") { + getPrototypeOf = Object.getPrototypeOf; +} else if ({}.__proto__ === Object.prototype) { + getPrototypeOf = function (object) { return object.__proto__; }; +} + +module.exports = function (value) { + if (!isObject(value)) return false; + var prototype; + if (getPrototypeOf) { + prototype = getPrototypeOf(value); + } else { + try { + var valueConstructor = value.constructor; + if (valueConstructor) prototype = valueConstructor.prototype; + } catch (error) { + return false; + } + } + if (prototype && !hasOwnProperty.call(prototype, "propertyIsEnumerable")) return false; + return !isPrototype(value); +}; diff --git a/node_modules/type/promise/ensure.js b/node_modules/type/promise/ensure.js new file mode 100644 index 00000000..9d7f1652 --- /dev/null +++ b/node_modules/type/promise/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "%v is not a promise", arguments[1]); +}; diff --git a/node_modules/type/promise/is.js b/node_modules/type/promise/is.js new file mode 100644 index 00000000..53533627 --- /dev/null +++ b/node_modules/type/promise/is.js @@ -0,0 +1,27 @@ +"use strict"; + +var isPrototype = require("../prototype/is"); + +// In theory we could rely on Symbol.toStringTag directly, +// still early native implementation (e.g. in FF) predated symbols +var objectToString = Object.prototype.toString + , objectTaggedString = objectToString.call(Promise.resolve()); + +module.exports = function (value) { + if (!value) return false; + + // Sanity check (reject objects which do not expose common Promise interface) + try { + if (typeof value.then !== "function") return false; + if (typeof value["catch"] !== "function") return false; + } catch (error) { + return false; + } + + // Ensure its native Promise object (has [[PromiseState]] slot) + // Note: it's not 100% precise as string tag may be overriden + // and other objects could be hacked to expose it + if (objectToString.call(value) !== objectTaggedString) return false; + + return !isPrototype(value); +}; diff --git a/node_modules/type/prototype/is.js b/node_modules/type/prototype/is.js new file mode 100644 index 00000000..aaddb2aa --- /dev/null +++ b/node_modules/type/prototype/is.js @@ -0,0 +1,13 @@ +"use strict"; + +var isObject = require("../object/is"); + +module.exports = function (value) { + if (!isObject(value)) return false; + try { + if (!value.constructor) return false; + return value.constructor.prototype === value; + } catch (error) { + return false; + } +}; diff --git a/node_modules/type/reg-exp/ensure.js b/node_modules/type/reg-exp/ensure.js new file mode 100644 index 00000000..460a7e0a --- /dev/null +++ b/node_modules/type/reg-exp/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "%v is not a regular expression object", arguments[1]); +}; diff --git a/node_modules/type/reg-exp/is.js b/node_modules/type/reg-exp/is.js new file mode 100644 index 00000000..f0c69d52 --- /dev/null +++ b/node_modules/type/reg-exp/is.js @@ -0,0 +1,37 @@ +"use strict"; + +var isToStringTagSupported = require("../lib/is-to-string-tag-supported") + , isPrototype = require("../prototype/is"); + +var regExpTest = RegExp.prototype.test + , objectToString = Object.prototype.toString + , objectTaggedString = objectToString.call(/a/); + +module.exports = function (value) { + if (!value) return false; + + // Sanity check (reject objects which do not expose common RegExp interface) + if (!hasOwnProperty.call(value, "lastIndex")) return false; + try { + if (typeof value.lastIndex !== "number") return false; + if (typeof value.test !== "function") return false; + if (typeof value.exec !== "function") return false; + } catch (error) { + return false; + } + + // Ensure its native RegExp object (has [[RegExpMatcher]] slot) + if (isToStringTagSupported && typeof value[Symbol.toStringTag] === "string") { + // Edge case (possibly a regExp with custom Symbol.toStringTag) + try { + var lastIndex = value.lastIndex; + regExpTest.call(value, ""); + if (value.lastIndex !== lastIndex) value.lastIndex = lastIndex; + return true; + } catch (error) { + return false; + } + } + if (objectToString.call(value) !== objectTaggedString) return false; + return !isPrototype(value); +}; diff --git a/node_modules/type/safe-integer/coerce.js b/node_modules/type/safe-integer/coerce.js new file mode 100644 index 00000000..b97e4aae --- /dev/null +++ b/node_modules/type/safe-integer/coerce.js @@ -0,0 +1,13 @@ +"use strict"; + +var coerceToInteger = require("../integer/coerce"); + +var MAX_SAFE_INTEGER = 9007199254740991, MIN_SAFE_INTEGER = -9007199254740991; + +module.exports = function (value) { + value = coerceToInteger(value); + if (!value) return value; + if (value > MAX_SAFE_INTEGER) return null; + if (value < MIN_SAFE_INTEGER) return null; + return value; +}; diff --git a/node_modules/type/safe-integer/ensure.js b/node_modules/type/safe-integer/ensure.js new file mode 100644 index 00000000..0b4e61da --- /dev/null +++ b/node_modules/type/safe-integer/ensure.js @@ -0,0 +1,10 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , coerce = require("./coerce"); + +module.exports = function (value/*, options*/) { + var coerced = coerce(value); + if (coerced !== null) return coerced; + return resolveException(value, "%v is not a safe integer", arguments[1]); +}; diff --git a/node_modules/type/string/coerce.js b/node_modules/type/string/coerce.js new file mode 100644 index 00000000..43cd931f --- /dev/null +++ b/node_modules/type/string/coerce.js @@ -0,0 +1,23 @@ +"use strict"; + +var isValue = require("../value/is") + , isObject = require("../object/is"); + +var objectToString = Object.prototype.toString; + +module.exports = function (value) { + if (!isValue(value)) return null; + if (isObject(value)) { + // Reject Object.prototype.toString coercion + var valueToString = value.toString; + if (typeof valueToString !== "function") return null; + if (valueToString === objectToString) return null; + // Note: It can be object coming from other realm, still as there's no ES3 and CSP compliant + // way to resolve its realm's Object.prototype.toString it's left as not addressed edge case + } + try { + return "" + value; // Ensure implicit coercion + } catch (error) { + return null; + } +}; diff --git a/node_modules/type/string/ensure.js b/node_modules/type/string/ensure.js new file mode 100644 index 00000000..7a77aa59 --- /dev/null +++ b/node_modules/type/string/ensure.js @@ -0,0 +1,10 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , coerce = require("./coerce"); + +module.exports = function (value/*, options*/) { + var coerced = coerce(value); + if (coerced !== null) return coerced; + return resolveException(value, "%v is not a string", arguments[1]); +}; diff --git a/node_modules/type/test/_lib/arrow-function-if-supported.js b/node_modules/type/test/_lib/arrow-function-if-supported.js new file mode 100644 index 00000000..f80e5ebf --- /dev/null +++ b/node_modules/type/test/_lib/arrow-function-if-supported.js @@ -0,0 +1,4 @@ +"use strict"; + +try { module.exports = eval("(() => {})"); } +catch (error) {} diff --git a/node_modules/type/test/_lib/class-if-supported.js b/node_modules/type/test/_lib/class-if-supported.js new file mode 100644 index 00000000..cccfa950 --- /dev/null +++ b/node_modules/type/test/_lib/class-if-supported.js @@ -0,0 +1,4 @@ +"use strict"; + +try { module.exports = eval("(class {})"); } +catch (error) {} diff --git a/node_modules/type/test/array-length/coerce.js b/node_modules/type/test/array-length/coerce.js new file mode 100644 index 00000000..f47a1f6c --- /dev/null +++ b/node_modules/type/test/array-length/coerce.js @@ -0,0 +1,47 @@ +"use strict"; + +var assert = require("chai").assert + , coerceToArrayLength = require("../../array-length/coerce"); + +describe("array-length/coerce", function () { + it("Should coerce float", function () { + assert.equal(coerceToArrayLength(123.123), 123); + assert.equal(coerceToArrayLength(123.823), 123); + }); + it("Should coerce string", function () { assert.equal(coerceToArrayLength("12.123"), 12); }); + it("Should coerce booleans", function () { assert.equal(coerceToArrayLength(true), 1); }); + it("Should coerce number objects", function () { + assert.equal(coerceToArrayLength(new Number(343)), 343); + }); + it("Should coerce objects", function () { + assert.equal(coerceToArrayLength({ valueOf: function () { return 23; } }), 23); + }); + it("Should reject infinite number", function () { + assert.equal(coerceToArrayLength(Infinity), null); + }); + it("Should reject number beyond Number.MAX_SAFE_INTEGER", function () { + assert.equal(coerceToArrayLength(9007199254740992), null); + }); + it("Should reject negative number", function () { + assert.equal(coerceToArrayLength(-9), null); + }); + + it("Should reject NaN", function () { assert.equal(coerceToArrayLength(NaN), null); }); + + if (typeof Object.create === "function") { + it("Should not coerce objects with no number representation", function () { + assert.equal(coerceToArrayLength(Object.create(null)), null); + }); + } + + it("Should not coerce null", function () { assert.equal(coerceToArrayLength(null), null); }); + it("Should not coerce undefined", function () { + assert.equal(coerceToArrayLength(undefined), null); + }); + + if (typeof Symbol === "function") { + it("Should not coerce symbols", function () { + assert.equal(coerceToArrayLength(Symbol("foo")), null); + }); + } +}); diff --git a/node_modules/type/test/array-length/ensure.js b/node_modules/type/test/array-length/ensure.js new file mode 100644 index 00000000..2ff6bb65 --- /dev/null +++ b/node_modules/type/test/array-length/ensure.js @@ -0,0 +1,19 @@ +"use strict"; + +var assert = require("chai").assert + , ensureArrayLength = require("../../array-length/ensure"); + +describe("array-length/ensure", function () { + it("Should return coerced value", function () { + assert.equal(ensureArrayLength("12.23"), 12); + }); + it("Should crash on no value", function () { + try { + ensureArrayLength(-20); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "-20 is not a valid array length"); + } + }); +}); diff --git a/node_modules/type/test/array-like/ensure.js b/node_modules/type/test/array-like/ensure.js new file mode 100644 index 00000000..787b3037 --- /dev/null +++ b/node_modules/type/test/array-like/ensure.js @@ -0,0 +1,24 @@ +"use strict"; + +var assert = require("chai").assert + , ensureArrayLike = require("../../array-like/ensure"); + +describe("array-like/ensure", function () { + it("Should return input value", function () { + var value = []; + assert.equal(ensureArrayLike(value), value); + }); + it("Should allow strings with allowString option", function () { + var value = "foo"; + assert.equal(ensureArrayLike(value, { allowString: true }), value); + }); + it("Should crash on invalid value", function () { + try { + ensureArrayLike("foo"); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert(error.message.includes("is not an array like value")); + } + }); +}); diff --git a/node_modules/type/test/array-like/is.js b/node_modules/type/test/array-like/is.js new file mode 100644 index 00000000..b74883cf --- /dev/null +++ b/node_modules/type/test/array-like/is.js @@ -0,0 +1,47 @@ +"use strict"; + +var assert = require("chai").assert + , isArrayLike = require("../../array-like/is"); + +describe("array-like/is", function () { + it("Should return true on array", function () { assert.equal(isArrayLike([]), true); }); + it("Should return true on array-like object", function () { + assert.equal(isArrayLike({ length: 1 }), true); + }); + it("Should by default return false on string", function () { + assert.equal(isArrayLike("foo"), false); + }); + it("Should accept strings if specified", function () { + assert.equal(isArrayLike("foo", { allowString: true }), true); + }); + + it("Should return false on objects with negative length", function () { + assert.equal(isArrayLike({ length: -1 }), false); + }); + + it("Should return false on plain object", function () { + assert.equal(isArrayLike({}), false); + }); + it("Should return false on function", function () { + assert.equal(isArrayLike(function () { return true; }), false); + }); + + if (typeof Object.create === "function") { + it("Should return false on object with no prototype", function () { + assert.equal(isArrayLike(Object.create(null)), false); + }); + } + it("Should return false on number", function () { assert.equal(isArrayLike(123), false); }); + it("Should return false on NaN", function () { assert.equal(isArrayLike(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isArrayLike(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isArrayLike(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isArrayLike(null), false); }); + it("Should return false on undefined", function () { + assert.equal(isArrayLike(void 0), false); + }); +}); diff --git a/node_modules/type/test/array/ensure.js b/node_modules/type/test/array/ensure.js new file mode 100644 index 00000000..a5c1e3ef --- /dev/null +++ b/node_modules/type/test/array/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensureArray = require("../../array/ensure"); + +describe("array/ensure", function () { + it("Should return input value", function () { + var value = []; + assert.equal(ensureArray(value), value); + }); + it("Should crash on invalid value", function () { + try { + ensureArray(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert(error.message.includes("is not an array object")); + } + }); +}); diff --git a/node_modules/type/test/array/is.js b/node_modules/type/test/array/is.js new file mode 100644 index 00000000..88a1a404 --- /dev/null +++ b/node_modules/type/test/array/is.js @@ -0,0 +1,41 @@ +"use strict"; + +var assert = require("chai").assert + , isArray = require("../../array/is"); + +describe("array/is", function () { + it("Should return true on array", function () { assert.equal(isArray([]), true); }); + + it("Should return false on array with no common API exposed", function () { + var value = []; + value.push = null; + assert.equal(isArray(value), false); + }); + it("Should return false on Array.prototype", function () { + assert.equal(isArray(Array.prototype), false); + }); + + it("Should return false on plain object", function () { assert.equal(isArray({}), false); }); + it("Should return false on function", function () { + assert.equal(isArray(function () { return true; }), false); + }); + + if (typeof Object.create === "function") { + it("Should return false on object with no prototype", function () { + assert.equal(isArray(Object.create(null)), false); + }); + } + it("Should return false on string", function () { assert.equal(isArray("foo"), false); }); + it("Should return false on empty string", function () { assert.equal(isArray(""), false); }); + it("Should return false on number", function () { assert.equal(isArray(123), false); }); + it("Should return false on NaN", function () { assert.equal(isArray(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isArray(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isArray(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isArray(null), false); }); + it("Should return false on undefined", function () { assert.equal(isArray(void 0), false); }); +}); diff --git a/node_modules/type/test/date/ensure.js b/node_modules/type/test/date/ensure.js new file mode 100644 index 00000000..7fceffeb --- /dev/null +++ b/node_modules/type/test/date/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensureDate = require("../../date/ensure"); + +describe("date/ensure", function () { + it("Should return input value", function () { + var value = new Date(); + assert.equal(ensureDate(value), value); + }); + it("Should crash on invalid value", function () { + try { + ensureDate(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert(error.message.includes("is not a date object")); + } + }); +}); diff --git a/node_modules/type/test/date/is.js b/node_modules/type/test/date/is.js new file mode 100644 index 00000000..fc57cbf1 --- /dev/null +++ b/node_modules/type/test/date/is.js @@ -0,0 +1,46 @@ +"use strict"; + +var assert = require("chai").assert + , isDate = require("../../date/is"); + +describe("date/is", function () { + it("Should return true on date", function () { assert.equal(isDate(new Date()), true); }); + it("Should return false on invalid date", function () { + assert.equal(isDate(new Date("foo")), false); + }); + + it("Should return false on native date with no common API exposed", function () { + var value = new Date(); + value.getFullYear = null; + assert.equal(isDate(value), false); + }); + it("Should return false on Date.prototype", function () { + assert.equal(isDate(Date.prototype), false); + }); + it("Should return false on time value", function () { assert.equal(isDate(12312313), false); }); + + it("Should return false on plain object", function () { assert.equal(isDate({}), false); }); + it("Should return false on function", function () { + assert.equal(isDate(function () { return true; }), false); + }); + + it("Should return false on array", function () { assert.equal(isDate([]), false); }); + if (typeof Object.create === "function") { + it("Should return false on object with no prototype", function () { + assert.equal(isDate(Object.create(null)), false); + }); + } + it("Should return false on string", function () { assert.equal(isDate("foo"), false); }); + it("Should return false on empty string", function () { assert.equal(isDate(""), false); }); + it("Should return false on number", function () { assert.equal(isDate(123), false); }); + it("Should return false on NaN", function () { assert.equal(isDate(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isDate(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isDate(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isDate(null), false); }); + it("Should return false on undefined", function () { assert.equal(isDate(void 0), false); }); +}); diff --git a/node_modules/type/test/error/ensure.js b/node_modules/type/test/error/ensure.js new file mode 100644 index 00000000..c18bdee0 --- /dev/null +++ b/node_modules/type/test/error/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensureError = require("../../error/ensure"); + +describe("error/ensure", function () { + it("Should return input value", function () { + var value = new Error(); + assert.equal(ensureError(value), value); + }); + it("Should crash on invalid value", function () { + try { + ensureError(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert(error.message.includes("is not an error object")); + } + }); +}); diff --git a/node_modules/type/test/error/is.js b/node_modules/type/test/error/is.js new file mode 100644 index 00000000..12692b49 --- /dev/null +++ b/node_modules/type/test/error/is.js @@ -0,0 +1,50 @@ +"use strict"; + +var assert = require("chai").assert + , isError = require("../../error/is"); + +describe("error/is", function () { + it("Should return true on error", function () { assert.equal(isError(new Error()), true); }); + + it("Should return false on native error with no common API exposed", function () { + var value = new Error(); + value.message = null; + assert.equal(isError(value), false); + }); + it("Should return false on Error.prototype", function () { + assert.equal(isError(Error.prototype), false); + }); + + if (typeof Object.create === "function") { + it("Should return true on custom built ES5 era error", function () { + var CustomEs5Error = function () { Error.call(this); }; + CustomEs5Error.prototype = Object.create(Error.prototype); + assert.equal(isError(new CustomEs5Error()), true); + }); + + it("Should return false on object with no prototype", function () { + assert.equal(isError(Object.create(null)), false); + }); + } + + it("Should return false on plain object", function () { assert.equal(isError({}), false); }); + it("Should return false on function", function () { + assert.equal(isError(function () { return true; }), false); + }); + + it("Should return false on array", function () { assert.equal(isError([]), false); }); + + it("Should return false on string", function () { assert.equal(isError("foo"), false); }); + it("Should return false on empty string", function () { assert.equal(isError(""), false); }); + it("Should return false on number", function () { assert.equal(isError(123), false); }); + it("Should return false on NaN", function () { assert.equal(isError(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isError(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isError(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isError(null), false); }); + it("Should return false on undefined", function () { assert.equal(isError(void 0), false); }); +}); diff --git a/node_modules/type/test/finite/coerce.js b/node_modules/type/test/finite/coerce.js new file mode 100644 index 00000000..5d39837b --- /dev/null +++ b/node_modules/type/test/finite/coerce.js @@ -0,0 +1,40 @@ +"use strict"; + +var assert = require("chai").assert + , coerceToFinite = require("../../finite/coerce"); + +describe("finite/coerce", function () { + it("Should return input number", function () { + assert.equal(coerceToFinite(123.123), 123.123); + }); + it("Should coerce string", function () { assert.equal(coerceToFinite("12"), 12); }); + it("Should coerce booleans", function () { assert.equal(coerceToFinite(true), 1); }); + it("Should coerce number objects", function () { + assert.equal(coerceToFinite(new Number(343)), 343); + }); + it("Should coerce objects", function () { + assert.equal(coerceToFinite({ valueOf: function () { return 23; } }), 23); + }); + + it("Should reject infinite number", function () { + assert.equal(coerceToFinite(Infinity), null); + }); + it("Should reject NaN", function () { assert.equal(coerceToFinite(NaN), null); }); + + if (typeof Object.create === "function") { + it("Should not coerce objects with no number representation", function () { + assert.equal(coerceToFinite(Object.create(null)), null); + }); + } + + it("Should not coerce null", function () { assert.equal(coerceToFinite(null), null); }); + it("Should not coerce undefined", function () { + assert.equal(coerceToFinite(undefined), null); + }); + + if (typeof Symbol === "function") { + it("Should not coerce symbols", function () { + assert.equal(coerceToFinite(Symbol("foo")), null); + }); + } +}); diff --git a/node_modules/type/test/finite/ensure.js b/node_modules/type/test/finite/ensure.js new file mode 100644 index 00000000..ed4246ef --- /dev/null +++ b/node_modules/type/test/finite/ensure.js @@ -0,0 +1,17 @@ +"use strict"; + +var assert = require("chai").assert + , ensureFinite = require("../../finite/ensure"); + +describe("finite/ensure", function () { + it("Should return coerced value", function () { assert.equal(ensureFinite("12.23"), 12.23); }); + it("Should crash on no value", function () { + try { + ensureFinite(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "null is not a finite number"); + } + }); +}); diff --git a/node_modules/type/test/function/ensure.js b/node_modules/type/test/function/ensure.js new file mode 100644 index 00000000..e101c06b --- /dev/null +++ b/node_modules/type/test/function/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensureFunction = require("../../function/ensure"); + +describe("function/ensure", function () { + it("Should return input value", function () { + var value = function () { return true; }; + assert.equal(ensureFunction(value), value); + }); + it("Should crash on invalid value", function () { + try { + ensureFunction(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert(error.message.includes("is not a function")); + } + }); +}); diff --git a/node_modules/type/test/function/is.js b/node_modules/type/test/function/is.js new file mode 100644 index 00000000..6b561e59 --- /dev/null +++ b/node_modules/type/test/function/is.js @@ -0,0 +1,46 @@ +"use strict"; + +var assert = require("chai").assert + , isFunction = require("../../function/is") + , arrowFunctionIfSupported = require("../_lib/arrow-function-if-supported") + , classIfSupported = require("../_lib/class-if-supported"); + +describe("function/is", function () { + it("Should return true on function", function () { + assert.equal(isFunction(function () { return true; }), true); + }); + if (arrowFunctionIfSupported) { + it("Should return true on arrow function", function () { + assert.equal(isFunction(arrowFunctionIfSupported), true); + }); + } + if (classIfSupported) { + it("Should return true on class", function () { + assert.equal(isFunction(classIfSupported), true); + }); + } + it("Should return false on reg-exp", function () { assert.equal(isFunction(/foo/), false); }); + + it("Should return false on plain object", function () { assert.equal(isFunction({}), false); }); + it("Should return false on array", function () { assert.equal(isFunction([]), false); }); + if (typeof Object.create === "function") { + it("Should return false on object with no prototype", function () { + assert.equal(isFunction(Object.create(null)), false); + }); + } + it("Should return false on string", function () { assert.equal(isFunction("foo"), false); }); + it("Should return false on empty string", function () { assert.equal(isFunction(""), false); }); + it("Should return false on number", function () { assert.equal(isFunction(123), false); }); + it("Should return false on NaN", function () { assert.equal(isFunction(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isFunction(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isFunction(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isFunction(null), false); }); + it("Should return false on undefined", function () { + assert.equal(isFunction(void 0), false); + }); +}); diff --git a/node_modules/type/test/integer/coerce.js b/node_modules/type/test/integer/coerce.js new file mode 100644 index 00000000..7471ea3d --- /dev/null +++ b/node_modules/type/test/integer/coerce.js @@ -0,0 +1,49 @@ +"use strict"; + +var assert = require("chai").assert + , coerceToInteger = require("../../integer/coerce"); + +describe("integer/coerce", function () { + it("Should coerce float to integer", function () { + assert.equal(coerceToInteger(123.123), 123); + assert.equal(coerceToInteger(123.823), 123); + assert.equal(coerceToInteger(-123.123), -123); + assert.equal(coerceToInteger(-123.823), -123); + }); + it("Should coerce string", function () { assert.equal(coerceToInteger("12.123"), 12); }); + it("Should coerce booleans", function () { assert.equal(coerceToInteger(true), 1); }); + it("Should coerce number objects", function () { + assert.equal(coerceToInteger(new Number(343)), 343); + }); + it("Should coerce objects", function () { + assert.equal(coerceToInteger({ valueOf: function () { return 23; } }), 23); + }); + it("Should coerce number beyond Number.MAX_SAFE_INTEGER", function () { + assert.equal(coerceToInteger(9007199254740992), 9007199254740992); + }); + it("Should coerce number beyond Number.MIN_SAFE_INTEGER", function () { + assert.equal(coerceToInteger(-9007199254740992), -9007199254740992); + }); + + it("Should reject infinite number", function () { + assert.equal(coerceToInteger(Infinity), null); + }); + it("Should reject NaN", function () { assert.equal(coerceToInteger(NaN), null); }); + + if (typeof Object.create === "function") { + it("Should not coerce objects with no number representation", function () { + assert.equal(coerceToInteger(Object.create(null)), null); + }); + } + + it("Should not coerce null", function () { assert.equal(coerceToInteger(null), null); }); + it("Should not coerce undefined", function () { + assert.equal(coerceToInteger(undefined), null); + }); + + if (typeof Symbol === "function") { + it("Should not coerce symbols", function () { + assert.equal(coerceToInteger(Symbol("foo")), null); + }); + } +}); diff --git a/node_modules/type/test/integer/ensure.js b/node_modules/type/test/integer/ensure.js new file mode 100644 index 00000000..8b76a97f --- /dev/null +++ b/node_modules/type/test/integer/ensure.js @@ -0,0 +1,17 @@ +"use strict"; + +var assert = require("chai").assert + , ensureInteger = require("../../integer/ensure"); + +describe("integer/ensure", function () { + it("Should return coerced value", function () { assert.equal(ensureInteger("12.23"), 12); }); + it("Should crash on no value", function () { + try { + ensureInteger(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "null is not an integer"); + } + }); +}); diff --git a/node_modules/type/test/iterable/ensure.js b/node_modules/type/test/iterable/ensure.js new file mode 100644 index 00000000..a38e2045 --- /dev/null +++ b/node_modules/type/test/iterable/ensure.js @@ -0,0 +1,42 @@ +"use strict"; + +var assert = require("chai").assert + , coerceString = require("../../string/coerce") + , isArray = require("../../array/is") + , ensureIterable = require("../../iterable/ensure"); + +describe("iterable/ensure", function () { + it("Should return input value", function () { + var value = []; + assert.equal(ensureIterable(value), value); + }); + it("Should allow strings with allowString option", function () { + var value = "foo"; + assert.equal(ensureIterable(value, { allowString: true }), value); + }); + it("Should crash on invalid value", function () { + try { + ensureIterable("foo"); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert(error.message.includes("is not expected iterable value")); + } + }); + describe("Should support 'coerceItem' option", function () { + it("Should resolve coerced array", function () { + var coercedValue = ensureIterable(new Set(["foo", 12]), { coerceItem: coerceString }); + assert(isArray(coercedValue)); + assert.deepEqual(coercedValue, ["foo", "12"]); + }); + it("Should crash if some value is non coercible", function () { + try { + ensureIterable(["foo", {}], { coerceItem: coerceString }); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert(error.message.includes("is not expected iterable value")); + } + }); + }); +}); diff --git a/node_modules/type/test/iterable/is.js b/node_modules/type/test/iterable/is.js new file mode 100644 index 00000000..9a27fb10 --- /dev/null +++ b/node_modules/type/test/iterable/is.js @@ -0,0 +1,57 @@ +"use strict"; + +var assert = require("chai").assert + , isIterable = require("../../iterable/is"); + +describe("iterable/is", function () { + it("Should return true on array", function () { assert.equal(isIterable([]), true); }); + it("Should return true on arguments", function () { + assert.equal(isIterable((function () { return arguments; })()), true); + }); + it("Should by default return false on string", function () { + assert.equal(isIterable("foo"), false); + }); + it("Should accept strings if specified", function () { + assert.equal(isIterable("foo", { allowString: true }), true); + }); + + it("Should support denyEmpty option", function () { + assert.equal(isIterable([], { denyEmpty: true }), false); + assert.equal(isIterable([null], { denyEmpty: true }), true); + assert.equal(isIterable("", { allowString: true, denyEmpty: true }), false); + assert.equal(isIterable("foo", { allowString: true, denyEmpty: true }), true); + }); + + if (typeof Set === "function") { + it("Should return true on set", function () { assert.equal(isIterable(new Set()), true); }); + } + if (typeof Map === "function") { + it("Should return true on set", function () { assert.equal(isIterable(new Map()), true); }); + } + + it("Should return false on plain object", function () { assert.equal(isIterable({}), false); }); + it("Should return false on function", function () { + assert.equal(isIterable(function () { return true; }), false); + }); + + if (typeof Object.create === "function") { + it("Should return false on object with no prototype", function () { + assert.equal(isIterable(Object.create(null)), false); + }); + } + it("Should return false on string", function () { assert.equal(isIterable("foo"), false); }); + it("Should return false on empty string", function () { assert.equal(isIterable(""), false); }); + it("Should return false on number", function () { assert.equal(isIterable(123), false); }); + it("Should return false on NaN", function () { assert.equal(isIterable(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isIterable(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isIterable(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isIterable(null), false); }); + it("Should return false on undefined", function () { + assert.equal(isIterable(void 0), false); + }); +}); diff --git a/node_modules/type/test/natural-number/coerce.js b/node_modules/type/test/natural-number/coerce.js new file mode 100644 index 00000000..853ce748 --- /dev/null +++ b/node_modules/type/test/natural-number/coerce.js @@ -0,0 +1,47 @@ +"use strict"; + +var assert = require("chai").assert + , coerceToNaturalNumber = require("../../natural-number/coerce"); + +describe("natural-number/coerce", function () { + it("Should coerce float to integer", function () { + assert.equal(coerceToNaturalNumber(123.123), 123); + assert.equal(coerceToNaturalNumber(123.823), 123); + }); + it("Should coerce string", function () { assert.equal(coerceToNaturalNumber("12.123"), 12); }); + it("Should coerce booleans", function () { assert.equal(coerceToNaturalNumber(true), 1); }); + it("Should coerce number objects", function () { + assert.equal(coerceToNaturalNumber(new Number(343)), 343); + }); + it("Should coerce objects", function () { + assert.equal(coerceToNaturalNumber({ valueOf: function () { return 23; } }), 23); + }); + it("Should coerce number beyond Number.MAX_SAFE_INTEGER", function () { + assert.equal(coerceToNaturalNumber(9007199254740992), 9007199254740992); + }); + + it("Should reject negative number", function () { + assert.equal(coerceToNaturalNumber(-1), null); + }); + it("Should reject infinite number", function () { + assert.equal(coerceToNaturalNumber(Infinity), null); + }); + it("Should reject NaN", function () { assert.equal(coerceToNaturalNumber(NaN), null); }); + + if (typeof Object.create === "function") { + it("Should not coerce objects with no number representation", function () { + assert.equal(coerceToNaturalNumber(Object.create(null)), null); + }); + } + + it("Should not coerce null", function () { assert.equal(coerceToNaturalNumber(null), null); }); + it("Should not coerce undefined", function () { + assert.equal(coerceToNaturalNumber(undefined), null); + }); + + if (typeof Symbol === "function") { + it("Should not coerce symbols", function () { + assert.equal(coerceToNaturalNumber(Symbol("foo")), null); + }); + } +}); diff --git a/node_modules/type/test/natural-number/ensure.js b/node_modules/type/test/natural-number/ensure.js new file mode 100644 index 00000000..819c7e78 --- /dev/null +++ b/node_modules/type/test/natural-number/ensure.js @@ -0,0 +1,19 @@ +"use strict"; + +var assert = require("chai").assert + , ensureNaturalNumber = require("../../natural-number/ensure"); + +describe("natural-number/ensure", function () { + it("Should return coerced value", function () { + assert.equal(ensureNaturalNumber("12.23"), 12); + }); + it("Should crash on no value", function () { + try { + ensureNaturalNumber(-20); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "-20 is not a natural number"); + } + }); +}); diff --git a/node_modules/type/test/number/coerce.js b/node_modules/type/test/number/coerce.js new file mode 100644 index 00000000..d07d6f41 --- /dev/null +++ b/node_modules/type/test/number/coerce.js @@ -0,0 +1,40 @@ +"use strict"; + +var assert = require("chai").assert + , coerceToNumber = require("../../number/coerce"); + +describe("number/coerce", function () { + it("Should return input number", function () { + assert.equal(coerceToNumber(123.123), 123.123); + }); + it("Should return input infinite number", function () { + assert.equal(coerceToNumber(Infinity), Infinity); + }); + it("Should coerce string", function () { assert.equal(coerceToNumber("12"), 12); }); + it("Should coerce booleans", function () { assert.equal(coerceToNumber(true), 1); }); + it("Should coerce number objects", function () { + assert.equal(coerceToNumber(new Number(343)), 343); + }); + it("Should coerce objects", function () { + assert.equal(coerceToNumber({ valueOf: function () { return 23; } }), 23); + }); + + it("Should reject NaN", function () { assert.equal(coerceToNumber(NaN), null); }); + + if (typeof Object.create === "function") { + it("Should not coerce objects with no number representation", function () { + assert.equal(coerceToNumber(Object.create(null)), null); + }); + } + + it("Should not coerce null", function () { assert.equal(coerceToNumber(null), null); }); + it("Should not coerce undefined", function () { + assert.equal(coerceToNumber(undefined), null); + }); + + if (typeof Symbol === "function") { + it("Should not coerce symbols", function () { + assert.equal(coerceToNumber(Symbol("foo")), null); + }); + } +}); diff --git a/node_modules/type/test/number/ensure.js b/node_modules/type/test/number/ensure.js new file mode 100644 index 00000000..a6ddf3b7 --- /dev/null +++ b/node_modules/type/test/number/ensure.js @@ -0,0 +1,17 @@ +"use strict"; + +var assert = require("chai").assert + , ensureNumber = require("../../number/ensure"); + +describe("number/ensure", function () { + it("Should return coerced value", function () { assert.equal(ensureNumber("12.23"), 12.23); }); + it("Should crash on no value", function () { + try { + ensureNumber(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "null is not a number"); + } + }); +}); diff --git a/node_modules/type/test/object/ensure.js b/node_modules/type/test/object/ensure.js new file mode 100644 index 00000000..01d4b0ff --- /dev/null +++ b/node_modules/type/test/object/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensureObject = require("../../object/ensure"); + +describe("object/ensure", function () { + it("Should return input value", function () { + var value = {}; + assert.equal(ensureObject(value), value); + }); + it("Should crash on no value", function () { + try { + ensureObject(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "null is not an object"); + } + }); +}); diff --git a/node_modules/type/test/object/is.js b/node_modules/type/test/object/is.js new file mode 100644 index 00000000..f95d9a20 --- /dev/null +++ b/node_modules/type/test/object/is.js @@ -0,0 +1,30 @@ +"use strict"; + +var assert = require("chai").assert + , isObject = require("../../object/is"); + +describe("object/is", function () { + it("Should return true on object", function () { assert.equal(isObject({}), true); }); + it("Should return true on function", function () { + assert.equal(isObject(function () { return true; }), true); + }); + it("Should return true on array", function () { assert.equal(isObject([]), true); }); + if (typeof Object.create === "function") { + it("Should return true on object with no prototype", function () { + assert.equal(isObject(Object.create(null)), true); + }); + } + it("Should return false on string", function () { assert.equal(isObject("foo"), false); }); + it("Should return false on empty string", function () { assert.equal(isObject(""), false); }); + it("Should return false on number", function () { assert.equal(isObject(123), false); }); + it("Should return false on NaN", function () { assert.equal(isObject(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isObject(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isObject(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isObject(null), false); }); + it("Should return false on undefined", function () { assert.equal(isObject(void 0), false); }); +}); diff --git a/node_modules/type/test/plain-function/ensure.js b/node_modules/type/test/plain-function/ensure.js new file mode 100644 index 00000000..61aceb40 --- /dev/null +++ b/node_modules/type/test/plain-function/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensurePlainFunction = require("../../plain-function/ensure"); + +describe("plain-function/ensure", function () { + it("Should return input value", function () { + var value = function () { return true; }; + assert.equal(ensurePlainFunction(value), value); + }); + it("Should crash on invalid value", function () { + try { + ensurePlainFunction(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert(error.message.includes("is not a plain function")); + } + }); +}); diff --git a/node_modules/type/test/plain-function/is.js b/node_modules/type/test/plain-function/is.js new file mode 100644 index 00000000..a2a7c59f --- /dev/null +++ b/node_modules/type/test/plain-function/is.js @@ -0,0 +1,56 @@ +"use strict"; + +var assert = require("chai").assert + , isPlainFunction = require("../../plain-function/is") + , arrowFunctionIfSupported = require("../_lib/arrow-function-if-supported") + , classIfSupported = require("../_lib/class-if-supported"); + +describe("plain-function/is", function () { + it("Should return true on function", function () { + assert.equal(isPlainFunction(function () { return true; }), true); + }); + if (arrowFunctionIfSupported) { + it("Should return true on arrow function", function () { + assert.equal(isPlainFunction(arrowFunctionIfSupported), true); + }); + } + if (classIfSupported) { + it("Should return false on class", function () { + assert.equal(isPlainFunction(classIfSupported), false); + }); + } + it("Should return false on reg-exp", function () { + assert.equal(isPlainFunction(/foo/), false); + }); + + it("Should return false on plain object", function () { + assert.equal(isPlainFunction({}), false); + }); + it("Should return false on array", function () { assert.equal(isPlainFunction([]), false); }); + if (typeof Object.create === "function") { + it("Should return false on object with no prototype", function () { + assert.equal(isPlainFunction(Object.create(null)), false); + }); + } + it("Should return false on string", function () { + assert.equal(isPlainFunction("foo"), false); + }); + it("Should return false on empty string", function () { + assert.equal(isPlainFunction(""), false); + }); + it("Should return false on number", function () { assert.equal(isPlainFunction(123), false); }); + it("Should return false on NaN", function () { assert.equal(isPlainFunction(NaN), false); }); + it("Should return false on boolean", function () { + assert.equal(isPlainFunction(true), false); + }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isPlainFunction(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isPlainFunction(null), false); }); + it("Should return false on undefined", function () { + assert.equal(isPlainFunction(void 0), false); + }); +}); diff --git a/node_modules/type/test/plain-object/ensure.js b/node_modules/type/test/plain-object/ensure.js new file mode 100644 index 00000000..4ed0fca5 --- /dev/null +++ b/node_modules/type/test/plain-object/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensurePlainObject = require("../../plain-object/ensure"); + +describe("plain-object/ensure", function () { + it("Should return input value", function () { + var value = {}; + assert.equal(ensurePlainObject(value), value); + }); + it("Should crash on invalid value", function () { + try { + ensurePlainObject(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert(error.message.includes("is not a plain object")); + } + }); +}); diff --git a/node_modules/type/test/plain-object/is.js b/node_modules/type/test/plain-object/is.js new file mode 100644 index 00000000..5695e3f9 --- /dev/null +++ b/node_modules/type/test/plain-object/is.js @@ -0,0 +1,47 @@ +"use strict"; + +var assert = require("chai").assert + , isPlainObject = require("../../plain-object/is"); + +describe("plain-object/is", function () { + it("Should return true on plain object", function () { + assert.equal(isPlainObject({}), true); + }); + if (typeof Object.create === "function") { + it("Should return true on object with no prototype", function () { + assert.equal(isPlainObject(Object.create(null)), true); + }); + it( + "Should return false on object that inherits from object with no prototype", + function () { assert.equal(isPlainObject(Object.create(Object.create(null))), false); } + ); + } + it("Should return false on Object.prototype", function () { + assert.equal(isPlainObject(Object.prototype), false); + }); + it("Should return false on prototype that derives from Object.prototype", function () { + assert.equal(isPlainObject(RegExp.prototype), false); + }); + + it("Should return false on function", function () { + assert.equal(isPlainObject(function () { return true; }), false); + }); + + it("Should return false on string", function () { assert.equal(isPlainObject("foo"), false); }); + it("Should return false on empty string", function () { + assert.equal(isPlainObject(""), false); + }); + it("Should return false on number", function () { assert.equal(isPlainObject(123), false); }); + it("Should return false on NaN", function () { assert.equal(isPlainObject(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isPlainObject(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isPlainObject(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isPlainObject(null), false); }); + it("Should return false on undefined", function () { + assert.equal(isPlainObject(void 0), false); + }); +}); diff --git a/node_modules/type/test/promise/ensure.js b/node_modules/type/test/promise/ensure.js new file mode 100644 index 00000000..d2d1302b --- /dev/null +++ b/node_modules/type/test/promise/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensurePromise = require("../../promise/ensure"); + +describe("promise/ensure", function () { + it("Should return input value", function () { + var value = Promise.resolve(); + assert.equal(ensurePromise(value), value); + }); + it("Should crash on no value", function () { + try { + ensurePromise({}); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "[object Object] is not a promise"); + } + }); +}); diff --git a/node_modules/type/test/promise/is.js b/node_modules/type/test/promise/is.js new file mode 100644 index 00000000..496e3f34 --- /dev/null +++ b/node_modules/type/test/promise/is.js @@ -0,0 +1,39 @@ +"use strict"; + +var assert = require("chai").assert + , isPromise = require("../../promise/is"); + +describe("promise/is", function () { + if (typeof Promise === "function") { + it("Should return true on promise", function () { + assert.equal(isPromise(Promise.resolve()), true); + }); + } + it("Should return false on non-promise thenable", function () { + assert.equal(isPromise({ then: function () { return true; } }), false); + }); + + it("Should return false on plain object", function () { assert.equal(isPromise({}), false); }); + it("Should return false on function", function () { + assert.equal(isPromise(function () { return true; }), false); + }); + it("Should return false on array", function () { assert.equal(isPromise([]), false); }); + if (typeof Object.create === "function") { + it("Should return false on object with no prototype", function () { + assert.equal(isPromise(Object.create(null)), false); + }); + } + it("Should return false on string", function () { assert.equal(isPromise("foo"), false); }); + it("Should return false on empty string", function () { assert.equal(isPromise(""), false); }); + it("Should return false on number", function () { assert.equal(isPromise(123), false); }); + it("Should return false on NaN", function () { assert.equal(isPromise(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isPromise(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isPromise(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isPromise(null), false); }); + it("Should return false on undefined", function () { assert.equal(isPromise(void 0), false); }); +}); diff --git a/node_modules/type/test/prototype/is.js b/node_modules/type/test/prototype/is.js new file mode 100644 index 00000000..6f75451a --- /dev/null +++ b/node_modules/type/test/prototype/is.js @@ -0,0 +1,39 @@ +"use strict"; + +var assert = require("chai").assert + , isPrototype = require("../../prototype/is"); + +describe("prototype/is", function () { + it("Should return true on prototype", function () { + assert.equal(isPrototype(Object.prototype), true); + }); + it("Should return false on plain object", function () { + assert.equal(isPrototype({}), false); + }); + it("Should return false on function", function () { + assert.equal(isPrototype(function () { return true; }), false); + }); + it("Should return false on array", function () { assert.equal(isPrototype([]), false); }); + if (typeof Object.create === "function") { + it("Should return false on object with no prototype", function () { + assert.equal(isPrototype(Object.create(null)), false); + }); + } + it("Should return false on string", function () { assert.equal(isPrototype("foo"), false); }); + it("Should return false on empty string", function () { + assert.equal(isPrototype(""), false); + }); + it("Should return false on number", function () { assert.equal(isPrototype(123), false); }); + it("Should return false on NaN", function () { assert.equal(isPrototype(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isPrototype(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isPrototype(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isPrototype(null), false); }); + it("Should return false on undefined", function () { + assert.equal(isPrototype(void 0), false); + }); +}); diff --git a/node_modules/type/test/reg-exp/ensure.js b/node_modules/type/test/reg-exp/ensure.js new file mode 100644 index 00000000..476d992c --- /dev/null +++ b/node_modules/type/test/reg-exp/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensureRegExp = require("../../reg-exp/ensure"); + +describe("reg-exp/ensure", function () { + it("Should return input value", function () { + var value = /foo/; + assert.equal(ensureRegExp(value), value); + }); + it("Should crash on invalid value", function () { + try { + ensureRegExp(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert(error.message.includes("is not a regular expression object")); + } + }); +}); diff --git a/node_modules/type/test/reg-exp/is.js b/node_modules/type/test/reg-exp/is.js new file mode 100644 index 00000000..dbe65cee --- /dev/null +++ b/node_modules/type/test/reg-exp/is.js @@ -0,0 +1,47 @@ +"use strict"; + +var assert = require("chai").assert + , isRegExp = require("../../reg-exp/is"); + +describe("reg-exp/is", function () { + it("Should return true on regular expression", function () { + assert.equal(isRegExp(/foo/), true); + }); + + it("Should return false on native regular expression with no common API exposed", function () { + var re = /foo/; + re.test = null; + assert.equal(isRegExp(re), false); + }); + it("Should return false on RegExp.prototype", function () { + assert.equal(isRegExp(RegExp.prototype), false); + }); + it("Should return false on regexp like string", function () { + assert.equal(isRegExp("/foo/"), false); + }); + + it("Should return false on plain object", function () { assert.equal(isRegExp({}), false); }); + it("Should return false on function", function () { + assert.equal(isRegExp(function () { return true; }), false); + }); + + it("Should return false on array", function () { assert.equal(isRegExp([]), false); }); + if (typeof Object.create === "function") { + it("Should return false on object with no prototype", function () { + assert.equal(isRegExp(Object.create(null)), false); + }); + } + it("Should return false on string", function () { assert.equal(isRegExp("foo"), false); }); + it("Should return false on empty string", function () { assert.equal(isRegExp(""), false); }); + it("Should return false on number", function () { assert.equal(isRegExp(123), false); }); + it("Should return false on NaN", function () { assert.equal(isRegExp(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isRegExp(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isRegExp(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isRegExp(null), false); }); + it("Should return false on undefined", function () { assert.equal(isRegExp(void 0), false); }); +}); diff --git a/node_modules/type/test/safe-integer/coerce.js b/node_modules/type/test/safe-integer/coerce.js new file mode 100644 index 00000000..4ba9086f --- /dev/null +++ b/node_modules/type/test/safe-integer/coerce.js @@ -0,0 +1,49 @@ +"use strict"; + +var assert = require("chai").assert + , coerceToSafeInteger = require("../../safe-integer/coerce"); + +describe("safe-integer/coerce", function () { + it("Should coerce float to integer", function () { + assert.equal(coerceToSafeInteger(123.123), 123); + assert.equal(coerceToSafeInteger(123.823), 123); + assert.equal(coerceToSafeInteger(-123.123), -123); + assert.equal(coerceToSafeInteger(-123.823), -123); + }); + it("Should coerce string", function () { assert.equal(coerceToSafeInteger("12.123"), 12); }); + it("Should coerce booleans", function () { assert.equal(coerceToSafeInteger(true), 1); }); + it("Should coerce number objects", function () { + assert.equal(coerceToSafeInteger(new Number(343)), 343); + }); + it("Should coerce objects", function () { + assert.equal(coerceToSafeInteger({ valueOf: function () { return 23; } }), 23); + }); + it("Should reject infinite number", function () { + assert.equal(coerceToSafeInteger(Infinity), null); + }); + it("Should reject number beyond Number.MAX_SAFE_INTEGER", function () { + assert.equal(coerceToSafeInteger(9007199254740992), null); + }); + it("Should reject number beyond Number.MIN_SAFE_INTEGER", function () { + assert.equal(coerceToSafeInteger(-9007199254740992), null); + }); + + it("Should reject NaN", function () { assert.equal(coerceToSafeInteger(NaN), null); }); + + if (typeof Object.create === "function") { + it("Should not coerce objects with no number representation", function () { + assert.equal(coerceToSafeInteger(Object.create(null)), null); + }); + } + + it("Should not coerce null", function () { assert.equal(coerceToSafeInteger(null), null); }); + it("Should not coerce undefined", function () { + assert.equal(coerceToSafeInteger(undefined), null); + }); + + if (typeof Symbol === "function") { + it("Should not coerce symbols", function () { + assert.equal(coerceToSafeInteger(Symbol("foo")), null); + }); + } +}); diff --git a/node_modules/type/test/safe-integer/ensure.js b/node_modules/type/test/safe-integer/ensure.js new file mode 100644 index 00000000..d8d4ba08 --- /dev/null +++ b/node_modules/type/test/safe-integer/ensure.js @@ -0,0 +1,19 @@ +"use strict"; + +var assert = require("chai").assert + , ensureSafeInteger = require("../../safe-integer/ensure"); + +describe("safe-integer/ensure", function () { + it("Should return coerced value", function () { + assert.equal(ensureSafeInteger("12.23"), 12); + }); + it("Should crash on no value", function () { + try { + ensureSafeInteger(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "null is not a safe integer"); + } + }); +}); diff --git a/node_modules/type/test/string/coerce.js b/node_modules/type/test/string/coerce.js new file mode 100644 index 00000000..08091a28 --- /dev/null +++ b/node_modules/type/test/string/coerce.js @@ -0,0 +1,36 @@ +"use strict"; + +var assert = require("chai").assert + , coerceToString = require("../../string/coerce"); + +describe("string/coerce", function () { + it("Should return input string", function () { assert.equal(coerceToString("foo"), "foo"); }); + it("Should coerce numbers", function () { assert.equal(coerceToString(12), "12"); }); + it("Should coerce booleans", function () { assert.equal(coerceToString(true), "true"); }); + it("Should coerce string objects", function () { + assert.equal(coerceToString(new String("bar")), "bar"); + }); + it("Should coerce objects", function () { + assert.equal( + coerceToString({ toString: function () { return "Some object"; } }), "Some object" + ); + }); + if (typeof Object.create === "function") { + it("Should not coerce objects with no toString", function () { + assert.equal(coerceToString(Object.create(null)), null); + }); + } + it("Should not coerce objects with no custom toString", function () { + assert.equal(coerceToString({}), null); + }); + it("Should not coerce null", function () { assert.equal(coerceToString(null), null); }); + it("Should not coerce undefined", function () { + assert.equal(coerceToString(undefined), null); + }); + + if (typeof Symbol === "function") { + it("Should not coerce symbols", function () { + assert.equal(coerceToString(Symbol("foo")), null); + }); + } +}); diff --git a/node_modules/type/test/string/ensure.js b/node_modules/type/test/string/ensure.js new file mode 100644 index 00000000..ffbc363d --- /dev/null +++ b/node_modules/type/test/string/ensure.js @@ -0,0 +1,17 @@ +"use strict"; + +var assert = require("chai").assert + , ensureString = require("../../string/ensure"); + +describe("string/ensure", function () { + it("Should return coerced value", function () { assert.equal(ensureString(12), "12"); }); + it("Should crash on no value", function () { + try { + ensureString(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "null is not a string"); + } + }); +}); diff --git a/node_modules/type/test/thenable/ensure.js b/node_modules/type/test/thenable/ensure.js new file mode 100644 index 00000000..13c81afd --- /dev/null +++ b/node_modules/type/test/thenable/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensureThenable = require("../../thenable/ensure"); + +describe("thenable/ensure", function () { + it("Should return input value", function () { + var value = { then: function () { return true; } }; + assert.equal(ensureThenable(value), value); + }); + it("Should crash on no value", function () { + try { + ensureThenable({}); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "[object Object] is not a thenable object"); + } + }); +}); diff --git a/node_modules/type/test/thenable/is.js b/node_modules/type/test/thenable/is.js new file mode 100644 index 00000000..37a32d49 --- /dev/null +++ b/node_modules/type/test/thenable/is.js @@ -0,0 +1,44 @@ +"use strict"; + +var assert = require("chai").assert + , isThenable = require("../../thenable/is"); + +describe("thenable/is", function () { + it("Should return true on object with `then` method", function () { + assert.equal(isThenable({ then: function () { return true; } }), true); + }); + if (typeof Promise === "function") { + it("Should return true on promise", function () { + assert.equal(isThenable(Promise.resolve()), true); + }); + } + it("Should return false on object with `then` non callable property", function () { + assert.equal(isThenable({ then: {} }), false); + }); + + it("Should return false on plain object", function () { assert.equal(isThenable({}), false); }); + it("Should return false on function", function () { + assert.equal(isThenable(function () { return true; }), false); + }); + it("Should return false on array", function () { assert.equal(isThenable([]), false); }); + if (typeof Object.create === "function") { + it("Should return false on object with no prototype", function () { + assert.equal(isThenable(Object.create(null)), false); + }); + } + it("Should return false on string", function () { assert.equal(isThenable("foo"), false); }); + it("Should return false on empty string", function () { assert.equal(isThenable(""), false); }); + it("Should return false on number", function () { assert.equal(isThenable(123), false); }); + it("Should return false on NaN", function () { assert.equal(isThenable(NaN), false); }); + it("Should return false on boolean", function () { assert.equal(isThenable(true), false); }); + if (typeof Symbol === "function") { + it("Should return false on symbol", function () { + assert.equal(isThenable(Symbol("foo")), false); + }); + } + + it("Should return false on null", function () { assert.equal(isThenable(null), false); }); + it("Should return false on undefined", function () { + assert.equal(isThenable(void 0), false); + }); +}); diff --git a/node_modules/type/test/time-value/coerce.js b/node_modules/type/test/time-value/coerce.js new file mode 100644 index 00000000..22a02fee --- /dev/null +++ b/node_modules/type/test/time-value/coerce.js @@ -0,0 +1,47 @@ +"use strict"; + +var assert = require("chai").assert + , coerceToTimeValue = require("../../time-value/coerce"); + +describe("time-value/coerce", function () { + it("Should coerce float to time value", function () { + assert.equal(coerceToTimeValue(123.123), 123); + assert.equal(coerceToTimeValue(123.823), 123); + assert.equal(coerceToTimeValue(-123.123), -123); + assert.equal(coerceToTimeValue(-123.823), -123); + }); + it("Should coerce string", function () { assert.equal(coerceToTimeValue("12.123"), 12); }); + it("Should coerce booleans", function () { assert.equal(coerceToTimeValue(true), 1); }); + it("Should coerce number objects", function () { + assert.equal(coerceToTimeValue(new Number(343)), 343); + }); + it("Should coerce objects", function () { + assert.equal(coerceToTimeValue({ valueOf: function () { return 23; } }), 23); + }); + it("Should reject infinite number", function () { + assert.equal(coerceToTimeValue(Infinity), null); + }); + it("Should reject number beyond 100,000,000 days from unix epox", function () { + assert.equal(coerceToTimeValue(8.64e15 + 1), null); + assert.equal(coerceToTimeValue(-8.64e15 - 1), null); + }); + + it("Should reject NaN", function () { assert.equal(coerceToTimeValue(NaN), null); }); + + if (typeof Object.create === "function") { + it("Should not coerce objects with no number representation", function () { + assert.equal(coerceToTimeValue(Object.create(null)), null); + }); + } + + it("Should not coerce null", function () { assert.equal(coerceToTimeValue(null), null); }); + it("Should not coerce undefined", function () { + assert.equal(coerceToTimeValue(undefined), null); + }); + + if (typeof Symbol === "function") { + it("Should not coerce symbols", function () { + assert.equal(coerceToTimeValue(Symbol("foo")), null); + }); + } +}); diff --git a/node_modules/type/test/time-value/ensure.js b/node_modules/type/test/time-value/ensure.js new file mode 100644 index 00000000..d53b87e4 --- /dev/null +++ b/node_modules/type/test/time-value/ensure.js @@ -0,0 +1,17 @@ +"use strict"; + +var assert = require("chai").assert + , ensureTimeValue = require("../../time-value/ensure"); + +describe("time-value/ensure", function () { + it("Should return coerced value", function () { assert.equal(ensureTimeValue("12.23"), 12); }); + it("Should crash on no value", function () { + try { + ensureTimeValue("foo"); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "foo is not a time value"); + } + }); +}); diff --git a/node_modules/type/test/value/ensure.js b/node_modules/type/test/value/ensure.js new file mode 100644 index 00000000..06d698e9 --- /dev/null +++ b/node_modules/type/test/value/ensure.js @@ -0,0 +1,20 @@ +"use strict"; + +var assert = require("chai").assert + , ensureValue = require("../../value/ensure"); + +describe("value/ensure", function () { + it("Should return input value", function () { + var value = {}; + assert.equal(ensureValue(value), value); + }); + it("Should crash on no value", function () { + try { + ensureValue(null); + throw new Error("Unexpected"); + } catch (error) { + assert.equal(error.name, "TypeError"); + assert.equal(error.message, "Cannot use null"); + } + }); +}); diff --git a/node_modules/type/test/value/is.js b/node_modules/type/test/value/is.js new file mode 100644 index 00000000..d3d893ec --- /dev/null +++ b/node_modules/type/test/value/is.js @@ -0,0 +1,29 @@ +"use strict"; + +var assert = require("chai").assert + , isValue = require("../../value/is"); + +describe("value/is", function () { + it("Should return true on object", function () { assert.equal(isValue({}), true); }); + it("Should return true on function", function () { + assert.equal(isValue(function () { return true; }), true); + }); + it("Should return true on array", function () { assert.equal(isValue([]), true); }); + if (typeof Object.create === "function") { + it("Should return true on object with no prototype", function () { + assert.equal(isValue(Object.create(null)), true); + }); + } + it("Should return true on string", function () { assert.equal(isValue("foo"), true); }); + it("Should return true on empty string", function () { assert.equal(isValue(""), true); }); + it("Should return true on number", function () { assert.equal(isValue(123), true); }); + it("Should return true on NaN", function () { assert.equal(isValue(NaN), true); }); + it("Should return true on boolean", function () { assert.equal(isValue(false), true); }); + if (typeof Symbol === "function") { + // eslint-disable-next-line no-undef + it("Should return true on symbol", function () { assert.equal(isValue(Symbol()), true); }); + } + + it("Should return false on null", function () { assert.equal(isValue(null), false); }); + it("Should return false on undefined", function () { assert.equal(isValue(void 0), false); }); +}); diff --git a/node_modules/type/thenable/ensure.js b/node_modules/type/thenable/ensure.js new file mode 100644 index 00000000..4d7f4226 --- /dev/null +++ b/node_modules/type/thenable/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "%v is not a thenable object", arguments[1]); +}; diff --git a/node_modules/type/thenable/is.js b/node_modules/type/thenable/is.js new file mode 100644 index 00000000..1f3d3993 --- /dev/null +++ b/node_modules/type/thenable/is.js @@ -0,0 +1,9 @@ +"use strict"; + +var isObject = require("../object/is"); + +module.exports = function (value) { + if (!isObject(value)) return false; + try { return typeof value.then === "function"; } + catch (error) { return false; } +}; diff --git a/node_modules/type/time-value/coerce.js b/node_modules/type/time-value/coerce.js new file mode 100644 index 00000000..7124864a --- /dev/null +++ b/node_modules/type/time-value/coerce.js @@ -0,0 +1,12 @@ +"use strict"; + +var coerceToInteger = require("../integer/coerce"); + +var abs = Math.abs; + +module.exports = function (value) { + value = coerceToInteger(value); + if (!value) return value; + if (abs(value) > 8.64e15) return null; + return value; +}; diff --git a/node_modules/type/time-value/ensure.js b/node_modules/type/time-value/ensure.js new file mode 100644 index 00000000..cf17175a --- /dev/null +++ b/node_modules/type/time-value/ensure.js @@ -0,0 +1,10 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , coerce = require("./coerce"); + +module.exports = function (value/*, options*/) { + var coerced = coerce(value); + if (coerced !== null) return coerced; + return resolveException(value, "%v is not a time value", arguments[1]); +}; diff --git a/node_modules/type/value/ensure.js b/node_modules/type/value/ensure.js new file mode 100644 index 00000000..0d24327a --- /dev/null +++ b/node_modules/type/value/ensure.js @@ -0,0 +1,9 @@ +"use strict"; + +var resolveException = require("../lib/resolve-exception") + , is = require("./is"); + +module.exports = function (value/*, options*/) { + if (is(value)) return value; + return resolveException(value, "Cannot use %v", arguments[1]); +}; diff --git a/node_modules/type/value/is.js b/node_modules/type/value/is.js new file mode 100644 index 00000000..648aa9c7 --- /dev/null +++ b/node_modules/type/value/is.js @@ -0,0 +1,6 @@ +"use strict"; + +// ES3 safe +var _undefined = void 0; + +module.exports = function (value) { return value !== _undefined && value !== null; }; diff --git a/node_modules/typedarray/.travis.yml b/node_modules/typedarray/.travis.yml new file mode 100644 index 00000000..cc4dba29 --- /dev/null +++ b/node_modules/typedarray/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/node_modules/typedarray/LICENSE b/node_modules/typedarray/LICENSE new file mode 100644 index 00000000..11adfaec --- /dev/null +++ b/node_modules/typedarray/LICENSE @@ -0,0 +1,35 @@ +/* + Copyright (c) 2010, Linden Research, Inc. + Copyright (c) 2012, Joshua Bell + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + $/LicenseInfo$ + */ + +// Original can be found at: +// https://bitbucket.org/lindenlab/llsd +// Modifications by Joshua Bell inexorabletash@gmail.com +// https://github.com/inexorabletash/polyfill + +// ES3/ES5 implementation of the Krhonos Typed Array Specification +// Ref: http://www.khronos.org/registry/typedarray/specs/latest/ +// Date: 2011-02-01 +// +// Variations: +// * Allows typed_array.get/set() as alias for subscripts (typed_array[]) diff --git a/node_modules/typedarray/example/tarray.js b/node_modules/typedarray/example/tarray.js new file mode 100644 index 00000000..8423d7c9 --- /dev/null +++ b/node_modules/typedarray/example/tarray.js @@ -0,0 +1,4 @@ +var Uint8Array = require('../').Uint8Array; +var ua = new Uint8Array(5); +ua[1] = 256 + 55; +console.log(ua[1]); diff --git a/node_modules/typedarray/index.js b/node_modules/typedarray/index.js new file mode 100644 index 00000000..5e540841 --- /dev/null +++ b/node_modules/typedarray/index.js @@ -0,0 +1,630 @@ +var undefined = (void 0); // Paranoia + +// Beyond this value, index getters/setters (i.e. array[0], array[1]) are so slow to +// create, and consume so much memory, that the browser appears frozen. +var MAX_ARRAY_LENGTH = 1e5; + +// Approximations of internal ECMAScript conversion functions +var ECMAScript = (function() { + // Stash a copy in case other scripts modify these + var opts = Object.prototype.toString, + ophop = Object.prototype.hasOwnProperty; + + return { + // Class returns internal [[Class]] property, used to avoid cross-frame instanceof issues: + Class: function(v) { return opts.call(v).replace(/^\[object *|\]$/g, ''); }, + HasProperty: function(o, p) { return p in o; }, + HasOwnProperty: function(o, p) { return ophop.call(o, p); }, + IsCallable: function(o) { return typeof o === 'function'; }, + ToInt32: function(v) { return v >> 0; }, + ToUint32: function(v) { return v >>> 0; } + }; +}()); + +// Snapshot intrinsics +var LN2 = Math.LN2, + abs = Math.abs, + floor = Math.floor, + log = Math.log, + min = Math.min, + pow = Math.pow, + round = Math.round; + +// ES5: lock down object properties +function configureProperties(obj) { + if (getOwnPropNames && defineProp) { + var props = getOwnPropNames(obj), i; + for (i = 0; i < props.length; i += 1) { + defineProp(obj, props[i], { + value: obj[props[i]], + writable: false, + enumerable: false, + configurable: false + }); + } + } +} + +// emulate ES5 getter/setter API using legacy APIs +// http://blogs.msdn.com/b/ie/archive/2010/09/07/transitioning-existing-code-to-the-es5-getter-setter-apis.aspx +// (second clause tests for Object.defineProperty() in IE<9 that only supports extending DOM prototypes, but +// note that IE<9 does not support __defineGetter__ or __defineSetter__ so it just renders the method harmless) +var defineProp +if (Object.defineProperty && (function() { + try { + Object.defineProperty({}, 'x', {}); + return true; + } catch (e) { + return false; + } + })()) { + defineProp = Object.defineProperty; +} else { + defineProp = function(o, p, desc) { + if (!o === Object(o)) throw new TypeError("Object.defineProperty called on non-object"); + if (ECMAScript.HasProperty(desc, 'get') && Object.prototype.__defineGetter__) { Object.prototype.__defineGetter__.call(o, p, desc.get); } + if (ECMAScript.HasProperty(desc, 'set') && Object.prototype.__defineSetter__) { Object.prototype.__defineSetter__.call(o, p, desc.set); } + if (ECMAScript.HasProperty(desc, 'value')) { o[p] = desc.value; } + return o; + }; +} + +var getOwnPropNames = Object.getOwnPropertyNames || function (o) { + if (o !== Object(o)) throw new TypeError("Object.getOwnPropertyNames called on non-object"); + var props = [], p; + for (p in o) { + if (ECMAScript.HasOwnProperty(o, p)) { + props.push(p); + } + } + return props; +}; + +// ES5: Make obj[index] an alias for obj._getter(index)/obj._setter(index, value) +// for index in 0 ... obj.length +function makeArrayAccessors(obj) { + if (!defineProp) { return; } + + if (obj.length > MAX_ARRAY_LENGTH) throw new RangeError("Array too large for polyfill"); + + function makeArrayAccessor(index) { + defineProp(obj, index, { + 'get': function() { return obj._getter(index); }, + 'set': function(v) { obj._setter(index, v); }, + enumerable: true, + configurable: false + }); + } + + var i; + for (i = 0; i < obj.length; i += 1) { + makeArrayAccessor(i); + } +} + +// Internal conversion functions: +// pack() - take a number (interpreted as Type), output a byte array +// unpack() - take a byte array, output a Type-like number + +function as_signed(value, bits) { var s = 32 - bits; return (value << s) >> s; } +function as_unsigned(value, bits) { var s = 32 - bits; return (value << s) >>> s; } + +function packI8(n) { return [n & 0xff]; } +function unpackI8(bytes) { return as_signed(bytes[0], 8); } + +function packU8(n) { return [n & 0xff]; } +function unpackU8(bytes) { return as_unsigned(bytes[0], 8); } + +function packU8Clamped(n) { n = round(Number(n)); return [n < 0 ? 0 : n > 0xff ? 0xff : n & 0xff]; } + +function packI16(n) { return [(n >> 8) & 0xff, n & 0xff]; } +function unpackI16(bytes) { return as_signed(bytes[0] << 8 | bytes[1], 16); } + +function packU16(n) { return [(n >> 8) & 0xff, n & 0xff]; } +function unpackU16(bytes) { return as_unsigned(bytes[0] << 8 | bytes[1], 16); } + +function packI32(n) { return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]; } +function unpackI32(bytes) { return as_signed(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], 32); } + +function packU32(n) { return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]; } +function unpackU32(bytes) { return as_unsigned(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], 32); } + +function packIEEE754(v, ebits, fbits) { + + var bias = (1 << (ebits - 1)) - 1, + s, e, f, ln, + i, bits, str, bytes; + + function roundToEven(n) { + var w = floor(n), f = n - w; + if (f < 0.5) + return w; + if (f > 0.5) + return w + 1; + return w % 2 ? w + 1 : w; + } + + // Compute sign, exponent, fraction + if (v !== v) { + // NaN + // http://dev.w3.org/2006/webapi/WebIDL/#es-type-mapping + e = (1 << ebits) - 1; f = pow(2, fbits - 1); s = 0; + } else if (v === Infinity || v === -Infinity) { + e = (1 << ebits) - 1; f = 0; s = (v < 0) ? 1 : 0; + } else if (v === 0) { + e = 0; f = 0; s = (1 / v === -Infinity) ? 1 : 0; + } else { + s = v < 0; + v = abs(v); + + if (v >= pow(2, 1 - bias)) { + e = min(floor(log(v) / LN2), 1023); + f = roundToEven(v / pow(2, e) * pow(2, fbits)); + if (f / pow(2, fbits) >= 2) { + e = e + 1; + f = 1; + } + if (e > bias) { + // Overflow + e = (1 << ebits) - 1; + f = 0; + } else { + // Normalized + e = e + bias; + f = f - pow(2, fbits); + } + } else { + // Denormalized + e = 0; + f = roundToEven(v / pow(2, 1 - bias - fbits)); + } + } + + // Pack sign, exponent, fraction + bits = []; + for (i = fbits; i; i -= 1) { bits.push(f % 2 ? 1 : 0); f = floor(f / 2); } + for (i = ebits; i; i -= 1) { bits.push(e % 2 ? 1 : 0); e = floor(e / 2); } + bits.push(s ? 1 : 0); + bits.reverse(); + str = bits.join(''); + + // Bits to bytes + bytes = []; + while (str.length) { + bytes.push(parseInt(str.substring(0, 8), 2)); + str = str.substring(8); + } + return bytes; +} + +function unpackIEEE754(bytes, ebits, fbits) { + + // Bytes to bits + var bits = [], i, j, b, str, + bias, s, e, f; + + for (i = bytes.length; i; i -= 1) { + b = bytes[i - 1]; + for (j = 8; j; j -= 1) { + bits.push(b % 2 ? 1 : 0); b = b >> 1; + } + } + bits.reverse(); + str = bits.join(''); + + // Unpack sign, exponent, fraction + bias = (1 << (ebits - 1)) - 1; + s = parseInt(str.substring(0, 1), 2) ? -1 : 1; + e = parseInt(str.substring(1, 1 + ebits), 2); + f = parseInt(str.substring(1 + ebits), 2); + + // Produce number + if (e === (1 << ebits) - 1) { + return f !== 0 ? NaN : s * Infinity; + } else if (e > 0) { + // Normalized + return s * pow(2, e - bias) * (1 + f / pow(2, fbits)); + } else if (f !== 0) { + // Denormalized + return s * pow(2, -(bias - 1)) * (f / pow(2, fbits)); + } else { + return s < 0 ? -0 : 0; + } +} + +function unpackF64(b) { return unpackIEEE754(b, 11, 52); } +function packF64(v) { return packIEEE754(v, 11, 52); } +function unpackF32(b) { return unpackIEEE754(b, 8, 23); } +function packF32(v) { return packIEEE754(v, 8, 23); } + + +// +// 3 The ArrayBuffer Type +// + +(function() { + + /** @constructor */ + var ArrayBuffer = function ArrayBuffer(length) { + length = ECMAScript.ToInt32(length); + if (length < 0) throw new RangeError('ArrayBuffer size is not a small enough positive integer'); + + this.byteLength = length; + this._bytes = []; + this._bytes.length = length; + + var i; + for (i = 0; i < this.byteLength; i += 1) { + this._bytes[i] = 0; + } + + configureProperties(this); + }; + + exports.ArrayBuffer = exports.ArrayBuffer || ArrayBuffer; + + // + // 4 The ArrayBufferView Type + // + + // NOTE: this constructor is not exported + /** @constructor */ + var ArrayBufferView = function ArrayBufferView() { + //this.buffer = null; + //this.byteOffset = 0; + //this.byteLength = 0; + }; + + // + // 5 The Typed Array View Types + // + + function makeConstructor(bytesPerElement, pack, unpack) { + // Each TypedArray type requires a distinct constructor instance with + // identical logic, which this produces. + + var ctor; + ctor = function(buffer, byteOffset, length) { + var array, sequence, i, s; + + if (!arguments.length || typeof arguments[0] === 'number') { + // Constructor(unsigned long length) + this.length = ECMAScript.ToInt32(arguments[0]); + if (length < 0) throw new RangeError('ArrayBufferView size is not a small enough positive integer'); + + this.byteLength = this.length * this.BYTES_PER_ELEMENT; + this.buffer = new ArrayBuffer(this.byteLength); + this.byteOffset = 0; + } else if (typeof arguments[0] === 'object' && arguments[0].constructor === ctor) { + // Constructor(TypedArray array) + array = arguments[0]; + + this.length = array.length; + this.byteLength = this.length * this.BYTES_PER_ELEMENT; + this.buffer = new ArrayBuffer(this.byteLength); + this.byteOffset = 0; + + for (i = 0; i < this.length; i += 1) { + this._setter(i, array._getter(i)); + } + } else if (typeof arguments[0] === 'object' && + !(arguments[0] instanceof ArrayBuffer || ECMAScript.Class(arguments[0]) === 'ArrayBuffer')) { + // Constructor(sequence array) + sequence = arguments[0]; + + this.length = ECMAScript.ToUint32(sequence.length); + this.byteLength = this.length * this.BYTES_PER_ELEMENT; + this.buffer = new ArrayBuffer(this.byteLength); + this.byteOffset = 0; + + for (i = 0; i < this.length; i += 1) { + s = sequence[i]; + this._setter(i, Number(s)); + } + } else if (typeof arguments[0] === 'object' && + (arguments[0] instanceof ArrayBuffer || ECMAScript.Class(arguments[0]) === 'ArrayBuffer')) { + // Constructor(ArrayBuffer buffer, + // optional unsigned long byteOffset, optional unsigned long length) + this.buffer = buffer; + + this.byteOffset = ECMAScript.ToUint32(byteOffset); + if (this.byteOffset > this.buffer.byteLength) { + throw new RangeError("byteOffset out of range"); + } + + if (this.byteOffset % this.BYTES_PER_ELEMENT) { + // The given byteOffset must be a multiple of the element + // size of the specific type, otherwise an exception is raised. + throw new RangeError("ArrayBuffer length minus the byteOffset is not a multiple of the element size."); + } + + if (arguments.length < 3) { + this.byteLength = this.buffer.byteLength - this.byteOffset; + + if (this.byteLength % this.BYTES_PER_ELEMENT) { + throw new RangeError("length of buffer minus byteOffset not a multiple of the element size"); + } + this.length = this.byteLength / this.BYTES_PER_ELEMENT; + } else { + this.length = ECMAScript.ToUint32(length); + this.byteLength = this.length * this.BYTES_PER_ELEMENT; + } + + if ((this.byteOffset + this.byteLength) > this.buffer.byteLength) { + throw new RangeError("byteOffset and length reference an area beyond the end of the buffer"); + } + } else { + throw new TypeError("Unexpected argument type(s)"); + } + + this.constructor = ctor; + + configureProperties(this); + makeArrayAccessors(this); + }; + + ctor.prototype = new ArrayBufferView(); + ctor.prototype.BYTES_PER_ELEMENT = bytesPerElement; + ctor.prototype._pack = pack; + ctor.prototype._unpack = unpack; + ctor.BYTES_PER_ELEMENT = bytesPerElement; + + // getter type (unsigned long index); + ctor.prototype._getter = function(index) { + if (arguments.length < 1) throw new SyntaxError("Not enough arguments"); + + index = ECMAScript.ToUint32(index); + if (index >= this.length) { + return undefined; + } + + var bytes = [], i, o; + for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT; + i < this.BYTES_PER_ELEMENT; + i += 1, o += 1) { + bytes.push(this.buffer._bytes[o]); + } + return this._unpack(bytes); + }; + + // NONSTANDARD: convenience alias for getter: type get(unsigned long index); + ctor.prototype.get = ctor.prototype._getter; + + // setter void (unsigned long index, type value); + ctor.prototype._setter = function(index, value) { + if (arguments.length < 2) throw new SyntaxError("Not enough arguments"); + + index = ECMAScript.ToUint32(index); + if (index >= this.length) { + return undefined; + } + + var bytes = this._pack(value), i, o; + for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT; + i < this.BYTES_PER_ELEMENT; + i += 1, o += 1) { + this.buffer._bytes[o] = bytes[i]; + } + }; + + // void set(TypedArray array, optional unsigned long offset); + // void set(sequence array, optional unsigned long offset); + ctor.prototype.set = function(index, value) { + if (arguments.length < 1) throw new SyntaxError("Not enough arguments"); + var array, sequence, offset, len, + i, s, d, + byteOffset, byteLength, tmp; + + if (typeof arguments[0] === 'object' && arguments[0].constructor === this.constructor) { + // void set(TypedArray array, optional unsigned long offset); + array = arguments[0]; + offset = ECMAScript.ToUint32(arguments[1]); + + if (offset + array.length > this.length) { + throw new RangeError("Offset plus length of array is out of range"); + } + + byteOffset = this.byteOffset + offset * this.BYTES_PER_ELEMENT; + byteLength = array.length * this.BYTES_PER_ELEMENT; + + if (array.buffer === this.buffer) { + tmp = []; + for (i = 0, s = array.byteOffset; i < byteLength; i += 1, s += 1) { + tmp[i] = array.buffer._bytes[s]; + } + for (i = 0, d = byteOffset; i < byteLength; i += 1, d += 1) { + this.buffer._bytes[d] = tmp[i]; + } + } else { + for (i = 0, s = array.byteOffset, d = byteOffset; + i < byteLength; i += 1, s += 1, d += 1) { + this.buffer._bytes[d] = array.buffer._bytes[s]; + } + } + } else if (typeof arguments[0] === 'object' && typeof arguments[0].length !== 'undefined') { + // void set(sequence array, optional unsigned long offset); + sequence = arguments[0]; + len = ECMAScript.ToUint32(sequence.length); + offset = ECMAScript.ToUint32(arguments[1]); + + if (offset + len > this.length) { + throw new RangeError("Offset plus length of array is out of range"); + } + + for (i = 0; i < len; i += 1) { + s = sequence[i]; + this._setter(offset + i, Number(s)); + } + } else { + throw new TypeError("Unexpected argument type(s)"); + } + }; + + // TypedArray subarray(long begin, optional long end); + ctor.prototype.subarray = function(start, end) { + function clamp(v, min, max) { return v < min ? min : v > max ? max : v; } + + start = ECMAScript.ToInt32(start); + end = ECMAScript.ToInt32(end); + + if (arguments.length < 1) { start = 0; } + if (arguments.length < 2) { end = this.length; } + + if (start < 0) { start = this.length + start; } + if (end < 0) { end = this.length + end; } + + start = clamp(start, 0, this.length); + end = clamp(end, 0, this.length); + + var len = end - start; + if (len < 0) { + len = 0; + } + + return new this.constructor( + this.buffer, this.byteOffset + start * this.BYTES_PER_ELEMENT, len); + }; + + return ctor; + } + + var Int8Array = makeConstructor(1, packI8, unpackI8); + var Uint8Array = makeConstructor(1, packU8, unpackU8); + var Uint8ClampedArray = makeConstructor(1, packU8Clamped, unpackU8); + var Int16Array = makeConstructor(2, packI16, unpackI16); + var Uint16Array = makeConstructor(2, packU16, unpackU16); + var Int32Array = makeConstructor(4, packI32, unpackI32); + var Uint32Array = makeConstructor(4, packU32, unpackU32); + var Float32Array = makeConstructor(4, packF32, unpackF32); + var Float64Array = makeConstructor(8, packF64, unpackF64); + + exports.Int8Array = exports.Int8Array || Int8Array; + exports.Uint8Array = exports.Uint8Array || Uint8Array; + exports.Uint8ClampedArray = exports.Uint8ClampedArray || Uint8ClampedArray; + exports.Int16Array = exports.Int16Array || Int16Array; + exports.Uint16Array = exports.Uint16Array || Uint16Array; + exports.Int32Array = exports.Int32Array || Int32Array; + exports.Uint32Array = exports.Uint32Array || Uint32Array; + exports.Float32Array = exports.Float32Array || Float32Array; + exports.Float64Array = exports.Float64Array || Float64Array; +}()); + +// +// 6 The DataView View Type +// + +(function() { + function r(array, index) { + return ECMAScript.IsCallable(array.get) ? array.get(index) : array[index]; + } + + var IS_BIG_ENDIAN = (function() { + var u16array = new(exports.Uint16Array)([0x1234]), + u8array = new(exports.Uint8Array)(u16array.buffer); + return r(u8array, 0) === 0x12; + }()); + + // Constructor(ArrayBuffer buffer, + // optional unsigned long byteOffset, + // optional unsigned long byteLength) + /** @constructor */ + var DataView = function DataView(buffer, byteOffset, byteLength) { + if (arguments.length === 0) { + buffer = new exports.ArrayBuffer(0); + } else if (!(buffer instanceof exports.ArrayBuffer || ECMAScript.Class(buffer) === 'ArrayBuffer')) { + throw new TypeError("TypeError"); + } + + this.buffer = buffer || new exports.ArrayBuffer(0); + + this.byteOffset = ECMAScript.ToUint32(byteOffset); + if (this.byteOffset > this.buffer.byteLength) { + throw new RangeError("byteOffset out of range"); + } + + if (arguments.length < 3) { + this.byteLength = this.buffer.byteLength - this.byteOffset; + } else { + this.byteLength = ECMAScript.ToUint32(byteLength); + } + + if ((this.byteOffset + this.byteLength) > this.buffer.byteLength) { + throw new RangeError("byteOffset and length reference an area beyond the end of the buffer"); + } + + configureProperties(this); + }; + + function makeGetter(arrayType) { + return function(byteOffset, littleEndian) { + + byteOffset = ECMAScript.ToUint32(byteOffset); + + if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength) { + throw new RangeError("Array index out of range"); + } + byteOffset += this.byteOffset; + + var uint8Array = new exports.Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT), + bytes = [], i; + for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1) { + bytes.push(r(uint8Array, i)); + } + + if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN)) { + bytes.reverse(); + } + + return r(new arrayType(new exports.Uint8Array(bytes).buffer), 0); + }; + } + + DataView.prototype.getUint8 = makeGetter(exports.Uint8Array); + DataView.prototype.getInt8 = makeGetter(exports.Int8Array); + DataView.prototype.getUint16 = makeGetter(exports.Uint16Array); + DataView.prototype.getInt16 = makeGetter(exports.Int16Array); + DataView.prototype.getUint32 = makeGetter(exports.Uint32Array); + DataView.prototype.getInt32 = makeGetter(exports.Int32Array); + DataView.prototype.getFloat32 = makeGetter(exports.Float32Array); + DataView.prototype.getFloat64 = makeGetter(exports.Float64Array); + + function makeSetter(arrayType) { + return function(byteOffset, value, littleEndian) { + + byteOffset = ECMAScript.ToUint32(byteOffset); + if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength) { + throw new RangeError("Array index out of range"); + } + + // Get bytes + var typeArray = new arrayType([value]), + byteArray = new exports.Uint8Array(typeArray.buffer), + bytes = [], i, byteView; + + for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1) { + bytes.push(r(byteArray, i)); + } + + // Flip if necessary + if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN)) { + bytes.reverse(); + } + + // Write them + byteView = new exports.Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT); + byteView.set(bytes); + }; + } + + DataView.prototype.setUint8 = makeSetter(exports.Uint8Array); + DataView.prototype.setInt8 = makeSetter(exports.Int8Array); + DataView.prototype.setUint16 = makeSetter(exports.Uint16Array); + DataView.prototype.setInt16 = makeSetter(exports.Int16Array); + DataView.prototype.setUint32 = makeSetter(exports.Uint32Array); + DataView.prototype.setInt32 = makeSetter(exports.Int32Array); + DataView.prototype.setFloat32 = makeSetter(exports.Float32Array); + DataView.prototype.setFloat64 = makeSetter(exports.Float64Array); + + exports.DataView = exports.DataView || DataView; + +}()); diff --git a/node_modules/typedarray/package.json b/node_modules/typedarray/package.json new file mode 100644 index 00000000..a7854a0f --- /dev/null +++ b/node_modules/typedarray/package.json @@ -0,0 +1,55 @@ +{ + "name": "typedarray", + "version": "0.0.6", + "description": "TypedArray polyfill for old browsers", + "main": "index.js", + "devDependencies": { + "tape": "~2.3.2" + }, + "scripts": { + "test": "tape test/*.js test/server/*.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/substack/typedarray.git" + }, + "homepage": "https://github.com/substack/typedarray", + "keywords": [ + "ArrayBuffer", + "DataView", + "Float32Array", + "Float64Array", + "Int8Array", + "Int16Array", + "Int32Array", + "Uint8Array", + "Uint8ClampedArray", + "Uint16Array", + "Uint32Array", + "typed", + "array", + "polyfill" + ], + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/6..latest", + "firefox/16..latest", + "firefox/nightly", + "chrome/22..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/node_modules/typedarray/readme.markdown b/node_modules/typedarray/readme.markdown new file mode 100644 index 00000000..d18f6f71 --- /dev/null +++ b/node_modules/typedarray/readme.markdown @@ -0,0 +1,61 @@ +# typedarray + +TypedArray polyfill ripped from [this +module](https://raw.github.com/inexorabletash/polyfill). + +[![build status](https://secure.travis-ci.org/substack/typedarray.png)](http://travis-ci.org/substack/typedarray) + +[![testling badge](https://ci.testling.com/substack/typedarray.png)](https://ci.testling.com/substack/typedarray) + +# example + +``` js +var Uint8Array = require('typedarray').Uint8Array; +var ua = new Uint8Array(5); +ua[1] = 256 + 55; +console.log(ua[1]); +``` + +output: + +``` +55 +``` + +# methods + +``` js +var TA = require('typedarray') +``` + +The `TA` object has the following constructors: + +* TA.ArrayBuffer +* TA.DataView +* TA.Float32Array +* TA.Float64Array +* TA.Int8Array +* TA.Int16Array +* TA.Int32Array +* TA.Uint8Array +* TA.Uint8ClampedArray +* TA.Uint16Array +* TA.Uint32Array + +# install + +With [npm](https://npmjs.org) do: + +``` +npm install typedarray +``` + +To use this module in the browser, compile with +[browserify](http://browserify.org) +or download a UMD build from browserify CDN: + +http://wzrd.in/standalone/typedarray@latest + +# license + +MIT diff --git a/node_modules/typedarray/test/server/undef_globals.js b/node_modules/typedarray/test/server/undef_globals.js new file mode 100644 index 00000000..425950f9 --- /dev/null +++ b/node_modules/typedarray/test/server/undef_globals.js @@ -0,0 +1,19 @@ +var test = require('tape'); +var vm = require('vm'); +var fs = require('fs'); +var src = fs.readFileSync(__dirname + '/../../index.js', 'utf8'); + +test('u8a without globals', function (t) { + var c = { + module: { exports: {} }, + }; + c.exports = c.module.exports; + vm.runInNewContext(src, c); + var TA = c.module.exports; + var ua = new(TA.Uint8Array)(5); + + t.equal(ua.length, 5); + ua[1] = 256 + 55; + t.equal(ua[1], 55); + t.end(); +}); diff --git a/node_modules/typedarray/test/tarray.js b/node_modules/typedarray/test/tarray.js new file mode 100644 index 00000000..df596a34 --- /dev/null +++ b/node_modules/typedarray/test/tarray.js @@ -0,0 +1,10 @@ +var TA = require('../'); +var test = require('tape'); + +test('tiny u8a test', function (t) { + var ua = new(TA.Uint8Array)(5); + t.equal(ua.length, 5); + ua[1] = 256 + 55; + t.equal(ua[1], 55); + t.end(); +}); diff --git a/node_modules/unc-path-regex/LICENSE b/node_modules/unc-path-regex/LICENSE new file mode 100644 index 00000000..65f90aca --- /dev/null +++ b/node_modules/unc-path-regex/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/unc-path-regex/README.md b/node_modules/unc-path-regex/README.md new file mode 100644 index 00000000..e0edddab --- /dev/null +++ b/node_modules/unc-path-regex/README.md @@ -0,0 +1,88 @@ +# unc-path-regex [![NPM version](https://badge.fury.io/js/unc-path-regex.svg)](http://badge.fury.io/js/unc-path-regex) [![Build Status](https://travis-ci.org/jonschlinkert/unc-path-regex.svg)](https://travis-ci.org/jonschlinkert/unc-path-regex) + +> Regular expression for testing if a file path is a windows UNC file path. Can also be used as a component of another regexp via the `.source` property. + +Visit the MSDN reference for [Common Data Types 2.2.57 UNC](https://msdn.microsoft.com/en-us/library/gg465305.aspx) for more information about UNC paths. + +## Install + +Install with [npm](https://www.npmjs.com/) + +```sh +$ npm i unc-path-regex --save +``` + +## Usage + +```js +// unc-path-regex returns a function +var regex = require('unc-path-regex')(); +``` + +**true** + +Returns true for windows UNC paths: + +```js +regex.test('\\/foo/bar'); +regex.test('\\\\foo/bar'); +regex.test('\\\\foo\\admin$'); +regex.test('\\\\foo\\admin$\\system32'); +regex.test('\\\\foo\\temp'); +regex.test('\\\\/foo/bar'); +regex.test('\\\\\\/foo/bar'); +``` + +**false** + +Returns false for non-UNC paths: + +```js +regex.test('/foo/bar'); +regex.test('/'); +regex.test('/foo'); +regex.test('/foo/'); +regex.test('c:'); +regex.test('c:.'); +regex.test('c:./'); +regex.test('c:./file'); +regex.test('c:/'); +regex.test('c:/file'); +``` + +## Related projects + +* [dotfile-regex](https://github.com/regexps/dotfile-regex): Regular expresson for matching dotfiles. +* [dotdir-regex](https://github.com/regexps/dotdir-regex): Regex for matching dot-directories, like `.git/` +* [dirname-regex](https://github.com/regexps/dirname-regex): Regular expression for matching the directory part of a file path. +* [is-unc-path](https://github.com/jonschlinkert/is-unc-path): Returns true if a filepath is a windows UNC file path. +* [is-glob](https://github.com/jonschlinkert/is-glob): Returns `true` if the given string looks like a glob pattern. +* [path-regex](https://github.com/regexps/path-regex): Regular expression for matching the parts of a file path. + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/unc-path-regex/issues/new) + +## Author + +**Jon Schlinkert** + ++ [github/jonschlinkert](https://github.com/jonschlinkert) ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2015 Jon Schlinkert +Released under the MIT license. + +*** + +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on July 07, 2015._ \ No newline at end of file diff --git a/node_modules/unc-path-regex/index.js b/node_modules/unc-path-regex/index.js new file mode 100644 index 00000000..c268404d --- /dev/null +++ b/node_modules/unc-path-regex/index.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = function uncPathRegex() { + return /^[\\\/]{2,}[^\\\/]+[\\\/]+[^\\\/]+/; +}; diff --git a/node_modules/unc-path-regex/package.json b/node_modules/unc-path-regex/package.json new file mode 100644 index 00000000..3fba9de1 --- /dev/null +++ b/node_modules/unc-path-regex/package.json @@ -0,0 +1,56 @@ +{ + "name": "unc-path-regex", + "description": "Regular expression for testing if a file path is a windows UNC file path. Can also be used as a component of another regexp via the `.source` property.", + "version": "0.1.2", + "homepage": "https://github.com/regexhq/unc-path-regex", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": { + "type" : "git", + "url": "https://github.com/regexhq/unc-path-regex.git" + }, + "bugs": { + "url": "https://github.com/regexhq/unc-path-regex/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "mocha": "*" + }, + "keywords": [ + "absolute", + "expression", + "file", + "filepath", + "match", + "matching", + "path", + "regex", + "regexp", + "regular", + "unc", + "win", + "windows" + ], + "verb": { + "related": { + "list": [ + "dotfile-regex", + "is-unc-path", + "unc-path-regex", + "dotdir-regex", + "path-regex", + "dirname-regex", + "is-glob" + ] + } + } +} diff --git a/node_modules/undertaker-registry/LICENSE b/node_modules/undertaker-registry/LICENSE new file mode 100644 index 00000000..d7e309bc --- /dev/null +++ b/node_modules/undertaker-registry/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, 2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/undertaker-registry/README.md b/node_modules/undertaker-registry/README.md new file mode 100644 index 00000000..4392872e --- /dev/null +++ b/node_modules/undertaker-registry/README.md @@ -0,0 +1,210 @@ +

      + + + +

      + +# undertaker-registry + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Default registry in gulp 4. + +## Usage + +```js +var gulp = require('gulp'); +var UndertakerRegistry = require('undertaker-registry'); + +var registry = new UndertakerRegistry(); + +gulp.registry(registry); +``` + +## API + +### new UndertakerRegistry([options]) + +Constructor for the default registry. Inherit from this constructor to build custom registries. + +### init(taker) + +No-op method that receives the undertaker instance. Useful to set pre-defined tasks using the +`undertaker.task(taskName, fn)` method. Custom registries can override this method when inheriting +from this default registry. + +### get(taskName) => Function + +Returns the task with that name or undefined if no task is registered with that name. Useful for custom +task storage. Custom registries can override this method when inheriting from this default registry. + +### set(taskName, fn) => [Function] + +Adds a task to the registry. If `set` modifies a task, it should return the new task so Undertaker can +properly maintain metadata for the task. Useful for adding custom behavior to every task as it is +registered in the system. Custom registries can override this method when inheriting from this default +registry. + +### tasks() => Object + +Returns an object listing all tasks in the registry. Necessary to override if the `get` method is overridden +for custom task storage. Custom registries can override this when when inheriting from this default +registry. + +## Custom Registries + +Custom registries are constructor functions allowing you to pre-define/share tasks +or add custom functionality to your registries. + +A registry's prototype should define: + +- `init(taker)`: receives the undertaker instance to set pre-defined tasks using the `task(taskName, fn)` method. +- `get(taskName)`: returns the task with that name + or `undefined` if no task is registered with that name. +- `set(taskName, fn)`: add task to the registry. If `set` modifies a task, it should return the new task. +- `tasks()`: returns an object listing all tasks in the registry. + +You should not call these functions yourself; leave that to Undertaker, so it can +keep its metadata consistent. + +The easiest way to create a custom registry is to inherit from +[undertaker-registry](https://www.npmjs.com/package/undertaker-registry): + +```javascript +var util = require('util'); + +var DefaultRegistry = require('undertaker-registry'); + +function MyRegistry(){ + DefaultRegistry.call(this); +} + +util.inherits(MyRegistry, DefaultRegistry); + +module.exports = MyRegistry; +``` + +### Sharing tasks + +To share common tasks with all your projects, you can expose an `init` method on the registry +prototype and it will receive the Undertaker instance as the only argument. You can then use +`undertaker.task(name, fn)` to register pre-defined tasks. + +For example you might want to share a `clean` task: + +```javascript +var fs = require('fs'); +var util = require('util'); + +var DefaultRegistry = require('undertaker-registry'); +var del = require('del'); + +function CommonRegistry(opts){ + DefaultRegistry.call(this); + + opts = opts || {}; + + this.buildDir = opts.buildDir || './build'; +} + +util.inherits(CommonRegistry, DefaultRegistry); + +CommonRegistry.prototype.init = function(takerInst){ + var buildDir = this.buildDir; + var exists = fs.existsSync(buildDir); + + if(exists){ + throw new Error('Cannot initialize common tasks. ' + buildDir + ' directory exists.'); + } + + takerInst.task('clean', function(){ + return del([buildDir]); + }); +} + +module.exports = CommonRegistry; +``` + +Then to use it in a project: +```javascript +var Undertaker = require('undertaker'); +var CommonRegistry = require('myorg-common-tasks'); + +var taker = new Undertaker(CommonRegistry({ buildDir: '/dist' })); + +taker.task('build', taker.series('clean', function build(cb) { + // do things + cb(); +})); +``` + +### Sharing Functionalities + +By controlling how tasks are added to the registry, you can decorate them. + +For example if you wanted all tasks to share some data, you can use a custom registry +to bind them to that data. Be sure to return the altered task, as per the description +of registry methods above: + +```javascript +var util = require('util'); + +var Undertaker = require('undertaker'); +var DefaultRegistry = require('undertaker-registry'); + +// Some task defined somewhere else +var BuildRegistry = require('./build.js'); +var ServeRegistry = require('./serve.js'); + +function ConfigRegistry(config){ + DefaultRegistry.call(this); + this.config = config; +} + +util.inherits(ConfigRegistry, DefaultRegistry); + +ConfigRegistry.prototype.set = function set(name, fn) { + // The `DefaultRegistry` uses `this._tasks` for storage. + var task = this._tasks[name] = fn.bind(this.config); + return task; +}; + +var taker = new Undertaker(); + +taker.registry(new BuildRegistry()); +taker.registry(new ServeRegistry()); + +// `taker.registry` will reset each task in the registry with +// `ConfigRegistry.prototype.set` which will bind them to the config object. +taker.registry(new ConfigRegistry({ + src: './src', + build: './build', + bindTo: '0.0.0.0:8888' +})); + +taker.task('default', taker.series('clean', 'build', 'serve', function(cb) { + console.log('Server bind to ' + this.bindTo); + console.log('Serving' + this.build); + cb(); +})); +``` + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/undertaker-registry.svg +[npm-url]: https://npmjs.org/package/undertaker-registry +[npm-image]: http://img.shields.io/npm/v/undertaker-registry.svg + +[travis-url]: https://travis-ci.org/gulpjs/undertaker-registry +[travis-image]: http://img.shields.io/travis/gulpjs/undertaker-registry.svg + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/undertaker-registry +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/undertaker-registry.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/undertaker-registry +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/undertaker-registry/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/undertaker-registry/index.js b/node_modules/undertaker-registry/index.js new file mode 100644 index 00000000..15191a99 --- /dev/null +++ b/node_modules/undertaker-registry/index.js @@ -0,0 +1,30 @@ +'use strict'; + +function DefaultRegistry() { + if (this instanceof DefaultRegistry === false) { + return new DefaultRegistry(); + } + + this._tasks = {}; +} + +DefaultRegistry.prototype.init = function init(taker) {}; + +DefaultRegistry.prototype.get = function get(name) { + return this._tasks[name]; +}; + +DefaultRegistry.prototype.set = function set(name, fn) { + return this._tasks[name] = fn; +}; + +DefaultRegistry.prototype.tasks = function tasks() { + var self = this; + + return Object.keys(this._tasks).reduce(function(tasks, name) { + tasks[name] = self.get(name); + return tasks; + }, {}); +}; + +module.exports = DefaultRegistry; diff --git a/node_modules/undertaker-registry/package.json b/node_modules/undertaker-registry/package.json new file mode 100644 index 00000000..d7de6d92 --- /dev/null +++ b/node_modules/undertaker-registry/package.json @@ -0,0 +1,42 @@ +{ + "name": "undertaker-registry", + "version": "1.0.1", + "description": "Default registry in gulp 4.", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Blaine Bublitz " + ], + "repository": "gulpjs/undertaker-registry", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint . && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "devDependencies": { + "eslint": "^1.7.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.19.0", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "mocha": "^3.5.0" + }, + "keywords": [ + "registry", + "tasks", + "undertaker", + "gulp" + ] +} diff --git a/node_modules/undertaker/LICENSE b/node_modules/undertaker/LICENSE new file mode 100644 index 00000000..0b2955ae --- /dev/null +++ b/node_modules/undertaker/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blaine Bublitz, Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/undertaker/README.md b/node_modules/undertaker/README.md new file mode 100644 index 00000000..8855dddc --- /dev/null +++ b/node_modules/undertaker/README.md @@ -0,0 +1,324 @@ +

      + + + +

      + +# undertaker + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +## Usage + +```js +var fs = require('fs'); +var Undertaker = require('undertaker'); + +var taker = new Undertaker(); + +taker.task('task1', function(cb){ + // do things + + cb(); // when everything is done +}); + +taker.task('task2', function(){ + return fs.createReadStream('./myFile.js') + .pipe(fs.createWriteStream('./myFile.copy.js')); +}); + +taker.task('task3', function(){ + return new Promise(function(resolve, reject){ + // do things + + resolve(); // when everything is done + }); +}); + +taker.task('combined', taker.series('task1', 'task2')); + +taker.task('all', taker.parallel('combined', 'task3')); +``` + +## API + +__Task functions can be completed in any of the ways supported by +[`async-done`][async-resolution]__ + +### `new Undertaker([registryInstance])` + +The constructor is used to create a new instance of `Undertaker`. Each instance of +`Undertaker` gets its own instance of a registry. By default, the registry is an +instance of [`undertaker-registry`][undertaker-registry] +but it can be an instance of any other registry that follows the [Custom Registries API][custom-registries]. + +To use a custom registry, pass a custom registry instance (`new CustomRegistry([options])`) when +instantiating a new `Undertaker` instance. This will use the custom registry instance for that `Undertaker` instance. + +### `task([taskName,] fn)` + +Both a `getter` and `setter` for tasks. + +If a string (`taskName`) is given as the only argument, it behaves as a `getter` +and returns the wrapped task (not the original function). The wrapped task has a `unwrap` +method that will return the original function. + +If a function (`fn`) and optionally a string (`taskName`) is given, it behaves as +a `setter` and will register the task by the `taskName`. If `taskName` is not +specified, the `name` or `displayName` property of the function is used as the `taskName`. + +Will throw if: + +* As a `getter`: `taskName` is missing or not a string. +* As a `setter`: `taskName` is missing and `fn` is anonymous. +* As a `setter`: `fn` is missing or not a function. + +### `series(taskName || fn...)` + +Takes a variable amount of strings (`taskName`) and/or functions (`fn`) and +returns a function of the composed tasks or functions. Any `taskNames` are +retrieved from the registry using the `get` method. + +When the returned function is executed, the tasks or functions will be executed +in series, each waiting for the prior to finish. If an error occurs, execution +will stop. + +### `parallel(taskName || fn...)` + +Takes a variable amount of strings (`taskName`) and/or functions (`fn`) and +returns a function of the composed tasks or functions. Any `taskNames` are +retrieved from the registry using the `get` method. + +When the returned function is executed, the tasks or functions will be executed +in parallel, all being executed at the same time. If an error occurs, all execution +will complete. + +### `registry([registryInstance])` + +Optionally takes an instantiated registry object. If no arguments are passed, returns +the current registry object. If an instance of a registry (`customRegistry`) is passed +the tasks from the current registry will be transferred to it and the current registry +will be replaced with the new registry. + +The ability to assign new registries will allow you to pre-define/share tasks or add +custom functionality to your registries. See [Custom Registries][custom-registries] +for more information. + +### `tree([options])` + +Optionally takes an `options` object and returns an object representing the +tree of registered tasks. The object returned is [`archy`][archy] +compatible. Also, each node has a `type` property that can be used to determine if the node is a `task` or `function`. + +#### `options` + +##### `options.deep` + +Whether or not the whole tree should be returned. + +Type: `Boolean` + +Default: `false` + +### `lastRun(task, [precision])` + +Takes a string or function (`task`) and returns a timestamp of the last time the task +was run successfully. The time will be the time the task started. + +Returns `undefined` if the task has not been run. + +If a task errors, the result of `lastRun` will be undefined because the task +should probably be re-run from scratch to get into a good state again. + +The timestamp is always given in millisecond but the time resolution can be +rounded using the `precision` parameter. The use case is to be able to compare a build time +to a file time attribute. On node v0.10 or with file system like HFS or FAT, +`fs.stat` time attributes like `mtime` precision is one second. + +Assuming `undertakerInst.lastRun('someTask')` returns `1426000001111`, +`undertakerInst.lastRun('someTask', 1000)` returns `1426000001000`. + +The default time resolution is `1000` on node v0.10, `0` on node 0.11+ but +it can be overwritten using `UNDERTAKER_TIME_RESOLUTION` environment variable. + +## Custom Registries + +Custom registries are constructor functions allowing you to pre-define/share tasks +or add custom functionality to your registries. + +A registry's prototype should define: + +- `init(taker)`: receives the undertaker instance to set pre-defined tasks using the `task(taskName, fn)` method. +- `get(taskName)`: returns the task with that name + or `undefined` if no task is registered with that name. +- `set(taskName, fn)`: add task to the registry. If `set` modifies a task, it should return the new task. +- `tasks()`: returns an object listing all tasks in the registry. + +You should not call these functions yourself; leave that to Undertaker, so it can +keep its metadata consistent. + +The easiest way to create a custom registry is to inherit from [undertaker-registry]: + +```js +var util = require('util'); + +var DefaultRegistry = require('undertaker-registry'); + +function MyRegistry(){ + DefaultRegistry.call(this); +} + +util.inherits(MyRegistry, DefaultRegistry); + +module.exports = MyRegistry; +``` + +### Sharing tasks + +To share common tasks with all your projects, you can expose an `init` method on the registry +prototype and it will receive the `Undertaker` instance as the only argument. You can then use +`undertaker.task(name, fn)` to register pre-defined tasks. + +For example you might want to share a `clean` task: + +```js +var fs = require('fs'); +var util = require('util'); + +var DefaultRegistry = require('undertaker-registry'); +var del = require('del'); + +function CommonRegistry(opts){ + DefaultRegistry.call(this); + + opts = opts || {}; + + this.buildDir = opts.buildDir || './build'; +} + +util.inherits(CommonRegistry, DefaultRegistry); + +CommonRegistry.prototype.init = function(takerInst){ + var buildDir = this.buildDir; + var exists = fs.existsSync(buildDir); + + if(exists){ + throw new Error('Cannot initialize common tasks. ' + buildDir + ' directory exists.'); + } + + takerInst.task('clean', function(){ + return del([buildDir]); + }); +} + +module.exports = CommonRegistry; +``` + +Then to use it in a project: +```js +var Undertaker = require('undertaker'); +var CommonRegistry = require('myorg-common-tasks'); + +var taker = new Undertaker(CommonRegistry({ buildDir: '/dist' })); + +taker.task('build', taker.series('clean', function build(cb) { + // do things + cb(); +})); +``` + +### Sharing Functionalities + +By controlling how tasks are added to the registry, you can decorate them. + +For example if you wanted all tasks to share some data, you can use a custom registry +to bind them to that data. Be sure to return the altered task, as per the description +of registry methods above: + +```js +var util = require('util'); + +var Undertaker = require('undertaker'); +var DefaultRegistry = require('undertaker-registry'); + +// Some task defined somewhere else +var BuildRegistry = require('./build.js'); +var ServeRegistry = require('./serve.js'); + +function ConfigRegistry(config){ + DefaultRegistry.call(this); + this.config = config; +} + +util.inherits(ConfigRegistry, DefaultRegistry); + +ConfigRegistry.prototype.set = function set(name, fn) { + // The `DefaultRegistry` uses `this._tasks` for storage. + var task = this._tasks[name] = fn.bind(this.config); + return task; +}; + +var taker = new Undertaker(); + +taker.registry(new BuildRegistry()); +taker.registry(new ServeRegistry()); + +// `taker.registry` will reset each task in the registry with +// `ConfigRegistry.prototype.set` which will bind them to the config object. +taker.registry(new ConfigRegistry({ + src: './src', + build: './build', + bindTo: '0.0.0.0:8888' +})); + +taker.task('default', taker.series('clean', 'build', 'serve', function(cb) { + console.log('Server bind to ' + this.bindTo); + console.log('Serving' + this.build); + cb(); +})); +``` + +### In the wild + +* [undertaker-registry] - Custom registries probably want to inherit from this. +* [undertaker-forward-reference] - Custom registry supporting forward referenced tasks (similar to gulp 3.x). +* [undertaker-task-metadata] - Proof-of-concept custom registry that attaches metadata to each task. +* [undertaker-common-tasks] - Proof-of-concept custom registry that pre-defines some tasks. +* [alchemist-gulp] - A default set of tasks for building alchemist plugins. +* [gulp-hub] - Custom registry to run tasks in multiple gulpfiles. (In a branch as of this writing) +* [gulp-pipeline] - [RailsRegistry][rails-registry] is an ES2015 class that provides a gulp pipeline replacement for rails applications + +## License + +MIT + +[downloads-image]: https://img.shields.io/npm/dm/undertaker.svg +[npm-url]: https://www.npmjs.com/package/undertaker +[npm-image]: https://img.shields.io/npm/v/undertaker.svg + +[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=$PROJECT_ID&branchName=master +[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/undertaker?branchName=master + +[travis-url]: https://travis-ci.org/gulpjs/undertaker +[travis-image]: https://img.shields.io/travis/gulpjs/undertaker.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/undertaker +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/undertaker.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/undertaker +[coveralls-image]: https://img.shields.io/coveralls/gulpjs/undertaker/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg + +[custom-registries]: #custom-registries +[async-resolution]: https://github.com/phated/async-done#completion-and-error-resolution +[archy]: https://www.npmjs.org/package/archy +[undertaker-registry]: https://github.com/gulpjs/undertaker-registry +[undertaker-forward-reference]: https://github.com/gulpjs/undertaker-forward-reference +[undertaker-task-metadata]: https://github.com/gulpjs/undertaker-task-metadata +[undertaker-common-tasks]: https://github.com/gulpjs/undertaker-common-tasks +[alchemist-gulp]: https://github.com/webdesserts/alchemist-gulp +[gulp-hub]: https://github.com/frankwallis/gulp-hub/tree/registry-init +[gulp-pipeline]: https://github.com/alienfast/gulp-pipeline +[rails-registry]: https://github.com/alienfast/gulp-pipeline/blob/master/src/registry/railsRegistry.js diff --git a/node_modules/undertaker/index.js b/node_modules/undertaker/index.js new file mode 100644 index 00000000..3863feab --- /dev/null +++ b/node_modules/undertaker/index.js @@ -0,0 +1,47 @@ +'use strict'; + +var inherits = require('util').inherits; +var EventEmitter = require('events').EventEmitter; + +var DefaultRegistry = require('undertaker-registry'); + +var tree = require('./lib/tree'); +var task = require('./lib/task'); +var series = require('./lib/series'); +var lastRun = require('./lib/last-run'); +var parallel = require('./lib/parallel'); +var registry = require('./lib/registry'); +var _getTask = require('./lib/get-task'); +var _setTask = require('./lib/set-task'); + +function Undertaker(customRegistry) { + EventEmitter.call(this); + + this._registry = new DefaultRegistry(); + if (customRegistry) { + this.registry(customRegistry); + } + + this._settle = (process.env.UNDERTAKER_SETTLE === 'true'); +} + +inherits(Undertaker, EventEmitter); + + +Undertaker.prototype.tree = tree; + +Undertaker.prototype.task = task; + +Undertaker.prototype.series = series; + +Undertaker.prototype.lastRun = lastRun; + +Undertaker.prototype.parallel = parallel; + +Undertaker.prototype.registry = registry; + +Undertaker.prototype._getTask = _getTask; + +Undertaker.prototype._setTask = _setTask; + +module.exports = Undertaker; diff --git a/node_modules/undertaker/package.json b/node_modules/undertaker/package.json new file mode 100644 index 00000000..94a13af6 --- /dev/null +++ b/node_modules/undertaker/package.json @@ -0,0 +1,61 @@ +{ + "name": "undertaker", + "version": "1.3.0", + "description": "Task registry that allows composition through series/parallel methods.", + "author": "Gulp Team (https://gulpjs.com/)", + "contributors": [ + "Blaine Bublitz ", + "Damien Lebrun " + ], + "repository": "gulpjs/undertaker", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js", + "lib" + ], + "scripts": { + "lint": "eslint .", + "pretest": "npm run lint", + "test": "nyc mocha --async-only", + "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", + "coveralls": "nyc report --reporter=text-lcov | coveralls" + }, + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0", + "fast-levenshtein": "^1.0.0" + }, + "devDependencies": { + "async-once": "^1.0.0", + "coveralls": "github:phated/node-coveralls#2.x", + "del": "^2.0.2", + "eslint": "^2.13.1", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "gulp-jshint": "^1.8.4", + "mocha": "^3.0.0", + "nyc": "^10.3.2", + "once": "^1.3.1", + "through2": "^2.0.0", + "undertaker-common-tasks": "^1.0.0", + "undertaker-task-metadata": "^1.0.0", + "vinyl-fs": "^2.2.0" + }, + "keywords": [ + "registry", + "runner", + "task" + ] +} diff --git a/node_modules/union-value/LICENSE b/node_modules/union-value/LICENSE new file mode 100644 index 00000000..83b56e70 --- /dev/null +++ b/node_modules/union-value/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/union-value/README.md b/node_modules/union-value/README.md new file mode 100644 index 00000000..1a90ffbd --- /dev/null +++ b/node_modules/union-value/README.md @@ -0,0 +1,73 @@ +# union-value [![NPM version](https://img.shields.io/npm/v/union-value.svg?style=flat)](https://www.npmjs.com/package/union-value) [![NPM monthly downloads](https://img.shields.io/npm/dm/union-value.svg?style=flat)](https://npmjs.org/package/union-value) [![NPM total downloads](https://img.shields.io/npm/dt/union-value.svg?style=flat)](https://npmjs.org/package/union-value) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/union-value.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/union-value) + +> Set an array of unique values as the property of an object. Supports setting deeply nested properties using using object-paths/dot notation. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save union-value +``` + +## Usage + +```js +var union = require('union-value'); + +var obj = {}; + +union(obj, 'a.b.c', ['one', 'two']); +union(obj, 'a.b.c', ['three']); + +console.log(obj); +//=> {a: {b: {c: [ 'one', 'two', 'three' ] }}} +``` + +## About + +### Related projects + +* [assign-value](https://www.npmjs.com/package/assign-value): Assign a value or extend a deeply nested property of an object using object path… [more](https://github.com/jonschlinkert/assign-value) | [homepage](https://github.com/jonschlinkert/assign-value "Assign a value or extend a deeply nested property of an object using object path notation.") +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (`a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value "Use property paths (`a.b.c`) to get a nested value from an object.") +* [has-value](https://www.npmjs.com/package/has-value): Returns true if a value exists, false if empty. Works with deeply nested values using… [more](https://github.com/jonschlinkert/has-value) | [homepage](https://github.com/jonschlinkert/has-value "Returns true if a value exists, false if empty. Works with deeply nested values using object paths.") +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value "Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths.") +* [unset-value](https://www.npmjs.com/package/unset-value): Delete nested properties from an object using dot notation. | [homepage](https://github.com/jonschlinkert/unset-value "Delete nested properties from an object using dot notation.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.4.2, on February 25, 2017._ \ No newline at end of file diff --git a/node_modules/union-value/index.js b/node_modules/union-value/index.js new file mode 100644 index 00000000..9c5d8db2 --- /dev/null +++ b/node_modules/union-value/index.js @@ -0,0 +1,30 @@ +'use strict'; + +var isObject = require('is-extendable'); +var union = require('arr-union'); +var get = require('get-value'); +var set = require('set-value'); + +module.exports = function unionValue(obj, prop, value) { + if (!isObject(obj)) { + throw new TypeError('union-value expects the first argument to be an object.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('union-value expects `prop` to be a string.'); + } + + var arr = arrayify(get(obj, prop)); + set(obj, prop, union(arr, arrayify(value))); + return obj; +}; + +function arrayify(val) { + if (val === null || typeof val === 'undefined') { + return []; + } + if (Array.isArray(val)) { + return val; + } + return [val]; +} diff --git a/node_modules/union-value/package.json b/node_modules/union-value/package.json new file mode 100644 index 00000000..65441f6e --- /dev/null +++ b/node_modules/union-value/package.json @@ -0,0 +1,70 @@ +{ + "name": "union-value", + "description": "Set an array of unique values as the property of an object. Supports setting deeply nested properties using using object-paths/dot notation.", + "version": "1.0.1", + "homepage": "https://github.com/jonschlinkert/union-value", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/union-value", + "bugs": { + "url": "https://github.com/jonschlinkert/union-value/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "devDependencies": { + "gulp-format-md": "^0.1.11", + "mocha": "^3.2.0", + "should": "^11.2.0" + }, + "keywords": [ + "array", + "dot", + "get", + "has", + "nested", + "notation", + "object", + "path", + "prop", + "property", + "set", + "union", + "value" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "assign-value", + "get-value", + "has-value", + "set-value", + "unset-value" + ] + }, + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/unique-stream/LICENSE b/node_modules/unique-stream/LICENSE new file mode 100644 index 00000000..cd2225ad --- /dev/null +++ b/node_modules/unique-stream/LICENSE @@ -0,0 +1,20 @@ +Copyright 2014 Eugene Ware + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/unique-stream/README.md b/node_modules/unique-stream/README.md new file mode 100644 index 00000000..afd49a0f --- /dev/null +++ b/node_modules/unique-stream/README.md @@ -0,0 +1,134 @@ +# unique-stream + +node.js through stream that emits a unique stream of objects based on criteria + +[![Build Status](https://travis-ci.org/eugeneware/unique-stream.svg?branch=master)](https://travis-ci.org/eugeneware/unique-stream) +[![Coverage Status](https://coveralls.io/repos/eugeneware/unique-stream/badge.svg?branch=master&service=github)](https://coveralls.io/github/eugeneware/unique-stream?branch=master) + +## Installation + +Install via [npm](https://www.npmjs.com/): + +``` +$ npm install unique-stream +``` + +## Examples + +### Dedupe a ReadStream based on JSON.stringify: + +``` js +var unique = require('unique-stream') + , Stream = require('stream'); + +// return a stream of 3 identical objects +function makeStreamOfObjects() { + var s = new Stream; + s.readable = true; + var count = 3; + for (var i = 0; i < 3; i++) { + setImmediate(function () { + s.emit('data', { name: 'Bob', number: 123 }); + --count || end(); + }); + } + + function end() { + s.emit('end'); + } + + return s; +} + +// Will only print out one object as the rest are dupes. (Uses JSON.stringify) +makeStreamOfObjects() + .pipe(unique()) + .on('data', console.log); + +``` + +### Dedupe a ReadStream based on an object property: + +``` js +// Use name as the key field to dedupe on. Will only print one object +makeStreamOfObjects() + .pipe(unique('name')) + .on('data', console.log); +``` + +### Dedupe a ReadStream based on a custom function: + +``` js +// Use a custom function to dedupe on. Use the 'number' field. Will only print one object. +makeStreamOfObjects() + .pipe(function (data) { + return data.number; + }) + .on('data', console.log); +``` + +## Dedupe multiple streams + +The reason I wrote this was to dedupe multiple object streams: + +``` js +var aggregator = unique(); + +// Stream 1 +makeStreamOfObjects() + .pipe(aggregator); + +// Stream 2 +makeStreamOfObjects() + .pipe(aggregator); + +// Stream 3 +makeStreamOfObjects() + .pipe(aggregator); + +aggregator.on('data', console.log); +``` + +## Use a custom store to record keys that have been encountered + +By default a set is used to store keys encountered so far, in order to check new ones for +uniqueness. You can supply your own store instead, providing it supports the add(key) and +has(key) methods. This could allow you to use a persistent store so that already encountered +objects are not re-streamed when node is reloaded. + +``` js +var keyStore = { + store: {}, + + add: function(key) { + this.store[key] = true; + }, + + has: function(key) { + return this.store[key] !== undefined; + } +}; + +makeStreamOfObjects() + .pipe(unique('name', keyStore)) + .on('data', console.log); +``` + +## Contributing + +unique-stream is an **OPEN Open Source Project**. This means that: + +> Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project. + +See the [CONTRIBUTING.md](https://github.com/eugeneware/unique-stream/blob/master/CONTRIBUTING.md) file for more details. + +### Contributors + +unique-stream is only possible due to the excellent work of the following contributors: + + + + + + +
      Eugene WareGitHub/eugeneware
      Craig AmbroseGitHub/craigambrose
      Shinnosuke WatanabeGitHub/shinnn
      Rouven WeßlingGitHub/realityking
      diff --git a/node_modules/unique-stream/index.js b/node_modules/unique-stream/index.js new file mode 100644 index 00000000..13209b99 --- /dev/null +++ b/node_modules/unique-stream/index.js @@ -0,0 +1,48 @@ +'use strict'; + +var filter = require('through2-filter').obj; +var stringify = require("json-stable-stringify-without-jsonify"); + +var ES6Set; +if (typeof global.Set === 'function') { + ES6Set = global.Set; +} else { + ES6Set = function() { + this.keys = []; + this.has = function(val) { + return this.keys.indexOf(val) !== -1; + }, + this.add = function(val) { + this.keys.push(val); + } + } +} + +function prop(propName) { + return function (data) { + return data[propName]; + }; +} + +module.exports = unique; +function unique(propName, keyStore) { + keyStore = keyStore || new ES6Set(); + + var keyfn = stringify; + if (typeof propName === 'string') { + keyfn = prop(propName); + } else if (typeof propName === 'function') { + keyfn = propName; + } + + return filter(function (data) { + var key = keyfn(data); + + if (keyStore.has(key)) { + return false; + } + + keyStore.add(key); + return true; + }); +} diff --git a/node_modules/unique-stream/package.json b/node_modules/unique-stream/package.json new file mode 100644 index 00000000..201e6535 --- /dev/null +++ b/node_modules/unique-stream/package.json @@ -0,0 +1,32 @@ +{ + "name": "unique-stream", + "version": "2.3.1", + "description": "node.js through stream that emits a unique stream of objects based on criteria", + "repository": "eugeneware/unique-stream", + "author": "Eugene Ware ", + "license": "MIT", + "files": [ + "index.js" + ], + "scripts": { + "test": "mocha", + "coverage": "istanbul cover _mocha" + }, + "keywords": [ + "unique", + "stream", + "unique-stream", + "streaming", + "streams" + ], + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + }, + "devDependencies": { + "after": "~0.8.1", + "chai": "^4.2.0", + "istanbul": "^0.4.5", + "mocha": "^5.2.0" + } +} diff --git a/node_modules/unset-value/LICENSE b/node_modules/unset-value/LICENSE new file mode 100644 index 00000000..ec85897e --- /dev/null +++ b/node_modules/unset-value/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, 2017, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/unset-value/README.md b/node_modules/unset-value/README.md new file mode 100644 index 00000000..f0fec3d3 --- /dev/null +++ b/node_modules/unset-value/README.md @@ -0,0 +1,131 @@ +# unset-value [![NPM version](https://img.shields.io/npm/v/unset-value.svg?style=flat)](https://www.npmjs.com/package/unset-value) [![NPM monthly downloads](https://img.shields.io/npm/dm/unset-value.svg?style=flat)](https://npmjs.org/package/unset-value) [![NPM total downloads](https://img.shields.io/npm/dt/unset-value.svg?style=flat)](https://npmjs.org/package/unset-value) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/unset-value.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/unset-value) + +> Delete nested properties from an object using dot notation. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save unset-value +``` + +## Usage + +```js +var unset = require('unset-value'); + +var obj = {a: {b: {c: 'd', e: 'f'}}}; +unset(obj, 'a.b.c'); +console.log(obj); +//=> {a: {b: {e: 'f'}}}; +``` + +## Examples + +### Updates the object when a property is deleted + +```js +var obj = {a: 'b'}; +unset(obj, 'a'); +console.log(obj); +//=> {} +``` + +### Returns true when a property is deleted + +```js +unset({a: 'b'}, 'a') // true +``` + +### Returns `true` when a property does not exist + +This is consistent with `delete` behavior in that it does not +throw when a property does not exist. + +```js +unset({a: {b: {c: 'd'}}}, 'd') // true +``` + +### delete nested values + +```js +var one = {a: {b: {c: 'd'}}}; +unset(one, 'a.b'); +console.log(one); +//=> {a: {}} + +var two = {a: {b: {c: 'd'}}}; +unset(two, 'a.b.c'); +console.log(two); +//=> {a: {b: {}}} + +var three = {a: {b: {c: 'd', e: 'f'}}}; +unset(three, 'a.b.c'); +console.log(three); +//=> {a: {b: {e: 'f'}}} +``` + +### throws on invalid args + +```js +unset(); +// 'expected an object.' +``` + +## About + +### Related projects + +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (`a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value "Use property paths (`a.b.c`) to get a nested value from an object.") +* [get-values](https://www.npmjs.com/package/get-values): Return an array of all values from the given object. | [homepage](https://github.com/jonschlinkert/get-values "Return an array of all values from the given object.") +* [omit-value](https://www.npmjs.com/package/omit-value): Omit properties from an object or deeply nested property of an object using object path… [more](https://github.com/jonschlinkert/omit-value) | [homepage](https://github.com/jonschlinkert/omit-value "Omit properties from an object or deeply nested property of an object using object path notation.") +* [put-value](https://www.npmjs.com/package/put-value): Update only existing values from an object, works with dot notation paths like `a.b.c` and… [more](https://github.com/tunnckocore/put-value#readme) | [homepage](https://github.com/tunnckocore/put-value#readme "Update only existing values from an object, works with dot notation paths like `a.b.c` and support deep nesting.") +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value "Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths.") +* [union-value](https://www.npmjs.com/package/union-value): Set an array of unique values as the property of an object. Supports setting deeply… [more](https://github.com/jonschlinkert/union-value) | [homepage](https://github.com/jonschlinkert/union-value "Set an array of unique values as the property of an object. Supports setting deeply nested properties using using object-paths/dot notation.") +* [upsert-value](https://www.npmjs.com/package/upsert-value): Update or set nested values and any intermediaries with dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/doowb/upsert-value "Update or set nested values and any intermediaries with dot notation (`'a.b.c'`) paths.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 6 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.4.2, on February 25, 2017._ \ No newline at end of file diff --git a/node_modules/unset-value/index.js b/node_modules/unset-value/index.js new file mode 100644 index 00000000..a9190101 --- /dev/null +++ b/node_modules/unset-value/index.js @@ -0,0 +1,32 @@ +/*! + * unset-value + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isObject = require('isobject'); +var has = require('has-value'); + +module.exports = function unset(obj, prop) { + if (!isObject(obj)) { + throw new TypeError('expected an object.'); + } + if (obj.hasOwnProperty(prop)) { + delete obj[prop]; + return true; + } + + if (has(obj, prop)) { + var segs = prop.split('.'); + var last = segs.pop(); + while (segs.length && segs[segs.length - 1].slice(-1) === '\\') { + last = segs.pop().slice(0, -1) + '.' + last; + } + while (segs.length) obj = obj[prop = segs.shift()]; + return (delete obj[last]); + } + return true; +}; diff --git a/node_modules/unset-value/node_modules/has-value/LICENSE b/node_modules/unset-value/node_modules/has-value/LICENSE new file mode 100644 index 00000000..39245ac1 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/unset-value/node_modules/has-value/README.md b/node_modules/unset-value/node_modules/has-value/README.md new file mode 100644 index 00000000..a927633e --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/README.md @@ -0,0 +1,130 @@ +# has-value [![NPM version](https://img.shields.io/npm/v/has-value.svg?style=flat)](https://www.npmjs.com/package/has-value) [![NPM downloads](https://img.shields.io/npm/dm/has-value.svg?style=flat)](https://npmjs.org/package/has-value) [![Build Status](https://img.shields.io/travis/jonschlinkert/has-value.svg?style=flat)](https://travis-ci.org/jonschlinkert/has-value) + +> Returns true if a value exists, false if empty. Works with deeply nested values using object paths. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install has-value --save +``` + +**Works for:** + +* booleans +* functions +* numbers (pass `true` as the last arg to treat zero as a value instead of falsey) +* strings +* nulls +* object +* arrays + +## Usage + +Works with nested object paths or a single value: + +```js +var hasValue = require('has-value'); + +hasValue({a: {b: {c: 'foo'}}} 'a.b.c'); +//=> true + +hasValue('a'); +//=> true + +hasValue(''); +//=> false + +hasValue(1); +//=> true + +hasValue(0); +//=> false + +hasValue(0, true); // pass `true` as the last arg to treat zero as a value +//=> true + +hasValue({a: 'a'}}); +//=> true + +hasValue({}}); +//=> false + +hasValue(['a']); +//=> true + +hasValue([]); +//=> false + +hasValue(function(foo) {}); // function length/arity +//=> true + +hasValue(function() {}); +//=> false + +hasValue(true); +hasValue(false); +//=> true +``` + +## isEmpty + +To do the opposite and test for empty values, do: + +```js +function isEmpty(o, isZero) { + return !hasValue.apply(hasValue, arguments); +} +``` + +## Related projects + +You might also be interested in these projects: + +* [get-object](https://www.npmjs.com/package/get-object): Get a property from an object using dot (object path) notation. | [homepage](https://github.com/jonschlinkert/get-object) +* [get-property](https://www.npmjs.com/package/get-property): Get a nested property or its value from an object using simple `a.b.c` paths. | [homepage](https://github.com/jonschlinkert/get-property) +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (`a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value) +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value) + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/has-value/issues/new). + +## Building docs + +Generate readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install verb && npm run docs +``` + +Or, if [verb](https://github.com/verbose/verb) is installed globally: + +```sh +$ verb +``` + +## Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +## Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/has-value/blob/master/LICENSE). + +*** + +_This file was generated by [verb](https://github.com/verbose/verb), v, on March 27, 2016._ \ No newline at end of file diff --git a/node_modules/unset-value/node_modules/has-value/index.js b/node_modules/unset-value/node_modules/has-value/index.js new file mode 100644 index 00000000..90687c87 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/index.js @@ -0,0 +1,19 @@ +/*! + * has-value + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var isObject = require('isobject'); +var hasValues = require('has-values'); +var get = require('get-value'); + +module.exports = function(obj, prop, noZero) { + if (isObject(obj)) { + return hasValues(get(obj, prop), noZero); + } + return hasValues(obj, prop); +}; diff --git a/node_modules/unset-value/node_modules/has-value/node_modules/isobject/LICENSE b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/LICENSE new file mode 100644 index 00000000..39245ac1 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/unset-value/node_modules/has-value/node_modules/isobject/README.md b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/README.md new file mode 100644 index 00000000..9dd897aa --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/README.md @@ -0,0 +1,112 @@ +# isobject [![NPM version](https://img.shields.io/npm/v/isobject.svg?style=flat)](https://www.npmjs.com/package/isobject) [![NPM downloads](https://img.shields.io/npm/dm/isobject.svg?style=flat)](https://npmjs.org/package/isobject) [![Build Status](https://img.shields.io/travis/jonschlinkert/isobject.svg?style=flat)](https://travis-ci.org/jonschlinkert/isobject) + +Returns true if the value is an object and not an array or null. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install isobject --save +``` + +Use [is-plain-object](https://github.com/jonschlinkert/is-plain-object) if you want only objects that are created by the `Object` constructor. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install isobject +``` + +Install with [bower](http://bower.io/) + +```sh +$ bower install isobject +``` + +## Usage + +```js +var isObject = require('isobject'); +``` + +**True** + +All of the following return `true`: + +```js +isObject({}); +isObject(Object.create({})); +isObject(Object.create(Object.prototype)); +isObject(Object.create(null)); +isObject({}); +isObject(new Foo); +isObject(/foo/); +``` + +**False** + +All of the following return `false`: + +```js +isObject(); +isObject(function () {}); +isObject(1); +isObject([]); +isObject(undefined); +isObject(null); +``` + +## Related projects + +You might also be interested in these projects: + +[merge-deep](https://www.npmjs.com/package/merge-deep): Recursively merge values in a javascript object. | [homepage](https://github.com/jonschlinkert/merge-deep) + +* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow) +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object) +* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of) + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/isobject/issues/new). + +## Building docs + +Generate readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install verb && npm run docs +``` + +Or, if [verb](https://github.com/verbose/verb) is installed globally: + +```sh +$ verb +``` + +## Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +## Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/isobject/blob/master/LICENSE). + +*** + +_This file was generated by [verb](https://github.com/verbose/verb), v0.9.0, on April 25, 2016._ \ No newline at end of file diff --git a/node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js new file mode 100644 index 00000000..aa0dce0b --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js @@ -0,0 +1,14 @@ +/*! + * isobject + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var isArray = require('isarray'); + +module.exports = function isObject(val) { + return val != null && typeof val === 'object' && isArray(val) === false; +}; diff --git a/node_modules/unset-value/node_modules/has-value/node_modules/isobject/package.json b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/package.json new file mode 100644 index 00000000..954f4113 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/package.json @@ -0,0 +1,67 @@ +{ + "name": "isobject", + "description": "Returns true if the value is an object and not an array or null.", + "version": "2.1.0", + "homepage": "https://github.com/jonschlinkert/isobject", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/isobject", + "bugs": { + "url": "https://github.com/jonschlinkert/isobject/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "isarray": "1.0.0" + }, + "devDependencies": { + "gulp-format-md": "^0.1.9", + "mocha": "^2.4.5" + }, + "keywords": [ + "check", + "is", + "is-object", + "isobject", + "kind", + "kind-of", + "kindof", + "native", + "object", + "type", + "typeof", + "value" + ], + "verb": { + "related": { + "list": [ + "merge-deep", + "extend-shallow", + "is-plain-object", + "kind-of" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "reflinks": [ + "verb" + ] + } +} diff --git a/node_modules/unset-value/node_modules/has-value/package.json b/node_modules/unset-value/node_modules/has-value/package.json new file mode 100644 index 00000000..88ff6edc --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/package.json @@ -0,0 +1,81 @@ +{ + "name": "has-value", + "version": "0.3.1", + "description": "Returns true if a value exists, false if empty. Works with deeply nested values using object paths.", + "homepage": "https://github.com/jonschlinkert/has-value", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/has-value", + "bugs": { + "url": "https://github.com/jonschlinkert/has-value/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "devDependencies": { + "gulp-format-md": "^0.1.7", + "mocha": "^2.4.5" + }, + "keywords": [ + "array", + "boolean", + "empty", + "find", + "function", + "has", + "hasOwn", + "javascript", + "js", + "key", + "keys", + "node.js", + "null", + "number", + "object", + "properties", + "property", + "string", + "type", + "util", + "utilities", + "utility", + "value" + ], + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "get-object", + "get-property", + "get-value", + "set-value" + ] + }, + "reflinks": [ + "verb" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/unset-value/node_modules/has-values/LICENSE b/node_modules/unset-value/node_modules/has-values/LICENSE new file mode 100644 index 00000000..39245ac1 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-values/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/unset-value/node_modules/has-values/README.md b/node_modules/unset-value/node_modules/has-values/README.md new file mode 100644 index 00000000..13319c51 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-values/README.md @@ -0,0 +1,114 @@ +# has-values [![NPM version](https://img.shields.io/npm/v/has-values.svg?style=flat)](https://www.npmjs.com/package/has-values) [![NPM downloads](https://img.shields.io/npm/dm/has-values.svg?style=flat)](https://npmjs.org/package/has-values) [![Build Status](https://img.shields.io/travis/jonschlinkert/has-values.svg?style=flat)](https://travis-ci.org/jonschlinkert/has-values) + +> Returns true if any values exist, false if empty. Works for booleans, functions, numbers, strings, nulls, objects and arrays. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install has-values --save +``` + +## Usage + +```js +var hasValue = require('has-values'); + +hasValue('a'); +//=> true + +hasValue(''); +//=> false + +hasValue(1); +//=> true + +hasValue(0); +//=> false + +hasValue(0, true); // treat zero as a value +//=> true + +hasValue({a: 'a'}}); +//=> true + +hasValue({}}); +//=> false + +hasValue(['a']); +//=> true + +hasValue([]); +//=> false + +hasValue(function(foo) {}); // function length/arity +//=> true + +hasValue(function() {}); +//=> false + +hasValue(true); +hasValue(false); +//=> true +``` + +## isEmpty + +To test for empty values, do: + +```js +function isEmpty(o, isZero) { + return !hasValue(o, isZero); +} +``` + +## Related projects + +You might also be interested in these projects: + +* [has-value](https://www.npmjs.com/package/has-value): Returns true if a value exists, false if empty. Works with deeply nested values using… [more](https://www.npmjs.com/package/has-value) | [homepage](https://github.com/jonschlinkert/has-value) +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object) +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject) + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/has-values/issues/new). + +## Building docs + +Generate readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install verb && npm run docs +``` + +Or, if [verb](https://github.com/verbose/verb) is installed globally: + +```sh +$ verb +``` + +## Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +## Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/has-values/blob/master/LICENSE). + +*** + +_This file was generated by [verb](https://github.com/verbose/verb), v, on March 27, 2016._ \ No newline at end of file diff --git a/node_modules/unset-value/node_modules/has-values/index.js b/node_modules/unset-value/node_modules/has-values/index.js new file mode 100644 index 00000000..6d04ba1f --- /dev/null +++ b/node_modules/unset-value/node_modules/has-values/index.js @@ -0,0 +1,36 @@ +/*! + * has-values + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +module.exports = function hasValue(o, noZero) { + if (o === null || o === undefined) { + return false; + } + + if (typeof o === 'boolean') { + return true; + } + + if (typeof o === 'number') { + if (o === 0 && noZero === true) { + return false; + } + return true; + } + + if (o.length !== undefined) { + return o.length !== 0; + } + + for (var key in o) { + if (o.hasOwnProperty(key)) { + return true; + } + } + return false; +}; diff --git a/node_modules/unset-value/node_modules/has-values/package.json b/node_modules/unset-value/node_modules/has-values/package.json new file mode 100644 index 00000000..519a2c89 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-values/package.json @@ -0,0 +1,75 @@ +{ + "name": "has-values", + "version": "0.1.4", + "description": "Returns true if any values exist, false if empty. Works for booleans, functions, numbers, strings, nulls, objects and arrays. ", + "homepage": "https://github.com/jonschlinkert/has-values", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/has-values", + "bugs": { + "url": "https://github.com/jonschlinkert/has-values/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "gulp-format-md": "^0.1.7", + "mocha": "^2.4.5" + }, + "keywords": [ + "array", + "boolean", + "empty", + "find", + "function", + "has", + "hasOwn", + "javascript", + "js", + "key", + "keys", + "node.js", + "null", + "number", + "object", + "properties", + "property", + "string", + "type", + "util", + "utilities", + "utility", + "value" + ], + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "has-value", + "isobject", + "is-plain-object" + ] + }, + "reflinks": [ + "verb" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/unset-value/package.json b/node_modules/unset-value/package.json new file mode 100644 index 00000000..0753ba6d --- /dev/null +++ b/node_modules/unset-value/package.json @@ -0,0 +1,71 @@ +{ + "name": "unset-value", + "description": "Delete nested properties from an object using dot notation.", + "version": "1.0.0", + "homepage": "https://github.com/jonschlinkert/unset-value", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + " (https://github.com/wtgtybhertgeghgtwtg)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "jonschlinkert/unset-value", + "bugs": { + "url": "https://github.com/jonschlinkert/unset-value/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "devDependencies": { + "gulp-format-md": "^0.1.11", + "mocha": "*", + "should": "*" + }, + "keywords": [ + "del", + "delete", + "key", + "object", + "omit", + "prop", + "property", + "remove", + "unset", + "value" + ], + "verb": { + "related": { + "list": [ + "get-value", + "get-values", + "omit-value", + "put-value", + "set-value", + "union-value", + "upsert-value" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/upath/LICENSE b/node_modules/upath/LICENSE new file mode 100755 index 00000000..77fab240 --- /dev/null +++ b/node_modules/upath/LICENSE @@ -0,0 +1,22 @@ +Copyright(c) 2014-2019 Angelos Pikoulas (agelos.pikoulas@gmail.com) + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/upath/build/code/upath.js b/node_modules/upath/build/code/upath.js new file mode 100644 index 00000000..f0949e13 --- /dev/null +++ b/node_modules/upath/build/code/upath.js @@ -0,0 +1,171 @@ +/** +* upath http://github.com/anodynos/upath/ +* +* A proxy to `path`, replacing `\` with `/` for all results & new methods to normalize & join keeping leading `./` and add, change, default, trim file extensions. +* Version 1.2.0 - Compiled on 2019-09-02 23:33:57 +* Repository git://github.com/anodynos/upath +* Copyright(c) 2019 Angelos Pikoulas +* License MIT +*/ + +// Generated by uRequire v0.7.0-beta.33 target: 'lib' template: 'nodejs' + + +var VERSION = '1.2.0'; // injected by urequire-rc-inject-version + +var extraFn, extraFunctions, isFunction, isString, isValidExt, name, path, propName, propValue, toUnix, upath, slice = [].slice, indexOf = [].indexOf || function (item) { + for (var i = 0, l = this.length; i < l; i++) { + if (i in this && this[i] === item) + return i; + } + return -1; + }, hasProp = {}.hasOwnProperty; +path = require("path"); +isFunction = function (val) { + return val instanceof Function; +}; +isString = function (val) { + return typeof val === "string" || !!val && typeof val === "object" && Object.prototype.toString.call(val) === "[object String]"; +}; +upath = exports; +upath.VERSION = typeof VERSION !== "undefined" && VERSION !== null ? VERSION : "NO-VERSION"; +toUnix = function (p) { + var double; + p = p.replace(/\\/g, "/"); + double = /\/\//; + while (p.match(double)) { + p = p.replace(double, "/"); + } + return p; +}; +for (propName in path) { + propValue = path[propName]; + if (isFunction(propValue)) { + upath[propName] = function (propName) { + return function () { + var args, result; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + args = args.map(function (p) { + if (isString(p)) { + return toUnix(p); + } else { + return p; + } + }); + result = path[propName].apply(path, args); + if (isString(result)) { + return toUnix(result); + } else { + return result; + } + }; + }(propName); + } else { + upath[propName] = propValue; + } +} +upath.sep = "/"; +extraFunctions = { + toUnix: toUnix, + normalizeSafe: function (p) { + p = toUnix(p); + if (p.startsWith("./")) { + if (p.startsWith("./..") || p === "./") { + return upath.normalize(p); + } else { + return "./" + upath.normalize(p); + } + } else { + return upath.normalize(p); + } + }, + normalizeTrim: function (p) { + p = upath.normalizeSafe(p); + if (p.endsWith("/")) { + return p.slice(0, +(p.length - 2) + 1 || 9000000000); + } else { + return p; + } + }, + joinSafe: function () { + var p, result; + p = 1 <= arguments.length ? slice.call(arguments, 0) : []; + result = upath.join.apply(null, p); + if (p[0].startsWith("./") && !result.startsWith("./")) { + result = "./" + result; + } + return result; + }, + addExt: function (file, ext) { + if (!ext) { + return file; + } else { + if (ext[0] !== ".") { + ext = "." + ext; + } + return file + (file.endsWith(ext) ? "" : ext); + } + }, + trimExt: function (filename, ignoreExts, maxSize) { + var oldExt; + if (maxSize == null) { + maxSize = 7; + } + oldExt = upath.extname(filename); + if (isValidExt(oldExt, ignoreExts, maxSize)) { + return filename.slice(0, +(filename.length - oldExt.length - 1) + 1 || 9000000000); + } else { + return filename; + } + }, + removeExt: function (filename, ext) { + if (!ext) { + return filename; + } else { + ext = ext[0] === "." ? ext : "." + ext; + if (upath.extname(filename) === ext) { + return upath.trimExt(filename); + } else { + return filename; + } + } + }, + changeExt: function (filename, ext, ignoreExts, maxSize) { + if (maxSize == null) { + maxSize = 7; + } + return upath.trimExt(filename, ignoreExts, maxSize) + (!ext ? "" : ext[0] === "." ? ext : "." + ext); + }, + defaultExt: function (filename, ext, ignoreExts, maxSize) { + var oldExt; + if (maxSize == null) { + maxSize = 7; + } + oldExt = upath.extname(filename); + if (isValidExt(oldExt, ignoreExts, maxSize)) { + return filename; + } else { + return upath.addExt(filename, ext); + } + } +}; +isValidExt = function (ext, ignoreExts, maxSize) { + if (ignoreExts == null) { + ignoreExts = []; + } + return ext && ext.length <= maxSize && indexOf.call(ignoreExts.map(function (e) { + return (e && e[0] !== "." ? "." : "") + e; + }), ext) < 0; +}; +for (name in extraFunctions) { + if (!hasProp.call(extraFunctions, name)) + continue; + extraFn = extraFunctions[name]; + if (upath[name] !== void 0) { + throw new Error("path." + name + " already exists."); + } else { + upath[name] = extraFn; + } +} + +; \ No newline at end of file diff --git a/node_modules/upath/package.json b/node_modules/upath/package.json new file mode 100644 index 00000000..38f605b5 --- /dev/null +++ b/node_modules/upath/package.json @@ -0,0 +1,60 @@ +{ + "name": "upath", + "description": "A proxy to `path`, replacing `\\` with `/` for all results & new methods to normalize & join keeping leading `./` and add, change, default, trim file extensions.", + "version": "1.2.0", + "homepage": "http://github.com/anodynos/upath/", + "author": { + "name": "Angelos Pikoulas", + "email": "agelos.pikoulas@gmail.com" + }, + "license": "MIT", + "keywords": [ + "path", + "unix", + "windows", + "extension", + "file extension", + "replace extension", + "change extension", + "trim extension", + "add extension", + "default extension" + ], + "repository": { + "type": "git", + "url": "git://github.com/anodynos/upath" + }, + "bugs": { + "url": "http://github.com/anodynos/upath/issues", + "email": "agelos.pikoulas@gmail.com" + }, + "main": "./build/code/upath.js", + "types": "./upath.d.ts", + "preferGlobal": false, + "scripts": { + "test": "grunt", + "build": "grunt lib" + }, + "directories": { + "doc": "./doc", + "dist": "./build" + }, + "engines": { + "node": ">=4", + "yarn": "*" + }, + "devDependencies": { + "chai": "~4.0.2", + "coffee-script": "1.12.6", + "grunt": "0.4.5", + "grunt-contrib-watch": "^1.1.0", + "grunt-urequire": "0.7.x", + "lodash": "^4.17.15", + "mocha": "~3.4.2", + "uberscore": "0.0.19", + "underscore.string": "^3.3.5", + "urequire": "0.7.0-beta.33", + "urequire-ab-specrunner": "^0.2.5", + "urequire-rc-inject-version": "^0.1.6" + } +} diff --git a/node_modules/upath/readme.md b/node_modules/upath/readme.md new file mode 100644 index 00000000..21bd958f --- /dev/null +++ b/node_modules/upath/readme.md @@ -0,0 +1,342 @@ +# upath v1.2.0 + +[![Build Status](https://travis-ci.org/anodynos/upath.svg?branch=master)](https://travis-ci.org/anodynos/upath) +[![Up to date Status](https://david-dm.org/anodynos/upath.png)](https://david-dm.org/anodynos/upath) + +A drop-in replacement / proxy to nodejs's `path` that: + + * Replaces the windows `\` with the unix `/` in all string params & results. This has significant positives - see below. + + * Adds **filename extensions** functions `addExt`, `trimExt`, `removeExt`, `changeExt`, and `defaultExt`. + + * Add a `normalizeSafe` function to preserve any meaningful leading `./` & a `normalizeTrim` which additionally trims any useless ending `/`. + + * Plus a helper `toUnix` that simply converts `\` to `/` and consolidates duplicates. + +**Useful note: these docs are actually auto generated from [specs](https://github.com/anodynos/upath/blob/master/source/spec/upath-spec.coffee), running on Linux.** + +Notes: + + * `upath.sep` is set to `'/'` for seamless replacement (as of 1.0.3). + + * upath has no runtime dependencies, except built-in `path` (as of 1.0.4) + + * travis-ci tested in node versions 4 to 12 + + +## Why ? + +Normal `path` doesn't convert paths to a unified format (ie `/`) before calculating paths (`normalize`, `join`), which can lead to numerous problems. +Also path joining, normalization etc on the two formats is not consistent, depending on where it runs. Running `path` on Windows yields different results than when it runs on Linux / Mac. + +In general, if you code your paths logic while developing on Unix/Mac and it runs on Windows, you may run into problems when using `path`. + +Note that using **Unix `/` on Windows** works perfectly inside nodejs (and other languages), so there's no reason to stick to the Windows legacy at all. + +##### Examples / specs + + +Check out the different (improved) behavior to vanilla `path`: + + `upath.normalize(path)` --returns--> + + ✓ `'c:/windows/nodejs/path'` ---> `'c:/windows/nodejs/path'` // equal to `path.normalize()` + ✓ `'c:/windows/../nodejs/path'` ---> `'c:/nodejs/path'` // equal to `path.normalize()` + ✓ `'c:\\windows\\nodejs\\path'` ---> `'c:/windows/nodejs/path'` // `path.normalize()` gives `'c:\windows\nodejs\path'` + ✓ `'c:\\windows\\..\\nodejs\\path'` ---> `'c:/nodejs/path'` // `path.normalize()` gives `'c:\windows\..\nodejs\path'` + ✓ `'//windows\\unix/mixed'` ---> `'/windows/unix/mixed'` // `path.normalize()` gives `'/windows\unix/mixed'` + ✓ `'\\windows//unix/mixed'` ---> `'/windows/unix/mixed'` // `path.normalize()` gives `'\windows/unix/mixed'` + ✓ `'////\\windows\\..\\unix/mixed/'` ---> `'/unix/mixed/'` // `path.normalize()` gives `'/\windows\..\unix/mixed/'` + + +Joining paths can also be a problem: + + `upath.join(paths...)` --returns--> + + ✓ `'some/nodejs/deep', '../path'` ---> `'some/nodejs/path'` // equal to `path.join()` + ✓ `'some/nodejs\\windows', '../path'` ---> `'some/nodejs/path'` // `path.join()` gives `'some/path'` + ✓ `'some\\windows\\only', '..\\path'` ---> `'some/windows/path'` // `path.join()` gives `'some\windows\only/..\path'` + + +Parsing with `path.parse()` should also be consistent across OSes: + + `upath.parse(path)` --returns--> + + ✓ `'c:\Windows\Directory\somefile.ext'` ---> `{ root: '', dir: 'c:/Windows/Directory', base: 'somefile.ext', ext: '.ext', name: 'somefile' }` + // `path.parse()` gives `'{ root: '', dir: '', base: 'c:\\Windows\\Directory\\somefile.ext', ext: '.ext', name: 'c:\\Windows\\Directory\\somefile' }'` + ✓ `'/root/of/unix/somefile.ext'` ---> `{ root: '/', dir: '/root/of/unix', base: 'somefile.ext', ext: '.ext', name: 'somefile' }` // equal to `path.parse()` + + +## Added functions + + +#### `upath.toUnix(path)` + +Just converts all `` to `/` and consolidates duplicates, without performing any normalization. + +##### Examples / specs + + `upath.toUnix(path)` --returns--> + + ✓ `'.//windows\//unix//mixed////'` ---> `'./windows/unix/mixed/'` + ✓ `'..///windows\..\\unix/mixed'` ---> `'../windows/../unix/mixed'` + + +#### `upath.normalizeSafe(path)` + +Exactly like `path.normalize(path)`, but it keeps the first meaningful `./`. + +Note that the unix `/` is returned everywhere, so windows `\` is always converted to unix `/`. + +##### Examples / specs & how it differs from vanilla `path` + + `upath.normalizeSafe(path)` --returns--> + + ✓ `''` ---> `'.'` // equal to `path.normalize()` + ✓ `'.'` ---> `'.'` // equal to `path.normalize()` + ✓ `'./'` ---> `'./'` // equal to `path.normalize()` + ✓ `'.//'` ---> `'./'` // equal to `path.normalize()` + ✓ `'.\\'` ---> `'./'` // `path.normalize()` gives `'.\'` + ✓ `'.\\//'` ---> `'./'` // `path.normalize()` gives `'.\/'` + ✓ `'./..'` ---> `'..'` // equal to `path.normalize()` + ✓ `'.//..'` ---> `'..'` // equal to `path.normalize()` + ✓ `'./../'` ---> `'../'` // equal to `path.normalize()` + ✓ `'.\\..\\'` ---> `'../'` // `path.normalize()` gives `'.\..\'` + ✓ `'./../dep'` ---> `'../dep'` // equal to `path.normalize()` + ✓ `'../dep'` ---> `'../dep'` // equal to `path.normalize()` + ✓ `'../path/dep'` ---> `'../path/dep'` // equal to `path.normalize()` + ✓ `'../path/../dep'` ---> `'../dep'` // equal to `path.normalize()` + ✓ `'dep'` ---> `'dep'` // equal to `path.normalize()` + ✓ `'path//dep'` ---> `'path/dep'` // equal to `path.normalize()` + ✓ `'./dep'` ---> `'./dep'` // `path.normalize()` gives `'dep'` + ✓ `'./path/dep'` ---> `'./path/dep'` // `path.normalize()` gives `'path/dep'` + ✓ `'./path/../dep'` ---> `'./dep'` // `path.normalize()` gives `'dep'` + ✓ `'.//windows\\unix/mixed/'` ---> `'./windows/unix/mixed/'` // `path.normalize()` gives `'windows\unix/mixed/'` + ✓ `'..//windows\\unix/mixed'` ---> `'../windows/unix/mixed'` // `path.normalize()` gives `'../windows\unix/mixed'` + ✓ `'windows\\unix/mixed/'` ---> `'windows/unix/mixed/'` // `path.normalize()` gives `'windows\unix/mixed/'` + ✓ `'..//windows\\..\\unix/mixed'` ---> `'../unix/mixed'` // `path.normalize()` gives `'../windows\..\unix/mixed'` + + +#### `upath.normalizeTrim(path)` + +Exactly like `path.normalizeSafe(path)`, but it trims any useless ending `/`. + +##### Examples / specs + + `upath.normalizeTrim(path)` --returns--> + + ✓ `'./'` ---> `'.'` // `upath.normalizeSafe()` gives `'./'` + ✓ `'./../'` ---> `'..'` // `upath.normalizeSafe()` gives `'../'` + ✓ `'./../dep/'` ---> `'../dep'` // `upath.normalizeSafe()` gives `'../dep/'` + ✓ `'path//dep\\'` ---> `'path/dep'` // `upath.normalizeSafe()` gives `'path/dep/'` + ✓ `'.//windows\\unix/mixed/'` ---> `'./windows/unix/mixed'` // `upath.normalizeSafe()` gives `'./windows/unix/mixed/'` + + +#### `upath.joinSafe([path1][, path2][, ...])` + +Exactly like `path.join()`, but it keeps the first meaningful `./`. + +Note that the unix `/` is returned everywhere, so windows `\` is always converted to unix `/`. + +##### Examples / specs & how it differs from vanilla `path` + + `upath.joinSafe(path)` --returns--> + + ✓ `'some/nodejs/deep', '../path'` ---> `'some/nodejs/path'` // equal to `path.join()` + ✓ `'./some/local/unix/', '../path'` ---> `'./some/local/path'` // `path.join()` gives `'some/local/path'` + ✓ `'./some\\current\\mixed', '..\\path'` ---> `'./some/current/path'` // `path.join()` gives `'some\current\mixed/..\path'` + ✓ `'../some/relative/destination', '..\\path'` ---> `'../some/relative/path'` // `path.join()` gives `'../some/relative/destination/..\path'` + + +## Added functions for *filename extension* manipulation. + +**Happy notes:** + + In all functions you can: + + * use both `.ext` & `ext` - the dot `.` on the extension is always adjusted correctly. + + * omit the `ext` param (pass null/undefined/empty string) and the common sense thing will happen. + + * ignore specific extensions from being considered as valid ones (eg `.min`, `.dev` `.aLongExtIsNotAnExt` etc), hence no trimming or replacement takes place on them. + + + +#### `upath.addExt(filename, [ext])` + +Adds `.ext` to `filename`, but only if it doesn't already have the exact extension. + +##### Examples / specs + + `upath.addExt(filename, 'js')` --returns--> + + ✓ `'myfile/addExt'` ---> `'myfile/addExt.js'` + ✓ `'myfile/addExt.txt'` ---> `'myfile/addExt.txt.js'` + ✓ `'myfile/addExt.js'` ---> `'myfile/addExt.js'` + ✓ `'myfile/addExt.min.'` ---> `'myfile/addExt.min..js'` + + +It adds nothing if no `ext` param is passed. + + `upath.addExt(filename)` --returns--> + + ✓ `'myfile/addExt'` ---> `'myfile/addExt'` + ✓ `'myfile/addExt.txt'` ---> `'myfile/addExt.txt'` + ✓ `'myfile/addExt.js'` ---> `'myfile/addExt.js'` + ✓ `'myfile/addExt.min.'` ---> `'myfile/addExt.min.'` + + +#### `upath.trimExt(filename, [ignoreExts], [maxSize=7])` + +Trims a filename's extension. + + * Extensions are considered to be up to `maxSize` chars long, counting the dot (defaults to 7). + + * An `Array` of `ignoreExts` (eg `['.min']`) prevents these from being considered as extension, thus are not trimmed. + +##### Examples / specs + + `upath.trimExt(filename)` --returns--> + + ✓ `'my/trimedExt.txt'` ---> `'my/trimedExt'` + ✓ `'my/trimedExt'` ---> `'my/trimedExt'` + ✓ `'my/trimedExt.min'` ---> `'my/trimedExt'` + ✓ `'my/trimedExt.min.js'` ---> `'my/trimedExt.min'` + ✓ `'../my/trimedExt.longExt'` ---> `'../my/trimedExt.longExt'` + + +It is ignoring `.min` & `.dev` as extensions, and considers exts with up to 8 chars. + + `upath.trimExt(filename, ['min', '.dev'], 8)` --returns--> + + ✓ `'my/trimedExt.txt'` ---> `'my/trimedExt'` + ✓ `'my/trimedExt.min'` ---> `'my/trimedExt.min'` + ✓ `'my/trimedExt.dev'` ---> `'my/trimedExt.dev'` + ✓ `'../my/trimedExt.longExt'` ---> `'../my/trimedExt'` + ✓ `'../my/trimedExt.longRExt'` ---> `'../my/trimedExt.longRExt'` + + +#### `upath.removeExt(filename, ext)` + +Removes the specific `ext` extension from filename, if it has it. Otherwise it leaves it as is. +As in all upath functions, it be `.ext` or `ext`. + +##### Examples / specs + + `upath.removeExt(filename, '.js')` --returns--> + + ✓ `'removedExt.js'` ---> `'removedExt'` + ✓ `'removedExt.txt.js'` ---> `'removedExt.txt'` + ✓ `'notRemoved.txt'` ---> `'notRemoved.txt'` + +It does not care about the length of exts. + + `upath.removeExt(filename, '.longExt')` --returns--> + + ✓ `'removedExt.longExt'` ---> `'removedExt'` + ✓ `'removedExt.txt.longExt'` ---> `'removedExt.txt'` + ✓ `'notRemoved.txt'` ---> `'notRemoved.txt'` + + +#### `upath.changeExt(filename, [ext], [ignoreExts], [maxSize=7])` + +Changes a filename's extension to `ext`. If it has no (valid) extension, it adds it. + + * Valid extensions are considered to be up to `maxSize` chars long, counting the dot (defaults to 7). + + * An `Array` of `ignoreExts` (eg `['.min']`) prevents these from being considered as extension, thus are not changed - the new extension is added instead. + +##### Examples / specs + + `upath.changeExt(filename, '.js')` --returns--> + + ✓ `'my/module.min'` ---> `'my/module.js'` + ✓ `'my/module.coffee'` ---> `'my/module.js'` + ✓ `'my/module'` ---> `'my/module.js'` + ✓ `'file/withDot.'` ---> `'file/withDot.js'` + ✓ `'file/change.longExt'` ---> `'file/change.longExt.js'` + + +If no `ext` param is given, it trims the current extension (if any). + + `upath.changeExt(filename)` --returns--> + + ✓ `'my/module.min'` ---> `'my/module'` + ✓ `'my/module.coffee'` ---> `'my/module'` + ✓ `'my/module'` ---> `'my/module'` + ✓ `'file/withDot.'` ---> `'file/withDot'` + ✓ `'file/change.longExt'` ---> `'file/change.longExt'` + + +It is ignoring `.min` & `.dev` as extensions, and considers exts with up to 8 chars. + + `upath.changeExt(filename, 'js', ['min', '.dev'], 8)` --returns--> + + ✓ `'my/module.coffee'` ---> `'my/module.js'` + ✓ `'file/notValidExt.min'` ---> `'file/notValidExt.min.js'` + ✓ `'file/notValidExt.dev'` ---> `'file/notValidExt.dev.js'` + ✓ `'file/change.longExt'` ---> `'file/change.js'` + ✓ `'file/change.longRExt'` ---> `'file/change.longRExt.js'` + + +#### `upath.defaultExt(filename, [ext], [ignoreExts], [maxSize=7])` + +Adds `.ext` to `filename`, only if it doesn't already have _any_ *old* extension. + + * (Old) extensions are considered to be up to `maxSize` chars long, counting the dot (defaults to 7). + + * An `Array` of `ignoreExts` (eg `['.min']`) will force adding default `.ext` even if one of these is present. + +##### Examples / specs + + `upath.defaultExt(filename, 'js')` --returns--> + + ✓ `'fileWith/defaultExt'` ---> `'fileWith/defaultExt.js'` + ✓ `'fileWith/defaultExt.js'` ---> `'fileWith/defaultExt.js'` + ✓ `'fileWith/defaultExt.min'` ---> `'fileWith/defaultExt.min'` + ✓ `'fileWith/defaultExt.longExt'` ---> `'fileWith/defaultExt.longExt.js'` + + +If no `ext` param is passed, it leaves filename intact. + + `upath.defaultExt(filename)` --returns--> + + ✓ `'fileWith/defaultExt'` ---> `'fileWith/defaultExt'` + ✓ `'fileWith/defaultExt.js'` ---> `'fileWith/defaultExt.js'` + ✓ `'fileWith/defaultExt.min'` ---> `'fileWith/defaultExt.min'` + ✓ `'fileWith/defaultExt.longExt'` ---> `'fileWith/defaultExt.longExt'` + + +It is ignoring `.min` & `.dev` as extensions, and considers exts with up to 8 chars. + + `upath.defaultExt(filename, 'js', ['min', '.dev'], 8)` --returns--> + + ✓ `'fileWith/defaultExt'` ---> `'fileWith/defaultExt.js'` + ✓ `'fileWith/defaultExt.min'` ---> `'fileWith/defaultExt.min.js'` + ✓ `'fileWith/defaultExt.dev'` ---> `'fileWith/defaultExt.dev.js'` + ✓ `'fileWith/defaultExt.longExt'` ---> `'fileWith/defaultExt.longExt'` + ✓ `'fileWith/defaultExt.longRext'` ---> `'fileWith/defaultExt.longRext.js'` + + +Copyright(c) 2014-2019 Angelos Pikoulas (agelos.pikoulas@gmail.com) + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/upath/upath.d.ts b/node_modules/upath/upath.d.ts new file mode 100644 index 00000000..778d70a8 --- /dev/null +++ b/node_modules/upath/upath.d.ts @@ -0,0 +1,239 @@ +declare module "upath" { + + /** + * A parsed path object generated by path.parse() or consumed by path.format(). + */ + export interface ParsedPath { + /** + * The root of the path such as '/' or 'c:\' + */ + root: string; + /** + * The full directory path such as '/home/user/dir' or 'c:\path\dir' + */ + dir: string; + /** + * The file name including extension (if any) such as 'index.html' + */ + base: string; + /** + * The file extension (if any) such as '.html' + */ + ext: string; + /** + * The file name without extension (if any) such as 'index' + */ + name: string; + } + + /** + * Version of the library + */ + export var VERSION: string; + + /** + * Just converts all `to/` and consolidates duplicates, without performing any normalization. + * + * @param p string path to convert to unix. + */ + export function toUnix(p: string): string; + + /** + * Exactly like path.normalize(path), but it keeps the first meaningful ./. + * + * Note that the unix / is returned everywhere, so windows \ is always converted to unix /. + * + * @param p string path to normalize. + */ + export function normalizeSafe(p: string): string; + + /** + * Exactly like path.normalizeSafe(path), but it trims any useless ending /. + * + * @param p string path to normalize + */ + export function normalizeTrim(p: string): string; + + /** + * Exactly like path.join(), but it keeps the first meaningful ./. + * + * Note that the unix / is returned everywhere, so windows \ is always converted to unix /. + * + * @param paths string paths to join + */ + export function joinSafe(...p: any[]): string; + + /** + * Adds .ext to filename, but only if it doesn't already have the exact extension. + * + * @param file string filename to add extension to + * @param ext string extension to add + */ + export function addExt(file: string, ext: string): string; + + /** + * Trims a filename's extension. + * + * Extensions are considered to be up to maxSize chars long, counting the dot (defaults to 7). + * + * An Array of ignoreExts (eg ['.min']) prevents these from being considered as extension, thus are not trimmed. + * + * @param filename string filename to trim it's extension + * @param ignoreExts array extensions to ignore + * @param maxSize number max length of the extension + */ + export function trimExt(filename: string, ignoreExts?: string[], maxSize?: number): string; + + /** + * Removes the specific ext extension from filename, if it has it. Otherwise it leaves it as is. As in all upath functions, it be .ext or ext. + * + * @param file string filename to remove extension to + * @param ext string extension to remove + */ + export function removeExt(filename: string, ext: string): string; + + /** + * Changes a filename's extension to ext. If it has no (valid) extension, it adds it. + * + * Valid extensions are considered to be up to maxSize chars long, counting the dot (defaults to 7). + * + * An Array of ignoreExts (eg ['.min']) prevents these from being considered as extension, thus are not changed - the new extension is added instead. + * + * @param filename string filename to change it's extension + * @param ext string extension to change to + * @param ignoreExts array extensions to ignore + * @param maxSize number max length of the extension + */ + export function changeExt(filename: string, ext: string, ignoreExts?: string[], maxSize?: number): string; + + /** + * Adds .ext to filename, only if it doesn't already have any old extension. + * + * (Old) extensions are considered to be up to maxSize chars long, counting the dot (defaults to 7). + * + * An Array of ignoreExts (eg ['.min']) will force adding default .ext even if one of these is present. + * + * @param filename string filename to default to it's extension + * @param ext string extension to default to + * @param ignoreExts array extensions to ignore + * @param maxSize number max length of the extension + */ + export function defaultExt(filename: string, ext: string, ignoreExts?: string[], maxSize?: number): string; + + /** + * Normalize a string path, reducing '..' and '.' parts. + * When multiple slashes are found, they're replaced by a single one; when the path contains a trailing slash, it is preserved. On Windows backslashes are used. + * + * @param p string path to normalize. + */ + export function normalize(p: string): string; + /** + * Join all arguments together and normalize the resulting path. + * Arguments must be strings. In v0.8, non-string arguments were silently ignored. In v0.10 and up, an exception is thrown. + * + * @param paths string paths to join. + */ + export function join(...paths: any[]): string; + /** + * Join all arguments together and normalize the resulting path. + * Arguments must be strings. In v0.8, non-string arguments were silently ignored. In v0.10 and up, an exception is thrown. + * + * @param paths string paths to join. + */ + export function join(...paths: string[]): string; + /** + * The right-most parameter is considered {to}. Other parameters are considered an array of {from}. + * + * Starting from leftmost {from} parameter, resolves {to} to an absolute path. + * + * If {to} isn't already absolute, {from} arguments are prepended in right to left order, until an absolute path is found. If after using all {from} paths still no absolute path is found, the current working directory is used as well. The resulting path is normalized, and trailing slashes are removed unless the path gets resolved to the root directory. + * + * @param pathSegments string paths to join. Non-string arguments are ignored. + */ + export function resolve(...pathSegments: any[]): string; + /** + * Determines whether {path} is an absolute path. An absolute path will always resolve to the same location, regardless of the working directory. + * + * @param path path to test. + */ + export function isAbsolute(path: string): boolean; + /** + * Solve the relative path from {from} to {to}. + * At times we have two absolute paths, and we need to derive the relative path from one to the other. This is actually the reverse transform of path.resolve. + * + * @param from + * @param to + */ + export function relative(from: string, to: string): string; + /** + * Return the directory name of a path. Similar to the Unix dirname command. + * + * @param p the path to evaluate. + */ + export function dirname(p: string): string; + /** + * Return the last portion of a path. Similar to the Unix basename command. + * Often used to extract the file name from a fully qualified path. + * + * @param p the path to evaluate. + * @param ext optionally, an extension to remove from the result. + */ + export function basename(p: string, ext?: string): string; + /** + * Return the extension of the path, from the last '.' to end of string in the last portion of the path. + * If there is no '.' in the last portion of the path or the first character of it is '.', then it returns an empty string + * + * @param p the path to evaluate. + */ + export function extname(p: string): string; + /** + * The platform-specific file separator. '\\' or '/'. + */ + export var sep: string; + /** + * The platform-specific file delimiter. ';' or ':'. + */ + export var delimiter: string; + /** + * Returns an object from a path string - the opposite of format(). + * + * @param pathString path to evaluate. + */ + export function parse(pathString: string): ParsedPath; + /** + * Returns a path string from an object - the opposite of parse(). + * + * @param pathString path to evaluate. + */ + export function format(pathObject: ParsedPath): string; + + export module posix { + export function normalize(p: string): string; + export function join(...paths: any[]): string; + export function resolve(...pathSegments: any[]): string; + export function isAbsolute(p: string): boolean; + export function relative(from: string, to: string): string; + export function dirname(p: string): string; + export function basename(p: string, ext?: string): string; + export function extname(p: string): string; + export var sep: string; + export var delimiter: string; + export function parse(p: string): ParsedPath; + export function format(pP: ParsedPath): string; + } + + export module win32 { + export function normalize(p: string): string; + export function join(...paths: any[]): string; + export function resolve(...pathSegments: any[]): string; + export function isAbsolute(p: string): boolean; + export function relative(from: string, to: string): string; + export function dirname(p: string): string; + export function basename(p: string, ext?: string): string; + export function extname(p: string): string; + export var sep: string; + export var delimiter: string; + export function parse(p: string): ParsedPath; + export function format(pP: ParsedPath): string; + } +} diff --git a/node_modules/uri-js/LICENSE b/node_modules/uri-js/LICENSE new file mode 100755 index 00000000..9338bde8 --- /dev/null +++ b/node_modules/uri-js/LICENSE @@ -0,0 +1,11 @@ +Copyright 2011 Gary Court. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY GARY COURT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court. diff --git a/node_modules/uri-js/README.md b/node_modules/uri-js/README.md new file mode 100755 index 00000000..43e648bb --- /dev/null +++ b/node_modules/uri-js/README.md @@ -0,0 +1,203 @@ +# URI.js + +URI.js is an [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt) compliant, scheme extendable URI parsing/validating/resolving library for all JavaScript environments (browsers, Node.js, etc). +It is also compliant with the IRI ([RFC 3987](http://www.ietf.org/rfc/rfc3987.txt)), IDNA ([RFC 5890](http://www.ietf.org/rfc/rfc5890.txt)), IPv6 Address ([RFC 5952](http://www.ietf.org/rfc/rfc5952.txt)), IPv6 Zone Identifier ([RFC 6874](http://www.ietf.org/rfc/rfc6874.txt)) specifications. + +URI.js has an extensive test suite, and works in all (Node.js, web) environments. It weighs in at 6.4kb (gzipped, 17kb deflated). + +## API + +### Parsing + + URI.parse("uri://user:pass@example.com:123/one/two.three?q1=a1&q2=a2#body"); + //returns: + //{ + // scheme : "uri", + // userinfo : "user:pass", + // host : "example.com", + // port : 123, + // path : "/one/two.three", + // query : "q1=a1&q2=a2", + // fragment : "body" + //} + +### Serializing + + URI.serialize({scheme : "http", host : "example.com", fragment : "footer"}) === "http://example.com/#footer" + +### Resolving + + URI.resolve("uri://a/b/c/d?q", "../../g") === "uri://a/g" + +### Normalizing + + URI.normalize("HTTP://ABC.com:80/%7Esmith/home.html") === "http://abc.com/~smith/home.html" + +### Comparison + + URI.equal("example://a/b/c/%7Bfoo%7D", "eXAMPLE://a/./b/../b/%63/%7bfoo%7d") === true + +### IP Support + + //IPv4 normalization + URI.normalize("//192.068.001.000") === "//192.68.1.0" + + //IPv6 normalization + URI.normalize("//[2001:0:0DB8::0:0001]") === "//[2001:0:db8::1]" + + //IPv6 zone identifier support + URI.parse("//[2001:db8::7%25en1]"); + //returns: + //{ + // host : "2001:db8::7%en1" + //} + +### IRI Support + + //convert IRI to URI + URI.serialize(URI.parse("http://examplé.org/rosé")) === "http://xn--exampl-gva.org/ros%C3%A9" + //convert URI to IRI + URI.serialize(URI.parse("http://xn--exampl-gva.org/ros%C3%A9"), {iri:true}) === "http://examplé.org/rosé" + +### Options + +All of the above functions can accept an additional options argument that is an object that can contain one or more of the following properties: + +* `scheme` (string) + + Indicates the scheme that the URI should be treated as, overriding the URI's normal scheme parsing behavior. + +* `reference` (string) + + If set to `"suffix"`, it indicates that the URI is in the suffix format, and the validator will use the option's `scheme` property to determine the URI's scheme. + +* `tolerant` (boolean, false) + + If set to `true`, the parser will relax URI resolving rules. + +* `absolutePath` (boolean, false) + + If set to `true`, the serializer will not resolve a relative `path` component. + +* `iri` (boolean, false) + + If set to `true`, the serializer will unescape non-ASCII characters as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt). + +* `unicodeSupport` (boolean, false) + + If set to `true`, the parser will unescape non-ASCII characters in the parsed output as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt). + +* `domainHost` (boolean, false) + + If set to `true`, the library will treat the `host` component as a domain name, and convert IDNs (International Domain Names) as per [RFC 5891](http://www.ietf.org/rfc/rfc5891.txt). + +## Scheme Extendable + +URI.js supports inserting custom [scheme](http://en.wikipedia.org/wiki/URI_scheme) dependent processing rules. Currently, URI.js has built in support for the following schemes: + +* http \[[RFC 2616](http://www.ietf.org/rfc/rfc2616.txt)\] +* https \[[RFC 2818](http://www.ietf.org/rfc/rfc2818.txt)\] +* ws \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\] +* wss \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\] +* mailto \[[RFC 6068](http://www.ietf.org/rfc/rfc6068.txt)\] +* urn \[[RFC 2141](http://www.ietf.org/rfc/rfc2141.txt)\] +* urn:uuid \[[RFC 4122](http://www.ietf.org/rfc/rfc4122.txt)\] + +### HTTP/HTTPS Support + + URI.equal("HTTP://ABC.COM:80", "http://abc.com/") === true + URI.equal("https://abc.com", "HTTPS://ABC.COM:443/") === true + +### WS/WSS Support + + URI.parse("wss://example.com/foo?bar=baz"); + //returns: + //{ + // scheme : "wss", + // host: "example.com", + // resourceName: "/foo?bar=baz", + // secure: true, + //} + + URI.equal("WS://ABC.COM:80/chat#one", "ws://abc.com/chat") === true + +### Mailto Support + + URI.parse("mailto:alpha@example.com,bravo@example.com?subject=SUBSCRIBE&body=Sign%20me%20up!"); + //returns: + //{ + // scheme : "mailto", + // to : ["alpha@example.com", "bravo@example.com"], + // subject : "SUBSCRIBE", + // body : "Sign me up!" + //} + + URI.serialize({ + scheme : "mailto", + to : ["alpha@example.com"], + subject : "REMOVE", + body : "Please remove me", + headers : { + cc : "charlie@example.com" + } + }) === "mailto:alpha@example.com?cc=charlie@example.com&subject=REMOVE&body=Please%20remove%20me" + +### URN Support + + URI.parse("urn:example:foo"); + //returns: + //{ + // scheme : "urn", + // nid : "example", + // nss : "foo", + //} + +#### URN UUID Support + + URI.parse("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"); + //returns: + //{ + // scheme : "urn", + // nid : "uuid", + // uuid : "f81d4fae-7dec-11d0-a765-00a0c91e6bf6", + //} + +## Usage + +To load in a browser, use the following tag: + + + +To load in a CommonJS/Module environment, first install with npm/yarn by running on the command line: + + npm install uri-js + # OR + yarn add uri-js + +Then, in your code, load it using: + + const URI = require("uri-js"); + +If you are writing your code in ES6+ (ESNEXT) or TypeScript, you would load it using: + + import * as URI from "uri-js"; + +Or you can load just what you need using named exports: + + import { parse, serialize, resolve, resolveComponents, normalize, equal, removeDotSegments, pctEncChar, pctDecChars, escapeComponent, unescapeComponent } from "uri-js"; + +## Breaking changes + +### Breaking changes from 3.x + +URN parsing has been completely changed to better align with the specification. Scheme is now always `urn`, but has two new properties: `nid` which contains the Namspace Identifier, and `nss` which contains the Namespace Specific String. The `nss` property will be removed by higher order scheme handlers, such as the UUID URN scheme handler. + +The UUID of a URN can now be found in the `uuid` property. + +### Breaking changes from 2.x + +URI validation has been removed as it was slow, exposed a vulnerabilty, and was generally not useful. + +### Breaking changes from 1.x + +The `errors` array on parsed components is now an `error` string. diff --git a/node_modules/uri-js/dist/es5/uri.all.d.ts b/node_modules/uri-js/dist/es5/uri.all.d.ts new file mode 100755 index 00000000..da51e235 --- /dev/null +++ b/node_modules/uri-js/dist/es5/uri.all.d.ts @@ -0,0 +1,59 @@ +export interface URIComponents { + scheme?: string; + userinfo?: string; + host?: string; + port?: number | string; + path?: string; + query?: string; + fragment?: string; + reference?: string; + error?: string; +} +export interface URIOptions { + scheme?: string; + reference?: string; + tolerant?: boolean; + absolutePath?: boolean; + iri?: boolean; + unicodeSupport?: boolean; + domainHost?: boolean; +} +export interface URISchemeHandler { + scheme: string; + parse(components: ParentComponents, options: Options): Components; + serialize(components: Components, options: Options): ParentComponents; + unicodeSupport?: boolean; + domainHost?: boolean; + absolutePath?: boolean; +} +export interface URIRegExps { + NOT_SCHEME: RegExp; + NOT_USERINFO: RegExp; + NOT_HOST: RegExp; + NOT_PATH: RegExp; + NOT_PATH_NOSCHEME: RegExp; + NOT_QUERY: RegExp; + NOT_FRAGMENT: RegExp; + ESCAPE: RegExp; + UNRESERVED: RegExp; + OTHER_CHARS: RegExp; + PCT_ENCODED: RegExp; + IPV4ADDRESS: RegExp; + IPV6ADDRESS: RegExp; +} +export declare const SCHEMES: { + [scheme: string]: URISchemeHandler; +}; +export declare function pctEncChar(chr: string): string; +export declare function pctDecChars(str: string): string; +export declare function parse(uriString: string, options?: URIOptions): URIComponents; +export declare function removeDotSegments(input: string): string; +export declare function serialize(components: URIComponents, options?: URIOptions): string; +export declare function resolveComponents(base: URIComponents, relative: URIComponents, options?: URIOptions, skipNormalization?: boolean): URIComponents; +export declare function resolve(baseURI: string, relativeURI: string, options?: URIOptions): string; +export declare function normalize(uri: string, options?: URIOptions): string; +export declare function normalize(uri: URIComponents, options?: URIOptions): URIComponents; +export declare function equal(uriA: string, uriB: string, options?: URIOptions): boolean; +export declare function equal(uriA: URIComponents, uriB: URIComponents, options?: URIOptions): boolean; +export declare function escapeComponent(str: string, options?: URIOptions): string; +export declare function unescapeComponent(str: string, options?: URIOptions): string; diff --git a/node_modules/uri-js/dist/es5/uri.all.js b/node_modules/uri-js/dist/es5/uri.all.js new file mode 100755 index 00000000..0706116f --- /dev/null +++ b/node_modules/uri-js/dist/es5/uri.all.js @@ -0,0 +1,1443 @@ +/** @license URI.js v4.4.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.URI = global.URI || {}))); +}(this, (function (exports) { 'use strict'; + +function merge() { + for (var _len = arguments.length, sets = Array(_len), _key = 0; _key < _len; _key++) { + sets[_key] = arguments[_key]; + } + + if (sets.length > 1) { + sets[0] = sets[0].slice(0, -1); + var xl = sets.length - 1; + for (var x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } else { + return sets[0]; + } +} +function subexp(str) { + return "(?:" + str + ")"; +} +function typeOf(o) { + return o === undefined ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase(); +} +function toUpperCase(str) { + return str.toUpperCase(); +} +function toArray(obj) { + return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : []; +} +function assign(target, source) { + var obj = target; + if (source) { + for (var key in source) { + obj[key] = source[key]; + } + } + return obj; +} + +function buildExps(isIRI) { + var ALPHA$$ = "[A-Za-z]", + CR$ = "[\\x0D]", + DIGIT$$ = "[0-9]", + DQUOTE$$ = "[\\x22]", + HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), + //case-insensitive + LF$$ = "[\\x0A]", + SP$$ = "[\\x20]", + PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), + //expanded + GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", + SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", + RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), + UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", + //subset, excludes bidi control characters + IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", + //subset + UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), + SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), + USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), + DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), + DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), + //relaxed parsing rules + IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), + H16$ = subexp(HEXDIG$$ + "{1,4}"), + LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), + IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), + // 6( h16 ":" ) ls32 + IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), + // "::" 5( h16 ":" ) ls32 + IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), + //[ h16 ] "::" 4( h16 ":" ) ls32 + IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), + //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), + //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), + //[ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), + //[ *4( h16 ":" ) h16 ] "::" ls32 + IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), + //[ *5( h16 ":" ) h16 ] "::" h16 + IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), + //[ *6( h16 ":" ) h16 ] "::" + IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), + ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), + //RFC 6874 + IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), + //RFC 6874 + IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), + //RFC 6874, with relaxed parsing rules + IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), + IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), + //RFC 6874 + REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), + HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), + PORT$ = subexp(DIGIT$$ + "*"), + AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), + PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), + SEGMENT$ = subexp(PCHAR$ + "*"), + SEGMENT_NZ$ = subexp(PCHAR$ + "+"), + SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), + PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), + PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), + //simplified + PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), + //simplified + PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), + //simplified + PATH_EMPTY$ = "(?!" + PCHAR$ + ")", + PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), + FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), + HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), + RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), + ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), + GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", + SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"; + return { + NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), + NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED: new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"), + IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"), + IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules + }; +} +var URI_PROTOCOL = buildExps(false); + +var IRI_PROTOCOL = buildExps(true); + +var slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; +}(); + + + + + + + + + + + + + +var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } +}; + +/** Highest positive signed 32-bit float value */ + +var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +var base = 36; +var tMin = 1; +var tMax = 26; +var skew = 38; +var damp = 700; +var initialBias = 72; +var initialN = 128; // 0x80 +var delimiter = '-'; // '\x2D' + +/** Regular expressions */ +var regexPunycode = /^xn--/; +var regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +var errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +var baseMinusTMin = base - tMin; +var floor = Math.floor; +var stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error$1(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + var result = []; + var length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + var output = []; + var counter = 0; + var length = string.length; + while (counter < length) { + var value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + var extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { + // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +var ucs2encode = function ucs2encode(array) { + return String.fromCodePoint.apply(String, toConsumableArray(array)); +}; + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +var basicToDigit = function basicToDigit(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +var digitToBasic = function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +var adapt = function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +var decode = function decode(input) { + // Don't use UCS-2. + var output = []; + var inputLength = input.length; + var i = 0; + var n = initialN; + var bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + var basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (var j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error$1('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{ + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + var oldi = i; + for (var w = 1, k = base;; /* no condition */k += base) { + + if (index >= inputLength) { + error$1('invalid-input'); + } + + var digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error$1('overflow'); + } + + i += digit * w; + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + + if (digit < t) { + break; + } + + var baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error$1('overflow'); + } + + w *= baseMinusT; + } + + var out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error$1('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + } + + return String.fromCodePoint.apply(String, output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +var encode = function encode(input) { + var output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + var inputLength = input.length; + + // Initialize the state. + var n = initialN; + var delta = 0; + var bias = initialBias; + + // Handle the basic code points. + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _currentValue2 = _step.value; + + if (_currentValue2 < 0x80) { + output.push(stringFromCharCode(_currentValue2)); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + var basicLength = output.length; + var handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + var m = maxInt; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var currentValue = _step2.value; + + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + var handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error$1('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var _currentValue = _step3.value; + + if (_currentValue < n && ++delta > maxInt) { + error$1('overflow'); + } + if (_currentValue == n) { + // Represent delta as a generalized variable-length integer. + var q = delta; + for (var k = base;; /* no condition */k += base) { + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (q < t) { + break; + } + var qMinusT = q - t; + var baseMinusT = base - t; + output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3.return) { + _iterator3.return(); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + ++delta; + ++n; + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +var toUnicode = function toUnicode(input) { + return mapDomain(input, function (string) { + return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +var toASCII = function toASCII(input) { + return mapDomain(input, function (string) { + return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +var punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @see http://github.com/garycourt/uri-js + */ +/** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + */ +var SCHEMES = {}; +function pctEncChar(chr) { + var c = chr.charCodeAt(0); + var e = void 0; + if (c < 16) e = "%0" + c.toString(16).toUpperCase();else if (c < 128) e = "%" + c.toString(16).toUpperCase();else if (c < 2048) e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();else e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase(); + return e; +} +function pctDecChars(str) { + var newStr = ""; + var i = 0; + var il = str.length; + while (i < il) { + var c = parseInt(str.substr(i + 1, 2), 16); + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } else if (c >= 194 && c < 224) { + if (il - i >= 6) { + var c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode((c & 31) << 6 | c2 & 63); + } else { + newStr += str.substr(i, 6); + } + i += 6; + } else if (c >= 224) { + if (il - i >= 9) { + var _c = parseInt(str.substr(i + 4, 2), 16); + var c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63); + } else { + newStr += str.substr(i, 9); + } + i += 9; + } else { + newStr += str.substr(i, 3); + i += 3; + } + } + return newStr; +} +function _normalizeComponentEncoding(components, protocol) { + function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return !decStr.match(protocol.UNRESERVED) ? str : decStr; + } + if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, ""); + if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + return components; +} + +function _stripLeadingZeros(str) { + return str.replace(/^0*(.*)/, "$1") || "0"; +} +function _normalizeIPv4(host, protocol) { + var matches = host.match(protocol.IPV4ADDRESS) || []; + + var _matches = slicedToArray(matches, 2), + address = _matches[1]; + + if (address) { + return address.split(".").map(_stripLeadingZeros).join("."); + } else { + return host; + } +} +function _normalizeIPv6(host, protocol) { + var matches = host.match(protocol.IPV6ADDRESS) || []; + + var _matches2 = slicedToArray(matches, 3), + address = _matches2[1], + zone = _matches2[2]; + + if (address) { + var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(), + _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2), + last = _address$toLowerCase$2[0], + first = _address$toLowerCase$2[1]; + + var firstFields = first ? first.split(":").map(_stripLeadingZeros) : []; + var lastFields = last.split(":").map(_stripLeadingZeros); + var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]); + var fieldCount = isLastFieldIPv4Address ? 7 : 8; + var lastFieldsStart = lastFields.length - fieldCount; + var fields = Array(fieldCount); + for (var x = 0; x < fieldCount; ++x) { + fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || ''; + } + if (isLastFieldIPv4Address) { + fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol); + } + var allZeroFields = fields.reduce(function (acc, field, index) { + if (!field || field === "0") { + var lastLongest = acc[acc.length - 1]; + if (lastLongest && lastLongest.index + lastLongest.length === index) { + lastLongest.length++; + } else { + acc.push({ index: index, length: 1 }); + } + } + return acc; + }, []); + var longestZeroFields = allZeroFields.sort(function (a, b) { + return b.length - a.length; + })[0]; + var newHost = void 0; + if (longestZeroFields && longestZeroFields.length > 1) { + var newFirst = fields.slice(0, longestZeroFields.index); + var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length); + newHost = newFirst.join(":") + "::" + newLast.join(":"); + } else { + newHost = fields.join(":"); + } + if (zone) { + newHost += "%" + zone; + } + return newHost; + } else { + return host; + } +} +var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i; +var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === undefined; +function parse(uriString) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var components = {}; + var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; + if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + var matches = uriString.match(URI_PARSE); + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + components.userinfo = matches[3]; + components.host = matches[4]; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = matches[7]; + components.fragment = matches[8]; + //fix port number + if (isNaN(components.port)) { + components.port = matches[5]; + } + } else { + //IE FIX for improper RegExp matching + //store each component + components.scheme = matches[1] || undefined; + components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : undefined; + components.host = uriString.indexOf("//") !== -1 ? matches[4] : undefined; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = uriString.indexOf("?") !== -1 ? matches[7] : undefined; + components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : undefined; + //fix port number + if (isNaN(components.port)) { + components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined; + } + } + if (components.host) { + //normalize IP hosts + components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol); + } + //determine reference type + if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) { + components.reference = "same-document"; + } else if (components.scheme === undefined) { + components.reference = "relative"; + } else if (components.fragment === undefined) { + components.reference = "absolute"; + } else { + components.reference = "uri"; + } + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.error = components.error || "URI is not a " + options.reference + " reference."; + } + //find scheme handler + var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //check if scheme can't handle IRIs + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + //if host component is a domain name + if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) { + //convert Unicode IDN -> ASCII IDN + try { + components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; + } + } + //convert IRI -> URI + _normalizeComponentEncoding(components, URI_PROTOCOL); + } else { + //normalize encodings + _normalizeComponentEncoding(components, protocol); + } + //perform scheme specific parsing + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } else { + components.error = components.error || "URI can not be parsed."; + } + return components; +} + +function _recomposeAuthority(components, options) { + var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; + var uriTokens = []; + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo); + uriTokens.push("@"); + } + if (components.host !== undefined) { + //normalize IP hosts, add brackets and escape zone separator for IPv6 + uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) { + return "[" + $1 + ($2 ? "%25" + $2 : "") + "]"; + })); + } + if (typeof components.port === "number" || typeof components.port === "string") { + uriTokens.push(":"); + uriTokens.push(String(components.port)); + } + return uriTokens.length ? uriTokens.join("") : undefined; +} + +var RDS1 = /^\.\.?\//; +var RDS2 = /^\/\.(\/|$)/; +var RDS3 = /^\/\.\.(\/|$)/; +var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/; +function removeDotSegments(input) { + var output = []; + while (input.length) { + if (input.match(RDS1)) { + input = input.replace(RDS1, ""); + } else if (input.match(RDS2)) { + input = input.replace(RDS2, "/"); + } else if (input.match(RDS3)) { + input = input.replace(RDS3, "/"); + output.pop(); + } else if (input === "." || input === "..") { + input = ""; + } else { + var im = input.match(RDS5); + if (im) { + var s = im[0]; + input = input.slice(s.length); + output.push(s); + } else { + throw new Error("Unexpected dot segment condition"); + } + } + } + return output.join(""); +} + +function serialize(components) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL; + var uriTokens = []; + //find scheme handler + var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //perform scheme specific serialization + if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options); + if (components.host) { + //if host component is an IPv6 address + if (protocol.IPV6ADDRESS.test(components.host)) {} + //TODO: normalize IPv6 address as per RFC 5952 + + //if host component is a domain name + else if (options.domainHost || schemeHandler && schemeHandler.domainHost) { + //convert IDN via punycode + try { + components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + } + //normalize encoding + _normalizeComponentEncoding(components, protocol); + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme); + uriTokens.push(":"); + } + var authority = _recomposeAuthority(components, options); + if (authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + if (components.path !== undefined) { + var s = components.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + uriTokens.push(s); + } + if (components.query !== undefined) { + uriTokens.push("?"); + uriTokens.push(components.query); + } + if (components.fragment !== undefined) { + uriTokens.push("#"); + uriTokens.push(components.fragment); + } + return uriTokens.join(""); //merge tokens into a string +} + +function resolveComponents(base, relative) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var skipNormalization = arguments[3]; + + var target = {}; + if (!skipNormalization) { + base = parse(serialize(base, options), options); //normalize base components + relative = parse(serialize(relative, options), options); //normalize relative components + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) { + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== undefined) { + target.query = relative.query; + } else { + target.query = base.query; + } + } else { + if (relative.path.charAt(0) === "/") { + target.path = removeDotSegments(relative.path); + } else { + if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) { + target.path = "/" + relative.path; + } else if (!base.path) { + target.path = relative.path; + } else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + //target.authority = base.authority; + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; +} + +function resolve(baseURI, relativeURI, options) { + var schemelessOptions = assign({ scheme: 'null' }, options); + return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions); +} + +function normalize(uri, options) { + if (typeof uri === "string") { + uri = serialize(parse(uri, options), options); + } else if (typeOf(uri) === "object") { + uri = parse(serialize(uri, options), options); + } + return uri; +} + +function equal(uriA, uriB, options) { + if (typeof uriA === "string") { + uriA = serialize(parse(uriA, options), options); + } else if (typeOf(uriA) === "object") { + uriA = serialize(uriA, options); + } + if (typeof uriB === "string") { + uriB = serialize(parse(uriB, options), options); + } else if (typeOf(uriB) === "object") { + uriB = serialize(uriB, options); + } + return uriA === uriB; +} + +function escapeComponent(str, options) { + return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar); +} + +function unescapeComponent(str, options) { + return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars); +} + +var handler = { + scheme: "http", + domainHost: true, + parse: function parse(components, options) { + //report missing host + if (!components.host) { + components.error = components.error || "HTTP URIs must have a host."; + } + return components; + }, + serialize: function serialize(components, options) { + var secure = String(components.scheme).toLowerCase() === "https"; + //normalize the default port + if (components.port === (secure ? 443 : 80) || components.port === "") { + components.port = undefined; + } + //normalize the empty path + if (!components.path) { + components.path = "/"; + } + //NOTE: We do not parse query strings for HTTP URIs + //as WWW Form Url Encoded query strings are part of the HTML4+ spec, + //and not the HTTP spec. + return components; + } +}; + +var handler$1 = { + scheme: "https", + domainHost: handler.domainHost, + parse: handler.parse, + serialize: handler.serialize +}; + +function isSecure(wsComponents) { + return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss"; +} +//RFC 6455 +var handler$2 = { + scheme: "ws", + domainHost: true, + parse: function parse(components, options) { + var wsComponents = components; + //indicate if the secure flag is set + wsComponents.secure = isSecure(wsComponents); + //construct resouce name + wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : ''); + wsComponents.path = undefined; + wsComponents.query = undefined; + return wsComponents; + }, + serialize: function serialize(wsComponents, options) { + //normalize the default port + if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") { + wsComponents.port = undefined; + } + //ensure scheme matches secure flag + if (typeof wsComponents.secure === 'boolean') { + wsComponents.scheme = wsComponents.secure ? 'wss' : 'ws'; + wsComponents.secure = undefined; + } + //reconstruct path from resource name + if (wsComponents.resourceName) { + var _wsComponents$resourc = wsComponents.resourceName.split('?'), + _wsComponents$resourc2 = slicedToArray(_wsComponents$resourc, 2), + path = _wsComponents$resourc2[0], + query = _wsComponents$resourc2[1]; + + wsComponents.path = path && path !== '/' ? path : undefined; + wsComponents.query = query; + wsComponents.resourceName = undefined; + } + //forbid fragment component + wsComponents.fragment = undefined; + return wsComponents; + } +}; + +var handler$3 = { + scheme: "wss", + domainHost: handler$2.domainHost, + parse: handler$2.parse, + serialize: handler$2.serialize +}; + +var O = {}; +var isIRI = true; +//RFC 3986 +var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; +var HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive +var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded +//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = +//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127) +//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext +//const VCHAR$$ = "[\\x21-\\x7E]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext +//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"); +//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$); +//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'); +var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; +var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; +var VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"); +var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; +var UNRESERVED = new RegExp(UNRESERVED$$, "g"); +var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); +var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); +var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); +var NOT_HFVALUE = NOT_HFNAME; +function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return !decStr.match(UNRESERVED) ? str : decStr; +} +var handler$4 = { + scheme: "mailto", + parse: function parse$$1(components, options) { + var mailtoComponents = components; + var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : []; + mailtoComponents.path = undefined; + if (mailtoComponents.query) { + var unknownHeaders = false; + var headers = {}; + var hfields = mailtoComponents.query.split("&"); + for (var x = 0, xl = hfields.length; x < xl; ++x) { + var hfield = hfields[x].split("="); + switch (hfield[0]) { + case "to": + var toAddrs = hfield[1].split(","); + for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) { + to.push(toAddrs[_x]); + } + break; + case "subject": + mailtoComponents.subject = unescapeComponent(hfield[1], options); + break; + case "body": + mailtoComponents.body = unescapeComponent(hfield[1], options); + break; + default: + unknownHeaders = true; + headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); + break; + } + } + if (unknownHeaders) mailtoComponents.headers = headers; + } + mailtoComponents.query = undefined; + for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) { + var addr = to[_x2].split("@"); + addr[0] = unescapeComponent(addr[0]); + if (!options.unicodeSupport) { + //convert Unicode IDN -> ASCII IDN + try { + addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); + } catch (e) { + mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; + } + } else { + addr[1] = unescapeComponent(addr[1], options).toLowerCase(); + } + to[_x2] = addr.join("@"); + } + return mailtoComponents; + }, + serialize: function serialize$$1(mailtoComponents, options) { + var components = mailtoComponents; + var to = toArray(mailtoComponents.to); + if (to) { + for (var x = 0, xl = to.length; x < xl; ++x) { + var toAddr = String(to[x]); + var atIdx = toAddr.lastIndexOf("@"); + var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); + var domain = toAddr.slice(atIdx + 1); + //convert IDN via punycode + try { + domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain); + } catch (e) { + components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + to[x] = localPart + "@" + domain; + } + components.path = to.join(","); + } + var headers = mailtoComponents.headers = mailtoComponents.headers || {}; + if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject; + if (mailtoComponents.body) headers["body"] = mailtoComponents.body; + var fields = []; + for (var name in headers) { + if (headers[name] !== O[name]) { + fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)); + } + } + if (fields.length) { + components.query = fields.join("&"); + } + return components; + } +}; + +var URN_PARSE = /^([^\:]+)\:(.*)/; +//RFC 2141 +var handler$5 = { + scheme: "urn", + parse: function parse$$1(components, options) { + var matches = components.path && components.path.match(URN_PARSE); + var urnComponents = components; + if (matches) { + var scheme = options.scheme || urnComponents.scheme || "urn"; + var nid = matches[1].toLowerCase(); + var nss = matches[2]; + var urnScheme = scheme + ":" + (options.nid || nid); + var schemeHandler = SCHEMES[urnScheme]; + urnComponents.nid = nid; + urnComponents.nss = nss; + urnComponents.path = undefined; + if (schemeHandler) { + urnComponents = schemeHandler.parse(urnComponents, options); + } + } else { + urnComponents.error = urnComponents.error || "URN can not be parsed."; + } + return urnComponents; + }, + serialize: function serialize$$1(urnComponents, options) { + var scheme = options.scheme || urnComponents.scheme || "urn"; + var nid = urnComponents.nid; + var urnScheme = scheme + ":" + (options.nid || nid); + var schemeHandler = SCHEMES[urnScheme]; + if (schemeHandler) { + urnComponents = schemeHandler.serialize(urnComponents, options); + } + var uriComponents = urnComponents; + var nss = urnComponents.nss; + uriComponents.path = (nid || options.nid) + ":" + nss; + return uriComponents; + } +}; + +var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; +//RFC 4122 +var handler$6 = { + scheme: "urn:uuid", + parse: function parse(urnComponents, options) { + var uuidComponents = urnComponents; + uuidComponents.uuid = uuidComponents.nss; + uuidComponents.nss = undefined; + if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) { + uuidComponents.error = uuidComponents.error || "UUID is not valid."; + } + return uuidComponents; + }, + serialize: function serialize(uuidComponents, options) { + var urnComponents = uuidComponents; + //normalize UUID + urnComponents.nss = (uuidComponents.uuid || "").toLowerCase(); + return urnComponents; + } +}; + +SCHEMES[handler.scheme] = handler; +SCHEMES[handler$1.scheme] = handler$1; +SCHEMES[handler$2.scheme] = handler$2; +SCHEMES[handler$3.scheme] = handler$3; +SCHEMES[handler$4.scheme] = handler$4; +SCHEMES[handler$5.scheme] = handler$5; +SCHEMES[handler$6.scheme] = handler$6; + +exports.SCHEMES = SCHEMES; +exports.pctEncChar = pctEncChar; +exports.pctDecChars = pctDecChars; +exports.parse = parse; +exports.removeDotSegments = removeDotSegments; +exports.serialize = serialize; +exports.resolveComponents = resolveComponents; +exports.resolve = resolve; +exports.normalize = normalize; +exports.equal = equal; +exports.escapeComponent = escapeComponent; +exports.unescapeComponent = unescapeComponent; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=uri.all.js.map diff --git a/node_modules/uri-js/dist/es5/uri.all.js.map b/node_modules/uri-js/dist/es5/uri.all.js.map new file mode 100755 index 00000000..5b30c4e2 --- /dev/null +++ b/node_modules/uri-js/dist/es5/uri.all.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uri.all.js","sources":["../../src/index.ts","../../src/schemes/urn-uuid.ts","../../src/schemes/urn.ts","../../src/schemes/mailto.ts","../../src/schemes/wss.ts","../../src/schemes/ws.ts","../../src/schemes/https.ts","../../src/schemes/http.ts","../../src/uri.ts","../../node_modules/punycode/punycode.es6.js","../../src/regexps-iri.ts","../../src/regexps-uri.ts","../../src/util.ts"],"sourcesContent":["import { SCHEMES } from \"./uri\";\n\nimport http from \"./schemes/http\";\nSCHEMES[http.scheme] = http;\n\nimport https from \"./schemes/https\";\nSCHEMES[https.scheme] = https;\n\nimport ws from \"./schemes/ws\";\nSCHEMES[ws.scheme] = ws;\n\nimport wss from \"./schemes/wss\";\nSCHEMES[wss.scheme] = wss;\n\nimport mailto from \"./schemes/mailto\";\nSCHEMES[mailto.scheme] = mailto;\n\nimport urn from \"./schemes/urn\";\nSCHEMES[urn.scheme] = urn;\n\nimport uuid from \"./schemes/urn-uuid\";\nSCHEMES[uuid.scheme] = uuid;\n\nexport * from \"./uri\";\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { URNComponents } from \"./urn\";\nimport { SCHEMES } from \"../uri\";\n\nexport interface UUIDComponents extends URNComponents {\n\tuuid?: string;\n}\n\nconst UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\nconst UUID_PARSE = /^[0-9A-Fa-f\\-]{36}/;\n\n//RFC 4122\nconst handler:URISchemeHandler = {\n\tscheme : \"urn:uuid\",\n\n\tparse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents {\n\t\tconst uuidComponents = urnComponents as UUIDComponents;\n\t\tuuidComponents.uuid = uuidComponents.nss;\n\t\tuuidComponents.nss = undefined;\n\n\t\tif (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n\t\t\tuuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n\t\t}\n\n\t\treturn uuidComponents;\n\t},\n\n\tserialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents {\n\t\tconst urnComponents = uuidComponents as URNComponents;\n\t\t//normalize UUID\n\t\turnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n\t\treturn urnComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, SCHEMES } from \"../uri\";\n\nexport interface URNComponents extends URIComponents {\n\tnid?:string;\n\tnss?:string;\n}\n\nexport interface URNOptions extends URIOptions {\n\tnid?:string;\n}\n\nconst NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\";\nconst PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\";\nconst TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\";\nconst NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\";\nconst URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\");\nconst URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\");\nconst URN_PARSE = /^([^\\:]+)\\:(.*)/;\nconst URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g;\n\n//RFC 2141\nconst handler:URISchemeHandler = {\n\tscheme : \"urn\",\n\n\tparse : function (components:URIComponents, options:URNOptions):URNComponents {\n\t\tconst matches = components.path && components.path.match(URN_PARSE);\n\t\tlet urnComponents = components as URNComponents;\n\n\t\tif (matches) {\n\t\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\t\tconst nid = matches[1].toLowerCase();\n\t\t\tconst nss = matches[2];\n\t\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\t\turnComponents.nid = nid;\n\t\t\turnComponents.nss = nss;\n\t\t\turnComponents.path = undefined;\n\n\t\t\tif (schemeHandler) {\n\t\t\t\turnComponents = schemeHandler.parse(urnComponents, options) as URNComponents;\n\t\t\t}\n\t\t} else {\n\t\t\turnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n\t\t}\n\n\t\treturn urnComponents;\n\t},\n\n\tserialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents {\n\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\tconst nid = urnComponents.nid;\n\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\tif (schemeHandler) {\n\t\t\turnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents;\n\t\t}\n\n\t\tconst uriComponents = urnComponents as URIComponents;\n\t\tconst nss = urnComponents.nss;\n\t\turiComponents.path = `${nid || options.nid}:${nss}`;\n\n\t\treturn uriComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, pctDecChars, unescapeComponent } from \"../uri\";\nimport punycode from \"punycode\";\nimport { merge, subexp, toUpperCase, toArray } from \"../util\";\n\nexport interface MailtoHeaders {\n\t[hfname:string]:string\n}\n\nexport interface MailtoComponents extends URIComponents {\n\tto:Array,\n\theaders?:MailtoHeaders,\n\tsubject?:string,\n\tbody?:string\n}\n\nconst O:MailtoHeaders = {};\nconst isIRI = true;\n\n//RFC 3986\nconst UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nconst HEXDIG$$ = \"[0-9A-Fa-f]\"; //case-insensitive\nconst PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)); //expanded\n\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\"; //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nconst ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nconst QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nconst VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nconst DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\");\nconst QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$);\nconst QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$);\nconst QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"');\n\n//RFC 6068\nconst DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\"; //%d33-90 / %d94-126\nconst SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nconst QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$);\nconst DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\");\nconst LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$);\nconst ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$);\nconst TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\");\nconst HFNAME$ = subexp(QCHAR$ + \"*\");\nconst HFVALUE$ = HFNAME$;\nconst HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$);\nconst HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\");\nconst HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$);\nconst MAILTO_URI = new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\");\n\nconst UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nconst PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nconst NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nconst NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\");\nconst NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nconst NOT_HFVALUE = NOT_HFNAME;\nconst TO = new RegExp(\"^\" + TO$ + \"$\");\nconst HFIELDS = new RegExp(\"^\" + HFIELDS2$ + \"$\");\n\nfunction decodeUnreserved(str:string):string {\n\tconst decStr = pctDecChars(str);\n\treturn (!decStr.match(UNRESERVED) ? str : decStr);\n}\n\nconst handler:URISchemeHandler = {\n\tscheme : \"mailto\",\n\n\tparse : function (components:URIComponents, options:URIOptions):MailtoComponents {\n\t\tconst mailtoComponents = components as MailtoComponents;\n\t\tconst to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(\",\") : []);\n\t\tmailtoComponents.path = undefined;\n\n\t\tif (mailtoComponents.query) {\n\t\t\tlet unknownHeaders = false\n\t\t\tconst headers:MailtoHeaders = {};\n\t\t\tconst hfields = mailtoComponents.query.split(\"&\");\n\n\t\t\tfor (let x = 0, xl = hfields.length; x < xl; ++x) {\n\t\t\t\tconst hfield = hfields[x].split(\"=\");\n\n\t\t\t\tswitch (hfield[0]) {\n\t\t\t\t\tcase \"to\":\n\t\t\t\t\t\tconst toAddrs = hfield[1].split(\",\");\n\t\t\t\t\t\tfor (let x = 0, xl = toAddrs.length; x < xl; ++x) {\n\t\t\t\t\t\t\tto.push(toAddrs[x]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"subject\":\n\t\t\t\t\t\tmailtoComponents.subject = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"body\":\n\t\t\t\t\t\tmailtoComponents.body = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tunknownHeaders = true;\n\t\t\t\t\t\theaders[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (unknownHeaders) mailtoComponents.headers = headers;\n\t\t}\n\n\t\tmailtoComponents.query = undefined;\n\n\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\tconst addr = to[x].split(\"@\");\n\n\t\t\taddr[0] = unescapeComponent(addr[0]);\n\n\t\t\tif (!options.unicodeSupport) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\taddr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tmailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddr[1] = unescapeComponent(addr[1], options).toLowerCase();\n\t\t\t}\n\n\t\t\tto[x] = addr.join(\"@\");\n\t\t}\n\n\t\treturn mailtoComponents;\n\t},\n\n\tserialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents {\n\t\tconst components = mailtoComponents as URIComponents;\n\t\tconst to = toArray(mailtoComponents.to);\n\t\tif (to) {\n\t\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\t\tconst toAddr = String(to[x]);\n\t\t\t\tconst atIdx = toAddr.lastIndexOf(\"@\");\n\t\t\t\tconst localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n\t\t\t\tlet domain = toAddr.slice(atIdx + 1);\n\n\t\t\t\t//convert IDN via punycode\n\t\t\t\ttry {\n\t\t\t\t\tdomain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t\t}\n\n\t\t\t\tto[x] = localPart + \"@\" + domain;\n\t\t\t}\n\n\t\t\tcomponents.path = to.join(\",\");\n\t\t}\n\n\t\tconst headers = mailtoComponents.headers = mailtoComponents.headers || {};\n\n\t\tif (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n\t\tif (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n\n\t\tconst fields = [];\n\t\tfor (const name in headers) {\n\t\t\tif (headers[name] !== O[name]) {\n\t\t\t\tfields.push(\n\t\t\t\t\tname.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +\n\t\t\t\t\t\"=\" +\n\t\t\t\t\theaders[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (fields.length) {\n\t\t\tcomponents.query = fields.join(\"&\");\n\t\t}\n\n\t\treturn components;\n\t}\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport ws from \"./ws\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"wss\",\n\tdomainHost : ws.domainHost,\n\tparse : ws.parse,\n\tserialize : ws.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nexport interface WSComponents extends URIComponents {\n\tresourceName?: string;\n\tsecure?: boolean;\n}\n\nfunction isSecure(wsComponents:WSComponents):boolean {\n\treturn typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === \"wss\";\n}\n\n//RFC 6455\nconst handler:URISchemeHandler = {\n\tscheme : \"ws\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):WSComponents {\n\t\tconst wsComponents = components as WSComponents;\n\n\t\t//indicate if the secure flag is set\n\t\twsComponents.secure = isSecure(wsComponents);\n\n\t\t//construct resouce name\n\t\twsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');\n\t\twsComponents.path = undefined;\n\t\twsComponents.query = undefined;\n\n\t\treturn wsComponents;\n\t},\n\n\tserialize : function (wsComponents:WSComponents, options:URIOptions):URIComponents {\n\t\t//normalize the default port\n\t\tif (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === \"\") {\n\t\t\twsComponents.port = undefined;\n\t\t}\n\n\t\t//ensure scheme matches secure flag\n\t\tif (typeof wsComponents.secure === 'boolean') {\n\t\t\twsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws');\n\t\t\twsComponents.secure = undefined;\n\t\t}\n\n\t\t//reconstruct path from resource name\n\t\tif (wsComponents.resourceName) {\n\t\t\tconst [path, query] = wsComponents.resourceName.split('?');\n\t\t\twsComponents.path = (path && path !== '/' ? path : undefined);\n\t\t\twsComponents.query = query;\n\t\t\twsComponents.resourceName = undefined;\n\t\t}\n\n\t\t//forbid fragment component\n\t\twsComponents.fragment = undefined;\n\n\t\treturn wsComponents;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport http from \"./http\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"https\",\n\tdomainHost : http.domainHost,\n\tparse : http.parse,\n\tserialize : http.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"http\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//report missing host\n\t\tif (!components.host) {\n\t\t\tcomponents.error = components.error || \"HTTP URIs must have a host.\";\n\t\t}\n\n\t\treturn components;\n\t},\n\n\tserialize : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\tconst secure = String(components.scheme).toLowerCase() === \"https\";\n\n\t\t//normalize the default port\n\t\tif (components.port === (secure ? 443 : 80) || components.port === \"\") {\n\t\t\tcomponents.port = undefined;\n\t\t}\n\t\t\n\t\t//normalize the empty path\n\t\tif (!components.path) {\n\t\t\tcomponents.path = \"/\";\n\t\t}\n\n\t\t//NOTE: We do not parse query strings for HTTP URIs\n\t\t//as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n\t\t//and not the HTTP spec.\n\n\t\treturn components;\n\t}\n};\n\nexport default handler;","/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author Gary Court\n * @see http://github.com/garycourt/uri-js\n */\n\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\n\nimport URI_PROTOCOL from \"./regexps-uri\";\nimport IRI_PROTOCOL from \"./regexps-iri\";\nimport punycode from \"punycode\";\nimport { toUpperCase, typeOf, assign } from \"./util\";\n\nexport interface URIComponents {\n\tscheme?:string;\n\tuserinfo?:string;\n\thost?:string;\n\tport?:number|string;\n\tpath?:string;\n\tquery?:string;\n\tfragment?:string;\n\treference?:string;\n\terror?:string;\n}\n\nexport interface URIOptions {\n\tscheme?:string;\n\treference?:string;\n\ttolerant?:boolean;\n\tabsolutePath?:boolean;\n\tiri?:boolean;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n}\n\nexport interface URISchemeHandler {\n\tscheme:string;\n\tparse(components:ParentComponents, options:Options):Components;\n\tserialize(components:Components, options:Options):ParentComponents;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n\tabsolutePath?:boolean;\n}\n\nexport interface URIRegExps {\n\tNOT_SCHEME : RegExp,\n\tNOT_USERINFO : RegExp,\n\tNOT_HOST : RegExp,\n\tNOT_PATH : RegExp,\n\tNOT_PATH_NOSCHEME : RegExp,\n\tNOT_QUERY : RegExp,\n\tNOT_FRAGMENT : RegExp,\n\tESCAPE : RegExp,\n\tUNRESERVED : RegExp,\n\tOTHER_CHARS : RegExp,\n\tPCT_ENCODED : RegExp,\n\tIPV4ADDRESS : RegExp,\n\tIPV6ADDRESS : RegExp,\n}\n\nexport const SCHEMES:{[scheme:string]:URISchemeHandler} = {};\n\nexport function pctEncChar(chr:string):string {\n\tconst c = chr.charCodeAt(0);\n\tlet e:string;\n\n\tif (c < 16) e = \"%0\" + c.toString(16).toUpperCase();\n\telse if (c < 128) e = \"%\" + c.toString(16).toUpperCase();\n\telse if (c < 2048) e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\telse e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\n\treturn e;\n}\n\nexport function pctDecChars(str:string):string {\n\tlet newStr = \"\";\n\tlet i = 0;\n\tconst il = str.length;\n\n\twhile (i < il) {\n\t\tconst c = parseInt(str.substr(i + 1, 2), 16);\n\n\t\tif (c < 128) {\n\t\t\tnewStr += String.fromCharCode(c);\n\t\t\ti += 3;\n\t\t}\n\t\telse if (c >= 194 && c < 224) {\n\t\t\tif ((il - i) >= 6) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 6);\n\t\t\t}\n\t\t\ti += 6;\n\t\t}\n\t\telse if (c >= 224) {\n\t\t\tif ((il - i) >= 9) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tconst c3 = parseInt(str.substr(i + 7, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 9);\n\t\t\t}\n\t\t\ti += 9;\n\t\t}\n\t\telse {\n\t\t\tnewStr += str.substr(i, 3);\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn newStr;\n}\n\nfunction _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) {\n\tfunction decodeUnreserved(str:string):string {\n\t\tconst decStr = pctDecChars(str);\n\t\treturn (!decStr.match(protocol.UNRESERVED) ? str : decStr);\n\t}\n\n\tif (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n\tif (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\n\treturn components;\n};\n\nfunction _stripLeadingZeros(str:string):string {\n\treturn str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\n\nfunction _normalizeIPv4(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV4ADDRESS) || [];\n\tconst [, address] = matches;\n\t\n\tif (address) {\n\t\treturn address.split(\".\").map(_stripLeadingZeros).join(\".\");\n\t} else {\n\t\treturn host;\n\t}\n}\n\nfunction _normalizeIPv6(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV6ADDRESS) || [];\n\tconst [, address, zone] = matches;\n\n\tif (address) {\n\t\tconst [last, first] = address.toLowerCase().split('::').reverse();\n\t\tconst firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n\t\tconst lastFields = last.split(\":\").map(_stripLeadingZeros);\n\t\tconst isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n\t\tconst fieldCount = isLastFieldIPv4Address ? 7 : 8;\n\t\tconst lastFieldsStart = lastFields.length - fieldCount;\n\t\tconst fields = Array(fieldCount);\n\n\t\tfor (let x = 0; x < fieldCount; ++x) {\n\t\t\tfields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n\t\t}\n\n\t\tif (isLastFieldIPv4Address) {\n\t\t\tfields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n\t\t}\n\n\t\tconst allZeroFields = fields.reduce>((acc, field, index) => {\n\t\t\tif (!field || field === \"0\") {\n\t\t\t\tconst lastLongest = acc[acc.length - 1];\n\t\t\t\tif (lastLongest && lastLongest.index + lastLongest.length === index) {\n\t\t\t\t\tlastLongest.length++;\n\t\t\t\t} else {\n\t\t\t\t\tacc.push({ index, length : 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\t\tconst longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];\n\n\t\tlet newHost:string;\n\t\tif (longestZeroFields && longestZeroFields.length > 1) {\n\t\t\tconst newFirst = fields.slice(0, longestZeroFields.index) ;\n\t\t\tconst newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n\t\t\tnewHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n\t\t} else {\n\t\t\tnewHost = fields.join(\":\");\n\t\t}\n\n\t\tif (zone) {\n\t\t\tnewHost += \"%\" + zone;\n\t\t}\n\n\t\treturn newHost;\n\t} else {\n\t\treturn host;\n\t}\n}\n\nconst URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nconst NO_MATCH_IS_UNDEFINED = ((\"\").match(/(){0}/))[1] === undefined;\n\nexport function parse(uriString:string, options:URIOptions = {}):URIComponents {\n\tconst components:URIComponents = {};\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\n\tif (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n\n\tconst matches = uriString.match(URI_PARSE);\n\n\tif (matches) {\n\t\tif (NO_MATCH_IS_UNDEFINED) {\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1];\n\t\t\tcomponents.userinfo = matches[3];\n\t\t\tcomponents.host = matches[4];\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = matches[7];\n\t\t\tcomponents.fragment = matches[8];\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = matches[5];\n\t\t\t}\n\t\t} else { //IE FIX for improper RegExp matching\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1] || undefined;\n\t\t\tcomponents.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\n\t\t\tcomponents.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\n\t\t\tcomponents.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (components.host) {\n\t\t\t//normalize IP hosts\n\t\t\tcomponents.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n\t\t}\n\n\t\t//determine reference type\n\t\tif (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n\t\t\tcomponents.reference = \"same-document\";\n\t\t} else if (components.scheme === undefined) {\n\t\t\tcomponents.reference = \"relative\";\n\t\t} else if (components.fragment === undefined) {\n\t\t\tcomponents.reference = \"absolute\";\n\t\t} else {\n\t\t\tcomponents.reference = \"uri\";\n\t\t}\n\n\t\t//check for reference errors\n\t\tif (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n\t\t\tcomponents.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n\t\t}\n\n\t\t//find scheme handler\n\t\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t\t//check if scheme can't handle IRIs\n\t\tif (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n\t\t\t//if host component is a domain name\n\t\t\tif (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\tcomponents.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//convert IRI -> URI\n\t\t\t_normalizeComponentEncoding(components, URI_PROTOCOL);\n\t\t} else {\n\t\t\t//normalize encodings\n\t\t\t_normalizeComponentEncoding(components, protocol);\n\t\t}\n\n\t\t//perform scheme specific parsing\n\t\tif (schemeHandler && schemeHandler.parse) {\n\t\t\tschemeHandler.parse(components, options);\n\t\t}\n\t} else {\n\t\tcomponents.error = components.error || \"URI can not be parsed.\";\n\t}\n\n\treturn components;\n};\n\nfunction _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined {\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\tif (components.userinfo !== undefined) {\n\t\turiTokens.push(components.userinfo);\n\t\turiTokens.push(\"@\");\n\t}\n\n\tif (components.host !== undefined) {\n\t\t//normalize IP hosts, add brackets and escape zone separator for IPv6\n\t\turiTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\"));\n\t}\n\n\tif (typeof components.port === \"number\" || typeof components.port === \"string\") {\n\t\turiTokens.push(\":\");\n\t\turiTokens.push(String(components.port));\n\t}\n\n\treturn uriTokens.length ? uriTokens.join(\"\") : undefined;\n};\n\nconst RDS1 = /^\\.\\.?\\//;\nconst RDS2 = /^\\/\\.(\\/|$)/;\nconst RDS3 = /^\\/\\.\\.(\\/|$)/;\nconst RDS4 = /^\\.\\.?$/;\nconst RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n\nexport function removeDotSegments(input:string):string {\n\tconst output:Array = [];\n\n\twhile (input.length) {\n\t\tif (input.match(RDS1)) {\n\t\t\tinput = input.replace(RDS1, \"\");\n\t\t} else if (input.match(RDS2)) {\n\t\t\tinput = input.replace(RDS2, \"/\");\n\t\t} else if (input.match(RDS3)) {\n\t\t\tinput = input.replace(RDS3, \"/\");\n\t\t\toutput.pop();\n\t\t} else if (input === \".\" || input === \"..\") {\n\t\t\tinput = \"\";\n\t\t} else {\n\t\t\tconst im = input.match(RDS5);\n\t\t\tif (im) {\n\t\t\t\tconst s = im[0];\n\t\t\t\tinput = input.slice(s.length);\n\t\t\t\toutput.push(s);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unexpected dot segment condition\");\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output.join(\"\");\n};\n\nexport function serialize(components:URIComponents, options:URIOptions = {}):string {\n\tconst protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\t//find scheme handler\n\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t//perform scheme specific serialization\n\tif (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n\n\tif (components.host) {\n\t\t//if host component is an IPv6 address\n\t\tif (protocol.IPV6ADDRESS.test(components.host)) {\n\t\t\t//TODO: normalize IPv6 address as per RFC 5952\n\t\t}\n\n\t\t//if host component is a domain name\n\t\telse if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {\n\t\t\t//convert IDN via punycode\n\t\t\ttry {\n\t\t\t\tcomponents.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\n\t\t\t} catch (e) {\n\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t}\n\t\t}\n\t}\n\n\t//normalize encoding\n\t_normalizeComponentEncoding(components, protocol);\n\n\tif (options.reference !== \"suffix\" && components.scheme) {\n\t\turiTokens.push(components.scheme);\n\t\turiTokens.push(\":\");\n\t}\n\n\tconst authority = _recomposeAuthority(components, options);\n\tif (authority !== undefined) {\n\t\tif (options.reference !== \"suffix\") {\n\t\t\turiTokens.push(\"//\");\n\t\t}\n\n\t\turiTokens.push(authority);\n\n\t\tif (components.path && components.path.charAt(0) !== \"/\") {\n\t\t\turiTokens.push(\"/\");\n\t\t}\n\t}\n\n\tif (components.path !== undefined) {\n\t\tlet s = components.path;\n\n\t\tif (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n\t\t\ts = removeDotSegments(s);\n\t\t}\n\n\t\tif (authority === undefined) {\n\t\t\ts = s.replace(/^\\/\\//, \"/%2F\"); //don't allow the path to start with \"//\"\n\t\t}\n\n\t\turiTokens.push(s);\n\t}\n\n\tif (components.query !== undefined) {\n\t\turiTokens.push(\"?\");\n\t\turiTokens.push(components.query);\n\t}\n\n\tif (components.fragment !== undefined) {\n\t\turiTokens.push(\"#\");\n\t\turiTokens.push(components.fragment);\n\t}\n\n\treturn uriTokens.join(\"\"); //merge tokens into a string\n};\n\nexport function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents {\n\tconst target:URIComponents = {};\n\n\tif (!skipNormalization) {\n\t\tbase = parse(serialize(base, options), options); //normalize base components\n\t\trelative = parse(serialize(relative, options), options); //normalize relative components\n\t}\n\toptions = options || {};\n\n\tif (!options.tolerant && relative.scheme) {\n\t\ttarget.scheme = relative.scheme;\n\t\t//target.authority = relative.authority;\n\t\ttarget.userinfo = relative.userinfo;\n\t\ttarget.host = relative.host;\n\t\ttarget.port = relative.port;\n\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\ttarget.query = relative.query;\n\t} else {\n\t\tif (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n\t\t\t//target.authority = relative.authority;\n\t\t\ttarget.userinfo = relative.userinfo;\n\t\t\ttarget.host = relative.host;\n\t\t\ttarget.port = relative.port;\n\t\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\t\ttarget.query = relative.query;\n\t\t} else {\n\t\t\tif (!relative.path) {\n\t\t\t\ttarget.path = base.path;\n\t\t\t\tif (relative.query !== undefined) {\n\t\t\t\t\ttarget.query = relative.query;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.query = base.query;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (relative.path.charAt(0) === \"/\") {\n\t\t\t\t\ttarget.path = removeDotSegments(relative.path);\n\t\t\t\t} else {\n\t\t\t\t\tif ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n\t\t\t\t\t\ttarget.path = \"/\" + relative.path;\n\t\t\t\t\t} else if (!base.path) {\n\t\t\t\t\t\ttarget.path = relative.path;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.path = removeDotSegments(target.path);\n\t\t\t\t}\n\t\t\t\ttarget.query = relative.query;\n\t\t\t}\n\t\t\t//target.authority = base.authority;\n\t\t\ttarget.userinfo = base.userinfo;\n\t\t\ttarget.host = base.host;\n\t\t\ttarget.port = base.port;\n\t\t}\n\t\ttarget.scheme = base.scheme;\n\t}\n\n\ttarget.fragment = relative.fragment;\n\n\treturn target;\n};\n\nexport function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string {\n\tconst schemelessOptions = assign({ scheme : 'null' }, options);\n\treturn serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n};\n\nexport function normalize(uri:string, options?:URIOptions):string;\nexport function normalize(uri:URIComponents, options?:URIOptions):URIComponents;\nexport function normalize(uri:any, options?:URIOptions):any {\n\tif (typeof uri === \"string\") {\n\t\turi = serialize(parse(uri, options), options);\n\t} else if (typeOf(uri) === \"object\") {\n\t\turi = parse(serialize(uri, options), options);\n\t}\n\n\treturn uri;\n};\n\nexport function equal(uriA:string, uriB:string, options?: URIOptions):boolean;\nexport function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean;\nexport function equal(uriA:any, uriB:any, options?:URIOptions):boolean {\n\tif (typeof uriA === \"string\") {\n\t\turiA = serialize(parse(uriA, options), options);\n\t} else if (typeOf(uriA) === \"object\") {\n\t\turiA = serialize(uriA, options);\n\t}\n\n\tif (typeof uriB === \"string\") {\n\t\turiB = serialize(parse(uriB, options), options);\n\t} else if (typeOf(uriB) === \"object\") {\n\t\turiB = serialize(uriB, options);\n\t}\n\n\treturn uriA === uriB;\n};\n\nexport function escapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\n};\n\nexport function unescapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\n};\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see \n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport default punycode;\n","import { URIRegExps } from \"./uri\";\nimport { buildExps } from \"./regexps-uri\";\n\nexport default buildExps(true);\n","import { URIRegExps } from \"./uri\";\nimport { merge, subexp } from \"./util\";\n\nexport function buildExps(isIRI:boolean):URIRegExps {\n\tconst\n\t\tALPHA$$ = \"[A-Za-z]\",\n\t\tCR$ = \"[\\\\x0D]\",\n\t\tDIGIT$$ = \"[0-9]\",\n\t\tDQUOTE$$ = \"[\\\\x22]\",\n\t\tHEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"), //case-insensitive\n\t\tLF$$ = \"[\\\\x0A]\",\n\t\tSP$$ = \"[\\\\x20]\",\n\t\tPCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)), //expanded\n\t\tGEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n\t\tSUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n\t\tRESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n\t\tUCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\", //subset, excludes bidi control characters\n\t\tIPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\", //subset\n\t\tUNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n\t\tSCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n\t\tUSERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n\t\tDEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n\t\tDEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$), //relaxed parsing rules\n\t\tIPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n\t\tH16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n\t\tLS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n\t\tIPV6ADDRESS1$ = subexp( subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$), // 6( h16 \":\" ) ls32\n\t\tIPV6ADDRESS2$ = subexp( \"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$), // \"::\" 5( h16 \":\" ) ls32\n\t\tIPV6ADDRESS3$ = subexp(subexp( H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$), //[ h16 ] \"::\" 4( h16 \":\" ) ls32\n\t\tIPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$), //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n\t\tIPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$), //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n\t\tIPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" + H16$ + \"\\\\:\" + LS32$), //[ *3( h16 \":\" ) h16 ] \"::\" h16 \":\" ls32\n\t\tIPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\" + LS32$), //[ *4( h16 \":\" ) h16 ] \"::\" ls32\n\t\tIPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\" + H16$ ), //[ *5( h16 \":\" ) h16 ] \"::\" h16\n\t\tIPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\" ), //[ *6( h16 \":\" ) h16 ] \"::\"\n\t\tIPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n\t\tZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"), //RFC 6874\n\t\tIPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$), //RFC 6874\n\t\tIPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$), //RFC 6874, with relaxed parsing rules\n\t\tIPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n\t\tIP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"), //RFC 6874\n\t\tREG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n\t\tHOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n\t\tPORT$ = subexp(DIGIT$$ + \"*\"),\n\t\tAUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n\t\tPCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n\t\tSEGMENT$ = subexp(PCHAR$ + \"*\"),\n\t\tSEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n\t\tSEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n\t\tPATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n\t\tPATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"), //simplified\n\t\tPATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n\t\tPATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tQUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n\t\tFRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n\t\tHIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tURI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tRELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n\t\tRELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tURI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n\t\tABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n\n\t\tGENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tRELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n\t\tSAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tAUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\"\n\t;\n\n\treturn {\n\t\tNOT_SCHEME : new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n\t\tNOT_USERINFO : new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_HOST : new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH : new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH_NOSCHEME : new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_QUERY : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n\t\tNOT_FRAGMENT : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n\t\tESCAPE : new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tUNRESERVED : new RegExp(UNRESERVED$$, \"g\"),\n\t\tOTHER_CHARS : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n\t\tPCT_ENCODED : new RegExp(PCT_ENCODED$, \"g\"),\n\t\tIPV4ADDRESS : new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n\t\tIPV6ADDRESS : new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\") //RFC 6874, with relaxed parsing rules\n\t};\n}\n\nexport default buildExps(false);\n","export function merge(...sets:Array):string {\n\tif (sets.length > 1) {\n\t\tsets[0] = sets[0].slice(0, -1);\n\t\tconst xl = sets.length - 1;\n\t\tfor (let x = 1; x < xl; ++x) {\n\t\t\tsets[x] = sets[x].slice(1, -1);\n\t\t}\n\t\tsets[xl] = sets[xl].slice(1);\n\t\treturn sets.join('');\n\t} else {\n\t\treturn sets[0];\n\t}\n}\n\nexport function subexp(str:string):string {\n\treturn \"(?:\" + str + \")\";\n}\n\nexport function typeOf(o:any):string {\n\treturn o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\n}\n\nexport function toUpperCase(str:string):string {\n\treturn str.toUpperCase();\n}\n\nexport function toArray(obj:any):Array {\n\treturn obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\n}\n\n\nexport function assign(target: object, source: any): any {\n\tconst obj = target as any;\n\tif (source) {\n\t\tfor (const key in source) {\n\t\t\tobj[key] = source[key];\n\t\t}\n\t}\n\treturn obj;\n}"],"names":["SCHEMES","uuid","scheme","urn","mailto","wss","ws","https","http","urnComponents","nss","uuidComponents","toLowerCase","options","error","tolerant","match","UUID","undefined","handler","uriComponents","path","nid","schemeHandler","serialize","urnScheme","parse","matches","components","URN_PARSE","query","fields","join","length","push","name","replace","PCT_ENCODED","decodeUnreserved","toUpperCase","NOT_HFNAME","pctEncChar","headers","NOT_HFVALUE","O","mailtoComponents","body","subject","to","x","localPart","domain","iri","e","punycode","toASCII","unescapeComponent","toUnicode","toAddr","slice","atIdx","NOT_LOCAL_PART","lastIndexOf","String","xl","toArray","addr","unicodeSupport","split","unknownHeaders","hfield","toAddrs","hfields","decStr","UNRESERVED","str","pctDecChars","RegExp","merge","UNRESERVED$$","SOME_DELIMS$$","ATEXT$$","VCHAR$$","PCT_ENCODED$","QTEXT$$","subexp","HEXDIG$$","isIRI","domainHost","wsComponents","fragment","resourceName","secure","port","isSecure","host","toString","URI_PROTOCOL","IRI_PROTOCOL","ESCAPE","escapeComponent","uriA","uriB","typeOf","equal","uri","normalize","resolveComponents","baseURI","schemelessOptions","relativeURI","assign","resolve","target","relative","base","userinfo","removeDotSegments","charAt","skipNormalization","uriTokens","s","authority","absolutePath","reference","_recomposeAuthority","protocol","IPV6ADDRESS","test","output","Error","input","im","RDS5","pop","RDS3","RDS2","RDS1","$1","$2","_normalizeIPv6","_normalizeIPv4","_","uriString","isNaN","indexOf","parseInt","NO_MATCH_IS_UNDEFINED","URI_PARSE","newHost","zone","newFirst","newLast","longestZeroFields","index","b","a","allZeroFields","sort","acc","lastLongest","field","reduce","fieldCount","isLastFieldIPv4Address","firstFields","lastFields","lastFieldsStart","Array","IPV4ADDRESS","last","map","_stripLeadingZeros","first","address","reverse","NOT_FRAGMENT","NOT_QUERY","NOT_PATH","NOT_PATH_NOSCHEME","NOT_HOST","NOT_USERINFO","NOT_SCHEME","_normalizeComponentEncoding","newStr","substr","i","fromCharCode","c","c2","c3","il","chr","charCodeAt","encode","decode","ucs2encode","ucs2decode","regexNonASCII","string","mapDomain","regexPunycode","n","delta","handledCPCount","adapt","handledCPCountPlusOne","basicLength","stringFromCharCode","digitToBasic","q","floor","qMinusT","baseMinusT","t","k","bias","tMin","tMax","currentValue","maxInt","m","inputLength","delimiter","initialBias","initialN","fromCodePoint","splice","out","oldi","w","digit","basicToDigit","basic","j","baseMinusTMin","skew","numPoints","firstTime","damp","flag","codePoint","array","value","extra","counter","result","encoded","labels","fn","regexSeparators","parts","RangeError","errors","type","Math","buildExps","IPV6ADDRESS$","ZONEID$","IPV4ADDRESS$","RESERVED$$","SUB_DELIMS$$","IPRIVATE$$","ALPHA$$","DIGIT$$","AUTHORITY_REF$","USERINFO$","HOST$","PORT$","SAMEDOC_REF$","FRAGMENT$","ABSOLUTE_REF$","SCHEME$","PATH_ABEMPTY$","PATH_ABSOLUTE$","PATH_ROOTLESS$","PATH_EMPTY$","QUERY$","RELATIVE_REF$","PATH_NOSCHEME$","GENERIC_REF$","ABSOLUTE_URI$","HIER_PART$","URI_REFERENCE$","URI$","RELATIVE$","RELATIVE_PART$","AUTHORITY$","PCHAR$","PATH$","SEGMENT_NZ$","SEGMENT_NZ_NC$","SEGMENT$","IP_LITERAL$","REG_NAME$","IPV6ADDRZ_RELAXED$","IPVFUTURE$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","H16$","LS32$","DEC_OCTET_RELAXED$","DEC_OCTET$","UCSCHAR$$","GEN_DELIMS$$","SP$$","DQUOTE$$","CR$","obj","key","source","setInterval","call","prototype","o","Object","shift","sets"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/es5/uri.all.min.d.ts b/node_modules/uri-js/dist/es5/uri.all.min.d.ts new file mode 100755 index 00000000..da51e235 --- /dev/null +++ b/node_modules/uri-js/dist/es5/uri.all.min.d.ts @@ -0,0 +1,59 @@ +export interface URIComponents { + scheme?: string; + userinfo?: string; + host?: string; + port?: number | string; + path?: string; + query?: string; + fragment?: string; + reference?: string; + error?: string; +} +export interface URIOptions { + scheme?: string; + reference?: string; + tolerant?: boolean; + absolutePath?: boolean; + iri?: boolean; + unicodeSupport?: boolean; + domainHost?: boolean; +} +export interface URISchemeHandler { + scheme: string; + parse(components: ParentComponents, options: Options): Components; + serialize(components: Components, options: Options): ParentComponents; + unicodeSupport?: boolean; + domainHost?: boolean; + absolutePath?: boolean; +} +export interface URIRegExps { + NOT_SCHEME: RegExp; + NOT_USERINFO: RegExp; + NOT_HOST: RegExp; + NOT_PATH: RegExp; + NOT_PATH_NOSCHEME: RegExp; + NOT_QUERY: RegExp; + NOT_FRAGMENT: RegExp; + ESCAPE: RegExp; + UNRESERVED: RegExp; + OTHER_CHARS: RegExp; + PCT_ENCODED: RegExp; + IPV4ADDRESS: RegExp; + IPV6ADDRESS: RegExp; +} +export declare const SCHEMES: { + [scheme: string]: URISchemeHandler; +}; +export declare function pctEncChar(chr: string): string; +export declare function pctDecChars(str: string): string; +export declare function parse(uriString: string, options?: URIOptions): URIComponents; +export declare function removeDotSegments(input: string): string; +export declare function serialize(components: URIComponents, options?: URIOptions): string; +export declare function resolveComponents(base: URIComponents, relative: URIComponents, options?: URIOptions, skipNormalization?: boolean): URIComponents; +export declare function resolve(baseURI: string, relativeURI: string, options?: URIOptions): string; +export declare function normalize(uri: string, options?: URIOptions): string; +export declare function normalize(uri: URIComponents, options?: URIOptions): URIComponents; +export declare function equal(uriA: string, uriB: string, options?: URIOptions): boolean; +export declare function equal(uriA: URIComponents, uriB: URIComponents, options?: URIOptions): boolean; +export declare function escapeComponent(str: string, options?: URIOptions): string; +export declare function unescapeComponent(str: string, options?: URIOptions): string; diff --git a/node_modules/uri-js/dist/es5/uri.all.min.js b/node_modules/uri-js/dist/es5/uri.all.min.js new file mode 100755 index 00000000..fcd84586 --- /dev/null +++ b/node_modules/uri-js/dist/es5/uri.all.min.js @@ -0,0 +1,3 @@ +/** @license URI.js v4.4.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */ +!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r(e.URI=e.URI||{})}(this,function(e){"use strict";function r(){for(var e=arguments.length,r=Array(e),n=0;n1){r[0]=r[0].slice(0,-1);for(var t=r.length-1,o=1;o1&&(t=n[0]+"@",e=n[1]),e=e.replace(j,"."),t+f(e.split("."),r).join(".")}function p(e){for(var r=[],n=0,t=e.length;n=55296&&o<=56319&&n>6|192).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase():"%"+(r>>12|224).toString(16).toUpperCase()+"%"+(r>>6&63|128).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase()}function d(e){for(var r="",n=0,t=e.length;n=194&&o<224){if(t-n>=6){var a=parseInt(e.substr(n+4,2),16);r+=String.fromCharCode((31&o)<<6|63&a)}else r+=e.substr(n,6);n+=6}else if(o>=224){if(t-n>=9){var i=parseInt(e.substr(n+4,2),16),u=parseInt(e.substr(n+7,2),16);r+=String.fromCharCode((15&o)<<12|(63&i)<<6|63&u)}else r+=e.substr(n,9);n+=9}else r+=e.substr(n,3),n+=3}return r}function l(e,r){function n(e){var n=d(e);return n.match(r.UNRESERVED)?n:e}return e.scheme&&(e.scheme=String(e.scheme).replace(r.PCT_ENCODED,n).toLowerCase().replace(r.NOT_SCHEME,"")),e.userinfo!==undefined&&(e.userinfo=String(e.userinfo).replace(r.PCT_ENCODED,n).replace(r.NOT_USERINFO,h).replace(r.PCT_ENCODED,o)),e.host!==undefined&&(e.host=String(e.host).replace(r.PCT_ENCODED,n).toLowerCase().replace(r.NOT_HOST,h).replace(r.PCT_ENCODED,o)),e.path!==undefined&&(e.path=String(e.path).replace(r.PCT_ENCODED,n).replace(e.scheme?r.NOT_PATH:r.NOT_PATH_NOSCHEME,h).replace(r.PCT_ENCODED,o)),e.query!==undefined&&(e.query=String(e.query).replace(r.PCT_ENCODED,n).replace(r.NOT_QUERY,h).replace(r.PCT_ENCODED,o)),e.fragment!==undefined&&(e.fragment=String(e.fragment).replace(r.PCT_ENCODED,n).replace(r.NOT_FRAGMENT,h).replace(r.PCT_ENCODED,o)),e}function m(e){return e.replace(/^0*(.*)/,"$1")||"0"}function g(e,r){var n=e.match(r.IPV4ADDRESS)||[],t=T(n,2),o=t[1];return o?o.split(".").map(m).join("."):e}function v(e,r){var n=e.match(r.IPV6ADDRESS)||[],t=T(n,3),o=t[1],a=t[2];if(o){for(var i=o.toLowerCase().split("::").reverse(),u=T(i,2),s=u[0],f=u[1],c=f?f.split(":").map(m):[],p=s.split(":").map(m),h=r.IPV4ADDRESS.test(p[p.length-1]),d=h?7:8,l=p.length-d,v=Array(d),E=0;E1){var A=v.slice(0,y.index),D=v.slice(y.index+y.length);S=A.join(":")+"::"+D.join(":")}else S=v.join(":");return a&&(S+="%"+a),S}return e}function E(e){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n={},t=!1!==r.iri?R:F;"suffix"===r.reference&&(e=(r.scheme?r.scheme+":":"")+"//"+e);var o=e.match(K);if(o){W?(n.scheme=o[1],n.userinfo=o[3],n.host=o[4],n.port=parseInt(o[5],10),n.path=o[6]||"",n.query=o[7],n.fragment=o[8],isNaN(n.port)&&(n.port=o[5])):(n.scheme=o[1]||undefined,n.userinfo=-1!==e.indexOf("@")?o[3]:undefined,n.host=-1!==e.indexOf("//")?o[4]:undefined,n.port=parseInt(o[5],10),n.path=o[6]||"",n.query=-1!==e.indexOf("?")?o[7]:undefined,n.fragment=-1!==e.indexOf("#")?o[8]:undefined,isNaN(n.port)&&(n.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?o[4]:undefined)),n.host&&(n.host=v(g(n.host,t),t)),n.scheme!==undefined||n.userinfo!==undefined||n.host!==undefined||n.port!==undefined||n.path||n.query!==undefined?n.scheme===undefined?n.reference="relative":n.fragment===undefined?n.reference="absolute":n.reference="uri":n.reference="same-document",r.reference&&"suffix"!==r.reference&&r.reference!==n.reference&&(n.error=n.error||"URI is not a "+r.reference+" reference.");var a=J[(r.scheme||n.scheme||"").toLowerCase()];if(r.unicodeSupport||a&&a.unicodeSupport)l(n,t);else{if(n.host&&(r.domainHost||a&&a.domainHost))try{n.host=B.toASCII(n.host.replace(t.PCT_ENCODED,d).toLowerCase())}catch(i){n.error=n.error||"Host's domain name can not be converted to ASCII via punycode: "+i}l(n,F)}a&&a.parse&&a.parse(n,r)}else n.error=n.error||"URI can not be parsed.";return n}function C(e,r){var n=!1!==r.iri?R:F,t=[];return e.userinfo!==undefined&&(t.push(e.userinfo),t.push("@")),e.host!==undefined&&t.push(v(g(String(e.host),n),n).replace(n.IPV6ADDRESS,function(e,r,n){return"["+r+(n?"%25"+n:"")+"]"})),"number"!=typeof e.port&&"string"!=typeof e.port||(t.push(":"),t.push(String(e.port))),t.length?t.join(""):undefined}function y(e){for(var r=[];e.length;)if(e.match(X))e=e.replace(X,"");else if(e.match(ee))e=e.replace(ee,"/");else if(e.match(re))e=e.replace(re,"/"),r.pop();else if("."===e||".."===e)e="";else{var n=e.match(ne);if(!n)throw new Error("Unexpected dot segment condition");var t=n[0];e=e.slice(t.length),r.push(t)}return r.join("")}function S(e){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n=r.iri?R:F,t=[],o=J[(r.scheme||e.scheme||"").toLowerCase()];if(o&&o.serialize&&o.serialize(e,r),e.host)if(n.IPV6ADDRESS.test(e.host));else if(r.domainHost||o&&o.domainHost)try{e.host=r.iri?B.toUnicode(e.host):B.toASCII(e.host.replace(n.PCT_ENCODED,d).toLowerCase())}catch(u){e.error=e.error||"Host's domain name can not be converted to "+(r.iri?"Unicode":"ASCII")+" via punycode: "+u}l(e,n),"suffix"!==r.reference&&e.scheme&&(t.push(e.scheme),t.push(":"));var a=C(e,r);if(a!==undefined&&("suffix"!==r.reference&&t.push("//"),t.push(a),e.path&&"/"!==e.path.charAt(0)&&t.push("/")),e.path!==undefined){var i=e.path;r.absolutePath||o&&o.absolutePath||(i=y(i)),a===undefined&&(i=i.replace(/^\/\//,"/%2F")),t.push(i)}return e.query!==undefined&&(t.push("?"),t.push(e.query)),e.fragment!==undefined&&(t.push("#"),t.push(e.fragment)),t.join("")}function A(e,r){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{},t=arguments[3],o={};return t||(e=E(S(e,n),n),r=E(S(r,n),n)),n=n||{},!n.tolerant&&r.scheme?(o.scheme=r.scheme,o.userinfo=r.userinfo,o.host=r.host,o.port=r.port,o.path=y(r.path||""),o.query=r.query):(r.userinfo!==undefined||r.host!==undefined||r.port!==undefined?(o.userinfo=r.userinfo,o.host=r.host,o.port=r.port,o.path=y(r.path||""),o.query=r.query):(r.path?("/"===r.path.charAt(0)?o.path=y(r.path):(e.userinfo===undefined&&e.host===undefined&&e.port===undefined||e.path?e.path?o.path=e.path.slice(0,e.path.lastIndexOf("/")+1)+r.path:o.path=r.path:o.path="/"+r.path,o.path=y(o.path)),o.query=r.query):(o.path=e.path,r.query!==undefined?o.query=r.query:o.query=e.query),o.userinfo=e.userinfo,o.host=e.host,o.port=e.port),o.scheme=e.scheme),o.fragment=r.fragment,o}function D(e,r,n){var t=i({scheme:"null"},n);return S(A(E(e,t),E(r,t),t,!0),t)}function w(e,r){return"string"==typeof e?e=S(E(e,r),r):"object"===t(e)&&(e=E(S(e,r),r)),e}function b(e,r,n){return"string"==typeof e?e=S(E(e,n),n):"object"===t(e)&&(e=S(e,n)),"string"==typeof r?r=S(E(r,n),n):"object"===t(r)&&(r=S(r,n)),e===r}function x(e,r){return e&&e.toString().replace(r&&r.iri?R.ESCAPE:F.ESCAPE,h)}function O(e,r){return e&&e.toString().replace(r&&r.iri?R.PCT_ENCODED:F.PCT_ENCODED,d)}function N(e){return"boolean"==typeof e.secure?e.secure:"wss"===String(e.scheme).toLowerCase()}function I(e){var r=d(e);return r.match(he)?r:e}var F=u(!1),R=u(!0),T=function(){function e(e,r){var n=[],t=!0,o=!1,a=undefined;try{for(var i,u=e[Symbol.iterator]();!(t=(i=u.next()).done)&&(n.push(i.value),!r||n.length!==r);t=!0);}catch(s){o=!0,a=s}finally{try{!t&&u["return"]&&u["return"]()}finally{if(o)throw a}}return n}return function(r,n){if(Array.isArray(r))return r;if(Symbol.iterator in Object(r))return e(r,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_=function(e){if(Array.isArray(e)){for(var r=0,n=Array(e.length);r= 0x80 (not a basic code point)","invalid-input":"Invalid input"},z=Math.floor,L=String.fromCharCode,$=function(e){return String.fromCodePoint.apply(String,_(e))},M=function(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:36},V=function(e,r){return e+22+75*(e<26)-((0!=r)<<5)},k=function(e,r,n){var t=0;for(e=n?z(e/700):e>>1,e+=z(e/r);e>455;t+=36)e=z(e/35);return z(t+36*e/(e+38))},Z=function(e){var r=[],n=e.length,t=0,o=128,a=72,i=e.lastIndexOf("-");i<0&&(i=0);for(var u=0;u=128&&s("not-basic"),r.push(e.charCodeAt(u));for(var f=i>0?i+1:0;f=n&&s("invalid-input");var d=M(e.charCodeAt(f++));(d>=36||d>z((P-t)/p))&&s("overflow"),t+=d*p;var l=h<=a?1:h>=a+26?26:h-a;if(dz(P/m)&&s("overflow"),p*=m}var g=r.length+1;a=k(t-c,g,0==c),z(t/g)>P-o&&s("overflow"),o+=z(t/g),t%=g,r.splice(t++,0,o)}return String.fromCodePoint.apply(String,r)},G=function(e){var r=[];e=p(e);var n=e.length,t=128,o=0,a=72,i=!0,u=!1,f=undefined;try{for(var c,h=e[Symbol.iterator]();!(i=(c=h.next()).done);i=!0){var d=c.value;d<128&&r.push(L(d))}}catch(U){u=!0,f=U}finally{try{!i&&h["return"]&&h["return"]()}finally{if(u)throw f}}var l=r.length,m=l;for(l&&r.push("-");m=t&&Az((P-o)/D)&&s("overflow"),o+=(g-t)*D,t=g;var w=!0,b=!1,x=undefined;try{for(var O,N=e[Symbol.iterator]();!(w=(O=N.next()).done);w=!0){var I=O.value;if(IP&&s("overflow"),I==t){for(var F=o,R=36;;R+=36){var T=R<=a?1:R>=a+26?26:R-a;if(FA-Z\\x5E-\\x7E]",'[\\"\\\\]'),he=new RegExp(se,"g"),de=new RegExp(ce,"g"),le=new RegExp(r("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',pe),"g"),me=new RegExp(r("[^]",se,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),ge=me,ve={scheme:"mailto",parse:function(e,r){var n=e,t=n.to=n.path?n.path.split(","):[];if(n.path=undefined,n.query){for(var o=!1,a={},i=n.query.split("&"),u=0,s=i.length;u):string {\n\tif (sets.length > 1) {\n\t\tsets[0] = sets[0].slice(0, -1);\n\t\tconst xl = sets.length - 1;\n\t\tfor (let x = 1; x < xl; ++x) {\n\t\t\tsets[x] = sets[x].slice(1, -1);\n\t\t}\n\t\tsets[xl] = sets[xl].slice(1);\n\t\treturn sets.join('');\n\t} else {\n\t\treturn sets[0];\n\t}\n}\n\nexport function subexp(str:string):string {\n\treturn \"(?:\" + str + \")\";\n}\n\nexport function typeOf(o:any):string {\n\treturn o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\n}\n\nexport function toUpperCase(str:string):string {\n\treturn str.toUpperCase();\n}\n\nexport function toArray(obj:any):Array {\n\treturn obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\n}\n\n\nexport function assign(target: object, source: any): any {\n\tconst obj = target as any;\n\tif (source) {\n\t\tfor (const key in source) {\n\t\t\tobj[key] = source[key];\n\t\t}\n\t}\n\treturn obj;\n}","import { URIRegExps } from \"./uri\";\nimport { merge, subexp } from \"./util\";\n\nexport function buildExps(isIRI:boolean):URIRegExps {\n\tconst\n\t\tALPHA$$ = \"[A-Za-z]\",\n\t\tCR$ = \"[\\\\x0D]\",\n\t\tDIGIT$$ = \"[0-9]\",\n\t\tDQUOTE$$ = \"[\\\\x22]\",\n\t\tHEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"), //case-insensitive\n\t\tLF$$ = \"[\\\\x0A]\",\n\t\tSP$$ = \"[\\\\x20]\",\n\t\tPCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)), //expanded\n\t\tGEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n\t\tSUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n\t\tRESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n\t\tUCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\", //subset, excludes bidi control characters\n\t\tIPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\", //subset\n\t\tUNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n\t\tSCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n\t\tUSERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n\t\tDEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n\t\tDEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$), //relaxed parsing rules\n\t\tIPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n\t\tH16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n\t\tLS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n\t\tIPV6ADDRESS1$ = subexp( subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$), // 6( h16 \":\" ) ls32\n\t\tIPV6ADDRESS2$ = subexp( \"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$), // \"::\" 5( h16 \":\" ) ls32\n\t\tIPV6ADDRESS3$ = subexp(subexp( H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$), //[ h16 ] \"::\" 4( h16 \":\" ) ls32\n\t\tIPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$), //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n\t\tIPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$), //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n\t\tIPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" + H16$ + \"\\\\:\" + LS32$), //[ *3( h16 \":\" ) h16 ] \"::\" h16 \":\" ls32\n\t\tIPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\" + LS32$), //[ *4( h16 \":\" ) h16 ] \"::\" ls32\n\t\tIPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\" + H16$ ), //[ *5( h16 \":\" ) h16 ] \"::\" h16\n\t\tIPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\" ), //[ *6( h16 \":\" ) h16 ] \"::\"\n\t\tIPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n\t\tZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"), //RFC 6874\n\t\tIPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$), //RFC 6874\n\t\tIPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$), //RFC 6874, with relaxed parsing rules\n\t\tIPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n\t\tIP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"), //RFC 6874\n\t\tREG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n\t\tHOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n\t\tPORT$ = subexp(DIGIT$$ + \"*\"),\n\t\tAUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n\t\tPCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n\t\tSEGMENT$ = subexp(PCHAR$ + \"*\"),\n\t\tSEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n\t\tSEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n\t\tPATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n\t\tPATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"), //simplified\n\t\tPATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n\t\tPATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tQUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n\t\tFRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n\t\tHIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tURI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tRELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n\t\tRELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tURI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n\t\tABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n\n\t\tGENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tRELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n\t\tSAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tAUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\"\n\t;\n\n\treturn {\n\t\tNOT_SCHEME : new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n\t\tNOT_USERINFO : new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_HOST : new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH : new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH_NOSCHEME : new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_QUERY : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n\t\tNOT_FRAGMENT : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n\t\tESCAPE : new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tUNRESERVED : new RegExp(UNRESERVED$$, \"g\"),\n\t\tOTHER_CHARS : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n\t\tPCT_ENCODED : new RegExp(PCT_ENCODED$, \"g\"),\n\t\tIPV4ADDRESS : new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n\t\tIPV6ADDRESS : new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\") //RFC 6874, with relaxed parsing rules\n\t};\n}\n\nexport default buildExps(false);\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see \n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport default punycode;\n","/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author Gary Court\n * @see http://github.com/garycourt/uri-js\n */\n\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\n\nimport URI_PROTOCOL from \"./regexps-uri\";\nimport IRI_PROTOCOL from \"./regexps-iri\";\nimport punycode from \"punycode\";\nimport { toUpperCase, typeOf, assign } from \"./util\";\n\nexport interface URIComponents {\n\tscheme?:string;\n\tuserinfo?:string;\n\thost?:string;\n\tport?:number|string;\n\tpath?:string;\n\tquery?:string;\n\tfragment?:string;\n\treference?:string;\n\terror?:string;\n}\n\nexport interface URIOptions {\n\tscheme?:string;\n\treference?:string;\n\ttolerant?:boolean;\n\tabsolutePath?:boolean;\n\tiri?:boolean;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n}\n\nexport interface URISchemeHandler {\n\tscheme:string;\n\tparse(components:ParentComponents, options:Options):Components;\n\tserialize(components:Components, options:Options):ParentComponents;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n\tabsolutePath?:boolean;\n}\n\nexport interface URIRegExps {\n\tNOT_SCHEME : RegExp,\n\tNOT_USERINFO : RegExp,\n\tNOT_HOST : RegExp,\n\tNOT_PATH : RegExp,\n\tNOT_PATH_NOSCHEME : RegExp,\n\tNOT_QUERY : RegExp,\n\tNOT_FRAGMENT : RegExp,\n\tESCAPE : RegExp,\n\tUNRESERVED : RegExp,\n\tOTHER_CHARS : RegExp,\n\tPCT_ENCODED : RegExp,\n\tIPV4ADDRESS : RegExp,\n\tIPV6ADDRESS : RegExp,\n}\n\nexport const SCHEMES:{[scheme:string]:URISchemeHandler} = {};\n\nexport function pctEncChar(chr:string):string {\n\tconst c = chr.charCodeAt(0);\n\tlet e:string;\n\n\tif (c < 16) e = \"%0\" + c.toString(16).toUpperCase();\n\telse if (c < 128) e = \"%\" + c.toString(16).toUpperCase();\n\telse if (c < 2048) e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\telse e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\n\treturn e;\n}\n\nexport function pctDecChars(str:string):string {\n\tlet newStr = \"\";\n\tlet i = 0;\n\tconst il = str.length;\n\n\twhile (i < il) {\n\t\tconst c = parseInt(str.substr(i + 1, 2), 16);\n\n\t\tif (c < 128) {\n\t\t\tnewStr += String.fromCharCode(c);\n\t\t\ti += 3;\n\t\t}\n\t\telse if (c >= 194 && c < 224) {\n\t\t\tif ((il - i) >= 6) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 6);\n\t\t\t}\n\t\t\ti += 6;\n\t\t}\n\t\telse if (c >= 224) {\n\t\t\tif ((il - i) >= 9) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tconst c3 = parseInt(str.substr(i + 7, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 9);\n\t\t\t}\n\t\t\ti += 9;\n\t\t}\n\t\telse {\n\t\t\tnewStr += str.substr(i, 3);\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn newStr;\n}\n\nfunction _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) {\n\tfunction decodeUnreserved(str:string):string {\n\t\tconst decStr = pctDecChars(str);\n\t\treturn (!decStr.match(protocol.UNRESERVED) ? str : decStr);\n\t}\n\n\tif (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n\tif (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\n\treturn components;\n};\n\nfunction _stripLeadingZeros(str:string):string {\n\treturn str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\n\nfunction _normalizeIPv4(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV4ADDRESS) || [];\n\tconst [, address] = matches;\n\t\n\tif (address) {\n\t\treturn address.split(\".\").map(_stripLeadingZeros).join(\".\");\n\t} else {\n\t\treturn host;\n\t}\n}\n\nfunction _normalizeIPv6(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV6ADDRESS) || [];\n\tconst [, address, zone] = matches;\n\n\tif (address) {\n\t\tconst [last, first] = address.toLowerCase().split('::').reverse();\n\t\tconst firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n\t\tconst lastFields = last.split(\":\").map(_stripLeadingZeros);\n\t\tconst isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n\t\tconst fieldCount = isLastFieldIPv4Address ? 7 : 8;\n\t\tconst lastFieldsStart = lastFields.length - fieldCount;\n\t\tconst fields = Array(fieldCount);\n\n\t\tfor (let x = 0; x < fieldCount; ++x) {\n\t\t\tfields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n\t\t}\n\n\t\tif (isLastFieldIPv4Address) {\n\t\t\tfields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n\t\t}\n\n\t\tconst allZeroFields = fields.reduce>((acc, field, index) => {\n\t\t\tif (!field || field === \"0\") {\n\t\t\t\tconst lastLongest = acc[acc.length - 1];\n\t\t\t\tif (lastLongest && lastLongest.index + lastLongest.length === index) {\n\t\t\t\t\tlastLongest.length++;\n\t\t\t\t} else {\n\t\t\t\t\tacc.push({ index, length : 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\t\tconst longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];\n\n\t\tlet newHost:string;\n\t\tif (longestZeroFields && longestZeroFields.length > 1) {\n\t\t\tconst newFirst = fields.slice(0, longestZeroFields.index) ;\n\t\t\tconst newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n\t\t\tnewHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n\t\t} else {\n\t\t\tnewHost = fields.join(\":\");\n\t\t}\n\n\t\tif (zone) {\n\t\t\tnewHost += \"%\" + zone;\n\t\t}\n\n\t\treturn newHost;\n\t} else {\n\t\treturn host;\n\t}\n}\n\nconst URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nconst NO_MATCH_IS_UNDEFINED = ((\"\").match(/(){0}/))[1] === undefined;\n\nexport function parse(uriString:string, options:URIOptions = {}):URIComponents {\n\tconst components:URIComponents = {};\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\n\tif (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n\n\tconst matches = uriString.match(URI_PARSE);\n\n\tif (matches) {\n\t\tif (NO_MATCH_IS_UNDEFINED) {\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1];\n\t\t\tcomponents.userinfo = matches[3];\n\t\t\tcomponents.host = matches[4];\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = matches[7];\n\t\t\tcomponents.fragment = matches[8];\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = matches[5];\n\t\t\t}\n\t\t} else { //IE FIX for improper RegExp matching\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1] || undefined;\n\t\t\tcomponents.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\n\t\t\tcomponents.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\n\t\t\tcomponents.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (components.host) {\n\t\t\t//normalize IP hosts\n\t\t\tcomponents.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n\t\t}\n\n\t\t//determine reference type\n\t\tif (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n\t\t\tcomponents.reference = \"same-document\";\n\t\t} else if (components.scheme === undefined) {\n\t\t\tcomponents.reference = \"relative\";\n\t\t} else if (components.fragment === undefined) {\n\t\t\tcomponents.reference = \"absolute\";\n\t\t} else {\n\t\t\tcomponents.reference = \"uri\";\n\t\t}\n\n\t\t//check for reference errors\n\t\tif (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n\t\t\tcomponents.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n\t\t}\n\n\t\t//find scheme handler\n\t\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t\t//check if scheme can't handle IRIs\n\t\tif (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n\t\t\t//if host component is a domain name\n\t\t\tif (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\tcomponents.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//convert IRI -> URI\n\t\t\t_normalizeComponentEncoding(components, URI_PROTOCOL);\n\t\t} else {\n\t\t\t//normalize encodings\n\t\t\t_normalizeComponentEncoding(components, protocol);\n\t\t}\n\n\t\t//perform scheme specific parsing\n\t\tif (schemeHandler && schemeHandler.parse) {\n\t\t\tschemeHandler.parse(components, options);\n\t\t}\n\t} else {\n\t\tcomponents.error = components.error || \"URI can not be parsed.\";\n\t}\n\n\treturn components;\n};\n\nfunction _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined {\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\tif (components.userinfo !== undefined) {\n\t\turiTokens.push(components.userinfo);\n\t\turiTokens.push(\"@\");\n\t}\n\n\tif (components.host !== undefined) {\n\t\t//normalize IP hosts, add brackets and escape zone separator for IPv6\n\t\turiTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\"));\n\t}\n\n\tif (typeof components.port === \"number\" || typeof components.port === \"string\") {\n\t\turiTokens.push(\":\");\n\t\turiTokens.push(String(components.port));\n\t}\n\n\treturn uriTokens.length ? uriTokens.join(\"\") : undefined;\n};\n\nconst RDS1 = /^\\.\\.?\\//;\nconst RDS2 = /^\\/\\.(\\/|$)/;\nconst RDS3 = /^\\/\\.\\.(\\/|$)/;\nconst RDS4 = /^\\.\\.?$/;\nconst RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n\nexport function removeDotSegments(input:string):string {\n\tconst output:Array = [];\n\n\twhile (input.length) {\n\t\tif (input.match(RDS1)) {\n\t\t\tinput = input.replace(RDS1, \"\");\n\t\t} else if (input.match(RDS2)) {\n\t\t\tinput = input.replace(RDS2, \"/\");\n\t\t} else if (input.match(RDS3)) {\n\t\t\tinput = input.replace(RDS3, \"/\");\n\t\t\toutput.pop();\n\t\t} else if (input === \".\" || input === \"..\") {\n\t\t\tinput = \"\";\n\t\t} else {\n\t\t\tconst im = input.match(RDS5);\n\t\t\tif (im) {\n\t\t\t\tconst s = im[0];\n\t\t\t\tinput = input.slice(s.length);\n\t\t\t\toutput.push(s);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unexpected dot segment condition\");\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output.join(\"\");\n};\n\nexport function serialize(components:URIComponents, options:URIOptions = {}):string {\n\tconst protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\t//find scheme handler\n\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t//perform scheme specific serialization\n\tif (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n\n\tif (components.host) {\n\t\t//if host component is an IPv6 address\n\t\tif (protocol.IPV6ADDRESS.test(components.host)) {\n\t\t\t//TODO: normalize IPv6 address as per RFC 5952\n\t\t}\n\n\t\t//if host component is a domain name\n\t\telse if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {\n\t\t\t//convert IDN via punycode\n\t\t\ttry {\n\t\t\t\tcomponents.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\n\t\t\t} catch (e) {\n\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t}\n\t\t}\n\t}\n\n\t//normalize encoding\n\t_normalizeComponentEncoding(components, protocol);\n\n\tif (options.reference !== \"suffix\" && components.scheme) {\n\t\turiTokens.push(components.scheme);\n\t\turiTokens.push(\":\");\n\t}\n\n\tconst authority = _recomposeAuthority(components, options);\n\tif (authority !== undefined) {\n\t\tif (options.reference !== \"suffix\") {\n\t\t\turiTokens.push(\"//\");\n\t\t}\n\n\t\turiTokens.push(authority);\n\n\t\tif (components.path && components.path.charAt(0) !== \"/\") {\n\t\t\turiTokens.push(\"/\");\n\t\t}\n\t}\n\n\tif (components.path !== undefined) {\n\t\tlet s = components.path;\n\n\t\tif (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n\t\t\ts = removeDotSegments(s);\n\t\t}\n\n\t\tif (authority === undefined) {\n\t\t\ts = s.replace(/^\\/\\//, \"/%2F\"); //don't allow the path to start with \"//\"\n\t\t}\n\n\t\turiTokens.push(s);\n\t}\n\n\tif (components.query !== undefined) {\n\t\turiTokens.push(\"?\");\n\t\turiTokens.push(components.query);\n\t}\n\n\tif (components.fragment !== undefined) {\n\t\turiTokens.push(\"#\");\n\t\turiTokens.push(components.fragment);\n\t}\n\n\treturn uriTokens.join(\"\"); //merge tokens into a string\n};\n\nexport function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents {\n\tconst target:URIComponents = {};\n\n\tif (!skipNormalization) {\n\t\tbase = parse(serialize(base, options), options); //normalize base components\n\t\trelative = parse(serialize(relative, options), options); //normalize relative components\n\t}\n\toptions = options || {};\n\n\tif (!options.tolerant && relative.scheme) {\n\t\ttarget.scheme = relative.scheme;\n\t\t//target.authority = relative.authority;\n\t\ttarget.userinfo = relative.userinfo;\n\t\ttarget.host = relative.host;\n\t\ttarget.port = relative.port;\n\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\ttarget.query = relative.query;\n\t} else {\n\t\tif (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n\t\t\t//target.authority = relative.authority;\n\t\t\ttarget.userinfo = relative.userinfo;\n\t\t\ttarget.host = relative.host;\n\t\t\ttarget.port = relative.port;\n\t\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\t\ttarget.query = relative.query;\n\t\t} else {\n\t\t\tif (!relative.path) {\n\t\t\t\ttarget.path = base.path;\n\t\t\t\tif (relative.query !== undefined) {\n\t\t\t\t\ttarget.query = relative.query;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.query = base.query;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (relative.path.charAt(0) === \"/\") {\n\t\t\t\t\ttarget.path = removeDotSegments(relative.path);\n\t\t\t\t} else {\n\t\t\t\t\tif ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n\t\t\t\t\t\ttarget.path = \"/\" + relative.path;\n\t\t\t\t\t} else if (!base.path) {\n\t\t\t\t\t\ttarget.path = relative.path;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.path = removeDotSegments(target.path);\n\t\t\t\t}\n\t\t\t\ttarget.query = relative.query;\n\t\t\t}\n\t\t\t//target.authority = base.authority;\n\t\t\ttarget.userinfo = base.userinfo;\n\t\t\ttarget.host = base.host;\n\t\t\ttarget.port = base.port;\n\t\t}\n\t\ttarget.scheme = base.scheme;\n\t}\n\n\ttarget.fragment = relative.fragment;\n\n\treturn target;\n};\n\nexport function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string {\n\tconst schemelessOptions = assign({ scheme : 'null' }, options);\n\treturn serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n};\n\nexport function normalize(uri:string, options?:URIOptions):string;\nexport function normalize(uri:URIComponents, options?:URIOptions):URIComponents;\nexport function normalize(uri:any, options?:URIOptions):any {\n\tif (typeof uri === \"string\") {\n\t\turi = serialize(parse(uri, options), options);\n\t} else if (typeOf(uri) === \"object\") {\n\t\turi = parse(serialize(uri, options), options);\n\t}\n\n\treturn uri;\n};\n\nexport function equal(uriA:string, uriB:string, options?: URIOptions):boolean;\nexport function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean;\nexport function equal(uriA:any, uriB:any, options?:URIOptions):boolean {\n\tif (typeof uriA === \"string\") {\n\t\turiA = serialize(parse(uriA, options), options);\n\t} else if (typeOf(uriA) === \"object\") {\n\t\turiA = serialize(uriA, options);\n\t}\n\n\tif (typeof uriB === \"string\") {\n\t\turiB = serialize(parse(uriB, options), options);\n\t} else if (typeOf(uriB) === \"object\") {\n\t\turiB = serialize(uriB, options);\n\t}\n\n\treturn uriA === uriB;\n};\n\nexport function escapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\n};\n\nexport function unescapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\n};\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nexport interface WSComponents extends URIComponents {\n\tresourceName?: string;\n\tsecure?: boolean;\n}\n\nfunction isSecure(wsComponents:WSComponents):boolean {\n\treturn typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === \"wss\";\n}\n\n//RFC 6455\nconst handler:URISchemeHandler = {\n\tscheme : \"ws\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):WSComponents {\n\t\tconst wsComponents = components as WSComponents;\n\n\t\t//indicate if the secure flag is set\n\t\twsComponents.secure = isSecure(wsComponents);\n\n\t\t//construct resouce name\n\t\twsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');\n\t\twsComponents.path = undefined;\n\t\twsComponents.query = undefined;\n\n\t\treturn wsComponents;\n\t},\n\n\tserialize : function (wsComponents:WSComponents, options:URIOptions):URIComponents {\n\t\t//normalize the default port\n\t\tif (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === \"\") {\n\t\t\twsComponents.port = undefined;\n\t\t}\n\n\t\t//ensure scheme matches secure flag\n\t\tif (typeof wsComponents.secure === 'boolean') {\n\t\t\twsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws');\n\t\t\twsComponents.secure = undefined;\n\t\t}\n\n\t\t//reconstruct path from resource name\n\t\tif (wsComponents.resourceName) {\n\t\t\tconst [path, query] = wsComponents.resourceName.split('?');\n\t\t\twsComponents.path = (path && path !== '/' ? path : undefined);\n\t\t\twsComponents.query = query;\n\t\t\twsComponents.resourceName = undefined;\n\t\t}\n\n\t\t//forbid fragment component\n\t\twsComponents.fragment = undefined;\n\n\t\treturn wsComponents;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, pctDecChars, unescapeComponent } from \"../uri\";\nimport punycode from \"punycode\";\nimport { merge, subexp, toUpperCase, toArray } from \"../util\";\n\nexport interface MailtoHeaders {\n\t[hfname:string]:string\n}\n\nexport interface MailtoComponents extends URIComponents {\n\tto:Array,\n\theaders?:MailtoHeaders,\n\tsubject?:string,\n\tbody?:string\n}\n\nconst O:MailtoHeaders = {};\nconst isIRI = true;\n\n//RFC 3986\nconst UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nconst HEXDIG$$ = \"[0-9A-Fa-f]\"; //case-insensitive\nconst PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)); //expanded\n\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\"; //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nconst ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nconst QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nconst VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nconst DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\");\nconst QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$);\nconst QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$);\nconst QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"');\n\n//RFC 6068\nconst DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\"; //%d33-90 / %d94-126\nconst SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nconst QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$);\nconst DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\");\nconst LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$);\nconst ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$);\nconst TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\");\nconst HFNAME$ = subexp(QCHAR$ + \"*\");\nconst HFVALUE$ = HFNAME$;\nconst HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$);\nconst HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\");\nconst HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$);\nconst MAILTO_URI = new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\");\n\nconst UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nconst PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nconst NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nconst NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\");\nconst NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nconst NOT_HFVALUE = NOT_HFNAME;\nconst TO = new RegExp(\"^\" + TO$ + \"$\");\nconst HFIELDS = new RegExp(\"^\" + HFIELDS2$ + \"$\");\n\nfunction decodeUnreserved(str:string):string {\n\tconst decStr = pctDecChars(str);\n\treturn (!decStr.match(UNRESERVED) ? str : decStr);\n}\n\nconst handler:URISchemeHandler = {\n\tscheme : \"mailto\",\n\n\tparse : function (components:URIComponents, options:URIOptions):MailtoComponents {\n\t\tconst mailtoComponents = components as MailtoComponents;\n\t\tconst to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(\",\") : []);\n\t\tmailtoComponents.path = undefined;\n\n\t\tif (mailtoComponents.query) {\n\t\t\tlet unknownHeaders = false\n\t\t\tconst headers:MailtoHeaders = {};\n\t\t\tconst hfields = mailtoComponents.query.split(\"&\");\n\n\t\t\tfor (let x = 0, xl = hfields.length; x < xl; ++x) {\n\t\t\t\tconst hfield = hfields[x].split(\"=\");\n\n\t\t\t\tswitch (hfield[0]) {\n\t\t\t\t\tcase \"to\":\n\t\t\t\t\t\tconst toAddrs = hfield[1].split(\",\");\n\t\t\t\t\t\tfor (let x = 0, xl = toAddrs.length; x < xl; ++x) {\n\t\t\t\t\t\t\tto.push(toAddrs[x]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"subject\":\n\t\t\t\t\t\tmailtoComponents.subject = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"body\":\n\t\t\t\t\t\tmailtoComponents.body = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tunknownHeaders = true;\n\t\t\t\t\t\theaders[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (unknownHeaders) mailtoComponents.headers = headers;\n\t\t}\n\n\t\tmailtoComponents.query = undefined;\n\n\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\tconst addr = to[x].split(\"@\");\n\n\t\t\taddr[0] = unescapeComponent(addr[0]);\n\n\t\t\tif (!options.unicodeSupport) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\taddr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tmailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddr[1] = unescapeComponent(addr[1], options).toLowerCase();\n\t\t\t}\n\n\t\t\tto[x] = addr.join(\"@\");\n\t\t}\n\n\t\treturn mailtoComponents;\n\t},\n\n\tserialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents {\n\t\tconst components = mailtoComponents as URIComponents;\n\t\tconst to = toArray(mailtoComponents.to);\n\t\tif (to) {\n\t\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\t\tconst toAddr = String(to[x]);\n\t\t\t\tconst atIdx = toAddr.lastIndexOf(\"@\");\n\t\t\t\tconst localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n\t\t\t\tlet domain = toAddr.slice(atIdx + 1);\n\n\t\t\t\t//convert IDN via punycode\n\t\t\t\ttry {\n\t\t\t\t\tdomain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t\t}\n\n\t\t\t\tto[x] = localPart + \"@\" + domain;\n\t\t\t}\n\n\t\t\tcomponents.path = to.join(\",\");\n\t\t}\n\n\t\tconst headers = mailtoComponents.headers = mailtoComponents.headers || {};\n\n\t\tif (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n\t\tif (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n\n\t\tconst fields = [];\n\t\tfor (const name in headers) {\n\t\t\tif (headers[name] !== O[name]) {\n\t\t\t\tfields.push(\n\t\t\t\t\tname.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +\n\t\t\t\t\t\"=\" +\n\t\t\t\t\theaders[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (fields.length) {\n\t\t\tcomponents.query = fields.join(\"&\");\n\t\t}\n\n\t\treturn components;\n\t}\n}\n\nexport default handler;","import { URIRegExps } from \"./uri\";\nimport { buildExps } from \"./regexps-uri\";\n\nexport default buildExps(true);\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"http\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//report missing host\n\t\tif (!components.host) {\n\t\t\tcomponents.error = components.error || \"HTTP URIs must have a host.\";\n\t\t}\n\n\t\treturn components;\n\t},\n\n\tserialize : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\tconst secure = String(components.scheme).toLowerCase() === \"https\";\n\n\t\t//normalize the default port\n\t\tif (components.port === (secure ? 443 : 80) || components.port === \"\") {\n\t\t\tcomponents.port = undefined;\n\t\t}\n\t\t\n\t\t//normalize the empty path\n\t\tif (!components.path) {\n\t\t\tcomponents.path = \"/\";\n\t\t}\n\n\t\t//NOTE: We do not parse query strings for HTTP URIs\n\t\t//as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n\t\t//and not the HTTP spec.\n\n\t\treturn components;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport http from \"./http\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"https\",\n\tdomainHost : http.domainHost,\n\tparse : http.parse,\n\tserialize : http.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport ws from \"./ws\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"wss\",\n\tdomainHost : ws.domainHost,\n\tparse : ws.parse,\n\tserialize : ws.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, SCHEMES } from \"../uri\";\n\nexport interface URNComponents extends URIComponents {\n\tnid?:string;\n\tnss?:string;\n}\n\nexport interface URNOptions extends URIOptions {\n\tnid?:string;\n}\n\nconst NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\";\nconst PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\";\nconst TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\";\nconst NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\";\nconst URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\");\nconst URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\");\nconst URN_PARSE = /^([^\\:]+)\\:(.*)/;\nconst URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g;\n\n//RFC 2141\nconst handler:URISchemeHandler = {\n\tscheme : \"urn\",\n\n\tparse : function (components:URIComponents, options:URNOptions):URNComponents {\n\t\tconst matches = components.path && components.path.match(URN_PARSE);\n\t\tlet urnComponents = components as URNComponents;\n\n\t\tif (matches) {\n\t\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\t\tconst nid = matches[1].toLowerCase();\n\t\t\tconst nss = matches[2];\n\t\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\t\turnComponents.nid = nid;\n\t\t\turnComponents.nss = nss;\n\t\t\turnComponents.path = undefined;\n\n\t\t\tif (schemeHandler) {\n\t\t\t\turnComponents = schemeHandler.parse(urnComponents, options) as URNComponents;\n\t\t\t}\n\t\t} else {\n\t\t\turnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n\t\t}\n\n\t\treturn urnComponents;\n\t},\n\n\tserialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents {\n\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\tconst nid = urnComponents.nid;\n\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\tif (schemeHandler) {\n\t\t\turnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents;\n\t\t}\n\n\t\tconst uriComponents = urnComponents as URIComponents;\n\t\tconst nss = urnComponents.nss;\n\t\turiComponents.path = `${nid || options.nid}:${nss}`;\n\n\t\treturn uriComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { URNComponents } from \"./urn\";\nimport { SCHEMES } from \"../uri\";\n\nexport interface UUIDComponents extends URNComponents {\n\tuuid?: string;\n}\n\nconst UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\nconst UUID_PARSE = /^[0-9A-Fa-f\\-]{36}/;\n\n//RFC 4122\nconst handler:URISchemeHandler = {\n\tscheme : \"urn:uuid\",\n\n\tparse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents {\n\t\tconst uuidComponents = urnComponents as UUIDComponents;\n\t\tuuidComponents.uuid = uuidComponents.nss;\n\t\tuuidComponents.nss = undefined;\n\n\t\tif (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n\t\t\tuuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n\t\t}\n\n\t\treturn uuidComponents;\n\t},\n\n\tserialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents {\n\t\tconst urnComponents = uuidComponents as URNComponents;\n\t\t//normalize UUID\n\t\turnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n\t\treturn urnComponents;\n\t},\n};\n\nexport default handler;","import { SCHEMES } from \"./uri\";\n\nimport http from \"./schemes/http\";\nSCHEMES[http.scheme] = http;\n\nimport https from \"./schemes/https\";\nSCHEMES[https.scheme] = https;\n\nimport ws from \"./schemes/ws\";\nSCHEMES[ws.scheme] = ws;\n\nimport wss from \"./schemes/wss\";\nSCHEMES[wss.scheme] = wss;\n\nimport mailto from \"./schemes/mailto\";\nSCHEMES[mailto.scheme] = mailto;\n\nimport urn from \"./schemes/urn\";\nSCHEMES[urn.scheme] = urn;\n\nimport uuid from \"./schemes/urn-uuid\";\nSCHEMES[uuid.scheme] = uuid;\n\nexport * from \"./uri\";\n"]} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/index.d.ts b/node_modules/uri-js/dist/esnext/index.d.ts new file mode 100755 index 00000000..f6be7603 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/index.d.ts @@ -0,0 +1 @@ +export * from "./uri"; diff --git a/node_modules/uri-js/dist/esnext/index.js b/node_modules/uri-js/dist/esnext/index.js new file mode 100755 index 00000000..e3531b5b --- /dev/null +++ b/node_modules/uri-js/dist/esnext/index.js @@ -0,0 +1,17 @@ +import { SCHEMES } from "./uri"; +import http from "./schemes/http"; +SCHEMES[http.scheme] = http; +import https from "./schemes/https"; +SCHEMES[https.scheme] = https; +import ws from "./schemes/ws"; +SCHEMES[ws.scheme] = ws; +import wss from "./schemes/wss"; +SCHEMES[wss.scheme] = wss; +import mailto from "./schemes/mailto"; +SCHEMES[mailto.scheme] = mailto; +import urn from "./schemes/urn"; +SCHEMES[urn.scheme] = urn; +import uuid from "./schemes/urn-uuid"; +SCHEMES[uuid.scheme] = uuid; +export * from "./uri"; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/index.js.map b/node_modules/uri-js/dist/esnext/index.js.map new file mode 100755 index 00000000..0971f6eb --- /dev/null +++ b/node_modules/uri-js/dist/esnext/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,IAAI,MAAM,gBAAgB,CAAC;AAClC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAE5B,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;AAE9B,OAAO,EAAE,MAAM,cAAc,CAAC;AAC9B,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;AAExB,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AAE1B,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEhC,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AAE1B,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAE5B,cAAc,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/regexps-iri.d.ts b/node_modules/uri-js/dist/esnext/regexps-iri.d.ts new file mode 100755 index 00000000..c91cdacb --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-iri.d.ts @@ -0,0 +1,3 @@ +import { URIRegExps } from "./uri"; +declare const _default: URIRegExps; +export default _default; diff --git a/node_modules/uri-js/dist/esnext/regexps-iri.js b/node_modules/uri-js/dist/esnext/regexps-iri.js new file mode 100755 index 00000000..34e7de98 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-iri.js @@ -0,0 +1,3 @@ +import { buildExps } from "./regexps-uri"; +export default buildExps(true); +//# sourceMappingURL=regexps-iri.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/regexps-iri.js.map b/node_modules/uri-js/dist/esnext/regexps-iri.js.map new file mode 100755 index 00000000..2269c580 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-iri.js.map @@ -0,0 +1 @@ +{"version":3,"file":"regexps-iri.js","sourceRoot":"","sources":["../../src/regexps-iri.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,eAAe,SAAS,CAAC,IAAI,CAAC,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/regexps-uri.d.ts b/node_modules/uri-js/dist/esnext/regexps-uri.d.ts new file mode 100755 index 00000000..6096bda5 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-uri.d.ts @@ -0,0 +1,4 @@ +import { URIRegExps } from "./uri"; +export declare function buildExps(isIRI: boolean): URIRegExps; +declare const _default: URIRegExps; +export default _default; diff --git a/node_modules/uri-js/dist/esnext/regexps-uri.js b/node_modules/uri-js/dist/esnext/regexps-uri.js new file mode 100755 index 00000000..1cc659f1 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-uri.js @@ -0,0 +1,42 @@ +import { merge, subexp } from "./util"; +export function buildExps(isIRI) { + const ALPHA$$ = "[A-Za-z]", CR$ = "[\\x0D]", DIGIT$$ = "[0-9]", DQUOTE$$ = "[\\x22]", HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), //case-insensitive + LF$$ = "[\\x0A]", SP$$ = "[\\x20]", PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), //expanded + GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", //subset, excludes bidi control characters + IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", //subset + UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), //relaxed parsing rules + IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), H16$ = subexp(HEXDIG$$ + "{1,4}"), LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), // 6( h16 ":" ) ls32 + IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), // "::" 5( h16 ":" ) ls32 + IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), //[ h16 ] "::" 4( h16 ":" ) ls32 + IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), //[ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), //[ *4( h16 ":" ) h16 ] "::" ls32 + IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), //[ *5( h16 ":" ) h16 ] "::" h16 + IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), //[ *6( h16 ":" ) h16 ] "::" + IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), //RFC 6874 + IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), //RFC 6874 + IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), //RFC 6874, with relaxed parsing rules + IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), //RFC 6874 + REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), PORT$ = subexp(DIGIT$$ + "*"), AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), SEGMENT$ = subexp(PCHAR$ + "*"), SEGMENT_NZ$ = subexp(PCHAR$ + "+"), SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), //simplified + PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified + PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified + PATH_EMPTY$ = "(?!" + PCHAR$ + ")", PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"; + return { + NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), + NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED: new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"), + IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"), + IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules + }; +} +export default buildExps(false); +//# sourceMappingURL=regexps-uri.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/regexps-uri.js.map b/node_modules/uri-js/dist/esnext/regexps-uri.js.map new file mode 100755 index 00000000..cb028b80 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-uri.js.map @@ -0,0 +1 @@ +{"version":3,"file":"regexps-uri.js","sourceRoot":"","sources":["../../src/regexps-uri.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/http.d.ts b/node_modules/uri-js/dist/esnext/schemes/http.d.ts new file mode 100755 index 00000000..fe5b2f35 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/http.d.ts @@ -0,0 +1,3 @@ +import { URISchemeHandler } from "../uri"; +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/http.js b/node_modules/uri-js/dist/esnext/schemes/http.js new file mode 100755 index 00000000..6abf0fe6 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/http.js @@ -0,0 +1,28 @@ +const handler = { + scheme: "http", + domainHost: true, + parse: function (components, options) { + //report missing host + if (!components.host) { + components.error = components.error || "HTTP URIs must have a host."; + } + return components; + }, + serialize: function (components, options) { + const secure = String(components.scheme).toLowerCase() === "https"; + //normalize the default port + if (components.port === (secure ? 443 : 80) || components.port === "") { + components.port = undefined; + } + //normalize the empty path + if (!components.path) { + components.path = "/"; + } + //NOTE: We do not parse query strings for HTTP URIs + //as WWW Form Url Encoded query strings are part of the HTML4+ spec, + //and not the HTTP spec. + return components; + } +}; +export default handler; +//# sourceMappingURL=http.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/http.js.map b/node_modules/uri-js/dist/esnext/schemes/http.js.map new file mode 100755 index 00000000..82118970 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/http.js.map @@ -0,0 +1 @@ +{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/schemes/http.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,MAAM;IAEf,UAAU,EAAG,IAAI;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,qBAAqB;QACrB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,6BAA6B,CAAC;SACrE;QAED,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,SAAS,EAAG,UAAU,UAAwB,EAAE,OAAkB;QACjE,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;QAEnE,4BAA4B;QAC5B,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK,EAAE,EAAE;YACtE,UAAU,CAAC,IAAI,GAAG,SAAS,CAAC;SAC5B;QAED,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;SACtB;QAED,mDAAmD;QACnD,oEAAoE;QACpE,wBAAwB;QAExB,OAAO,UAAU,CAAC;IACnB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/https.d.ts b/node_modules/uri-js/dist/esnext/schemes/https.d.ts new file mode 100755 index 00000000..fe5b2f35 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/https.d.ts @@ -0,0 +1,3 @@ +import { URISchemeHandler } from "../uri"; +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/https.js b/node_modules/uri-js/dist/esnext/schemes/https.js new file mode 100755 index 00000000..ec4b6e76 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/https.js @@ -0,0 +1,9 @@ +import http from "./http"; +const handler = { + scheme: "https", + domainHost: http.domainHost, + parse: http.parse, + serialize: http.serialize +}; +export default handler; +//# sourceMappingURL=https.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/https.js.map b/node_modules/uri-js/dist/esnext/schemes/https.js.map new file mode 100755 index 00000000..385b8efe --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/https.js.map @@ -0,0 +1 @@ +{"version":3,"file":"https.js","sourceRoot":"","sources":["../../../src/schemes/https.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,OAAO;IAChB,UAAU,EAAG,IAAI,CAAC,UAAU;IAC5B,KAAK,EAAG,IAAI,CAAC,KAAK;IAClB,SAAS,EAAG,IAAI,CAAC,SAAS;CAC1B,CAAA;AAED,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts b/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts new file mode 100755 index 00000000..e2aefc2a --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts @@ -0,0 +1,12 @@ +import { URISchemeHandler, URIComponents } from "../uri"; +export interface MailtoHeaders { + [hfname: string]: string; +} +export interface MailtoComponents extends URIComponents { + to: Array; + headers?: MailtoHeaders; + subject?: string; + body?: string; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/mailto.js b/node_modules/uri-js/dist/esnext/schemes/mailto.js new file mode 100755 index 00000000..2553713c --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/mailto.js @@ -0,0 +1,148 @@ +import { pctEncChar, pctDecChars, unescapeComponent } from "../uri"; +import punycode from "punycode"; +import { merge, subexp, toUpperCase, toArray } from "../util"; +const O = {}; +const isIRI = true; +//RFC 3986 +const UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; +const HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive +const PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded +//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = +//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127) +//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext +//const VCHAR$$ = "[\\x21-\\x7E]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext +//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"); +//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$); +//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'); +const ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; +const QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; +const VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"); +const DOT_ATOM_TEXT$ = subexp(ATEXT$$ + "+" + subexp("\\." + ATEXT$$ + "+") + "*"); +const QUOTED_PAIR$ = subexp("\\\\" + VCHAR$$); +const QCONTENT$ = subexp(QTEXT$$ + "|" + QUOTED_PAIR$); +const QUOTED_STRING$ = subexp('\\"' + QCONTENT$ + "*" + '\\"'); +//RFC 6068 +const DTEXT_NO_OBS$$ = "[\\x21-\\x5A\\x5E-\\x7E]"; //%d33-90 / %d94-126 +const SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; +const QCHAR$ = subexp(UNRESERVED$$ + "|" + PCT_ENCODED$ + "|" + SOME_DELIMS$$); +const DOMAIN$ = subexp(DOT_ATOM_TEXT$ + "|" + "\\[" + DTEXT_NO_OBS$$ + "*" + "\\]"); +const LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + "|" + QUOTED_STRING$); +const ADDR_SPEC$ = subexp(LOCAL_PART$ + "\\@" + DOMAIN$); +const TO$ = subexp(ADDR_SPEC$ + subexp("\\," + ADDR_SPEC$) + "*"); +const HFNAME$ = subexp(QCHAR$ + "*"); +const HFVALUE$ = HFNAME$; +const HFIELD$ = subexp(HFNAME$ + "\\=" + HFVALUE$); +const HFIELDS2$ = subexp(HFIELD$ + subexp("\\&" + HFIELD$) + "*"); +const HFIELDS$ = subexp("\\?" + HFIELDS2$); +const MAILTO_URI = new RegExp("^mailto\\:" + TO$ + "?" + HFIELDS$ + "?$"); +const UNRESERVED = new RegExp(UNRESERVED$$, "g"); +const PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); +const NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); +const NOT_DOMAIN = new RegExp(merge("[^]", ATEXT$$, "[\\.]", "[\\[]", DTEXT_NO_OBS$$, "[\\]]"), "g"); +const NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); +const NOT_HFVALUE = NOT_HFNAME; +const TO = new RegExp("^" + TO$ + "$"); +const HFIELDS = new RegExp("^" + HFIELDS2$ + "$"); +function decodeUnreserved(str) { + const decStr = pctDecChars(str); + return (!decStr.match(UNRESERVED) ? str : decStr); +} +const handler = { + scheme: "mailto", + parse: function (components, options) { + const mailtoComponents = components; + const to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(",") : []); + mailtoComponents.path = undefined; + if (mailtoComponents.query) { + let unknownHeaders = false; + const headers = {}; + const hfields = mailtoComponents.query.split("&"); + for (let x = 0, xl = hfields.length; x < xl; ++x) { + const hfield = hfields[x].split("="); + switch (hfield[0]) { + case "to": + const toAddrs = hfield[1].split(","); + for (let x = 0, xl = toAddrs.length; x < xl; ++x) { + to.push(toAddrs[x]); + } + break; + case "subject": + mailtoComponents.subject = unescapeComponent(hfield[1], options); + break; + case "body": + mailtoComponents.body = unescapeComponent(hfield[1], options); + break; + default: + unknownHeaders = true; + headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); + break; + } + } + if (unknownHeaders) + mailtoComponents.headers = headers; + } + mailtoComponents.query = undefined; + for (let x = 0, xl = to.length; x < xl; ++x) { + const addr = to[x].split("@"); + addr[0] = unescapeComponent(addr[0]); + if (!options.unicodeSupport) { + //convert Unicode IDN -> ASCII IDN + try { + addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); + } + catch (e) { + mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; + } + } + else { + addr[1] = unescapeComponent(addr[1], options).toLowerCase(); + } + to[x] = addr.join("@"); + } + return mailtoComponents; + }, + serialize: function (mailtoComponents, options) { + const components = mailtoComponents; + const to = toArray(mailtoComponents.to); + if (to) { + for (let x = 0, xl = to.length; x < xl; ++x) { + const toAddr = String(to[x]); + const atIdx = toAddr.lastIndexOf("@"); + const localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); + let domain = toAddr.slice(atIdx + 1); + //convert IDN via punycode + try { + domain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain)); + } + catch (e) { + components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + to[x] = localPart + "@" + domain; + } + components.path = to.join(","); + } + const headers = mailtoComponents.headers = mailtoComponents.headers || {}; + if (mailtoComponents.subject) + headers["subject"] = mailtoComponents.subject; + if (mailtoComponents.body) + headers["body"] = mailtoComponents.body; + const fields = []; + for (const name in headers) { + if (headers[name] !== O[name]) { + fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + + "=" + + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)); + } + } + if (fields.length) { + components.query = fields.join("&"); + } + return components; + } +}; +export default handler; +//# sourceMappingURL=mailto.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/mailto.js.map b/node_modules/uri-js/dist/esnext/schemes/mailto.js.map new file mode 100755 index 00000000..82dba9a1 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/mailto.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mailto.js","sourceRoot":"","sources":["../../../src/schemes/mailto.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts new file mode 100755 index 00000000..e75f2e79 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts @@ -0,0 +1,7 @@ +import { URISchemeHandler, URIOptions } from "../uri"; +import { URNComponents } from "./urn"; +export interface UUIDComponents extends URNComponents { + uuid?: string; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js new file mode 100755 index 00000000..d1fce495 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js @@ -0,0 +1,23 @@ +const UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; +const UUID_PARSE = /^[0-9A-Fa-f\-]{36}/; +//RFC 4122 +const handler = { + scheme: "urn:uuid", + parse: function (urnComponents, options) { + const uuidComponents = urnComponents; + uuidComponents.uuid = uuidComponents.nss; + uuidComponents.nss = undefined; + if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) { + uuidComponents.error = uuidComponents.error || "UUID is not valid."; + } + return uuidComponents; + }, + serialize: function (uuidComponents, options) { + const urnComponents = uuidComponents; + //normalize UUID + urnComponents.nss = (uuidComponents.uuid || "").toLowerCase(); + return urnComponents; + }, +}; +export default handler; +//# sourceMappingURL=urn-uuid.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map new file mode 100755 index 00000000..3b7a8b3a --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map @@ -0,0 +1 @@ +{"version":3,"file":"urn-uuid.js","sourceRoot":"","sources":["../../../src/schemes/urn-uuid.ts"],"names":[],"mappings":"AAQA,MAAM,IAAI,GAAG,0DAA0D,CAAC;AACxE,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,UAAU;AACV,MAAM,OAAO,GAA+D;IAC3E,MAAM,EAAG,UAAU;IAEnB,KAAK,EAAG,UAAU,aAA2B,EAAE,OAAkB;QAChE,MAAM,cAAc,GAAG,aAA+B,CAAC;QACvD,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC;QACzC,cAAc,CAAC,GAAG,GAAG,SAAS,CAAC;QAE/B,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;YACpF,cAAc,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,IAAI,oBAAoB,CAAC;SACpE;QAED,OAAO,cAAc,CAAC;IACvB,CAAC;IAED,SAAS,EAAG,UAAU,cAA6B,EAAE,OAAkB;QACtE,MAAM,aAAa,GAAG,cAA+B,CAAC;QACtD,gBAAgB;QAChB,aAAa,CAAC,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,OAAO,aAAa,CAAC;IACtB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/urn.d.ts b/node_modules/uri-js/dist/esnext/schemes/urn.d.ts new file mode 100755 index 00000000..7e0c2fba --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn.d.ts @@ -0,0 +1,10 @@ +import { URISchemeHandler, URIComponents, URIOptions } from "../uri"; +export interface URNComponents extends URIComponents { + nid?: string; + nss?: string; +} +export interface URNOptions extends URIOptions { + nid?: string; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/urn.js b/node_modules/uri-js/dist/esnext/schemes/urn.js new file mode 100755 index 00000000..5d3f10aa --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn.js @@ -0,0 +1,49 @@ +import { SCHEMES } from "../uri"; +const NID$ = "(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})"; +const PCT_ENCODED$ = "(?:\\%[0-9A-Fa-f]{2})"; +const TRANS$$ = "[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]"; +const NSS$ = "(?:(?:" + PCT_ENCODED$ + "|" + TRANS$$ + ")+)"; +const URN_SCHEME = new RegExp("^urn\\:(" + NID$ + ")$"); +const URN_PATH = new RegExp("^(" + NID$ + ")\\:(" + NSS$ + ")$"); +const URN_PARSE = /^([^\:]+)\:(.*)/; +const URN_EXCLUDED = /[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g; +//RFC 2141 +const handler = { + scheme: "urn", + parse: function (components, options) { + const matches = components.path && components.path.match(URN_PARSE); + let urnComponents = components; + if (matches) { + const scheme = options.scheme || urnComponents.scheme || "urn"; + const nid = matches[1].toLowerCase(); + const nss = matches[2]; + const urnScheme = `${scheme}:${options.nid || nid}`; + const schemeHandler = SCHEMES[urnScheme]; + urnComponents.nid = nid; + urnComponents.nss = nss; + urnComponents.path = undefined; + if (schemeHandler) { + urnComponents = schemeHandler.parse(urnComponents, options); + } + } + else { + urnComponents.error = urnComponents.error || "URN can not be parsed."; + } + return urnComponents; + }, + serialize: function (urnComponents, options) { + const scheme = options.scheme || urnComponents.scheme || "urn"; + const nid = urnComponents.nid; + const urnScheme = `${scheme}:${options.nid || nid}`; + const schemeHandler = SCHEMES[urnScheme]; + if (schemeHandler) { + urnComponents = schemeHandler.serialize(urnComponents, options); + } + const uriComponents = urnComponents; + const nss = urnComponents.nss; + uriComponents.path = `${nid || options.nid}:${nss}`; + return uriComponents; + }, +}; +export default handler; +//# sourceMappingURL=urn.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/urn.js.map b/node_modules/uri-js/dist/esnext/schemes/urn.js.map new file mode 100755 index 00000000..ea43b0be --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn.js.map @@ -0,0 +1 @@ +{"version":3,"file":"urn.js","sourceRoot":"","sources":["../../../src/schemes/urn.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,OAAO,EAAE,MAAM,QAAQ,CAAC;AAW7C,MAAM,IAAI,GAAG,qCAAqC,CAAC;AACnD,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAC7C,MAAM,OAAO,GAAG,mEAAmE,CAAC;AACpF,MAAM,IAAI,GAAG,QAAQ,GAAG,YAAY,GAAG,GAAG,GAAG,OAAO,GAAG,KAAK,CAAC;AAC7D,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACxD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,MAAM,SAAS,GAAG,iBAAiB,CAAC;AACpC,MAAM,YAAY,GAAG,iDAAiD,CAAC;AAEvE,UAAU;AACV,MAAM,OAAO,GAA8C;IAC1D,MAAM,EAAG,KAAK;IAEd,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,aAAa,GAAG,UAA2B,CAAC;QAEhD,IAAI,OAAO,EAAE;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC;YAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YACpD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAEzC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,IAAI,GAAG,SAAS,CAAC;YAE/B,IAAI,aAAa,EAAE;gBAClB,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAkB,CAAC;aAC7E;SACD;aAAM;YACN,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,wBAAwB,CAAC;SACtE;QAED,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,SAAS,EAAG,UAAU,aAA2B,EAAE,OAAkB;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC;QAC/D,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,aAAa,EAAE;YAClB,aAAa,GAAG,aAAa,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,CAAkB,CAAC;SACjF;QAED,MAAM,aAAa,GAAG,aAA8B,CAAC;QACrD,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,aAAa,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QAEpD,OAAO,aAAa,CAAC;IACtB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/ws.d.ts b/node_modules/uri-js/dist/esnext/schemes/ws.d.ts new file mode 100755 index 00000000..47f4835b --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/ws.d.ts @@ -0,0 +1,7 @@ +import { URISchemeHandler, URIComponents } from "../uri"; +export interface WSComponents extends URIComponents { + resourceName?: string; + secure?: boolean; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/ws.js b/node_modules/uri-js/dist/esnext/schemes/ws.js new file mode 100755 index 00000000..9277f035 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/ws.js @@ -0,0 +1,41 @@ +function isSecure(wsComponents) { + return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss"; +} +//RFC 6455 +const handler = { + scheme: "ws", + domainHost: true, + parse: function (components, options) { + const wsComponents = components; + //indicate if the secure flag is set + wsComponents.secure = isSecure(wsComponents); + //construct resouce name + wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : ''); + wsComponents.path = undefined; + wsComponents.query = undefined; + return wsComponents; + }, + serialize: function (wsComponents, options) { + //normalize the default port + if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") { + wsComponents.port = undefined; + } + //ensure scheme matches secure flag + if (typeof wsComponents.secure === 'boolean') { + wsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws'); + wsComponents.secure = undefined; + } + //reconstruct path from resource name + if (wsComponents.resourceName) { + const [path, query] = wsComponents.resourceName.split('?'); + wsComponents.path = (path && path !== '/' ? path : undefined); + wsComponents.query = query; + wsComponents.resourceName = undefined; + } + //forbid fragment component + wsComponents.fragment = undefined; + return wsComponents; + } +}; +export default handler; +//# sourceMappingURL=ws.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/ws.js.map b/node_modules/uri-js/dist/esnext/schemes/ws.js.map new file mode 100755 index 00000000..186818cc --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/ws.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../../src/schemes/ws.ts"],"names":[],"mappings":"AAOA,kBAAkB,YAAyB;IAC1C,OAAO,OAAO,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;AAC7H,CAAC;AAED,UAAU;AACV,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,IAAI;IAEb,UAAU,EAAG,IAAI;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,YAAY,GAAG,UAA0B,CAAC;QAEhD,oCAAoC;QACpC,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QAE7C,wBAAwB;QACxB,YAAY,CAAC,YAAY,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9G,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;QAC9B,YAAY,CAAC,KAAK,GAAG,SAAS,CAAC;QAE/B,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,SAAS,EAAG,UAAU,YAAyB,EAAE,OAAkB;QAClE,4BAA4B;QAC5B,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,KAAK,EAAE,EAAE;YAC1F,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;SAC9B;QAED,mCAAmC;QACnC,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE;YAC7C,YAAY,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC;SAChC;QAED,qCAAqC;QACrC,IAAI,YAAY,CAAC,YAAY,EAAE;YAC9B,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3D,YAAY,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC9D,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;YAC3B,YAAY,CAAC,YAAY,GAAG,SAAS,CAAC;SACtC;QAED,2BAA2B;QAC3B,YAAY,CAAC,QAAQ,GAAG,SAAS,CAAC;QAElC,OAAO,YAAY,CAAC;IACrB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/wss.d.ts b/node_modules/uri-js/dist/esnext/schemes/wss.d.ts new file mode 100755 index 00000000..fe5b2f35 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/wss.d.ts @@ -0,0 +1,3 @@ +import { URISchemeHandler } from "../uri"; +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/wss.js b/node_modules/uri-js/dist/esnext/schemes/wss.js new file mode 100755 index 00000000..d1e22ccd --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/wss.js @@ -0,0 +1,9 @@ +import ws from "./ws"; +const handler = { + scheme: "wss", + domainHost: ws.domainHost, + parse: ws.parse, + serialize: ws.serialize +}; +export default handler; +//# sourceMappingURL=wss.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/wss.js.map b/node_modules/uri-js/dist/esnext/schemes/wss.js.map new file mode 100755 index 00000000..e19006d9 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/wss.js.map @@ -0,0 +1 @@ +{"version":3,"file":"wss.js","sourceRoot":"","sources":["../../../src/schemes/wss.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,MAAM,CAAC;AAEtB,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,KAAK;IACd,UAAU,EAAG,EAAE,CAAC,UAAU;IAC1B,KAAK,EAAG,EAAE,CAAC,KAAK;IAChB,SAAS,EAAG,EAAE,CAAC,SAAS;CACxB,CAAA;AAED,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/uri.d.ts b/node_modules/uri-js/dist/esnext/uri.d.ts new file mode 100755 index 00000000..da51e235 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/uri.d.ts @@ -0,0 +1,59 @@ +export interface URIComponents { + scheme?: string; + userinfo?: string; + host?: string; + port?: number | string; + path?: string; + query?: string; + fragment?: string; + reference?: string; + error?: string; +} +export interface URIOptions { + scheme?: string; + reference?: string; + tolerant?: boolean; + absolutePath?: boolean; + iri?: boolean; + unicodeSupport?: boolean; + domainHost?: boolean; +} +export interface URISchemeHandler { + scheme: string; + parse(components: ParentComponents, options: Options): Components; + serialize(components: Components, options: Options): ParentComponents; + unicodeSupport?: boolean; + domainHost?: boolean; + absolutePath?: boolean; +} +export interface URIRegExps { + NOT_SCHEME: RegExp; + NOT_USERINFO: RegExp; + NOT_HOST: RegExp; + NOT_PATH: RegExp; + NOT_PATH_NOSCHEME: RegExp; + NOT_QUERY: RegExp; + NOT_FRAGMENT: RegExp; + ESCAPE: RegExp; + UNRESERVED: RegExp; + OTHER_CHARS: RegExp; + PCT_ENCODED: RegExp; + IPV4ADDRESS: RegExp; + IPV6ADDRESS: RegExp; +} +export declare const SCHEMES: { + [scheme: string]: URISchemeHandler; +}; +export declare function pctEncChar(chr: string): string; +export declare function pctDecChars(str: string): string; +export declare function parse(uriString: string, options?: URIOptions): URIComponents; +export declare function removeDotSegments(input: string): string; +export declare function serialize(components: URIComponents, options?: URIOptions): string; +export declare function resolveComponents(base: URIComponents, relative: URIComponents, options?: URIOptions, skipNormalization?: boolean): URIComponents; +export declare function resolve(baseURI: string, relativeURI: string, options?: URIOptions): string; +export declare function normalize(uri: string, options?: URIOptions): string; +export declare function normalize(uri: URIComponents, options?: URIOptions): URIComponents; +export declare function equal(uriA: string, uriB: string, options?: URIOptions): boolean; +export declare function equal(uriA: URIComponents, uriB: URIComponents, options?: URIOptions): boolean; +export declare function escapeComponent(str: string, options?: URIOptions): string; +export declare function unescapeComponent(str: string, options?: URIOptions): string; diff --git a/node_modules/uri-js/dist/esnext/uri.js b/node_modules/uri-js/dist/esnext/uri.js new file mode 100755 index 00000000..659ce265 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/uri.js @@ -0,0 +1,480 @@ +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @see http://github.com/garycourt/uri-js + */ +/** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + */ +import URI_PROTOCOL from "./regexps-uri"; +import IRI_PROTOCOL from "./regexps-iri"; +import punycode from "punycode"; +import { toUpperCase, typeOf, assign } from "./util"; +export const SCHEMES = {}; +export function pctEncChar(chr) { + const c = chr.charCodeAt(0); + let e; + if (c < 16) + e = "%0" + c.toString(16).toUpperCase(); + else if (c < 128) + e = "%" + c.toString(16).toUpperCase(); + else if (c < 2048) + e = "%" + ((c >> 6) | 192).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + else + e = "%" + ((c >> 12) | 224).toString(16).toUpperCase() + "%" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + return e; +} +export function pctDecChars(str) { + let newStr = ""; + let i = 0; + const il = str.length; + while (i < il) { + const c = parseInt(str.substr(i + 1, 2), 16); + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } + else if (c >= 194 && c < 224) { + if ((il - i) >= 6) { + const c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + } + else { + newStr += str.substr(i, 6); + } + i += 6; + } + else if (c >= 224) { + if ((il - i) >= 9) { + const c2 = parseInt(str.substr(i + 4, 2), 16); + const c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + } + else { + newStr += str.substr(i, 9); + } + i += 9; + } + else { + newStr += str.substr(i, 3); + i += 3; + } + } + return newStr; +} +function _normalizeComponentEncoding(components, protocol) { + function decodeUnreserved(str) { + const decStr = pctDecChars(str); + return (!decStr.match(protocol.UNRESERVED) ? str : decStr); + } + if (components.scheme) + components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, ""); + if (components.userinfo !== undefined) + components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.host !== undefined) + components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.path !== undefined) + components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.query !== undefined) + components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.fragment !== undefined) + components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + return components; +} +; +function _stripLeadingZeros(str) { + return str.replace(/^0*(.*)/, "$1") || "0"; +} +function _normalizeIPv4(host, protocol) { + const matches = host.match(protocol.IPV4ADDRESS) || []; + const [, address] = matches; + if (address) { + return address.split(".").map(_stripLeadingZeros).join("."); + } + else { + return host; + } +} +function _normalizeIPv6(host, protocol) { + const matches = host.match(protocol.IPV6ADDRESS) || []; + const [, address, zone] = matches; + if (address) { + const [last, first] = address.toLowerCase().split('::').reverse(); + const firstFields = first ? first.split(":").map(_stripLeadingZeros) : []; + const lastFields = last.split(":").map(_stripLeadingZeros); + const isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]); + const fieldCount = isLastFieldIPv4Address ? 7 : 8; + const lastFieldsStart = lastFields.length - fieldCount; + const fields = Array(fieldCount); + for (let x = 0; x < fieldCount; ++x) { + fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || ''; + } + if (isLastFieldIPv4Address) { + fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol); + } + const allZeroFields = fields.reduce((acc, field, index) => { + if (!field || field === "0") { + const lastLongest = acc[acc.length - 1]; + if (lastLongest && lastLongest.index + lastLongest.length === index) { + lastLongest.length++; + } + else { + acc.push({ index, length: 1 }); + } + } + return acc; + }, []); + const longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0]; + let newHost; + if (longestZeroFields && longestZeroFields.length > 1) { + const newFirst = fields.slice(0, longestZeroFields.index); + const newLast = fields.slice(longestZeroFields.index + longestZeroFields.length); + newHost = newFirst.join(":") + "::" + newLast.join(":"); + } + else { + newHost = fields.join(":"); + } + if (zone) { + newHost += "%" + zone; + } + return newHost; + } + else { + return host; + } +} +const URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i; +const NO_MATCH_IS_UNDEFINED = ("").match(/(){0}/)[1] === undefined; +export function parse(uriString, options = {}) { + const components = {}; + const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL); + if (options.reference === "suffix") + uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + const matches = uriString.match(URI_PARSE); + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + components.userinfo = matches[3]; + components.host = matches[4]; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = matches[7]; + components.fragment = matches[8]; + //fix port number + if (isNaN(components.port)) { + components.port = matches[5]; + } + } + else { //IE FIX for improper RegExp matching + //store each component + components.scheme = matches[1] || undefined; + components.userinfo = (uriString.indexOf("@") !== -1 ? matches[3] : undefined); + components.host = (uriString.indexOf("//") !== -1 ? matches[4] : undefined); + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = (uriString.indexOf("?") !== -1 ? matches[7] : undefined); + components.fragment = (uriString.indexOf("#") !== -1 ? matches[8] : undefined); + //fix port number + if (isNaN(components.port)) { + components.port = (uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined); + } + } + if (components.host) { + //normalize IP hosts + components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol); + } + //determine reference type + if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) { + components.reference = "same-document"; + } + else if (components.scheme === undefined) { + components.reference = "relative"; + } + else if (components.fragment === undefined) { + components.reference = "absolute"; + } + else { + components.reference = "uri"; + } + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.error = components.error || "URI is not a " + options.reference + " reference."; + } + //find scheme handler + const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //check if scheme can't handle IRIs + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + //if host component is a domain name + if (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) { + //convert Unicode IDN -> ASCII IDN + try { + components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); + } + catch (e) { + components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; + } + } + //convert IRI -> URI + _normalizeComponentEncoding(components, URI_PROTOCOL); + } + else { + //normalize encodings + _normalizeComponentEncoding(components, protocol); + } + //perform scheme specific parsing + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } + else { + components.error = components.error || "URI can not be parsed."; + } + return components; +} +; +function _recomposeAuthority(components, options) { + const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL); + const uriTokens = []; + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo); + uriTokens.push("@"); + } + if (components.host !== undefined) { + //normalize IP hosts, add brackets and escape zone separator for IPv6 + uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => "[" + $1 + ($2 ? "%25" + $2 : "") + "]")); + } + if (typeof components.port === "number" || typeof components.port === "string") { + uriTokens.push(":"); + uriTokens.push(String(components.port)); + } + return uriTokens.length ? uriTokens.join("") : undefined; +} +; +const RDS1 = /^\.\.?\//; +const RDS2 = /^\/\.(\/|$)/; +const RDS3 = /^\/\.\.(\/|$)/; +const RDS4 = /^\.\.?$/; +const RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/; +export function removeDotSegments(input) { + const output = []; + while (input.length) { + if (input.match(RDS1)) { + input = input.replace(RDS1, ""); + } + else if (input.match(RDS2)) { + input = input.replace(RDS2, "/"); + } + else if (input.match(RDS3)) { + input = input.replace(RDS3, "/"); + output.pop(); + } + else if (input === "." || input === "..") { + input = ""; + } + else { + const im = input.match(RDS5); + if (im) { + const s = im[0]; + input = input.slice(s.length); + output.push(s); + } + else { + throw new Error("Unexpected dot segment condition"); + } + } + } + return output.join(""); +} +; +export function serialize(components, options = {}) { + const protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL); + const uriTokens = []; + //find scheme handler + const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //perform scheme specific serialization + if (schemeHandler && schemeHandler.serialize) + schemeHandler.serialize(components, options); + if (components.host) { + //if host component is an IPv6 address + if (protocol.IPV6ADDRESS.test(components.host)) { + //TODO: normalize IPv6 address as per RFC 5952 + } + //if host component is a domain name + else if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) { + //convert IDN via punycode + try { + components.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host)); + } + catch (e) { + components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + } + //normalize encoding + _normalizeComponentEncoding(components, protocol); + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme); + uriTokens.push(":"); + } + const authority = _recomposeAuthority(components, options); + if (authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + if (components.path !== undefined) { + let s = components.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + uriTokens.push(s); + } + if (components.query !== undefined) { + uriTokens.push("?"); + uriTokens.push(components.query); + } + if (components.fragment !== undefined) { + uriTokens.push("#"); + uriTokens.push(components.fragment); + } + return uriTokens.join(""); //merge tokens into a string +} +; +export function resolveComponents(base, relative, options = {}, skipNormalization) { + const target = {}; + if (!skipNormalization) { + base = parse(serialize(base, options), options); //normalize base components + relative = parse(serialize(relative, options), options); //normalize relative components + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } + else { + if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) { + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } + else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== undefined) { + target.query = relative.query; + } + else { + target.query = base.query; + } + } + else { + if (relative.path.charAt(0) === "/") { + target.path = removeDotSegments(relative.path); + } + else { + if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) { + target.path = "/" + relative.path; + } + else if (!base.path) { + target.path = relative.path; + } + else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + //target.authority = base.authority; + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; +} +; +export function resolve(baseURI, relativeURI, options) { + const schemelessOptions = assign({ scheme: 'null' }, options); + return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions); +} +; +export function normalize(uri, options) { + if (typeof uri === "string") { + uri = serialize(parse(uri, options), options); + } + else if (typeOf(uri) === "object") { + uri = parse(serialize(uri, options), options); + } + return uri; +} +; +export function equal(uriA, uriB, options) { + if (typeof uriA === "string") { + uriA = serialize(parse(uriA, options), options); + } + else if (typeOf(uriA) === "object") { + uriA = serialize(uriA, options); + } + if (typeof uriB === "string") { + uriB = serialize(parse(uriB, options), options); + } + else if (typeOf(uriB) === "object") { + uriB = serialize(uriB, options); + } + return uriA === uriB; +} +; +export function escapeComponent(str, options) { + return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar); +} +; +export function unescapeComponent(str, options) { + return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars); +} +; +//# sourceMappingURL=uri.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/uri.js.map b/node_modules/uri-js/dist/esnext/uri.js.map new file mode 100755 index 00000000..2e72ab18 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/uri.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/uri.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/util.d.ts b/node_modules/uri-js/dist/esnext/util.d.ts new file mode 100755 index 00000000..7c128575 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/util.d.ts @@ -0,0 +1,6 @@ +export declare function merge(...sets: Array): string; +export declare function subexp(str: string): string; +export declare function typeOf(o: any): string; +export declare function toUpperCase(str: string): string; +export declare function toArray(obj: any): Array; +export declare function assign(target: object, source: any): any; diff --git a/node_modules/uri-js/dist/esnext/util.js b/node_modules/uri-js/dist/esnext/util.js new file mode 100755 index 00000000..072711ef --- /dev/null +++ b/node_modules/uri-js/dist/esnext/util.js @@ -0,0 +1,36 @@ +export function merge(...sets) { + if (sets.length > 1) { + sets[0] = sets[0].slice(0, -1); + const xl = sets.length - 1; + for (let x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } + else { + return sets[0]; + } +} +export function subexp(str) { + return "(?:" + str + ")"; +} +export function typeOf(o) { + return o === undefined ? "undefined" : (o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase()); +} +export function toUpperCase(str) { + return str.toUpperCase(); +} +export function toArray(obj) { + return obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : []; +} +export function assign(target, source) { + const obj = target; + if (source) { + for (const key in source) { + obj[key] = source[key]; + } + } + return obj; +} +//# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/util.js.map b/node_modules/uri-js/dist/esnext/util.js.map new file mode 100755 index 00000000..05d9df02 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/util.js.map @@ -0,0 +1 @@ +{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,IAAkB;IAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;YAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC/B;QACD,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACrB;SAAM;QACN,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;KACf;AACF,CAAC;AAED,MAAM,iBAAiB,GAAU;IAChC,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;AAC1B,CAAC;AAED,MAAM,iBAAiB,CAAK;IAC3B,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACpJ,CAAC;AAED,MAAM,sBAAsB,GAAU;IACrC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,kBAAkB,GAAO;IAC9B,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvM,CAAC;AAGD,MAAM,iBAAiB,MAAc,EAAE,MAAW;IACjD,MAAM,GAAG,GAAG,MAAa,CAAC;IAC1B,IAAI,MAAM,EAAE;QACX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;YACzB,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;SACvB;KACD;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/package.json b/node_modules/uri-js/package.json new file mode 100755 index 00000000..de95d91a --- /dev/null +++ b/node_modules/uri-js/package.json @@ -0,0 +1,77 @@ +{ + "name": "uri-js", + "version": "4.4.1", + "description": "An RFC 3986/3987 compliant, scheme extendable URI/IRI parsing/validating/resolving library for JavaScript.", + "main": "dist/es5/uri.all.js", + "types": "dist/es5/uri.all.d.ts", + "directories": { + "test": "tests" + }, + "files": [ + "dist", + "package.json", + "yarn.lock", + "README.md", + "CHANGELOG", + "LICENSE" + ], + "scripts": { + "build:esnext": "tsc", + "build:es5": "rollup -c && cp dist/esnext/uri.d.ts dist/es5/uri.all.d.ts && npm run build:es5:fix-sourcemap", + "build:es5:fix-sourcemap": "sorcery -i dist/es5/uri.all.js", + "build:es5:min": "uglifyjs dist/es5/uri.all.js --support-ie8 --output dist/es5/uri.all.min.js --in-source-map dist/es5/uri.all.js.map --source-map uri.all.min.js.map --comments --compress --mangle --pure-funcs merge subexp && mv uri.all.min.js.map dist/es5/ && cp dist/es5/uri.all.d.ts dist/es5/uri.all.min.d.ts", + "build": "npm run build:esnext && npm run build:es5 && npm run build:es5:min", + "clean": "rm -rf dist", + "test": "mocha -u mocha-qunit-ui dist/es5/uri.all.js tests/tests.js" + }, + "repository": { + "type": "git", + "url": "http://github.com/garycourt/uri-js" + }, + "keywords": [ + "URI", + "IRI", + "IDN", + "URN", + "UUID", + "HTTP", + "HTTPS", + "WS", + "WSS", + "MAILTO", + "RFC3986", + "RFC3987", + "RFC5891", + "RFC2616", + "RFC2818", + "RFC2141", + "RFC4122", + "RFC4291", + "RFC5952", + "RFC6068", + "RFC6455", + "RFC6874" + ], + "author": "Gary Court ", + "license": "BSD-2-Clause", + "bugs": { + "url": "https://github.com/garycourt/uri-js/issues" + }, + "homepage": "https://github.com/garycourt/uri-js", + "devDependencies": { + "babel-cli": "^6.26.0", + "babel-plugin-external-helpers": "^6.22.0", + "babel-preset-latest": "^6.24.1", + "mocha": "^8.2.1", + "mocha-qunit-ui": "^0.1.3", + "rollup": "^0.41.6", + "rollup-plugin-babel": "^2.7.1", + "rollup-plugin-node-resolve": "^2.0.0", + "sorcery": "^0.10.0", + "typescript": "^2.8.1", + "uglify-js": "^2.8.14" + }, + "dependencies": { + "punycode": "^2.1.0" + } +} diff --git a/node_modules/uri-js/yarn.lock b/node_modules/uri-js/yarn.lock new file mode 100755 index 00000000..3c42ded1 --- /dev/null +++ b/node_modules/uri-js/yarn.lock @@ -0,0 +1,2558 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@6: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-external-helpers@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-es2015@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-es2016@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz#f900bf93e2ebc0d276df9b8ab59724ebfd959f8b" + dependencies: + babel-plugin-transform-exponentiation-operator "^6.24.1" + +babel-preset-es2017@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz#597beadfb9f7f208bcfd8a12e9b2b29b8b2f14d1" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.24.1" + +babel-preset-latest@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-latest/-/babel-preset-latest-6.24.1.tgz#677de069154a7485c2d25c577c02f624b85b85e8" + dependencies: + babel-preset-es2015 "^6.24.1" + babel-preset-es2016 "^6.24.1" + babel-preset-es2017 "^6.24.1" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-resolve@^1.11.0: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-crc32@^0.2.5: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +builtin-modules@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.1.2" + +chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^2.11.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^2.4.0, core-js@^2.5.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +debug@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +diff@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +es6-promise@^3.1.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.0.0: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@7.1.6, glob@^7.1.2, glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +graceful-fs@^4.1.11, graceful-fs@^4.1.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +graceful-fs@^4.1.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.4: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha-qunit-ui@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/mocha-qunit-ui/-/mocha-qunit-ui-0.1.3.tgz#e3e1ff1dac33222b10cef681efd7f82664141ea9" + +mocha@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.2.1.tgz#f2fa68817ed0e53343d989df65ccd358bc3a4b39" + integrity sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.4.3" + debug "4.2.0" + diff "4.0.2" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "3.14.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.2" + nanoid "3.1.12" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "7.2.0" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.0.2" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanoid@3.1.12: + version "3.1.12" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" + integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +output-file-sync@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +private@^0.1.6, private@^0.1.7, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +punycode@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@^2.0.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +regenerate@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6: + version "1.6.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" + dependencies: + path-parse "^1.0.5" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@^2.5.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + dependencies: + glob "^7.1.3" + +rollup-plugin-babel@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz#16528197b0f938a1536f44683c7a93d573182f57" + dependencies: + babel-core "6" + babel-plugin-transform-es2015-classes "^6.9.0" + object-assign "^4.1.0" + rollup-pluginutils "^1.5.0" + +rollup-plugin-node-resolve@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-2.1.1.tgz#cbb783b0d15b02794d58915350b2f0d902b8ddc8" + dependencies: + browser-resolve "^1.11.0" + builtin-modules "^1.1.0" + resolve "^1.1.6" + +rollup-pluginutils@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + +rollup@^0.41.6: + version "0.41.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" + dependencies: + source-map-support "^0.4.0" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +sander@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" + dependencies: + es6-promise "^3.1.2" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + rimraf "^2.5.2" + +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sorcery@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7" + dependencies: + buffer-crc32 "^0.2.5" + minimist "^1.2.0" + sander "^0.5.0" + sourcemap-codec "^1.3.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.0, source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +sourcemap-codec@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz#c8fd92d91889e902a07aee392bdd2c5863958ba2" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@7.2.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +typescript@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" + +uglify-js@^2.8.14: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8flags@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= + dependencies: + user-home "^1.1.1" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +workerpool@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.2.tgz#e241b43d8d033f1beb52c7851069456039d1d438" + integrity sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q== + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +y18n@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + +yargs-parser@13.1.2, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/node_modules/urix/.jshintrc b/node_modules/urix/.jshintrc new file mode 100644 index 00000000..e722e469 --- /dev/null +++ b/node_modules/urix/.jshintrc @@ -0,0 +1,42 @@ +{ + "bitwise": true, + "camelcase": true, + "curly": false, + "eqeqeq": true, + "es3": false, + "forin": true, + "immed": false, + "indent": false, + "latedef": "nofunc", + "newcap": false, + "noarg": true, + "noempty": true, + "nonew": false, + "plusplus": false, + "quotmark": true, + "undef": true, + "unused": "vars", + "strict": false, + "trailing": true, + "maxparams": 5, + "maxdepth": false, + "maxstatements": false, + "maxcomplexity": false, + "maxlen": 100, + + "asi": true, + "expr": true, + "globalstrict": true, + "smarttabs": true, + "sub": true, + + "node": true, + "globals": { + "describe": false, + "it": false, + "before": false, + "beforeEach": false, + "after": false, + "afterEach": false + } +} diff --git a/node_modules/urix/LICENSE b/node_modules/urix/LICENSE new file mode 100644 index 00000000..0595be36 --- /dev/null +++ b/node_modules/urix/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Simon Lydell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/urix/index.js b/node_modules/urix/index.js new file mode 100644 index 00000000..3fb79031 --- /dev/null +++ b/node_modules/urix/index.js @@ -0,0 +1,17 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +var path = require("path") + +"use strict" + +function urix(aPath) { + if (path.sep === "\\") { + return aPath + .replace(/\\/g, "/") + .replace(/^[a-z]:\/?/i, "/") + } + return aPath +} + +module.exports = urix diff --git a/node_modules/urix/package.json b/node_modules/urix/package.json new file mode 100644 index 00000000..ce795d17 --- /dev/null +++ b/node_modules/urix/package.json @@ -0,0 +1,25 @@ +{ + "name": "urix", + "version": "0.1.0", + "author": "Simon Lydell", + "license": "MIT", + "description": "Makes Windows-style paths more unix and URI friendly.", + "main": "index.js", + "repository": "lydell/urix", + "keywords": [ + "path", + "url", + "uri", + "unix", + "windows", + "backslash", + "slash" + ], + "scripts": { + "test": "jshint index.js test/ && mocha" + }, + "devDependencies": { + "mocha": "^1.17.1", + "jshint": "^2.4.4" + } +} diff --git a/node_modules/urix/readme.md b/node_modules/urix/readme.md new file mode 100644 index 00000000..ac386f5d --- /dev/null +++ b/node_modules/urix/readme.md @@ -0,0 +1,46 @@ +[![Build Status](https://travis-ci.org/lydell/urix.png?branch=master)](https://travis-ci.org/lydell/urix) + +Overview +======== + +Makes Windows-style paths more unix and URI friendly. Useful if you work with +paths that eventually will be used in URLs. + +```js +var urix = require("urix") + +// On Windows: +urix("c:\\users\\you\\foo") +// /users/you/foo + +// On unix-like systems: +urix("c:\\users\\you\\foo") +// c:\users\you\foo +``` + + +Installation +============ + +`npm install urix` + +```js +var urix = require("urix") +``` + + +Usage +===== + +### `urix(path)` ### + +On Windows, replaces all backslashes with slashes and uses a slash instead of a +drive letter and a colon for absolute paths. + +On unix-like systems it is a no-op. + + +License +======= + +[The X11 (“MIT”) License](LICENSE). diff --git a/node_modules/urix/test/index.js b/node_modules/urix/test/index.js new file mode 100644 index 00000000..b84b8f3e --- /dev/null +++ b/node_modules/urix/test/index.js @@ -0,0 +1,43 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +var path = require("path") +var assert = require("assert") +var urix = require("../") + +"use stict" + +function test(testPath, expected) { + path.sep = "\\" + assert.equal(urix(testPath), expected) + path.sep = "/" + assert.equal(urix(testPath), testPath) +} + +describe("urix", function() { + + it("is a function", function() { + assert.equal(typeof urix, "function") + }) + + + it("converts backslashes to slashes", function() { + test("a\\b\\c", "a/b/c") + test("\\a\\b\\c", "/a/b/c") + test("a/b\\c", "a/b/c") + test("\\\\a\\\\\\b///c", "//a///b///c") + }) + + + it("changes the drive letter to a slash", function() { + test("c:\\a", "/a") + test("C:\\a", "/a") + test("z:\\a", "/a") + test("c:a", "/a") + test("c:/a", "/a") + test("c:\\\\a", "//a") + test("c://a", "//a") + test("c:\\//a", "///a") + }) + +}) diff --git a/node_modules/use/LICENSE b/node_modules/use/LICENSE new file mode 100644 index 00000000..7cccaf9e --- /dev/null +++ b/node_modules/use/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/use/README.md b/node_modules/use/README.md new file mode 100644 index 00000000..59b1dbd8 --- /dev/null +++ b/node_modules/use/README.md @@ -0,0 +1,90 @@ +# use [![NPM version](https://img.shields.io/npm/v/use.svg?style=flat)](https://www.npmjs.com/package/use) [![NPM monthly downloads](https://img.shields.io/npm/dm/use.svg?style=flat)](https://npmjs.org/package/use) [![NPM total downloads](https://img.shields.io/npm/dt/use.svg?style=flat)](https://npmjs.org/package/use) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/use.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/use) + +> Easily add plugin support to your node.js application. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save use +``` + +A different take on plugin handling! This is not a middleware system, if you need something that handles async middleware, [ware](https://github.com/segmentio/ware) is great for that. + +## Usage + +```js +const use = require('use'); +``` + +See the [examples folder](./examples) for usage examples. + +## About + +
      +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
      + +
      +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
      + +
      +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
      + +### Related projects + +You might also be interested in these projects: + +* [base-plugins](https://www.npmjs.com/package/base-plugins): Adds 'smart plugin' support to your base application. | [homepage](https://github.com/node-base/base-plugins "Adds 'smart plugin' support to your base application.") +* [base](https://www.npmjs.com/package/base): Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks | [homepage](https://github.com/node-base/base "Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks") +* [ware](https://www.npmjs.com/package/ware): Easily create your own middleware layer. | [homepage](https://github.com/segmentio/ware "Easily create your own middleware layer.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 37 | [jonschlinkert](https://github.com/jonschlinkert) | +| 7 | [charlike-old](https://github.com/charlike-old) | +| 2 | [doowb](https://github.com/doowb) | +| 2 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Author + +**Jon Schlinkert** + +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 12, 2018._ \ No newline at end of file diff --git a/node_modules/use/index.js b/node_modules/use/index.js new file mode 100644 index 00000000..9a1eb4ee --- /dev/null +++ b/node_modules/use/index.js @@ -0,0 +1,155 @@ +/*! + * use + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +module.exports = function base(app, options) { + if (!isObject(app) && typeof app !== 'function') { + throw new TypeError('expected an object or function'); + } + + var opts = isObject(options) ? options : {}; + var prop = typeof opts.prop === 'string' ? opts.prop : 'fns'; + if (!Array.isArray(app[prop])) { + define(app, prop, []); + } + + /** + * Define a plugin function to be passed to use. The only + * parameter exposed to the plugin is `app`, the object or function. + * passed to `use(app)`. `app` is also exposed as `this` in plugins. + * + * Additionally, **if a plugin returns a function, the function will + * be pushed onto the `fns` array**, allowing the plugin to be + * called at a later point by the `run` method. + * + * ```js + * var use = require('use'); + * + * // define a plugin + * function foo(app) { + * // do stuff + * } + * + * var app = function(){}; + * use(app); + * + * // register plugins + * app.use(foo); + * app.use(bar); + * app.use(baz); + * ``` + * @name .use + * @param {Function} `fn` plugin function to call + * @api public + */ + + define(app, 'use', use); + + /** + * Run all plugins on `fns`. Any plugin that returns a function + * when called by `use` is pushed onto the `fns` array. + * + * ```js + * var config = {}; + * app.run(config); + * ``` + * @name .run + * @param {Object} `value` Object to be modified by plugins. + * @return {Object} Returns the object passed to `run` + * @api public + */ + + define(app, 'run', function(val) { + if (!isObject(val)) return; + + if (!val.use || !val.run) { + define(val, prop, val[prop] || []); + define(val, 'use', use); + } + + if (!val[prop] || val[prop].indexOf(base) === -1) { + val.use(base); + } + + var self = this || app; + var fns = self[prop]; + var len = fns.length; + var idx = -1; + + while (++idx < len) { + val.use(fns[idx]); + } + return val; + }); + + /** + * Call plugin `fn`. If a function is returned push it into the + * `fns` array to be called by the `run` method. + */ + + function use(type, fn, options) { + var offset = 1; + + if (typeof type === 'string' || Array.isArray(type)) { + fn = wrap(type, fn); + offset++; + } else { + options = fn; + fn = type; + } + + if (typeof fn !== 'function') { + throw new TypeError('expected a function'); + } + + var self = this || app; + var fns = self[prop]; + + var args = [].slice.call(arguments, offset); + args.unshift(self); + + if (typeof opts.hook === 'function') { + opts.hook.apply(self, args); + } + + var val = fn.apply(self, args); + if (typeof val === 'function' && fns.indexOf(val) === -1) { + fns.push(val); + } + return self; + } + + /** + * Wrap a named plugin function so that it's only called on objects of the + * given `type` + * + * @param {String} `type` + * @param {Function} `fn` Plugin function + * @return {Function} + */ + + function wrap(type, fn) { + return function plugin() { + return this.type === type ? fn.apply(this, arguments) : plugin; + }; + } + + return app; +}; + +function isObject(val) { + return val && typeof val === 'object' && !Array.isArray(val); +} + +function define(obj, key, val) { + Object.defineProperty(obj, key, { + configurable: true, + writable: true, + value: val + }); +} diff --git a/node_modules/use/package.json b/node_modules/use/package.json new file mode 100644 index 00000000..b7a3f9a1 --- /dev/null +++ b/node_modules/use/package.json @@ -0,0 +1,66 @@ +{ + "name": "use", + "description": "Easily add plugin support to your node.js application.", + "version": "3.1.1", + "homepage": "https://github.com/jonschlinkert/use", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Olsten Larck (https://i.am.charlike.online)", + "(https://github.com/wtgtybhertgeghgtwtg)" + ], + "repository": "jonschlinkert/use", + "bugs": { + "url": "https://github.com/jonschlinkert/use/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "base-plugins": "^1.0.0", + "define-property": "^2.0.0", + "extend-shallow": "^3.0.1", + "gulp": "^3.9.1", + "gulp-eslint": "^4.0.0", + "gulp-format-md": "^1.0.0", + "gulp-istanbul": "^1.1.2", + "gulp-mocha": "^3.0.1", + "mocha": "^4.0.1" + }, + "keywords": [ + "use" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "base", + "base-plugins", + "ware" + ] + }, + "reflinks": [ + "verb", + "ware" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/util-deprecate/History.md b/node_modules/util-deprecate/History.md new file mode 100644 index 00000000..acc86753 --- /dev/null +++ b/node_modules/util-deprecate/History.md @@ -0,0 +1,16 @@ + +1.0.2 / 2015-10-07 +================== + + * use try/catch when checking `localStorage` (#3, @kumavis) + +1.0.1 / 2014-11-25 +================== + + * browser: use `console.warn()` for deprecation calls + * browser: more jsdocs + +1.0.0 / 2014-04-30 +================== + + * initial commit diff --git a/node_modules/util-deprecate/LICENSE b/node_modules/util-deprecate/LICENSE new file mode 100644 index 00000000..6a60e8c2 --- /dev/null +++ b/node_modules/util-deprecate/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/util-deprecate/README.md b/node_modules/util-deprecate/README.md new file mode 100644 index 00000000..75622fa7 --- /dev/null +++ b/node_modules/util-deprecate/README.md @@ -0,0 +1,53 @@ +util-deprecate +============== +### The Node.js `util.deprecate()` function with browser support + +In Node.js, this module simply re-exports the `util.deprecate()` function. + +In the web browser (i.e. via browserify), a browser-specific implementation +of the `util.deprecate()` function is used. + + +## API + +A `deprecate()` function is the only thing exposed by this module. + +``` javascript +// setup: +exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead'); + + +// users see: +foo(); +// foo() is deprecated, use bar() instead +foo(); +foo(); +``` + + +## License + +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/util-deprecate/browser.js b/node_modules/util-deprecate/browser.js new file mode 100644 index 00000000..549ae2f0 --- /dev/null +++ b/node_modules/util-deprecate/browser.js @@ -0,0 +1,67 @@ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} diff --git a/node_modules/util-deprecate/node.js b/node_modules/util-deprecate/node.js new file mode 100644 index 00000000..5e6fcff5 --- /dev/null +++ b/node_modules/util-deprecate/node.js @@ -0,0 +1,6 @@ + +/** + * For Node.js, simply re-export the core `util.deprecate` function. + */ + +module.exports = require('util').deprecate; diff --git a/node_modules/util-deprecate/package.json b/node_modules/util-deprecate/package.json new file mode 100644 index 00000000..2e79f89a --- /dev/null +++ b/node_modules/util-deprecate/package.json @@ -0,0 +1,27 @@ +{ + "name": "util-deprecate", + "version": "1.0.2", + "description": "The Node.js `util.deprecate()` function with browser support", + "main": "node.js", + "browser": "browser.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/util-deprecate.git" + }, + "keywords": [ + "util", + "deprecate", + "browserify", + "browser", + "node" + ], + "author": "Nathan Rajlich (http://n8.io/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/TooTallNate/util-deprecate/issues" + }, + "homepage": "https://github.com/TooTallNate/util-deprecate" +} diff --git a/node_modules/uuid/AUTHORS b/node_modules/uuid/AUTHORS new file mode 100644 index 00000000..5a105230 --- /dev/null +++ b/node_modules/uuid/AUTHORS @@ -0,0 +1,5 @@ +Robert Kieffer +Christoph Tavan +AJ ONeal +Vincent Voyer +Roman Shtylman diff --git a/node_modules/uuid/CHANGELOG.md b/node_modules/uuid/CHANGELOG.md new file mode 100644 index 00000000..f811b8a0 --- /dev/null +++ b/node_modules/uuid/CHANGELOG.md @@ -0,0 +1,119 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [3.4.0](https://github.com/uuidjs/uuid/compare/v3.3.3...v3.4.0) (2020-01-16) + + +### Features + +* rename repository to github:uuidjs/uuid ([#351](https://github.com/uuidjs/uuid/issues/351)) ([e2d7314](https://github.com/uuidjs/uuid/commit/e2d7314)), closes [#338](https://github.com/uuidjs/uuid/issues/338) + +### [3.3.3](https://github.com/uuidjs/uuid/compare/v3.3.2...v3.3.3) (2019-08-19) + + +## [3.3.2](https://github.com/uuidjs/uuid/compare/v3.3.1...v3.3.2) (2018-06-28) + + +### Bug Fixes + +* typo ([305d877](https://github.com/uuidjs/uuid/commit/305d877)) + + + + +## [3.3.1](https://github.com/uuidjs/uuid/compare/v3.3.0...v3.3.1) (2018-06-28) + + +### Bug Fixes + +* fix [#284](https://github.com/uuidjs/uuid/issues/284) by setting function name in try-catch ([f2a60f2](https://github.com/uuidjs/uuid/commit/f2a60f2)) + + + + +# [3.3.0](https://github.com/uuidjs/uuid/compare/v3.2.1...v3.3.0) (2018-06-22) + + +### Bug Fixes + +* assignment to readonly property to allow running in strict mode ([#270](https://github.com/uuidjs/uuid/issues/270)) ([d062fdc](https://github.com/uuidjs/uuid/commit/d062fdc)) +* fix [#229](https://github.com/uuidjs/uuid/issues/229) ([c9684d4](https://github.com/uuidjs/uuid/commit/c9684d4)) +* Get correct version of IE11 crypto ([#274](https://github.com/uuidjs/uuid/issues/274)) ([153d331](https://github.com/uuidjs/uuid/commit/153d331)) +* mem issue when generating uuid ([#267](https://github.com/uuidjs/uuid/issues/267)) ([c47702c](https://github.com/uuidjs/uuid/commit/c47702c)) + +### Features + +* enforce Conventional Commit style commit messages ([#282](https://github.com/uuidjs/uuid/issues/282)) ([cc9a182](https://github.com/uuidjs/uuid/commit/cc9a182)) + + + +## [3.2.1](https://github.com/uuidjs/uuid/compare/v3.2.0...v3.2.1) (2018-01-16) + + +### Bug Fixes + +* use msCrypto if available. Fixes [#241](https://github.com/uuidjs/uuid/issues/241) ([#247](https://github.com/uuidjs/uuid/issues/247)) ([1fef18b](https://github.com/uuidjs/uuid/commit/1fef18b)) + + + + +# [3.2.0](https://github.com/uuidjs/uuid/compare/v3.1.0...v3.2.0) (2018-01-16) + + +### Bug Fixes + +* remove mistakenly added typescript dependency, rollback version (standard-version will auto-increment) ([09fa824](https://github.com/uuidjs/uuid/commit/09fa824)) +* use msCrypto if available. Fixes [#241](https://github.com/uuidjs/uuid/issues/241) ([#247](https://github.com/uuidjs/uuid/issues/247)) ([1fef18b](https://github.com/uuidjs/uuid/commit/1fef18b)) + + +### Features + +* Add v3 Support ([#217](https://github.com/uuidjs/uuid/issues/217)) ([d94f726](https://github.com/uuidjs/uuid/commit/d94f726)) + + +# [3.1.0](https://github.com/uuidjs/uuid/compare/v3.1.0...v3.0.1) (2017-06-17) + +### Bug Fixes + +* (fix) Add .npmignore file to exclude test/ and other non-essential files from packing. (#183) +* Fix typo (#178) +* Simple typo fix (#165) + +### Features +* v5 support in CLI (#197) +* V5 support (#188) + + +# 3.0.1 (2016-11-28) + +* split uuid versions into separate files + + +# 3.0.0 (2016-11-17) + +* remove .parse and .unparse + + +# 2.0.0 + +* Removed uuid.BufferClass + + +# 1.4.0 + +* Improved module context detection +* Removed public RNG functions + + +# 1.3.2 + +* Improve tests and handling of v1() options (Issue #24) +* Expose RNG option to allow for perf testing with different generators + + +# 1.3.0 + +* Support for version 1 ids, thanks to [@ctavan](https://github.com/ctavan)! +* Support for node.js crypto API +* De-emphasizing performance in favor of a) cryptographic quality PRNGs where available and b) more manageable code diff --git a/node_modules/uuid/LICENSE.md b/node_modules/uuid/LICENSE.md new file mode 100644 index 00000000..8c84e398 --- /dev/null +++ b/node_modules/uuid/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/uuid/README.md b/node_modules/uuid/README.md new file mode 100644 index 00000000..1752e475 --- /dev/null +++ b/node_modules/uuid/README.md @@ -0,0 +1,276 @@ + + +# uuid [![Build Status](https://secure.travis-ci.org/kelektiv/node-uuid.svg?branch=master)](http://travis-ci.org/kelektiv/node-uuid) # + +Simple, fast generation of [RFC4122](http://www.ietf.org/rfc/rfc4122.txt) UUIDS. + +Features: + +* Support for version 1, 3, 4 and 5 UUIDs +* Cross-platform +* Uses cryptographically-strong random number APIs (when available) +* Zero-dependency, small footprint (... but not [this small](https://gist.github.com/982883)) + +[**Deprecation warning**: The use of `require('uuid')` is deprecated and will not be +supported after version 3.x of this module. Instead, use `require('uuid/[v1|v3|v4|v5]')` as shown in the examples below.] + +## Quickstart - CommonJS (Recommended) + +```shell +npm install uuid +``` + +Then generate your uuid version of choice ... + +Version 1 (timestamp): + +```javascript +const uuidv1 = require('uuid/v1'); +uuidv1(); // ⇨ '2c5ea4c0-4067-11e9-8bad-9b1deb4d3b7d' + +``` + +Version 3 (namespace): + +```javascript +const uuidv3 = require('uuid/v3'); + +// ... using predefined DNS namespace (for domain names) +uuidv3('hello.example.com', uuidv3.DNS); // ⇨ '9125a8dc-52ee-365b-a5aa-81b0b3681cf6' + +// ... using predefined URL namespace (for, well, URLs) +uuidv3('http://example.com/hello', uuidv3.URL); // ⇨ 'c6235813-3ba4-3801-ae84-e0a6ebb7d138' + +// ... using a custom namespace +// +// Note: Custom namespaces should be a UUID string specific to your application! +// E.g. the one here was generated using this modules `uuid` CLI. +const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341'; +uuidv3('Hello, World!', MY_NAMESPACE); // ⇨ 'e8b5a51d-11c8-3310-a6ab-367563f20686' + +``` + +Version 4 (random): + +```javascript +const uuidv4 = require('uuid/v4'); +uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed' + +``` + +Version 5 (namespace): + +```javascript +const uuidv5 = require('uuid/v5'); + +// ... using predefined DNS namespace (for domain names) +uuidv5('hello.example.com', uuidv5.DNS); // ⇨ 'fdda765f-fc57-5604-a269-52a7df8164ec' + +// ... using predefined URL namespace (for, well, URLs) +uuidv5('http://example.com/hello', uuidv5.URL); // ⇨ '3bbcee75-cecc-5b56-8031-b6641c1ed1f1' + +// ... using a custom namespace +// +// Note: Custom namespaces should be a UUID string specific to your application! +// E.g. the one here was generated using this modules `uuid` CLI. +const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341'; +uuidv5('Hello, World!', MY_NAMESPACE); // ⇨ '630eb68f-e0fa-5ecc-887a-7c7a62614681' + +``` + +## API + +### Version 1 + +```javascript +const uuidv1 = require('uuid/v1'); + +// Incantations +uuidv1(); +uuidv1(options); +uuidv1(options, buffer, offset); +``` + +Generate and return a RFC4122 v1 (timestamp-based) UUID. + +* `options` - (Object) Optional uuid state to apply. Properties may include: + + * `node` - (Array) Node id as Array of 6 bytes (per 4.1.6). Default: Randomly generated ID. See note 1. + * `clockseq` - (Number between 0 - 0x3fff) RFC clock sequence. Default: An internally maintained clockseq is used. + * `msecs` - (Number) Time in milliseconds since unix Epoch. Default: The current time is used. + * `nsecs` - (Number between 0-9999) additional time, in 100-nanosecond units. Ignored if `msecs` is unspecified. Default: internal uuid counter is used, as per 4.2.1.2. + +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Note: The default [node id](https://tools.ietf.org/html/rfc4122#section-4.1.6) (the last 12 digits in the UUID) is generated once, randomly, on process startup, and then remains unchanged for the duration of the process. + +Example: Generate string UUID with fully-specified options + +```javascript +const v1options = { + node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab], + clockseq: 0x1234, + msecs: new Date('2011-11-01').getTime(), + nsecs: 5678 +}; +uuidv1(v1options); // ⇨ '710b962e-041c-11e1-9234-0123456789ab' + +``` + +Example: In-place generation of two binary IDs + +```javascript +// Generate two ids in an array +const arr = new Array(); +uuidv1(null, arr, 0); // ⇨ + // [ + // 44, 94, 164, 192, 64, 103, + // 17, 233, 146, 52, 155, 29, + // 235, 77, 59, 125 + // ] +uuidv1(null, arr, 16); // ⇨ + // [ + // 44, 94, 164, 192, 64, 103, 17, 233, + // 146, 52, 155, 29, 235, 77, 59, 125, + // 44, 94, 164, 193, 64, 103, 17, 233, + // 146, 52, 155, 29, 235, 77, 59, 125 + // ] + +``` + +### Version 3 + +```javascript +const uuidv3 = require('uuid/v3'); + +// Incantations +uuidv3(name, namespace); +uuidv3(name, namespace, buffer); +uuidv3(name, namespace, buffer, offset); +``` + +Generate and return a RFC4122 v3 UUID. + +* `name` - (String | Array[]) "name" to create UUID with +* `namespace` - (String | Array[]) "namespace" UUID either as a String or Array[16] of byte values +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. Default = 0 + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: + +```javascript +uuidv3('hello world', MY_NAMESPACE); // ⇨ '042ffd34-d989-321c-ad06-f60826172424' + +``` + +### Version 4 + +```javascript +const uuidv4 = require('uuid/v4') + +// Incantations +uuidv4(); +uuidv4(options); +uuidv4(options, buffer, offset); +``` + +Generate and return a RFC4122 v4 UUID. + +* `options` - (Object) Optional uuid state to apply. Properties may include: + * `random` - (Number[16]) Array of 16 numbers (0-255) to use in place of randomly generated values + * `rng` - (Function) Random # generator function that returns an Array[16] of byte values (0-255) +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: Generate string UUID with predefined `random` values + +```javascript +const v4options = { + random: [ + 0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea, + 0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36 + ] +}; +uuidv4(v4options); // ⇨ '109156be-c4fb-41ea-b1b4-efe1671c5836' + +``` + +Example: Generate two IDs in a single buffer + +```javascript +const buffer = new Array(); +uuidv4(null, buffer, 0); // ⇨ + // [ + // 155, 29, 235, 77, 59, + // 125, 75, 173, 155, 221, + // 43, 13, 123, 61, 203, + // 109 + // ] +uuidv4(null, buffer, 16); // ⇨ + // [ + // 155, 29, 235, 77, 59, 125, 75, 173, + // 155, 221, 43, 13, 123, 61, 203, 109, + // 27, 157, 107, 205, 187, 253, 75, 45, + // 155, 93, 171, 141, 251, 189, 75, 237 + // ] + +``` + +### Version 5 + +```javascript +const uuidv5 = require('uuid/v5'); + +// Incantations +uuidv5(name, namespace); +uuidv5(name, namespace, buffer); +uuidv5(name, namespace, buffer, offset); +``` + +Generate and return a RFC4122 v5 UUID. + +* `name` - (String | Array[]) "name" to create UUID with +* `namespace` - (String | Array[]) "namespace" UUID either as a String or Array[16] of byte values +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. Default = 0 + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: + +```javascript +uuidv5('hello world', MY_NAMESPACE); // ⇨ '9f282611-e0fd-5650-8953-89c8e342da0b' + +``` + +## Command Line + +UUIDs can be generated from the command line with the `uuid` command. + +```shell +$ uuid +ddeb27fb-d9a0-4624-be4d-4615062daed4 + +$ uuid v1 +02d37060-d446-11e7-a9fa-7bdae751ebe1 +``` + +Type `uuid --help` for usage details + +## Testing + +```shell +npm test +``` + +---- +Markdown generated from [README_js.md](README_js.md) by [![RunMD Logo](http://i.imgur.com/h0FVyzU.png)](https://github.com/broofa/runmd) \ No newline at end of file diff --git a/node_modules/uuid/index.js b/node_modules/uuid/index.js new file mode 100644 index 00000000..e96791ab --- /dev/null +++ b/node_modules/uuid/index.js @@ -0,0 +1,8 @@ +var v1 = require('./v1'); +var v4 = require('./v4'); + +var uuid = v4; +uuid.v1 = v1; +uuid.v4 = v4; + +module.exports = uuid; diff --git a/node_modules/uuid/package.json b/node_modules/uuid/package.json new file mode 100644 index 00000000..efc07b8f --- /dev/null +++ b/node_modules/uuid/package.json @@ -0,0 +1,49 @@ +{ + "name": "uuid", + "version": "3.4.0", + "description": "RFC4122 (v1, v4, and v5) UUIDs", + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ] + }, + "keywords": [ + "uuid", + "guid", + "rfc4122" + ], + "license": "MIT", + "bin": { + "uuid": "./bin/uuid" + }, + "devDependencies": { + "@commitlint/cli": "~8.2.0", + "@commitlint/config-conventional": "~8.2.0", + "eslint": "~6.4.0", + "husky": "~3.0.5", + "mocha": "6.2.0", + "runmd": "1.2.1", + "standard-version": "7.0.0" + }, + "scripts": { + "lint": "eslint .", + "test": "npm run lint && mocha test/test.js", + "md": "runmd --watch --output=README.md README_js.md", + "release": "standard-version", + "prepare": "runmd --output=README.md README_js.md" + }, + "browser": { + "./lib/rng.js": "./lib/rng-browser.js", + "./lib/sha1.js": "./lib/sha1-browser.js", + "./lib/md5.js": "./lib/md5-browser.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/uuidjs/uuid.git" + }, + "husky": { + "hooks": { + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" + } + } +} diff --git a/node_modules/uuid/v1.js b/node_modules/uuid/v1.js new file mode 100644 index 00000000..8c245de4 --- /dev/null +++ b/node_modules/uuid/v1.js @@ -0,0 +1,109 @@ +var rng = require('./lib/rng'); +var bytesToUuid = require('./lib/bytesToUuid'); + +// **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html + +var _nodeId; +var _clockseq; + +// Previous uuid creation time +var _lastMSecs = 0; +var _lastNSecs = 0; + +// See https://github.com/uuidjs/uuid for API details +function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || []; + + options = options || {}; + var node = options.node || _nodeId; + var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; + + // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 + if (node == null || clockseq == null) { + var seedBytes = rng(); + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [ + seedBytes[0] | 0x01, + seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5] + ]; + } + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } + + // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime(); + + // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; + + // Time since last uuid creation (in msecs) + var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; + + // Per 4.2.1.2, Bump clockseq on clock regression + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } + + // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } + + // Per 4.2.1.2 Throw error if too many uuids are requested + if (nsecs >= 10000) { + throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; + + // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + msecs += 12219292800000; + + // `time_low` + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; + + // `time_mid` + var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; + + // `time_high_and_version` + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + b[i++] = tmh >>> 16 & 0xff; + + // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + b[i++] = clockseq >>> 8 | 0x80; + + // `clock_seq_low` + b[i++] = clockseq & 0xff; + + // `node` + for (var n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } + + return buf ? buf : bytesToUuid(b); +} + +module.exports = v1; diff --git a/node_modules/uuid/v3.js b/node_modules/uuid/v3.js new file mode 100644 index 00000000..ee7e14c0 --- /dev/null +++ b/node_modules/uuid/v3.js @@ -0,0 +1,4 @@ +var v35 = require('./lib/v35.js'); +var md5 = require('./lib/md5'); + +module.exports = v35('v3', 0x30, md5); \ No newline at end of file diff --git a/node_modules/uuid/v4.js b/node_modules/uuid/v4.js new file mode 100644 index 00000000..1f07be1c --- /dev/null +++ b/node_modules/uuid/v4.js @@ -0,0 +1,29 @@ +var rng = require('./lib/rng'); +var bytesToUuid = require('./lib/bytesToUuid'); + +function v4(options, buf, offset) { + var i = buf && offset || 0; + + if (typeof(options) == 'string') { + buf = options === 'binary' ? new Array(16) : null; + options = null; + } + options = options || {}; + + var rnds = options.random || (options.rng || rng)(); + + // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + + // Copy bytes to buffer, if provided + if (buf) { + for (var ii = 0; ii < 16; ++ii) { + buf[i + ii] = rnds[ii]; + } + } + + return buf || bytesToUuid(rnds); +} + +module.exports = v4; diff --git a/node_modules/uuid/v5.js b/node_modules/uuid/v5.js new file mode 100644 index 00000000..4945baf3 --- /dev/null +++ b/node_modules/uuid/v5.js @@ -0,0 +1,3 @@ +var v35 = require('./lib/v35.js'); +var sha1 = require('./lib/sha1'); +module.exports = v35('v5', 0x50, sha1); diff --git a/node_modules/v8flags/LICENSE b/node_modules/v8flags/LICENSE new file mode 100644 index 00000000..ca63f909 --- /dev/null +++ b/node_modules/v8flags/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Tyler Kellen , Blaine Bublitz , and Eric Schoffstall + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/v8flags/README.md b/node_modules/v8flags/README.md new file mode 100644 index 00000000..19551fdf --- /dev/null +++ b/node_modules/v8flags/README.md @@ -0,0 +1,64 @@ +

      + + + +

      + +# v8flags + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Get available v8 and Node.js flags. + +## Usage +```js +const v8flags = require('v8flags'); + +v8flags(function(err, results) { + console.log(results); + // [ '--use_strict', + // '--es5_readonly', + // '--es52_globals', + // '--harmony_typeof', + // '--harmony_scoping', + // '--harmony_modules', + // '--harmony_proxies', + // '--harmony_collections', + // '--harmony', + // ... +}); +``` + +## API + +### `v8flags(cb)` + +Finds the available flags and calls the passed callback with any errors and an array of flag results. + +### `v8flags.configfile` + +The name of the cache file for flags. + +### `v8flags.configPath` + +The filepath location of the `configfile` above. + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/v8flags.svg +[npm-url]: https://www.npmjs.com/package/v8flags +[npm-image]: http://img.shields.io/npm/v/v8flags.svg + +[travis-url]: https://travis-ci.org/gulpjs/v8flags +[travis-image]: http://img.shields.io/travis/gulpjs/v8flags.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/v8flags +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/v8flags.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/v8flags +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/v8flags/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/v8flags/config-path.js b/node_modules/v8flags/config-path.js new file mode 100644 index 00000000..1acbe45e --- /dev/null +++ b/node_modules/v8flags/config-path.js @@ -0,0 +1,38 @@ +var os = require('os'); +var path = require('path'); +var userHome = require('homedir-polyfill')(); + +var env = process.env; +var name = 'js-v8flags'; + +function macos() { + var library = path.join(userHome, 'Library'); + return path.join(library, 'Caches', name); +} + +function windows() { + var appData = env.LOCALAPPDATA || path.join(userHome, 'AppData', 'Local'); + return path.join(appData, name); +} + +// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html +function linux() { + var username = path.basename(userHome); + return path.join(env.XDG_CACHE_HOME || path.join(userHome, '.cache'), name); +} + +module.exports = function(platform) { + if (!userHome) { + return os.tmpdir(); + } + + if (platform === 'darwin') { + return macos(); + } + + if (platform === 'win32') { + return windows(); + } + + return linux(); +}; diff --git a/node_modules/v8flags/index.js b/node_modules/v8flags/index.js new file mode 100644 index 00000000..0058c5af --- /dev/null +++ b/node_modules/v8flags/index.js @@ -0,0 +1,186 @@ +// this entire module is depressing. i should have spent my time learning +// how to patch v8 so that these options would just be available on the +// process object. + +var os = require('os'); +var fs = require('fs'); +var path = require('path'); +var crypto = require('crypto'); +var execFile = require('child_process').execFile; +var configPath = require('./config-path.js')(process.platform); +var version = require('./package.json').version; +var env = process.env; +var user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME || ''; +var exclusions = ['--help', '--completion_bash']; + +// This number must be incremented whenever the generated cache file changes. +var CACHE_VERSION = 2; + +var configfile = '.v8flags-' + CACHE_VERSION + '-' + process.versions.v8 + '.' + crypto.createHash('md5').update(user).digest('hex') + '.json'; + +var failureMessage = [ + 'Unable to cache a config file for v8flags to your home directory', + 'or a temporary folder. To fix this problem, please correct your', + 'environment by setting HOME=/path/to/home or TEMP=/path/to/temp.', + 'NOTE: the user running this must be able to access provided path.', + 'If all else fails, please open an issue here:', + 'http://github.com/tkellen/js-v8flags', +].join('\n'); + +function fail(err) { + err.message += '\n\n' + failureMessage; + return err; +} + +function openConfig(cb) { + fs.mkdir(configPath, function() { + tryOpenConfig(path.join(configPath, configfile), function(err, fd) { + if (err) { + return tryOpenConfig(path.join(os.tmpdir(), configfile), cb); + } + return cb(null, fd); + }); + }); +} + +function tryOpenConfig(configpath, cb) { + try { + // if the config file is valid, it should be json and therefore + // node should be able to require it directly. if this doesn't + // throw, we're done! + var content = require(configpath); + process.nextTick(function() { + cb(null, content); + }); + } catch (e) { + // if requiring the config file failed, maybe it doesn't exist, or + // perhaps it has become corrupted. instead of calling back with the + // content of the file, call back with a file descriptor that we can + // write the cached data to + fs.open(configpath, 'w+', function(err, fd) { + if (err) { + return cb(err); + } + return cb(null, fd); + }); + } +} + +// Node <= 9 outputs _ in flags with multiple words, while node 10 +// uses -. Both ways are accepted anyway, so always use `_` for better +// compatibility. +// We must not replace the first two --. +function normalizeFlagName(flag) { + return '--' + flag.slice(4).replace(/-/g, '_'); +} + +// i can't wait for the day this whole module is obsolete because these +// options are available on the process object. this executes node with +// `--v8-options` and parses the result, returning an array of command +// line flags. +function getFlags(cb) { + var errored = false; + var pending = 0; + var flags = []; + + runNode('--help'); + runNode('--v8-options'); + + function runNode(option) { + pending++; + execFile(process.execPath, [option], function(execErr, result) { + if (execErr || errored) { + if (!errored) { + errored = true; + cb(execErr); + } + return; + } + + var index = result.indexOf('\nOptions:'); + if (index >= 0) { + var regexp = /^\s\s--[\w-]+/gm; + regexp.lastIndex = index; + var matchedFlags = result.match(regexp); + if (matchedFlags) { + flags = flags.concat(matchedFlags + .map(normalizeFlagName) + .filter(function(name) { + return exclusions.indexOf(name) === -1; + }) + ); + } + } + + if (--pending === 0) { + cb(null, flags); + } + }); + } +} + +// write some json to a file descriptor. if this fails, call back +// with both the error and the data that was meant to be written. +function writeConfig(fd, flags, cb) { + var json = JSON.stringify(flags); + var buf; + if (Buffer.from && Buffer.from !== Uint8Array.from) { + // Node.js 4.5.0 or newer + buf = Buffer.from(json); + } else { + // Old Node.js versions + // The typeof safeguard below is mostly against accidental copy-pasting + // and code rewrite, it never happens as json is always a string here. + if (typeof json === 'number') { + throw new Error('Unexpected type number'); + } + buf = new Buffer(json); + } + return fs.write(fd, buf, 0, buf.length, 0 , function(writeErr) { + fs.close(fd, function(closeErr) { + var err = writeErr || closeErr; + if (err) { + return cb(fail(err), flags); + } + return cb(null, flags); + }); + }); +} + +module.exports = function(cb) { + // bail early if this is not node + var isElectron = process.versions && process.versions.electron; + if (isElectron) { + return process.nextTick(function() { + cb(null, []); + }); + } + + // attempt to open/read cache file + openConfig(function(openErr, result) { + if (!openErr && typeof result !== 'number') { + return cb(null, result); + } + // if the result is not an array, we need to go fetch + // the flags by invoking node with `--v8-options` + getFlags(function(flagsErr, flags) { + // if there was an error fetching the flags, bail immediately + if (flagsErr) { + return cb(flagsErr); + } + // if there was a problem opening the config file for writing + // throw an error but include the flags anyway so that users + // can continue to execute (at the expense of having to fetch + // flags on every run until they fix the underyling problem). + if (openErr) { + return cb(fail(openErr), flags); + } + // write the config file to disk so subsequent runs can read + // flags out of a cache file. + return writeConfig(result, flags, cb); + }); + }); +}; + +module.exports.configfile = configfile; +module.exports.configPath = configPath; diff --git a/node_modules/v8flags/package.json b/node_modules/v8flags/package.json new file mode 100644 index 00000000..6afbf231 --- /dev/null +++ b/node_modules/v8flags/package.json @@ -0,0 +1,48 @@ +{ + "name": "v8flags", + "version": "3.2.0", + "description": "Get available v8 and Node.js flags.", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Tyler Kellen ", + "Blaine Bublitz ", + "Nicolò Ribaudo ", + "Selwyn ", + "Leo Zhang " + ], + "repository": "gulpjs/v8flags", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "index.js", + "config-path.js", + "LICENSE" + ], + "scripts": { + "lint": "eslint .", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "devDependencies": { + "async": "^2.5.0", + "eslint": "^2.13.0", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "mocha": "^3.5.3", + "proxyquire": "^1.8.0" + }, + "keywords": [ + "v8 flags", + "harmony flags" + ] +} diff --git a/node_modules/validate-npm-package-license/LICENSE b/node_modules/validate-npm-package-license/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/node_modules/validate-npm-package-license/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/node_modules/validate-npm-package-license/README.md b/node_modules/validate-npm-package-license/README.md new file mode 100644 index 00000000..702bc7b4 --- /dev/null +++ b/node_modules/validate-npm-package-license/README.md @@ -0,0 +1,113 @@ +validate-npm-package-license +============================ + +Give me a string and I'll tell you if it's a valid npm package license string. + +```javascript +var valid = require('validate-npm-package-license'); +``` + +SPDX license identifiers are valid license strings: + +```javascript + +var assert = require('assert'); +var validSPDXExpression = { + validForNewPackages: true, + validForOldPackages: true, + spdx: true +}; + +assert.deepEqual(valid('MIT'), validSPDXExpression); +assert.deepEqual(valid('BSD-2-Clause'), validSPDXExpression); +assert.deepEqual(valid('Apache-2.0'), validSPDXExpression); +assert.deepEqual(valid('ISC'), validSPDXExpression); +``` +The function will return a warning and suggestion for nearly-correct license identifiers: + +```javascript +assert.deepEqual( + valid('Apache 2.0'), + { + validForOldPackages: false, + validForNewPackages: false, + warnings: [ + 'license should be ' + + 'a valid SPDX license expression (without "LicenseRef"), ' + + '"UNLICENSED", or ' + + '"SEE LICENSE IN "', + 'license is similar to the valid expression "Apache-2.0"' + ] + } +); +``` + +SPDX expressions are valid, too ... + +```javascript +// Simple SPDX license expression for dual licensing +assert.deepEqual( + valid('(GPL-3.0-only OR BSD-2-Clause)'), + validSPDXExpression +); +``` + +... except if they contain `LicenseRef`: + +```javascript +var warningAboutLicenseRef = { + validForOldPackages: false, + validForNewPackages: false, + spdx: true, + warnings: [ + 'license should be ' + + 'a valid SPDX license expression (without "LicenseRef"), ' + + '"UNLICENSED", or ' + + '"SEE LICENSE IN "', + ] +}; + +assert.deepEqual( + valid('LicenseRef-Made-Up'), + warningAboutLicenseRef +); + +assert.deepEqual( + valid('(MIT OR LicenseRef-Made-Up)'), + warningAboutLicenseRef +); +``` + +If you can't describe your licensing terms with standardized SPDX identifiers, put the terms in a file in the package and point users there: + +```javascript +assert.deepEqual( + valid('SEE LICENSE IN LICENSE.txt'), + { + validForNewPackages: true, + validForOldPackages: true, + inFile: 'LICENSE.txt' + } +); + +assert.deepEqual( + valid('SEE LICENSE IN license.md'), + { + validForNewPackages: true, + validForOldPackages: true, + inFile: 'license.md' + } +); +``` + +If there aren't any licensing terms, use `UNLICENSED`: + +```javascript +var unlicensed = { + validForNewPackages: true, + validForOldPackages: true, + unlicensed: true +}; +assert.deepEqual(valid('UNLICENSED'), unlicensed); +assert.deepEqual(valid('UNLICENCED'), unlicensed); +``` diff --git a/node_modules/validate-npm-package-license/index.js b/node_modules/validate-npm-package-license/index.js new file mode 100644 index 00000000..35eaa732 --- /dev/null +++ b/node_modules/validate-npm-package-license/index.js @@ -0,0 +1,86 @@ +var parse = require('spdx-expression-parse'); +var correct = require('spdx-correct'); + +var genericWarning = ( + 'license should be ' + + 'a valid SPDX license expression (without "LicenseRef"), ' + + '"UNLICENSED", or ' + + '"SEE LICENSE IN "' +); + +var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; + +function startsWith(prefix, string) { + return string.slice(0, prefix.length) === prefix; +} + +function usesLicenseRef(ast) { + if (ast.hasOwnProperty('license')) { + var license = ast.license; + return ( + startsWith('LicenseRef', license) || + startsWith('DocumentRef', license) + ); + } else { + return ( + usesLicenseRef(ast.left) || + usesLicenseRef(ast.right) + ); + } +} + +module.exports = function(argument) { + var ast; + + try { + ast = parse(argument); + } catch (e) { + var match + if ( + argument === 'UNLICENSED' || + argument === 'UNLICENCED' + ) { + return { + validForOldPackages: true, + validForNewPackages: true, + unlicensed: true + }; + } else if (match = fileReferenceRE.exec(argument)) { + return { + validForOldPackages: true, + validForNewPackages: true, + inFile: match[1] + }; + } else { + var result = { + validForOldPackages: false, + validForNewPackages: false, + warnings: [genericWarning] + }; + if (argument.trim().length !== 0) { + var corrected = correct(argument); + if (corrected) { + result.warnings.push( + 'license is similar to the valid expression "' + corrected + '"' + ); + } + } + return result; + } + } + + if (usesLicenseRef(ast)) { + return { + validForNewPackages: false, + validForOldPackages: false, + spdx: true, + warnings: [genericWarning] + }; + } else { + return { + validForNewPackages: true, + validForOldPackages: true, + spdx: true + }; + } +}; diff --git a/node_modules/validate-npm-package-license/package.json b/node_modules/validate-npm-package-license/package.json new file mode 100644 index 00000000..9e92af4f --- /dev/null +++ b/node_modules/validate-npm-package-license/package.json @@ -0,0 +1,28 @@ +{ + "name": "validate-npm-package-license", + "description": "Give me a string and I'll tell you if it's a valid npm package license string", + "version": "3.0.4", + "author": "Kyle E. Mitchell (https://kemitchell.com)", + "contributors": [ + "Mark Stacey " + ], + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + }, + "devDependencies": { + "defence-cli": "^2.0.1", + "replace-require-self": "^1.0.0" + }, + "keywords": [ + "license", + "npm", + "package", + "validation" + ], + "license": "Apache-2.0", + "repository": "kemitchell/validate-npm-package-license.js", + "scripts": { + "test": "defence README.md | replace-require-self | node" + } +} diff --git a/node_modules/value-or-function/LICENSE b/node_modules/value-or-function/LICENSE new file mode 100644 index 00000000..9aedc0d7 --- /dev/null +++ b/node_modules/value-or-function/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Blaine Bublitz, Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/value-or-function/README.md b/node_modules/value-or-function/README.md new file mode 100644 index 00000000..44ef2187 --- /dev/null +++ b/node_modules/value-or-function/README.md @@ -0,0 +1,132 @@ +

      + + + +

      + +# value-or-function + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Normalize a value or function, applying extra args to the function + +## Example + +```js +var normalize = require('value-or-function'); + +// Values matching type are returned +var isEnabled = normalize('boolean', true); +// isEnabled === true + +// Values not matching type return undefined +var isEnabled = normalize('boolean', 1); +// isEnabled === undefined + +// Functions are called +var isEnabled = normalize('boolean', function() { + return false; +}); +// isEnabled === false + +// Extra arguments are applied to function +var count = normalize('number', function(a, b) { + return a + b; +}, 1, 2); +// count === 3 + +// Supply the function with context +var context = { c: 3 }; +var count = normalize.call(context, 'number', function(a, b) { + return a + b + this.c; +}, 1, 2); +// count === 6 + +// Values one of multiple types are returned +var isEnabled = normalize(['string', 'boolean'], true); +// isEnabled === true + +// Provide a function as first argument to do custom coercion +var now = new Date(); +var enabledSince = normalize(function(value) { + if (value.constructor === Date) { + return value; + } +}, now); +// enabledSince === now + +// Convenience methods are available for the built-in types +var result = normalize.object({}); +var result = normalize.number(1); +var result = normalize.string(''); +var result = normalize.symbol(Symbol()); +var result = normalize.boolean(true); +var result = normalize.function(function() {}); +var result = normalize.date(new Date()); +``` + +## API + +### `normalize(coercer, value[, ...appliedArguments])` + +Takes a coercer function `coercer` to transform `value` to the desired type. +Also optionally takes any extra arguments to apply to `value` if `value` is a function. + +If the return value of `coercer(value)` is not `null` or `undefined`, that value is returned. +Otherwise, if `value` is a function, that function is called with any extra arguments +supplied to `normalize`, and its return value is passed through the coercer. + +If `coercer` is a string, it must be one of the built-in types (see below) +and the appropriate default coercer is invoked, optionally first reducing `value` +to a primitive type with `.valueOf()` if it is an Object. + +If `coercer` is an array, each element is tried until one returns something other +than `null` or `undefined`, or it results in `undefined` if all of the elements yield `null` or `undefined`. + +#### `normalize.object(value[, ...appliedArguments])` + +Convenience method for `normalize('object', ...)`. + +#### `normalize.number(value[, ...appliedArguments])` + +Convenience method for `normalize('number', ...)`. + +#### `normalize.string(value[, ...appliedArguments])` + +Convenience method for `normalize('string', ...)`. + +#### `normalize.symbol(value[, ...appliedArguments])` + +Convenience method for `normalize('symbol', ...)`. + +#### `normalize.boolean(value[, ...appliedArguments])` + +Convenience method for `normalize('boolean', ...)`. + +#### `normalize.function(value[, ...appliedArguments])` + +Convenience method for `normalize('function', ...)`. + +#### `normalize.date(value[, ...appliedArguments])` + +Convenience method for `normalize('date', ...)`. + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/value-or-function.svg +[npm-url]: https://npmjs.org/package/value-or-function +[npm-image]: http://img.shields.io/npm/v/value-or-function.svg + +[travis-url]: https://travis-ci.org/gulpjs/value-or-function +[travis-image]: http://img.shields.io/travis/gulpjs/value-or-function.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/value-or-function +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/value-or-function.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/value-or-function +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/value-or-function/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/node_modules/value-or-function/index.js b/node_modules/value-or-function/index.js new file mode 100644 index 00000000..1be06dc4 --- /dev/null +++ b/node_modules/value-or-function/index.js @@ -0,0 +1,113 @@ +'use strict'; + +// Built-in types +var types = [ + 'object', + 'number', + 'string', + 'symbol', + 'boolean', + 'date', + 'function', // Weird to expose this +]; + + +function normalize(coercer, value) { + if (typeof value === 'function') { + if (coercer === 'function') { + return value; + } + value = value.apply(this, slice(arguments, 2)); + } + return coerce(this, coercer, value); +} + + +function coerce(ctx, coercer, value) { + + // Handle built-in types + if (typeof coercer === 'string') { + if (coerce[coercer]) { + return coerce[coercer].call(ctx, value); + } + return typeOf(coercer, value); + } + + // Handle custom coercer + if (typeof coercer === 'function') { + return coercer.call(ctx, value); + } + + // Array of coercers, try in order until one returns a non-null value + var result; + coercer.some(function(coercer) { + result = coerce(ctx, coercer, value); + return result != null; + }); + + return result; +} + + +coerce.string = function(value) { + if (value != null && + typeof value === 'object' && + typeof value.toString === 'function') { + + value = value.toString(); + } + return typeOf('string', primitive(value)); +}; + + +coerce.number = function(value) { + return typeOf('number', primitive(value)); +}; + + +coerce.boolean = function(value) { + return typeOf('boolean', primitive(value)); +}; + + +coerce.date = function(value) { + value = primitive(value); + if (typeof value === 'number' && !isNaN(value) && isFinite(value)) { + return new Date(value); + } +}; + + +function typeOf(type, value) { + if (typeof value === type) { + return value; + } +} + + +function primitive(value) { + if (value != null && + typeof value === 'object' && + typeof value.valueOf === 'function') { + + value = value.valueOf(); + } + return value; +} + +function slice(value, from) { + return Array.prototype.slice.call(value, from); +} + +// Add methods for each type +types.forEach(function(type) { + // Make it an array for easier concat + var typeArg = [type]; + + normalize[type] = function() { + var args = slice(arguments); + return normalize.apply(this, typeArg.concat(args)); + }; +}); + +module.exports = normalize; diff --git a/node_modules/value-or-function/package.json b/node_modules/value-or-function/package.json new file mode 100644 index 00000000..adbcf839 --- /dev/null +++ b/node_modules/value-or-function/package.json @@ -0,0 +1,43 @@ +{ + "name": "value-or-function", + "version": "3.0.0", + "description": "Normalize a value or function, applying extra args to the function", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Blaine Bublitz ", + "Hugo Wood " + ], + "repository": "gulpjs/value-or-function", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "index.js" + ], + "scripts": { + "lint": "eslint . && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": {}, + "devDependencies": { + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.16.0", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "mocha": "^2.4.5" + }, + "keywords": [ + "options", + "normalize", + "value", + "function" + ] +} diff --git a/node_modules/verror/.npmignore b/node_modules/verror/.npmignore new file mode 100644 index 00000000..f14aec80 --- /dev/null +++ b/node_modules/verror/.npmignore @@ -0,0 +1,9 @@ +.gitignore +.gitmodules +deps +examples +experiments +jsl.node.conf +Makefile +Makefile.targ +test diff --git a/node_modules/verror/CHANGES.md b/node_modules/verror/CHANGES.md new file mode 100644 index 00000000..bbb745a2 --- /dev/null +++ b/node_modules/verror/CHANGES.md @@ -0,0 +1,28 @@ +# Changelog + +## Not yet released + +None yet. + +## v1.10.0 + +* #49 want convenience functions for MultiErrors + +## v1.9.0 + +* #47 could use VError.hasCauseWithName() + +## v1.8.1 + +* #39 captureStackTrace lost when inheriting from WError + +## v1.8.0 + +* #23 Preserve original stack trace(s) + +## v1.7.0 + +* #10 better support for extra properties on Errors +* #11 make it easy to find causes of a particular kind +* #29 No documentation on how to Install this package +* #36 elide development-only files from npm package diff --git a/node_modules/verror/CONTRIBUTING.md b/node_modules/verror/CONTRIBUTING.md new file mode 100644 index 00000000..750cef8d --- /dev/null +++ b/node_modules/verror/CONTRIBUTING.md @@ -0,0 +1,19 @@ +# Contributing + +This repository uses [cr.joyent.us](https://cr.joyent.us) (Gerrit) for new +changes. Anyone can submit changes. To get started, see the [cr.joyent.us user +guide](https://github.com/joyent/joyent-gerrit/blob/master/docs/user/README.md). +This repo does not use GitHub pull requests. + +See the [Joyent Engineering +Guidelines](https://github.com/joyent/eng/blob/master/docs/index.md) for general +best practices expected in this repository. + +Contributions should be "make prepush" clean. The "prepush" target runs the +"check" target, which requires these separate tools: + +* https://github.com/davepacheco/jsstyle +* https://github.com/davepacheco/javascriptlint + +If you're changing something non-trivial or user-facing, you may want to submit +an issue first. diff --git a/node_modules/verror/LICENSE b/node_modules/verror/LICENSE new file mode 100644 index 00000000..82a5cb86 --- /dev/null +++ b/node_modules/verror/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2016, Joyent, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE diff --git a/node_modules/verror/README.md b/node_modules/verror/README.md new file mode 100644 index 00000000..c1f0635e --- /dev/null +++ b/node_modules/verror/README.md @@ -0,0 +1,528 @@ +# verror: rich JavaScript errors + +This module provides several classes in support of Joyent's [Best Practices for +Error Handling in Node.js](http://www.joyent.com/developers/node/design/errors). +If you find any of the behavior here confusing or surprising, check out that +document first. + +The error classes here support: + +* printf-style arguments for the message +* chains of causes +* properties to provide extra information about the error +* creating your own subclasses that support all of these + +The classes here are: + +* **VError**, for chaining errors while preserving each one's error message. + This is useful in servers and command-line utilities when you want to + propagate an error up a call stack, but allow various levels to add their own + context. See examples below. +* **WError**, for wrapping errors while hiding the lower-level messages from the + top-level error. This is useful for API endpoints where you don't want to + expose internal error messages, but you still want to preserve the error chain + for logging and debugging. +* **SError**, which is just like VError but interprets printf-style arguments + more strictly. +* **MultiError**, which is just an Error that encapsulates one or more other + errors. (This is used for parallel operations that return several errors.) + + +# Quick start + +First, install the package: + + npm install verror + +If nothing else, you can use VError as a drop-in replacement for the built-in +JavaScript Error class, with the addition of printf-style messages: + +```javascript +var err = new VError('missing file: "%s"', '/etc/passwd'); +console.log(err.message); +``` + +This prints: + + missing file: "/etc/passwd" + +You can also pass a `cause` argument, which is any other Error object: + +```javascript +var fs = require('fs'); +var filename = '/nonexistent'; +fs.stat(filename, function (err1) { + var err2 = new VError(err1, 'stat "%s"', filename); + console.error(err2.message); +}); +``` + +This prints out: + + stat "/nonexistent": ENOENT, stat '/nonexistent' + +which resembles how Unix programs typically report errors: + + $ sort /nonexistent + sort: open failed: /nonexistent: No such file or directory + +To match the Unixy feel, when you print out the error, just prepend the +program's name to the VError's `message`. Or just call +[node-cmdutil.fail(your_verror)](https://github.com/joyent/node-cmdutil), which +does this for you. + +You can get the next-level Error using `err.cause()`: + +```javascript +console.error(err2.cause().message); +``` + +prints: + + ENOENT, stat '/nonexistent' + +Of course, you can chain these as many times as you want, and it works with any +kind of Error: + +```javascript +var err1 = new Error('No such file or directory'); +var err2 = new VError(err1, 'failed to stat "%s"', '/junk'); +var err3 = new VError(err2, 'request failed'); +console.error(err3.message); +``` + +This prints: + + request failed: failed to stat "/junk": No such file or directory + +The idea is that each layer in the stack annotates the error with a description +of what it was doing. The end result is a message that explains what happened +at each level. + +You can also decorate Error objects with additional information so that callers +can not only handle each kind of error differently, but also construct their own +error messages (e.g., to localize them, format them, group them by type, and so +on). See the example below. + + +# Deeper dive + +The two main goals for VError are: + +* **Make it easy to construct clear, complete error messages intended for + people.** Clear error messages greatly improve both user experience and + debuggability, so we wanted to make it easy to build them. That's why the + constructor takes printf-style arguments. +* **Make it easy to construct objects with programmatically-accessible + metadata** (which we call _informational properties_). Instead of just saying + "connection refused while connecting to 192.168.1.2:80", you can add + properties like `"ip": "192.168.1.2"` and `"tcpPort": 80`. This can be used + for feeding into monitoring systems, analyzing large numbers of Errors (as + from a log file), or localizing error messages. + +To really make this useful, it also needs to be easy to compose Errors: +higher-level code should be able to augment the Errors reported by lower-level +code to provide a more complete description of what happened. Instead of saying +"connection refused", you can say "operation X failed: connection refused". +That's why VError supports `causes`. + +In order for all this to work, programmers need to know that it's generally safe +to wrap lower-level Errors with higher-level ones. If you have existing code +that handles Errors produced by a library, you should be able to wrap those +Errors with a VError to add information without breaking the error handling +code. There are two obvious ways that this could break such consumers: + +* The error's name might change. People typically use `name` to determine what + kind of Error they've got. To ensure compatibility, you can create VErrors + with custom names, but this approach isn't great because it prevents you from + representing complex failures. For this reason, VError provides + `findCauseByName`, which essentially asks: does this Error _or any of its + causes_ have this specific type? If error handling code uses + `findCauseByName`, then subsystems can construct very specific causal chains + for debuggability and still let people handle simple cases easily. There's an + example below. +* The error's properties might change. People often hang additional properties + off of Error objects. If we wrap an existing Error in a new Error, those + properties would be lost unless we copied them. But there are a variety of + both standard and non-standard Error properties that should _not_ be copied in + this way: most obviously `name`, `message`, and `stack`, but also `fileName`, + `lineNumber`, and a few others. Plus, it's useful for some Error subclasses + to have their own private properties -- and there'd be no way to know whether + these should be copied. For these reasons, VError first-classes these + information properties. You have to provide them in the constructor, you can + only fetch them with the `info()` function, and VError takes care of making + sure properties from causes wind up in the `info()` output. + +Let's put this all together with an example from the node-fast RPC library. +node-fast implements a simple RPC protocol for Node programs. There's a server +and client interface, and clients make RPC requests to servers. Let's say the +server fails with an UnauthorizedError with message "user 'bob' is not +authorized". The client wraps all server errors with a FastServerError. The +client also wraps all request errors with a FastRequestError that includes the +name of the RPC call being made. The result of this failed RPC might look like +this: + + name: FastRequestError + message: "request failed: server error: user 'bob' is not authorized" + rpcMsgid: + rpcMethod: GetObject + cause: + name: FastServerError + message: "server error: user 'bob' is not authorized" + cause: + name: UnauthorizedError + message: "user 'bob' is not authorized" + rpcUser: "bob" + +When the caller uses `VError.info()`, the information properties are collapsed +so that it looks like this: + + message: "request failed: server error: user 'bob' is not authorized" + rpcMsgid: + rpcMethod: GetObject + rpcUser: "bob" + +Taking this apart: + +* The error's message is a complete description of the problem. The caller can + report this directly to its caller, which can potentially make its way back to + an end user (if appropriate). It can also be logged. +* The caller can tell that the request failed on the server, rather than as a + result of a client problem (e.g., failure to serialize the request), a + transport problem (e.g., failure to connect to the server), or something else + (e.g., a timeout). They do this using `findCauseByName('FastServerError')` + rather than checking the `name` field directly. +* If the caller logs this error, the logs can be analyzed to aggregate + errors by cause, by RPC method name, by user, or whatever. Or the + error can be correlated with other events for the same rpcMsgid. +* It wasn't very hard for any part of the code to contribute to this Error. + Each part of the stack has just a few lines to provide exactly what it knows, + with very little boilerplate. + +It's not expected that you'd use these complex forms all the time. Despite +supporting the complex case above, you can still just do: + + new VError("my service isn't working"); + +for the simple cases. + + +# Reference: VError, WError, SError + +VError, WError, and SError are convenient drop-in replacements for `Error` that +support printf-style arguments, first-class causes, informational properties, +and other useful features. + + +## Constructors + +The VError constructor has several forms: + +```javascript +/* + * This is the most general form. You can specify any supported options + * (including "cause" and "info") this way. + */ +new VError(options, sprintf_args...) + +/* + * This is a useful shorthand when the only option you need is "cause". + */ +new VError(cause, sprintf_args...) + +/* + * This is a useful shorthand when you don't need any options at all. + */ +new VError(sprintf_args...) +``` + +All of these forms construct a new VError that behaves just like the built-in +JavaScript `Error` class, with some additional methods described below. + +In the first form, `options` is a plain object with any of the following +optional properties: + +Option name | Type | Meaning +---------------- | ---------------- | ------- +`name` | string | Describes what kind of error this is. This is intended for programmatic use to distinguish between different kinds of errors. Note that in modern versions of Node.js, this name is ignored in the `stack` property value, but callers can still use the `name` property to get at it. +`cause` | any Error object | Indicates that the new error was caused by `cause`. See `cause()` below. If unspecified, the cause will be `null`. +`strict` | boolean | If true, then `null` and `undefined` values in `sprintf_args` are passed through to `sprintf()`. Otherwise, these are replaced with the strings `'null'`, and '`undefined`', respectively. +`constructorOpt` | function | If specified, then the stack trace for this error ends at function `constructorOpt`. Functions called by `constructorOpt` will not show up in the stack. This is useful when this class is subclassed. +`info` | object | Specifies arbitrary informational properties that are available through the `VError.info(err)` static class method. See that method for details. + +The second form is equivalent to using the first form with the specified `cause` +as the error's cause. This form is distinguished from the first form because +the first argument is an Error. + +The third form is equivalent to using the first form with all default option +values. This form is distinguished from the other forms because the first +argument is not an object or an Error. + +The `WError` constructor is used exactly the same way as the `VError` +constructor. The `SError` constructor is also used the same way as the +`VError` constructor except that in all cases, the `strict` property is +overriden to `true. + + +## Public properties + +`VError`, `WError`, and `SError` all provide the same public properties as +JavaScript's built-in Error objects. + +Property name | Type | Meaning +------------- | ------ | ------- +`name` | string | Programmatically-usable name of the error. +`message` | string | Human-readable summary of the failure. Programmatically-accessible details are provided through `VError.info(err)` class method. +`stack` | string | Human-readable stack trace where the Error was constructed. + +For all of these classes, the printf-style arguments passed to the constructor +are processed with `sprintf()` to form a message. For `WError`, this becomes +the complete `message` property. For `SError` and `VError`, this message is +prepended to the message of the cause, if any (with a suitable separator), and +the result becomes the `message` property. + +The `stack` property is managed entirely by the underlying JavaScript +implementation. It's generally implemented using a getter function because +constructing the human-readable stack trace is somewhat expensive. + +## Class methods + +The following methods are defined on the `VError` class and as exported +functions on the `verror` module. They're defined this way rather than using +methods on VError instances so that they can be used on Errors not created with +`VError`. + +### `VError.cause(err)` + +The `cause()` function returns the next Error in the cause chain for `err`, or +`null` if there is no next error. See the `cause` argument to the constructor. +Errors can have arbitrarily long cause chains. You can walk the `cause` chain +by invoking `VError.cause(err)` on each subsequent return value. If `err` is +not a `VError`, the cause is `null`. + +### `VError.info(err)` + +Returns an object with all of the extra error information that's been associated +with this Error and all of its causes. These are the properties passed in using +the `info` option to the constructor. Properties not specified in the +constructor for this Error are implicitly inherited from this error's cause. + +These properties are intended to provide programmatically-accessible metadata +about the error. For an error that indicates a failure to resolve a DNS name, +informational properties might include the DNS name to be resolved, or even the +list of resolvers used to resolve it. The values of these properties should +generally be plain objects (i.e., consisting only of null, undefined, numbers, +booleans, strings, and objects and arrays containing only other plain objects). + +### `VError.fullStack(err)` + +Returns a string containing the full stack trace, with all nested errors recursively +reported as `'caused by:' + err.stack`. + +### `VError.findCauseByName(err, name)` + +The `findCauseByName()` function traverses the cause chain for `err`, looking +for an error whose `name` property matches the passed in `name` value. If no +match is found, `null` is returned. + +If all you want is to know _whether_ there's a cause (and you don't care what it +is), you can use `VError.hasCauseWithName(err, name)`. + +If a vanilla error or a non-VError error is passed in, then there is no cause +chain to traverse. In this scenario, the function will check the `name` +property of only `err`. + +### `VError.hasCauseWithName(err, name)` + +Returns true if and only if `VError.findCauseByName(err, name)` would return +a non-null value. This essentially determines whether `err` has any cause in +its cause chain that has name `name`. + +### `VError.errorFromList(errors)` + +Given an array of Error objects (possibly empty), return a single error +representing the whole collection of errors. If the list has: + +* 0 elements, returns `null` +* 1 element, returns the sole error +* more than 1 element, returns a MultiError referencing the whole list + +This is useful for cases where an operation may produce any number of errors, +and you ultimately want to implement the usual `callback(err)` pattern. You can +accumulate the errors in an array and then invoke +`callback(VError.errorFromList(errors))` when the operation is complete. + + +### `VError.errorForEach(err, func)` + +Convenience function for iterating an error that may itself be a MultiError. + +In all cases, `err` must be an Error. If `err` is a MultiError, then `func` is +invoked as `func(errorN)` for each of the underlying errors of the MultiError. +If `err` is any other kind of error, `func` is invoked once as `func(err)`. In +all cases, `func` is invoked synchronously. + +This is useful for cases where an operation may produce any number of warnings +that may be encapsulated with a MultiError -- but may not be. + +This function does not iterate an error's cause chain. + + +## Examples + +The "Demo" section above covers several basic cases. Here's a more advanced +case: + +```javascript +var err1 = new VError('something bad happened'); +/* ... */ +var err2 = new VError({ + 'name': 'ConnectionError', + 'cause': err1, + 'info': { + 'errno': 'ECONNREFUSED', + 'remote_ip': '127.0.0.1', + 'port': 215 + } +}, 'failed to connect to "%s:%d"', '127.0.0.1', 215); + +console.log(err2.message); +console.log(err2.name); +console.log(VError.info(err2)); +console.log(err2.stack); +``` + +This outputs: + + failed to connect to "127.0.0.1:215": something bad happened + ConnectionError + { errno: 'ECONNREFUSED', remote_ip: '127.0.0.1', port: 215 } + ConnectionError: failed to connect to "127.0.0.1:215": something bad happened + at Object. (/home/dap/node-verror/examples/info.js:5:12) + at Module._compile (module.js:456:26) + at Object.Module._extensions..js (module.js:474:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Function.Module.runMain (module.js:497:10) + at startup (node.js:119:16) + at node.js:935:3 + +Information properties are inherited up the cause chain, with values at the top +of the chain overriding same-named values lower in the chain. To continue that +example: + +```javascript +var err3 = new VError({ + 'name': 'RequestError', + 'cause': err2, + 'info': { + 'errno': 'EBADREQUEST' + } +}, 'request failed'); + +console.log(err3.message); +console.log(err3.name); +console.log(VError.info(err3)); +console.log(err3.stack); +``` + +This outputs: + + request failed: failed to connect to "127.0.0.1:215": something bad happened + RequestError + { errno: 'EBADREQUEST', remote_ip: '127.0.0.1', port: 215 } + RequestError: request failed: failed to connect to "127.0.0.1:215": something bad happened + at Object. (/home/dap/node-verror/examples/info.js:20:12) + at Module._compile (module.js:456:26) + at Object.Module._extensions..js (module.js:474:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Function.Module.runMain (module.js:497:10) + at startup (node.js:119:16) + at node.js:935:3 + +You can also print the complete stack trace of combined `Error`s by using +`VError.fullStack(err).` + +```javascript +var err1 = new VError('something bad happened'); +/* ... */ +var err2 = new VError(err1, 'something really bad happened here'); + +console.log(VError.fullStack(err2)); +``` + +This outputs: + + VError: something really bad happened here: something bad happened + at Object. (/home/dap/node-verror/examples/fullStack.js:5:12) + at Module._compile (module.js:409:26) + at Object.Module._extensions..js (module.js:416:10) + at Module.load (module.js:343:32) + at Function.Module._load (module.js:300:12) + at Function.Module.runMain (module.js:441:10) + at startup (node.js:139:18) + at node.js:968:3 + caused by: VError: something bad happened + at Object. (/home/dap/node-verror/examples/fullStack.js:3:12) + at Module._compile (module.js:409:26) + at Object.Module._extensions..js (module.js:416:10) + at Module.load (module.js:343:32) + at Function.Module._load (module.js:300:12) + at Function.Module.runMain (module.js:441:10) + at startup (node.js:139:18) + at node.js:968:3 + +`VError.fullStack` is also safe to use on regular `Error`s, so feel free to use +it whenever you need to extract the stack trace from an `Error`, regardless if +it's a `VError` or not. + +# Reference: MultiError + +MultiError is an Error class that represents a group of Errors. This is used +when you logically need to provide a single Error, but you want to preserve +information about multiple underying Errors. A common case is when you execute +several operations in parallel and some of them fail. + +MultiErrors are constructed as: + +```javascript +new MultiError(error_list) +``` + +`error_list` is an array of at least one `Error` object. + +The cause of the MultiError is the first error provided. None of the other +`VError` options are supported. The `message` for a MultiError consists the +`message` from the first error, prepended with a message indicating that there +were other errors. + +For example: + +```javascript +err = new MultiError([ + new Error('failed to resolve DNS name "abc.example.com"'), + new Error('failed to resolve DNS name "def.example.com"'), +]); + +console.error(err.message); +``` + +outputs: + + first of 2 errors: failed to resolve DNS name "abc.example.com" + +See the convenience function `VError.errorFromList`, which is sometimes simpler +to use than this constructor. + +## Public methods + + +### `errors()` + +Returns an array of the errors used to construct this MultiError. + + +# Contributing + +See separate [contribution guidelines](CONTRIBUTING.md). diff --git a/node_modules/verror/node_modules/extsprintf/.gitmodules b/node_modules/verror/node_modules/extsprintf/.gitmodules new file mode 100644 index 00000000..401f01a7 --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/.gitmodules @@ -0,0 +1,3 @@ +[submodule "deps/catest"] + path = deps/catest + url = https://github.com/joyent/catest diff --git a/node_modules/verror/node_modules/extsprintf/.npmignore b/node_modules/verror/node_modules/extsprintf/.npmignore new file mode 100644 index 00000000..6ed1ae97 --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/.npmignore @@ -0,0 +1,2 @@ +/deps +/examples diff --git a/node_modules/verror/node_modules/extsprintf/CHANGES.md b/node_modules/verror/node_modules/extsprintf/CHANGES.md new file mode 100644 index 00000000..91c057e2 --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/CHANGES.md @@ -0,0 +1,10 @@ +# Changelog + +## Not yet released + +None yet. + +## v1.4.0 + +* #13 could provide better error messages for programmer errors +* #14 bring extsprintf into the modern world diff --git a/node_modules/verror/node_modules/extsprintf/CONTRIBUTING.md b/node_modules/verror/node_modules/extsprintf/CONTRIBUTING.md new file mode 100644 index 00000000..0ec903fa --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/CONTRIBUTING.md @@ -0,0 +1,20 @@ +# Contributing + +This repository uses [cr.joyent.us](https://cr.joyent.us) (Gerrit) for new +changes. Anyone can submit changes. To get started, see the [cr.joyent.us user +guide](https://github.com/joyent/joyent-gerrit/blob/master/docs/user/README.md). +This repo does not use GitHub pull requests. + +See the [Joyent Engineering +Guidelines](https://github.com/joyent/eng/blob/master/docs/index.md) for general +best practices expected in this repository. + +Contributions should be "make prepush" clean. This target requires separate +tools: + +* https://github.com/davepacheco/jsstyle +* https://github.com/davepacheco/javascriptlint +* https://github.com/joyent/catest + +If you're changing something non-trivial or user-facing, you may want to submit +an issue first. diff --git a/node_modules/verror/node_modules/extsprintf/LICENSE b/node_modules/verror/node_modules/extsprintf/LICENSE new file mode 100644 index 00000000..cbc0bb3b --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012, Joyent, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE diff --git a/node_modules/verror/node_modules/extsprintf/Makefile b/node_modules/verror/node_modules/extsprintf/Makefile new file mode 100644 index 00000000..6d960592 --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/Makefile @@ -0,0 +1,30 @@ +# +# Copyright (c) 2017, Joyent, Inc. All rights reserved. +# +# Makefile: top-level Makefile +# +# This Makefile contains only repo-specific logic and uses included makefiles +# to supply common targets (javascriptlint, jsstyle, restdown, etc.), which are +# used by other repos as well. +# + +# +# Files +# +CATEST = deps/catest/catest +JSL = jsl +JSSTYLE = jsstyle +JS_FILES := $(shell find examples lib -name '*.js') +JSL_FILES_NODE = $(JS_FILES) +JSSTYLE_FILES = $(JS_FILES) +JSL_CONF_NODE = jsl.node.conf + +# Default target is "check" +check: + +test: | $(CATEST) + $(CATEST) -a + +CATEST: deps/catest/.git + +include ./Makefile.targ diff --git a/node_modules/verror/node_modules/extsprintf/Makefile.targ b/node_modules/verror/node_modules/extsprintf/Makefile.targ new file mode 100644 index 00000000..2a64fe7e --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/Makefile.targ @@ -0,0 +1,285 @@ +# -*- mode: makefile -*- +# +# Copyright (c) 2012, Joyent, Inc. All rights reserved. +# +# Makefile.targ: common targets. +# +# NOTE: This makefile comes from the "eng" repo. It's designed to be dropped +# into other repos as-is without requiring any modifications. If you find +# yourself changing this file, you should instead update the original copy in +# eng.git and then update your repo to use the new version. +# +# This Makefile defines several useful targets and rules. You can use it by +# including it from a Makefile that specifies some of the variables below. +# +# Targets defined in this Makefile: +# +# check Checks JavaScript files for lint and style +# Checks bash scripts for syntax +# Checks SMF manifests for validity against the SMF DTD +# +# clean Removes built files +# +# docs Builds restdown documentation in docs/ +# +# prepush Depends on "check" and "test" +# +# test Does nothing (you should override this) +# +# xref Generates cscope (source cross-reference index) +# +# For details on what these targets are supposed to do, see the Joyent +# Engineering Guide. +# +# To make use of these targets, you'll need to set some of these variables. Any +# variables left unset will simply not be used. +# +# BASH_FILES Bash scripts to check for syntax +# (paths relative to top-level Makefile) +# +# CLEAN_FILES Files to remove as part of the "clean" target. Note +# that files generated by targets in this Makefile are +# automatically included in CLEAN_FILES. These include +# restdown-generated HTML and JSON files. +# +# DOC_FILES Restdown (documentation source) files. These are +# assumed to be contained in "docs/", and must NOT +# contain the "docs/" prefix. +# +# JSL_CONF_NODE Specify JavaScriptLint configuration files +# JSL_CONF_WEB (paths relative to top-level Makefile) +# +# Node.js and Web configuration files are separate +# because you'll usually want different global variable +# configurations. If no file is specified, none is given +# to jsl, which causes it to use a default configuration, +# which probably isn't what you want. +# +# JSL_FILES_NODE JavaScript files to check with Node config file. +# JSL_FILES_WEB JavaScript files to check with Web config file. +# +# You can also override these variables: +# +# BASH Path to bash (default: bash) +# +# CSCOPE_DIRS Directories to search for source files for the cscope +# index. (default: ".") +# +# JSL Path to JavaScriptLint (default: "jsl") +# +# JSL_FLAGS_NODE Additional flags to pass through to JSL +# JSL_FLAGS_WEB +# JSL_FLAGS +# +# JSSTYLE Path to jsstyle (default: jsstyle) +# +# JSSTYLE_FLAGS Additional flags to pass through to jsstyle +# + +# +# Defaults for the various tools we use. +# +BASH ?= bash +BASHSTYLE ?= tools/bashstyle +CP ?= cp +CSCOPE ?= cscope +CSCOPE_DIRS ?= . +JSL ?= jsl +JSSTYLE ?= jsstyle +MKDIR ?= mkdir -p +MV ?= mv +RESTDOWN_FLAGS ?= +RMTREE ?= rm -rf +JSL_FLAGS ?= --nologo --nosummary + +ifeq ($(shell uname -s),SunOS) + TAR ?= gtar +else + TAR ?= tar +endif + + +# +# Defaults for other fixed values. +# +BUILD = build +DISTCLEAN_FILES += $(BUILD) +DOC_BUILD = $(BUILD)/docs/public + +# +# Configure JSL_FLAGS_{NODE,WEB} based on JSL_CONF_{NODE,WEB}. +# +ifneq ($(origin JSL_CONF_NODE), undefined) + JSL_FLAGS_NODE += --conf=$(JSL_CONF_NODE) +endif + +ifneq ($(origin JSL_CONF_WEB), undefined) + JSL_FLAGS_WEB += --conf=$(JSL_CONF_WEB) +endif + +# +# Targets. For descriptions on what these are supposed to do, see the +# Joyent Engineering Guide. +# + +# +# Instruct make to keep around temporary files. We have rules below that +# automatically update git submodules as needed, but they employ a deps/*/.git +# temporary file. Without this directive, make tries to remove these .git +# directories after the build has completed. +# +.SECONDARY: $($(wildcard deps/*):%=%/.git) + +# +# This rule enables other rules that use files from a git submodule to have +# those files depend on deps/module/.git and have "make" automatically check +# out the submodule as needed. +# +deps/%/.git: + git submodule update --init deps/$* + +# +# These recipes make heavy use of dynamically-created phony targets. The parent +# Makefile defines a list of input files like BASH_FILES. We then say that each +# of these files depends on a fake target called filename.bashchk, and then we +# define a pattern rule for those targets that runs bash in check-syntax-only +# mode. This mechanism has the nice properties that if you specify zero files, +# the rule becomes a noop (unlike a single rule to check all bash files, which +# would invoke bash with zero files), and you can check individual files from +# the command line with "make filename.bashchk". +# +.PHONY: check-bash +check-bash: $(BASH_FILES:%=%.bashchk) $(BASH_FILES:%=%.bashstyle) + +%.bashchk: % + $(BASH) -n $^ + +%.bashstyle: % + $(BASHSTYLE) $^ + +.PHONY: check-jsl check-jsl-node check-jsl-web +check-jsl: check-jsl-node check-jsl-web + +check-jsl-node: $(JSL_FILES_NODE:%=%.jslnodechk) + +check-jsl-web: $(JSL_FILES_WEB:%=%.jslwebchk) + +%.jslnodechk: % $(JSL_EXEC) + $(JSL) $(JSL_FLAGS) $(JSL_FLAGS_NODE) $< + +%.jslwebchk: % $(JSL_EXEC) + $(JSL) $(JSL_FLAGS) $(JSL_FLAGS_WEB) $< + +.PHONY: check-jsstyle +check-jsstyle: $(JSSTYLE_FILES:%=%.jsstylechk) + +%.jsstylechk: % $(JSSTYLE_EXEC) + $(JSSTYLE) $(JSSTYLE_FLAGS) $< + +.PHONY: check +check: check-jsl check-jsstyle check-bash + @echo check ok + +.PHONY: clean +clean:: + -$(RMTREE) $(CLEAN_FILES) + +.PHONY: distclean +distclean:: clean + -$(RMTREE) $(DISTCLEAN_FILES) + +CSCOPE_FILES = cscope.in.out cscope.out cscope.po.out +CLEAN_FILES += $(CSCOPE_FILES) + +.PHONY: xref +xref: cscope.files + $(CSCOPE) -bqR + +.PHONY: cscope.files +cscope.files: + find $(CSCOPE_DIRS) -name '*.c' -o -name '*.h' -o -name '*.cc' \ + -o -name '*.js' -o -name '*.s' -o -name '*.cpp' > $@ + +# +# The "docs" target is complicated because we do several things here: +# +# (1) Use restdown to build HTML and JSON files from each of DOC_FILES. +# +# (2) Copy these files into $(DOC_BUILD) (build/docs/public), which +# functions as a complete copy of the documentation that could be +# mirrored or served over HTTP. +# +# (3) Then copy any directories and media from docs/media into +# $(DOC_BUILD)/media. This allows projects to include their own media, +# including files that will override same-named files provided by +# restdown. +# +# Step (3) is the surprisingly complex part: in order to do this, we need to +# identify the subdirectories in docs/media, recreate them in +# $(DOC_BUILD)/media, then do the same with the files. +# +DOC_MEDIA_DIRS := $(shell find docs/media -type d 2>/dev/null | grep -v "^docs/media$$") +DOC_MEDIA_DIRS := $(DOC_MEDIA_DIRS:docs/media/%=%) +DOC_MEDIA_DIRS_BUILD := $(DOC_MEDIA_DIRS:%=$(DOC_BUILD)/media/%) + +DOC_MEDIA_FILES := $(shell find docs/media -type f 2>/dev/null) +DOC_MEDIA_FILES := $(DOC_MEDIA_FILES:docs/media/%=%) +DOC_MEDIA_FILES_BUILD := $(DOC_MEDIA_FILES:%=$(DOC_BUILD)/media/%) + +# +# Like the other targets, "docs" just depends on the final files we want to +# create in $(DOC_BUILD), leveraging other targets and recipes to define how +# to get there. +# +.PHONY: docs +docs: \ + $(DOC_FILES:%.restdown=$(DOC_BUILD)/%.html) \ + $(DOC_FILES:%.restdown=$(DOC_BUILD)/%.json) \ + $(DOC_MEDIA_FILES_BUILD) + +# +# We keep the intermediate files so that the next build can see whether the +# files in DOC_BUILD are up to date. +# +.PRECIOUS: \ + $(DOC_FILES:%.restdown=docs/%.html) \ + $(DOC_FILES:%.restdown=docs/%json) + +# +# We do clean those intermediate files, as well as all of DOC_BUILD. +# +CLEAN_FILES += \ + $(DOC_BUILD) \ + $(DOC_FILES:%.restdown=docs/%.html) \ + $(DOC_FILES:%.restdown=docs/%.json) + +# +# Before installing the files, we must make sure the directories exist. The | +# syntax tells make that the dependency need only exist, not be up to date. +# Otherwise, it might try to rebuild spuriously because the directory itself +# appears out of date. +# +$(DOC_MEDIA_FILES_BUILD): | $(DOC_MEDIA_DIRS_BUILD) + +$(DOC_BUILD)/%: docs/% | $(DOC_BUILD) + $(CP) $< $@ + +docs/%.json docs/%.html: docs/%.restdown | $(DOC_BUILD) $(RESTDOWN_EXEC) + $(RESTDOWN) $(RESTDOWN_FLAGS) -m $(DOC_BUILD) $< + +$(DOC_BUILD): + $(MKDIR) $@ + +$(DOC_MEDIA_DIRS_BUILD): + $(MKDIR) $@ + +# +# The default "test" target does nothing. This should usually be overridden by +# the parent Makefile. It's included here so we can define "prepush" without +# requiring the repo to define "test". +# +.PHONY: test +test: + +.PHONY: prepush +prepush: check test diff --git a/node_modules/verror/node_modules/extsprintf/README.md b/node_modules/verror/node_modules/extsprintf/README.md new file mode 100644 index 00000000..b22998d6 --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/README.md @@ -0,0 +1,46 @@ +# extsprintf: extended POSIX-style sprintf + +Stripped down version of s[n]printf(3c). We make a best effort to throw an +exception when given a format string we don't understand, rather than ignoring +it, so that we won't break existing programs if/when we go implement the rest +of this. + +This implementation currently supports specifying + +* field alignment ('-' flag), +* zero-pad ('0' flag) +* always show numeric sign ('+' flag), +* field width +* conversions for strings, decimal integers, and floats (numbers). +* argument size specifiers. These are all accepted but ignored, since + Javascript has no notion of the physical size of an argument. + +Everything else is currently unsupported, most notably: precision, unsigned +numbers, non-decimal numbers, and characters. + +Besides the usual POSIX conversions, this implementation supports: + +* `%j`: pretty-print a JSON object (using node's "inspect") +* `%r`: pretty-print an Error object + +# Example + +First, install it: + + # npm install extsprintf + +Now, use it: + + var mod_extsprintf = require('extsprintf'); + console.log(mod_extsprintf.sprintf('hello %25s', 'world')); + +outputs: + + hello world + +# Also supported + +**printf**: same args as sprintf, but prints the result to stdout + +**fprintf**: same args as sprintf, preceded by a Node stream. Prints the result +to the given stream. diff --git a/node_modules/verror/node_modules/extsprintf/jsl.node.conf b/node_modules/verror/node_modules/extsprintf/jsl.node.conf new file mode 100644 index 00000000..03f787ff --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/jsl.node.conf @@ -0,0 +1,137 @@ +# +# Configuration File for JavaScript Lint +# +# This configuration file can be used to lint a collection of scripts, or to enable +# or disable warnings for scripts that are linted via the command line. +# + +### Warnings +# Enable or disable warnings based on requirements. +# Use "+WarningName" to display or "-WarningName" to suppress. +# ++ambiguous_else_stmt # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent ++ambiguous_nested_stmt # block statements containing block statements should use curly braces to resolve ambiguity ++ambiguous_newline # unexpected end of line; it is ambiguous whether these lines are part of the same statement ++anon_no_return_value # anonymous function does not always return value ++assign_to_function_call # assignment to a function call +-block_without_braces # block statement without curly braces ++comma_separated_stmts # multiple statements separated by commas (use semicolons?) ++comparison_type_conv # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==) ++default_not_at_end # the default case is not at the end of the switch statement ++dup_option_explicit # duplicate "option explicit" control comment ++duplicate_case_in_switch # duplicate case in switch statement ++duplicate_formal # duplicate formal argument {name} ++empty_statement # empty statement or extra semicolon ++identifier_hides_another # identifer {name} hides an identifier in a parent scope +-inc_dec_within_stmt # increment (++) and decrement (--) operators used as part of greater statement ++incorrect_version # Expected /*jsl:content-type*/ control comment. The script was parsed with the wrong version. ++invalid_fallthru # unexpected "fallthru" control comment ++invalid_pass # unexpected "pass" control comment ++jsl_cc_not_understood # couldn't understand control comment using /*jsl:keyword*/ syntax ++leading_decimal_point # leading decimal point may indicate a number or an object member ++legacy_cc_not_understood # couldn't understand control comment using /*@keyword@*/ syntax ++meaningless_block # meaningless block; curly braces have no impact ++mismatch_ctrl_comments # mismatched control comment; "ignore" and "end" control comments must have a one-to-one correspondence ++misplaced_regex # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma ++missing_break # missing break statement ++missing_break_for_last_case # missing break statement for last case in switch ++missing_default_case # missing default case in switch statement ++missing_option_explicit # the "option explicit" control comment is missing ++missing_semicolon # missing semicolon ++missing_semicolon_for_lambda # missing semicolon for lambda assignment ++multiple_plus_minus # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs ++nested_comment # nested comment ++no_return_value # function {name} does not always return a value ++octal_number # leading zeros make an octal number ++parseint_missing_radix # parseInt missing radix parameter ++partial_option_explicit # the "option explicit" control comment, if used, must be in the first script tag ++redeclared_var # redeclaration of {name} ++trailing_comma_in_array # extra comma is not recommended in array initializers ++trailing_decimal_point # trailing decimal point may indicate a number or an object member ++undeclared_identifier # undeclared identifier: {name} ++unreachable_code # unreachable code +-unreferenced_argument # argument declared but never referenced: {name} +-unreferenced_function # function is declared but never referenced: {name} ++unreferenced_variable # variable is declared but never referenced: {name} ++unsupported_version # JavaScript {version} is not supported ++use_of_label # use of label ++useless_assign # useless assignment ++useless_comparison # useless comparison; comparing identical expressions +-useless_quotes # the quotation marks are unnecessary ++useless_void # use of the void type may be unnecessary (void is always undefined) ++var_hides_arg # variable {name} hides argument ++want_assign_or_call # expected an assignment or function call ++with_statement # with statement hides undeclared variables; use temporary variable instead + + +### Output format +# Customize the format of the error message. +# __FILE__ indicates current file path +# __FILENAME__ indicates current file name +# __LINE__ indicates current line +# __COL__ indicates current column +# __ERROR__ indicates error message (__ERROR_PREFIX__: __ERROR_MSG__) +# __ERROR_NAME__ indicates error name (used in configuration file) +# __ERROR_PREFIX__ indicates error prefix +# __ERROR_MSG__ indicates error message +# +# For machine-friendly output, the output format can be prefixed with +# "encode:". If specified, all items will be encoded with C-slashes. +# +# Visual Studio syntax (default): ++output-format __FILE__(__LINE__): __ERROR__ +# Alternative syntax: +#+output-format __FILE__:__LINE__: __ERROR__ + + +### Context +# Show the in-line position of the error. +# Use "+context" to display or "-context" to suppress. +# ++context + + +### Control Comments +# Both JavaScript Lint and the JScript interpreter confuse each other with the syntax for +# the /*@keyword@*/ control comments and JScript conditional comments. (The latter is +# enabled in JScript with @cc_on@). The /*jsl:keyword*/ syntax is preferred for this reason, +# although legacy control comments are enabled by default for backward compatibility. +# +-legacy_control_comments + + +### Defining identifiers +# By default, "option explicit" is enabled on a per-file basis. +# To enable this for all files, use "+always_use_option_explicit" +-always_use_option_explicit + +# Define certain identifiers of which the lint is not aware. +# (Use this in conjunction with the "undeclared identifier" warning.) +# +# Common uses for webpages might be: ++define __dirname ++define clearInterval ++define clearTimeout ++define console ++define exports ++define global ++define process ++define require ++define setInterval ++define setTimeout ++define Buffer ++define JSON ++define Math + +### JavaScript Version +# To change the default JavaScript version: +#+default-type text/javascript;version=1.5 +#+default-type text/javascript;e4x=1 + +### Files +# Specify which files to lint +# Use "+recurse" to enable recursion (disabled by default). +# To add a set of files, use "+process FileName", "+process Folder\Path\*.js", +# or "+process Folder\Path\*.htm". +# + diff --git a/node_modules/verror/node_modules/extsprintf/package.json b/node_modules/verror/node_modules/extsprintf/package.json new file mode 100644 index 00000000..42669d2a --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/package.json @@ -0,0 +1,14 @@ +{ + "name": "extsprintf", + "version": "1.4.0", + "description": "extended POSIX-style sprintf", + "main": "./lib/extsprintf.js", + "repository": { + "type": "git", + "url": "git://github.com/davepacheco/node-extsprintf.git" + }, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" +} diff --git a/node_modules/verror/node_modules/extsprintf/test/tst.basic.js b/node_modules/verror/node_modules/extsprintf/test/tst.basic.js new file mode 100644 index 00000000..9e56fdaf --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/test/tst.basic.js @@ -0,0 +1,118 @@ +/* + * tst.basic.js: tests various valid invocation + */ + +var mod_assert = require('assert'); +var mod_extsprintf = require('../lib/extsprintf'); +var mod_path = require('path'); +var sprintf = mod_extsprintf.sprintf; + +var testcases = [ { + 'name': 'empty string', + 'args': [ '' ], + 'result': '' +}, { + 'name': '%s: basic', + 'args': [ '%s', 'foo' ], + 'result': 'foo' +}, { + 'name': '%s: not first', + 'args': [ 'hello %s\n', 'world' ], + 'result': 'hello world\n' +}, { + 'name': '%s: right-aligned', + 'args': [ 'hello %10s\n', 'world' ], + 'result': 'hello world\n' +}, { + 'name': '%s: left-aligned', + 'args': [ 'hello %-10sagain\n', 'world' ], + 'result': 'hello world again\n' +}, { + 'name': '%d: basic, positive', + 'args': [ '%d', 17 ], + 'result': '17' +}, { + 'name': '%d: basic, zero', + 'args': [ '%d', 0 ], + 'result': '0' +}, { + 'name': '%d: basic, floating point value', + 'args': [ '%d', 17.3 ], + 'result': '17' +}, { + 'name': '%d: basic, negative', + 'args': [ '%d', -3 ], + 'result': '-3' +}, { + 'name': '%d: right-aligned', + 'args': [ '%4d', 17 ], + 'result': ' 17' +}, { + 'name': '%d: right-aligned, zero-padded', + 'args': [ '%04d', 17 ], + 'result': '0017' +}, { + 'name': '%d: left-aligned', + 'args': [ '%-4d', 17 ], + 'result': '17 ' +}, { + 'name': '%x: basic', + 'args': [ '%x', 18], + 'result': '12' +}, { + 'name': '%x: zero-padded, right-aligned', + 'args': [ '%08x', 0xfeedface ], + 'result': 'feedface' +}, { + 'name': '%d: with plus sign', + 'args': [ '%+d', 17 ], + 'result': '+17' +}, { + 'name': '%f: basic', + 'args': [ '%f', 3.2 ], + 'result': '3.2' +}, { + 'name': '%f: right-aligned', + 'args': [ '%5f', 3.2 ], + 'result': ' 3.2' +}, { + 'name': '%%: basic', + 'args': [ '%%' ], + 'result': '%' +}, { + 'name': 'complex', + 'args': [ 'one %s %8s %-3d bytes past 0x%04x, which was %6f%%%s%5s', + 'program', 'wrote', -2, 0x30, 3.7, ' plus', 'over' ], + 'result': 'one program wrote -2 bytes past 0x0030, which was ' + + '3.7% plus over' +} ]; + +function main(verbose) { + /* + * Create one test case with a very large input string. + */ + var input = '1234'; + while (input.length < 100 * 1024) { + input += input; + } + testcases.push({ + 'name': 'long string argument (' + input.length + ' characters)', + 'args': [ '%s', input ], + 'result': input + }); + + testcases.forEach(function (tc) { + var result; + console.error('test case: %s', tc.name); + result = sprintf.apply(null, tc.args); + if (verbose) { + console.error(' args: %s', JSON.stringify(tc.args)); + console.error(' result: %s', result); + } + mod_assert.equal(tc.result, result); + }); + + console.log('%s tests passed', mod_path.basename(__filename)); +} + +main(process.argv.length > 2 && process.argv[2] == '-v'); diff --git a/node_modules/verror/node_modules/extsprintf/test/tst.invalid.js b/node_modules/verror/node_modules/extsprintf/test/tst.invalid.js new file mode 100644 index 00000000..1a7a5606 --- /dev/null +++ b/node_modules/verror/node_modules/extsprintf/test/tst.invalid.js @@ -0,0 +1,78 @@ +/* + * tst.invalid.js: tests invalid invocations + */ + +var mod_assert = require('assert'); +var mod_extsprintf = require('../lib/extsprintf'); +var mod_path = require('path'); +var sprintf = mod_extsprintf.sprintf; + +var testcases = [ { + 'name': 'missing all arguments', + 'args': [], + 'errmsg': /first argument must be a format string$/ +}, { + 'name': 'missing argument for format specifier (first char and specifier)', + 'args': [ '%s' ], + 'errmsg': new RegExp( + 'format string "%s": conversion specifier "%s" at character 1 ' + + 'has no matching argument \\(too few arguments passed\\)') +}, { + 'name': 'missing argument for format specifier (later in string)', + 'args': [ 'hello %s world %13d', 'big' ], + 'errmsg': new RegExp( + 'format string "hello %s world %13d": conversion specifier "%13d" at ' + + 'character 16 has no matching argument \\(too few arguments passed\\)') +}, { + 'name': 'printing null as string', + 'args': [ '%d cookies %3s', 15, null ], + 'errmsg': new RegExp( + 'format string "%d cookies %3s": conversion specifier "%3s" at ' + + 'character 12 attempted to print undefined or null as a string ' + + '\\(argument 3 to sprintf\\)') +}, { + 'name': 'printing undefined as string', + 'args': [ '%d cookies %3s ah %d', 15, undefined, 7 ], + 'errmsg': new RegExp( + 'format string "%d cookies %3s ah %d": conversion specifier "%3s" at ' + + 'character 12 attempted to print undefined or null as a string ' + + '\\(argument 3 to sprintf\\)') +}, { + 'name': 'unsupported format character', + 'args': [ 'do not use %X', 13 ], + 'errmsg': new RegExp( + 'format string "do not use %X": conversion ' + + 'specifier "%X" at character 12 is not supported$') +}, { + 'name': 'unsupported flags', + 'args': [ '%#x', 13 ], + 'errmsg': new RegExp( + 'format string "%#x": conversion ' + + 'specifier "%#x" at character 1 uses unsupported flags$') +} ]; + +function main(verbose) { + testcases.forEach(function (tc) { + var error; + console.error('test case: %s', tc.name); + if (verbose) { + console.error(' args: %s', JSON.stringify(tc.args)); + } + mod_assert.throws(function () { + try { + sprintf.apply(null, tc.args); + } catch (ex) { + error = ex; + throw (ex); + } + }, tc.errmsg); + + if (verbose && error) { + console.error(' error: %s', error.message); + } + }); + + console.log('%s tests passed', mod_path.basename(__filename)); +} + +main(process.argv.length > 2 && process.argv[2] == '-v'); diff --git a/node_modules/verror/package.json b/node_modules/verror/package.json new file mode 100644 index 00000000..79295c57 --- /dev/null +++ b/node_modules/verror/package.json @@ -0,0 +1,22 @@ +{ + "name": "verror", + "version": "1.10.0", + "description": "richer JavaScript errors", + "main": "./lib/verror.js", + "repository": { + "type": "git", + "url": "git://github.com/davepacheco/node-verror.git" + }, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": [ + "node >=0.6.0" + ], + "scripts": { + "test": "make test" + }, + "license": "MIT" +} diff --git a/node_modules/vinyl-fs/LICENSE b/node_modules/vinyl-fs/LICENSE new file mode 100644 index 00000000..6355a4b4 --- /dev/null +++ b/node_modules/vinyl-fs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/vinyl-fs/README.md b/node_modules/vinyl-fs/README.md new file mode 100644 index 00000000..786ad1b1 --- /dev/null +++ b/node_modules/vinyl-fs/README.md @@ -0,0 +1,341 @@ +

      + + + +

      + +# vinyl-fs + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +[Vinyl][vinyl] adapter for the file system. + +## What is Vinyl? + +[Vinyl][vinyl] is a very simple metadata object that describes a file. When you think of a file, two attributes come to mind: `path` and `contents`. These are the main attributes on a [Vinyl][vinyl] object. A file does not necessarily represent something on your computer’s file system. You have files on S3, FTP, Dropbox, Box, CloudThingly.io and other services. [Vinyl][vinyl] can be used to describe files from all of these sources. + +## What is a Vinyl Adapter? + +While Vinyl provides a clean way to describe a file, we now need a way to access these files. Each file source needs what we call a "Vinyl adapter". A Vinyl adapter simply exposes a `src(globs)` and a `dest(folder)` method. Each return a stream. The `src` stream produces Vinyl objects, and the `dest` stream consumes Vinyl objects. Vinyl adapters can expose extra methods that might be specific to their input/output medium, such as the `symlink` method `vinyl-fs` provides. + +## Usage + +```javascript +var map = require('map-stream'); +var vfs = require('vinyl-fs'); + +var log = function(file, cb) { + console.log(file.path); + cb(null, file); +}; + +vfs.src(['./js/**/*.js', '!./js/vendor/*.js']) + .pipe(map(log)) + .pipe(vfs.dest('./output')); +``` + +## API + +### `src(globs[, options])` + +Takes a glob string or an array of glob strings as the first argument and an options object as the second. +Returns a stream of [vinyl] `File` objects. + +__Note: UTF-8 BOM will be removed from all UTF-8 files read with `.src` unless disabled in the options.__ + +#### Globs + +Globs are executed in order, so negations should follow positive globs. + +For example: + +```js +fs.src(['!b*', '*']) +``` + +would not exclude any files, but the following would exclude all files starting with "b": + +```js +fs.src(['*', '!b*']) +``` + +#### Options + +- Values passed to the options must be of the expected type, otherwise they will be ignored. +- All options can be passed a function instead of a value. The function will be called with the [vinyl] `File` object as its only argument and must return a value of the expected type for that option. + +##### `options.buffer` + +Whether or not you want to buffer the file contents into memory. Setting to `false` will make `file.contents` a paused Stream. + +Type: `Boolean` + +Default: `true` + +##### `options.read` + +Whether or not you want the file to be read at all. Useful for stuff like removing files. Setting to `false` will make `file.contents = null` and will disable writing the file to disk via `.dest()`. + +Type: `Boolean` + +Default: `true` + +##### `options.since` + +Only streams files that have been modified since the time specified. + +Type: `Date` or `Number` + +Default: `undefined` + +##### `options.removeBOM` + +Causes the BOM to be removed on UTF-8 encoded files. Set to `false` if you need the BOM for some reason. + +Type: `Boolean` + +Default: `true` + +##### `options.sourcemaps` + +Enables sourcemap support on files passed through the stream. Will load inline sourcemaps and resolve sourcemap links from files. + +Type: `Boolean` + +Default: `false` + +##### `options.resolveSymlinks` + +Whether or not to recursively resolve symlinks to their targets. Set to `false` to preserve them as symlinks and make `file.symlink` equal the original symlink's target path. + +Type: `Boolean` + +Default: `true` + +##### `options.dot` + +Whether or not you want globs to match on dot files (e.g. `.gitignore`). + +__Note: This option is not resolved from a function because it is passed verbatim to node-glob.__ + +Type: `Boolean` + +Default: `false` + +##### other + +Any glob-related options are documented in [glob-stream] and [node-glob] and are forwarded verbatim. + +### `dest(folder[, options])` + +Takes a folder path string or a function as the first argument and an options object as the second. If given a function, it will be called with each [vinyl] `File` object and must return a folder path. +Returns a stream that accepts [vinyl] `File` objects, writes them to disk at the folder/cwd specified, and passes them downstream so you can keep piping these around. + +Once the file is written to disk, an attempt is made to determine if the `stat.mode`, `stat.mtime` and `stat.atime` of the [vinyl] `File` object differ from the file on the filesystem. +If they differ and the running process owns the file, the corresponding filesystem metadata is updated. +If they don't differ or the process doesn't own the file, the attempt is skipped silently. +__This functionality is disabled on Windows operating systems or any other OS that doesn't support `process.getuid` or `process.geteuid` in node. This is due to Windows having very unexpected results through usage of `fs.fchmod` and `fs.futimes`.__ + +__Note: The `fs.futimes()` method internally converts `stat.mtime` and `stat.atime` timestamps to seconds; this division by `1000` may cause some loss of precision in 32-bit Node.js.__ + +If the file has a `symlink` attribute specifying a target path, then a symlink will be created. + +__Note: The file will be modified after being written to this stream.__ + - `cwd`, `base`, and `path` will be overwritten to match the folder. + - `stat` will be updated to match the file on the filesystem. + - `contents` will have it's position reset to the beginning if it is a stream. + +#### Options + +- Values passed to the options must be of the expected type, otherwise they will be ignored. +- All options can be passed a function instead of a value. The function will be called with the [vinyl] `File` object as its only argument and must return a value of the expected type for that option. + +##### `options.cwd` + +The working directory the folder is relative to. + +Type: `String` + +Default: `process.cwd()` + +##### `options.mode` + +The mode the files should be created with. This option is only resolved if the [vinyl] `File` is not symbolic. + +Type: `Number` + +Default: The `mode` of the input file (`file.stat.mode`) if any, or the process mode if the input file has no `mode` property. + +##### `options.dirMode` + +The mode directories should be created with. + +Type: `Number` + +Default: The process `mode`. + +##### `options.overwrite` + +Whether or not existing files with the same path should be overwritten. + +Type: `Boolean` + +Default: `true` (always overwrite existing files) + +##### `options.append` + +Whether or not new data should be appended after existing file contents (if any). + +Type: `Boolean` + +Default: `false` (always replace existing contents, if any) + +##### `options.sourcemaps` + +Enables sourcemap support on files passed through the stream. Will write inline soucemaps if specified as `true`. +Specifying a `String` path will write external sourcemaps at the given path. + +Examples: + +```js +// Write as inline comments +vfs.dest('./', { sourcemaps: true }); + +// Write as files in the same folder +vfs.dest('./', { sourcemaps: '.' }); +``` + +Type: `Boolean` or `String` + +Default: `undefined` (do not write sourcemaps) + +##### `options.relativeSymlinks` + +When creating a symlink, whether or not the created symlink should be relative. If `false`, the symlink will be absolute. + +__Note: This option will be ignored if a `junction` is being created, as they must be absolute.__ + +Type: `Boolean` + +Default: `false` + +##### `options.useJunctions` + +When creating a symlink, whether or not a directory symlink should be created as a `junction`. +This option is only relevant on Windows and ignored elsewhere. Please refer to the [Symbolic Links on Windows][symbolic-caveats] section below. + +Type: `Boolean` + +Default: `true` + +### `symlink(folder[, options])` + +Takes a folder path string or a function as the first argument and an options object as the second. If given a function, it will be called with each [vinyl] `File` object and must return a folder path. +Returns a stream that accepts [vinyl] `File` objects, creates a symbolic link (i.e. symlink) at the folder/cwd specified, and passes them downstream so you can keep piping these around. + +__Note: The file will be modified after being written to this stream.__ + - `cwd`, `base`, and `path` will be overwritten to match the folder. + - `stat` will be updated to match the symlink on the filesystem. + - `contents` will be set to `null`. + - `symlink` will be added or replaced to be the original path. + +__Note: On Windows, directory links are created using Junctions by default. Use the `useJunctions` option to disable this behavior.__ + +#### Options + +- Values passed to the options must be of the expected type, otherwise they will be ignored. +- All options can be passed a function instead of a value. The function will be called with the [vinyl] `File` object as its only argument and must return a value of the expected type for that option. + +##### `options.cwd` + +The working directory the folder is relative to. + +Type: `String` + +Default: `process.cwd()` + +##### `options.dirMode` + +The mode directories should be created with. + +Type: `Number` + +Default: The process mode. + +##### `options.overwrite` + +Whether or not existing files with the same path should be overwritten. + +Type: `Boolean` + +Default: `true` (always overwrite existing files) + +##### `options.relativeSymlinks` + +Whether or not the created symlinks should be relative. If `false`, the symlink will be absolute. + +__Note: This option will be ignored if a `junction` is being created, as they must be absolute.__ + +Type: `Boolean` + +Default: `false` + +##### `options.useJunctions` + +When creating a symlink, whether or not a directory symlink should be created as a `junction`. +This option is only relevant on Windows and ignored elsewhere. Please refer to the [Symbolic Links on Windows][symbolic-caveats] section below. + +Type: `Boolean` + +Default: `true` + +#### Symbolic Links on Windows + +When creating symbolic links on Windows, we pass a `type` argument to Node's +`fs` module which specifies the kind of target we link to (one of `'file'`, +`'dir'` or `'junction'`). Specifically, this will be `'file'` when the target +is a regular file, `'junction'` if the target is a directory, or `'dir'` if +the target is a directory and the user overrides the `useJunctions` option +default. + +However, if the user tries to make a "dangling" link (pointing to a non-existent +target) we won't be able to determine automatically which type we should use. +In these cases, `vinyl-fs` will behave slightly differently depending on +whether the dangling link is being created via `symlink()` or via `dest()`. + +For dangling links created via `symlink()`, the incoming vinyl represents the +target and so we will look to its stats to guess the desired type. In +particular, if `isDirectory()` returns false then we'll create a `'file'` type +link, otherwise we will create a `'junction'` or a `'dir'` type link depending +on the value of the `useJunctions` option. + +For dangling links created via `dest()`, the incoming vinyl represents the link - +typically read off disk via `src()` with the `resolveSymlinks` option set to +false. In this case, we won't be able to make any reasonable guess as to the +type of link and we default to using `'file'`, which may cause unexpected behavior +if you are creating a "dangling" link to a directory. It is advised to avoid this +scenario. + + +[symbolic-caveats]: #symbolic-links-on-windows +[glob-stream]: https://github.com/gulpjs/glob-stream +[node-glob]: https://github.com/isaacs/node-glob +[gaze]: https://github.com/shama/gaze +[glob-watcher]: https://github.com/wearefractal/glob-watcher +[vinyl]: https://github.com/wearefractal/vinyl + +[downloads-image]: http://img.shields.io/npm/dm/vinyl-fs.svg +[npm-url]: https://www.npmjs.com/package/vinyl-fs +[npm-image]: http://img.shields.io/npm/v/vinyl-fs.svg + +[travis-url]: https://travis-ci.org/gulpjs/vinyl-fs +[travis-image]: http://img.shields.io/travis/gulpjs/vinyl-fs.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/vinyl-fs +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/vinyl-fs.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/vinyl-fs +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/vinyl-fs/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/vinyl-fs/index.js b/node_modules/vinyl-fs/index.js new file mode 100644 index 00000000..acdeac2b --- /dev/null +++ b/node_modules/vinyl-fs/index.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = { + src: require('./lib/src'), + dest: require('./lib/dest'), + symlink: require('./lib/symlink'), +}; diff --git a/node_modules/vinyl-fs/node_modules/through2/LICENSE.md b/node_modules/vinyl-fs/node_modules/through2/LICENSE.md new file mode 100644 index 00000000..a2429b63 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/through2/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License (MIT) + +**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/through2/README.md b/node_modules/vinyl-fs/node_modules/through2/README.md new file mode 100644 index 00000000..b5e44c7b --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/through2/README.md @@ -0,0 +1,134 @@ +# through2 + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node streams.Transform (Streams2/3) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +Note: As 2.x.x this module starts using **Streams3** instead of Stream2. To continue using a Streams2 version use `npm install through2@0` to fetch the latest version of 0.x.x. More information about Streams2 vs Streams3 and recommendations see the article **[Why I don't use Node's core 'stream' module](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html)**. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (var i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) + .on('finish', () => doSomethingSpecial()) +``` + +Or object streams: + +```js +var all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + var data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', (data) => { + all.push(data) + }) + .on('end', () => { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## API + +through2([ options, ] [ transformFunction ] [, flushFunction ]) + +Consult the **[stream.Transform](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + (chunk, enc, cb) => { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + ) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + (chunk, enc, cb) => cb(null, chunk), // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +through2.ctor([ options, ] transformFunction[, flushFunction ]) + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +var FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit == "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +var converter = new FToC() +// Or: +var converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +var converter = FToC({objectMode: true}) +``` + +## See Also + + - [through2-map](https://github.com/brycebaril/through2-map) - Array.prototype.map analog for streams. + - [through2-filter](https://github.com/brycebaril/through2-filter) - Array.prototype.filter analog for streams. + - [through2-reduce](https://github.com/brycebaril/through2-reduce) - Array.prototype.reduce analog for streams. + - [through2-spy](https://github.com/brycebaril/through2-spy) - Wrapper for simple stream.PassThrough spies. + - the [mississippi stream utility collection](https://github.com/maxogden/mississippi) includes `through2` as well as many more useful stream modules similar to this one + +## License + +**through2** is Copyright (c) Rod Vagg [@rvagg](https://twitter.com/rvagg) and additional contributors and licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/vinyl-fs/node_modules/through2/package.json b/node_modules/vinyl-fs/node_modules/through2/package.json new file mode 100644 index 00000000..15960b63 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/through2/package.json @@ -0,0 +1,33 @@ +{ + "name": "through2", + "version": "2.0.5", + "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise", + "main": "through2.js", + "scripts": { + "test": "node test/test.js | faucet" + }, + "repository": { + "type": "git", + "url": "https://github.com/rvagg/through2.git" + }, + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "author": "Rod Vagg (https://github.com/rvagg)", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "devDependencies": { + "bl": "~2.0.1", + "faucet": "0.0.1", + "nyc": "~13.1.0", + "safe-buffer": "~5.1.2", + "stream-spigot": "~3.0.6", + "tape": "~4.9.1" + } +} diff --git a/node_modules/vinyl-fs/node_modules/through2/through2.js b/node_modules/vinyl-fs/node_modules/through2/through2.js new file mode 100644 index 00000000..6baa6a1e --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/through2/through2.js @@ -0,0 +1,96 @@ +var Transform = require('readable-stream').Transform + , inherits = require('util').inherits + , xtend = require('xtend') + +function DestroyableTransform(opts) { + Transform.call(this, opts) + this._destroyed = false +} + +inherits(DestroyableTransform, Transform) + +DestroyableTransform.prototype.destroy = function(err) { + if (this._destroyed) return + this._destroyed = true + + var self = this + process.nextTick(function() { + if (err) + self.emit('error', err) + self.emit('close') + }) +} + +// a noop _transform function +function noop (chunk, enc, callback) { + callback(null, chunk) +} + + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return function (options, transform, flush) { + if (typeof options == 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform != 'function') + transform = noop + + if (typeof flush != 'function') + flush = null + + return construct(options, transform, flush) + } +} + + +// main export, just make me a transform stream! +module.exports = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(options) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) + + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +module.exports.ctor = through2(function (options, transform, flush) { + function Through2 (override) { + if (!(this instanceof Through2)) + return new Through2(override) + + this.options = xtend(options, override) + + DestroyableTransform.call(this, this.options) + } + + inherits(Through2, DestroyableTransform) + + Through2.prototype._transform = transform + + if (flush) + Through2.prototype._flush = flush + + return Through2 +}) + + +module.exports.obj = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) diff --git a/node_modules/vinyl-fs/package.json b/node_modules/vinyl-fs/package.json new file mode 100644 index 00000000..d8eecff7 --- /dev/null +++ b/node_modules/vinyl-fs/package.json @@ -0,0 +1,68 @@ +{ + "name": "vinyl-fs", + "version": "3.0.3", + "description": "Vinyl adapter for the file system.", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Eric Schoffstall ", + "Blaine Bublitz " + ], + "repository": "gulpjs/vinyl-fs", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js", + "lib" + ], + "scripts": { + "lint": "eslint . && jscs index.js lib/ test/", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "devDependencies": { + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.19.0", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mississippi": "^1.2.0", + "mocha": "^3.5.0", + "rimraf": "^2.6.1" + }, + "keywords": [ + "gulp", + "vinyl-adapter", + "vinyl", + "file", + "file system", + "fs", + "streams" + ] +} diff --git a/node_modules/vinyl-sourcemap/LICENSE b/node_modules/vinyl-sourcemap/LICENSE new file mode 100644 index 00000000..82c8d554 --- /dev/null +++ b/node_modules/vinyl-sourcemap/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors (Based on code from gulp-sourcemaps - ISC License - Copyright (c) 2014, Florian Reiterer) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/vinyl-sourcemap/README.md b/node_modules/vinyl-sourcemap/README.md new file mode 100644 index 00000000..6ffc0ef2 --- /dev/null +++ b/node_modules/vinyl-sourcemap/README.md @@ -0,0 +1,79 @@ +

      + + + +

      + +# vinyl-sourcemap + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Add/write sourcemaps to/from Vinyl files. + +## Usage + +```js +sourcemap.add(file, function(err, updatedFile) { + // updatedFile will have a .sourceMap property +}); + +// The 2nd argument can be given as a path string +sourcemap.write(file, './maps', function(err, updatedFile, sourcemapFile) { + // sourcemapFile will be a Vinyl file to be written to some location + // updatedFile will have the .contents property updated with a sourceMappingURL that resolves to sourcemapFile +}); + +// If not defined, the sourcemap is inlined +sourcemap.write(file, function(err, updatedFile, sourcemapFile) { + // sourcemapFile is undefined + // updatedFile will have the .contents property updated with a sourceMappingURL that is an inlined sourcemap +}); +``` + +## API + +### `sourcemap.add(file, callback)` + +Takes a [Vinyl][vinyl] `file` object and a `callback` function. It attempts to parse an inline sourcemap or load an external sourcemap for the file. If a valid sourcemap is found, the `sources` & `sourcesContent` properties are resolved to actual files (if possible) and a fully resolved sourcemap is attached as `file.sourceMap`. If a sourcemap is not found, a stub sourcemap is generated for the file and attached as `file.sourceMap`. + +Once all resolution is complete, the `callback(err, updatedFile)` is called with the `updatedFile`. If an error occurs, it will be passed as `err` and `updatedFile` will be undefined. __Note:__ The original file is mutated but `updatedFile` is passed to the callback as a convenience. + +If the `file` is not a Vinyl object or the contents are streaming, an Error will be passed to the `callback`. + +If the `file` has a `.sourceMap` property or the contents are null, the `callback` will be called immediately without mutation to the file. + +All filesystem operations are optional & non-fatal so any errors will not be bubbled to the `callback`. + +### `sourcemap.write(file, [outputPath,] callback)` + +Takes a [Vinyl][vinyl] `file` object, (optionally) an `outputPath` string and a `callback` function. + +If `outputPath` is not passed, an inline sourcemap will be generated from the `file.sourceMap` property and appended to the `file.contents`. Once the inline sourcemap is appended, the `callback(err, updatedFile)` is called with the `updatedFile`. If an error occurs, it will be passed as `err` and `updatedFile` will be undefined. __Note:__ The original file is mutated but `updatedFile` is passed to the callback as a convenience. + +If `outputPath` is passed, a new Vinyl file will be generated using `file.cwd` and `file.base` from the original file, the path to the external sourcemap, and the `file.sourceMap` (as contents). The external location will be appended to the `file.contents` of the original file. Once the new file is created and location appended, the `callback(err, updatedFile, sourcemapFile)` is called with the `updatedFile` and the `sourcemapFile`. If an error occurs, it will be passed as `err` and `updatedFile`/`sourcemapFile` will be undefined. __Note:__ The original file is mutated but `updatedFile` is passed to the callback as a convenience. + +If the `file` is not a Vinyl object or the contents are streaming, an Error will be passed to the `callback`. + +If the `file` doesn't have a `.sourceMap` property or the contents are null, the `callback` will be called immediately without mutation to the file. + +## License + +MIT + +[vinyl]: https://github.com/gulpjs/vinyl + +[downloads-image]: http://img.shields.io/npm/dm/vinyl-sourcemap.svg +[npm-url]: https://npmjs.com/package/vinyl-sourcemap +[npm-image]: http://img.shields.io/npm/v/vinyl-sourcemap.svg + +[travis-url]: https://travis-ci.org/gulpjs/vinyl-sourcemap +[travis-image]: http://img.shields.io/travis/gulpjs/vinyl-sourcemap.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/vinyl-sourcemap +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/vinyl-sourcemap.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/vinyl-sourcemap +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/vinyl-sourcemap/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/node_modules/vinyl-sourcemap/index.js b/node_modules/vinyl-sourcemap/index.js new file mode 100644 index 00000000..93d5062c --- /dev/null +++ b/node_modules/vinyl-sourcemap/index.js @@ -0,0 +1,66 @@ +'use strict'; + +var File = require('vinyl'); + +var helpers = require('./lib/helpers'); + +var PLUGIN_NAME = 'vinyl-sourcemap'; + +function add(file, callback) { + + // Bail early an error if the file argument is not a Vinyl file + if (!File.isVinyl(file)) { + return callback(new Error(PLUGIN_NAME + '-add: Not a vinyl file')); + } + + // Bail early with an error if file has streaming contents + if (file.isStream()) { + return callback(new Error(PLUGIN_NAME + '-add: Streaming not supported')); + } + + // Bail early successfully if file is null or already has a sourcemap + if (file.isNull() || file.sourceMap) { + return callback(null, file); + } + + var state = { + path: '', // Root path for the sources in the map + map: null, + content: file.contents.toString(), + // TODO: handle this? + preExistingComment: null, + }; + + helpers.addSourceMaps(file, state, callback); +} + +function write(file, destPath, callback) { + + // Check if options or a callback are passed as second argument + if (typeof destPath === 'function') { + callback = destPath; + destPath = undefined; + } + + // Bail early with an error if the file argument is not a Vinyl file + if (!File.isVinyl(file)) { + return callback(new Error(PLUGIN_NAME + '-write: Not a vinyl file')); + } + + // Bail early with an error if file has streaming contents + if (file.isStream()) { + return callback(new Error(PLUGIN_NAME + '-write: Streaming not supported')); + } + + // Bail early successfully if file is null or doesn't have sourcemap + if (file.isNull() || !file.sourceMap) { + return callback(null, file); + } + + helpers.writeSourceMaps(file, destPath, callback); +} + +module.exports = { + add: add, + write: write, +}; diff --git a/node_modules/vinyl-sourcemap/package.json b/node_modules/vinyl-sourcemap/package.json new file mode 100644 index 00000000..f5f4755b --- /dev/null +++ b/node_modules/vinyl-sourcemap/package.json @@ -0,0 +1,53 @@ +{ + "name": "vinyl-sourcemap", + "version": "1.1.0", + "description": "Add/write sourcemaps to/from Vinyl files.", + "author": "Gulp Team (http://gulpjs.com/)", + "contributors": [ + "Robin Venneman", + "Blaine Bublitz " + ], + "repository": "gulpjs/vinyl-sourcemap", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js", + "lib/" + ], + "scripts": { + "lint": "eslint index.js lib/ test/add.js test/write.js && jscs index.js lib/ test/add.js test/write.js", + "pretest": "npm run lint", + "test": "mocha --async-only", + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls" + }, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "devDependencies": { + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mississippi": "^1.3.0", + "mocha": "^3.2.0" + }, + "keywords": [ + "vinyl", + "sourcemap", + "gulp" + ] +} diff --git a/node_modules/vinyl-sourcemaps-apply/.jshintrc b/node_modules/vinyl-sourcemaps-apply/.jshintrc new file mode 100644 index 00000000..36a93d99 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/.jshintrc @@ -0,0 +1,4 @@ +{ + "node": true, + "strict": true +} \ No newline at end of file diff --git a/node_modules/vinyl-sourcemaps-apply/.npmignore b/node_modules/vinyl-sourcemaps-apply/.npmignore new file mode 100644 index 00000000..91dfed8d --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/.npmignore @@ -0,0 +1,2 @@ +.DS_Store +node_modules \ No newline at end of file diff --git a/node_modules/vinyl-sourcemaps-apply/README.md b/node_modules/vinyl-sourcemaps-apply/README.md new file mode 100644 index 00000000..b1d2c485 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/README.md @@ -0,0 +1,42 @@ +# vinyl-sourcemaps-apply + +Apply a source map to a vinyl file, merging it with preexisting source maps. + +## Usage: + +```javascript +var applySourceMap = require('vinyl-sourcemaps-apply'); +applySourceMap(vinylFile, sourceMap); +``` + +### Example (Gulp plugin): + +```javascript +var through = require('through2'); +var applySourceMap = require('vinyl-sourcemaps-apply'); +var myTransform = require('myTransform'); + +module.exports = function(options) { + + function transform(file, encoding, callback) { + // generate source maps if plugin source-map present + if (file.sourceMap) { + options.makeSourceMaps = true; + } + + // do normal plugin logic + var result = myTransform(file.contents, options); + file.contents = new Buffer(result.code); + + // apply source map to the chain + if (file.sourceMap) { + applySourceMap(file, result.map); + } + + this.push(file); + callback(); + } + + return through.obj(transform); +}; +``` \ No newline at end of file diff --git a/node_modules/vinyl-sourcemaps-apply/index.js b/node_modules/vinyl-sourcemaps-apply/index.js new file mode 100644 index 00000000..c966b809 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/index.js @@ -0,0 +1,39 @@ +'use strict'; +var SourceMapGenerator = require('source-map').SourceMapGenerator; +var SourceMapConsumer = require('source-map').SourceMapConsumer; + +module.exports = function applySourceMap(file, sourceMap) { + if (typeof sourceMap === 'string' || sourceMap instanceof String) { + sourceMap = JSON.parse(sourceMap); + } + + if (file.sourceMap && (typeof file.sourceMap === 'string' || file.sourceMap instanceof String)) { + file.sourceMap = JSON.parse(file.sourceMap); + } + + // check source map properties + assertProperty(sourceMap, "file"); + assertProperty(sourceMap, "mappings"); + assertProperty(sourceMap, "sources"); + + // fix paths if Windows style paths + sourceMap.file = sourceMap.file.replace(/\\/g, '/'); + sourceMap.sources = sourceMap.sources.map(function(filePath) { + return filePath.replace(/\\/g, '/'); + }); + + if (file.sourceMap && file.sourceMap.mappings !== '') { + var generator = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(sourceMap)); + generator.applySourceMap(new SourceMapConsumer(file.sourceMap)); + file.sourceMap = JSON.parse(generator.toString()); + } else { + file.sourceMap = sourceMap; + } +}; + +function assertProperty(sourceMap, propertyName) { + if (!sourceMap.hasOwnProperty(propertyName)) { + var e = new Error('Source map to be applied is missing the \"' + propertyName + '\" property'); + throw e; + } +} diff --git a/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/CHANGELOG.md b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/CHANGELOG.md new file mode 100644 index 00000000..3a8c066c --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/CHANGELOG.md @@ -0,0 +1,301 @@ +# Change Log + +## 0.5.6 + +* Fix for regression when people were using numbers as names in source maps. See + #236. + +## 0.5.5 + +* Fix "regression" of unsupported, implementation behavior that half the world + happens to have come to depend on. See #235. + +* Fix regression involving function hoisting in SpiderMonkey. See #233. + +## 0.5.4 + +* Large performance improvements to source-map serialization. See #228 and #229. + +## 0.5.3 + +* Do not include unnecessary distribution files. See + commit ef7006f8d1647e0a83fdc60f04f5a7ca54886f86. + +## 0.5.2 + +* Include browser distributions of the library in package.json's `files`. See + issue #212. + +## 0.5.1 + +* Fix latent bugs in IndexedSourceMapConsumer.prototype._parseMappings. See + ff05274becc9e6e1295ed60f3ea090d31d843379. + +## 0.5.0 + +* Node 0.8 is no longer supported. + +* Use webpack instead of dryice for bundling. + +* Big speedups serializing source maps. See pull request #203. + +* Fix a bug with `SourceMapConsumer.prototype.sourceContentFor` and sources that + explicitly start with the source root. See issue #199. + +## 0.4.4 + +* Fix an issue where using a `SourceMapGenerator` after having created a + `SourceMapConsumer` from it via `SourceMapConsumer.fromSourceMap` failed. See + issue #191. + +* Fix an issue with where `SourceMapGenerator` would mistakenly consider + different mappings as duplicates of each other and avoid generating them. See + issue #192. + +## 0.4.3 + +* A very large number of performance improvements, particularly when parsing + source maps. Collectively about 75% of time shaved off of the source map + parsing benchmark! + +* Fix a bug in `SourceMapConsumer.prototype.allGeneratedPositionsFor` and fuzzy + searching in the presence of a column option. See issue #177. + +* Fix a bug with joining a source and its source root when the source is above + the root. See issue #182. + +* Add the `SourceMapConsumer.prototype.hasContentsOfAllSources` method to + determine when all sources' contents are inlined into the source map. See + issue #190. + +## 0.4.2 + +* Add an `.npmignore` file so that the benchmarks aren't pulled down by + dependent projects. Issue #169. + +* Add an optional `column` argument to + `SourceMapConsumer.prototype.allGeneratedPositionsFor` and better handle lines + with no mappings. Issues #172 and #173. + +## 0.4.1 + +* Fix accidentally defining a global variable. #170. + +## 0.4.0 + +* The default direction for fuzzy searching was changed back to its original + direction. See #164. + +* There is now a `bias` option you can supply to `SourceMapConsumer` to control + the fuzzy searching direction. See #167. + +* About an 8% speed up in parsing source maps. See #159. + +* Added a benchmark for parsing and generating source maps. + +## 0.3.0 + +* Change the default direction that searching for positions fuzzes when there is + not an exact match. See #154. + +* Support for environments using json2.js for JSON serialization. See #156. + +## 0.2.0 + +* Support for consuming "indexed" source maps which do not have any remote + sections. See pull request #127. This introduces a minor backwards + incompatibility if you are monkey patching `SourceMapConsumer.prototype` + methods. + +## 0.1.43 + +* Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue + #148 for some discussion and issues #150, #151, and #152 for implementations. + +## 0.1.42 + +* Fix an issue where `SourceNode`s from different versions of the source-map + library couldn't be used in conjunction with each other. See issue #142. + +## 0.1.41 + +* Fix a bug with getting the source content of relative sources with a "./" + prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768). + +* Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the + column span of each mapping. + +* Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find + all generated positions associated with a given original source and line. + +## 0.1.40 + +* Performance improvements for parsing source maps in SourceMapConsumer. + +## 0.1.39 + +* Fix a bug where setting a source's contents to null before any source content + had been set before threw a TypeError. See issue #131. + +## 0.1.38 + +* Fix a bug where finding relative paths from an empty path were creating + absolute paths. See issue #129. + +## 0.1.37 + +* Fix a bug where if the source root was an empty string, relative source paths + would turn into absolute source paths. Issue #124. + +## 0.1.36 + +* Allow the `names` mapping property to be an empty string. Issue #121. + +## 0.1.35 + +* A third optional parameter was added to `SourceNode.fromStringWithSourceMap` + to specify a path that relative sources in the second parameter should be + relative to. Issue #105. + +* If no file property is given to a `SourceMapGenerator`, then the resulting + source map will no longer have a `null` file property. The property will + simply not exist. Issue #104. + +* Fixed a bug where consecutive newlines were ignored in `SourceNode`s. + Issue #116. + +## 0.1.34 + +* Make `SourceNode` work with windows style ("\r\n") newlines. Issue #103. + +* Fix bug involving source contents and the + `SourceMapGenerator.prototype.applySourceMap`. Issue #100. + +## 0.1.33 + +* Fix some edge cases surrounding path joining and URL resolution. + +* Add a third parameter for relative path to + `SourceMapGenerator.prototype.applySourceMap`. + +* Fix issues with mappings and EOLs. + +## 0.1.32 + +* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns + (issue 92). + +* Fixed test runner to actually report number of failed tests as its process + exit code. + +* Fixed a typo when reporting bad mappings (issue 87). + +## 0.1.31 + +* Delay parsing the mappings in SourceMapConsumer until queried for a source + location. + +* Support Sass source maps (which at the time of writing deviate from the spec + in small ways) in SourceMapConsumer. + +## 0.1.30 + +* Do not join source root with a source, when the source is a data URI. + +* Extend the test runner to allow running single specific test files at a time. + +* Performance improvements in `SourceNode.prototype.walk` and + `SourceMapConsumer.prototype.eachMapping`. + +* Source map browser builds will now work inside Workers. + +* Better error messages when attempting to add an invalid mapping to a + `SourceMapGenerator`. + +## 0.1.29 + +* Allow duplicate entries in the `names` and `sources` arrays of source maps + (usually from TypeScript) we are parsing. Fixes github issue 72. + +## 0.1.28 + +* Skip duplicate mappings when creating source maps from SourceNode; github + issue 75. + +## 0.1.27 + +* Don't throw an error when the `file` property is missing in SourceMapConsumer, + we don't use it anyway. + +## 0.1.26 + +* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70. + +## 0.1.25 + +* Make compatible with browserify + +## 0.1.24 + +* Fix issue with absolute paths and `file://` URIs. See + https://bugzilla.mozilla.org/show_bug.cgi?id=885597 + +## 0.1.23 + +* Fix issue with absolute paths and sourcesContent, github issue 64. + +## 0.1.22 + +* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21. + +## 0.1.21 + +* Fixed handling of sources that start with a slash so that they are relative to + the source root's host. + +## 0.1.20 + +* Fixed github issue #43: absolute URLs aren't joined with the source root + anymore. + +## 0.1.19 + +* Using Travis CI to run tests. + +## 0.1.18 + +* Fixed a bug in the handling of sourceRoot. + +## 0.1.17 + +* Added SourceNode.fromStringWithSourceMap. + +## 0.1.16 + +* Added missing documentation. + +* Fixed the generating of empty mappings in SourceNode. + +## 0.1.15 + +* Added SourceMapGenerator.applySourceMap. + +## 0.1.14 + +* The sourceRoot is now handled consistently. + +## 0.1.13 + +* Added SourceMapGenerator.fromSourceMap. + +## 0.1.12 + +* SourceNode now generates empty mappings too. + +## 0.1.11 + +* Added name support to SourceNode. + +## 0.1.10 + +* Added sourcesContent support to the customer and generator. diff --git a/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/LICENSE b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/LICENSE new file mode 100644 index 00000000..ed1b7cf2 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/LICENSE @@ -0,0 +1,28 @@ + +Copyright (c) 2009-2011, Mozilla Foundation and contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the names of the Mozilla Foundation nor the names of project + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/README.md b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/README.md new file mode 100644 index 00000000..32813394 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/README.md @@ -0,0 +1,729 @@ +# Source Map + +[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map) + +[![NPM](https://nodei.co/npm/source-map.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map) + +This is a library to generate and consume the source map format +[described here][format]. + +[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit + +## Use with Node + + $ npm install source-map + +## Use on the Web + + + +-------------------------------------------------------------------------------- + + + + + +## Table of Contents + +- [Examples](#examples) + - [Consuming a source map](#consuming-a-source-map) + - [Generating a source map](#generating-a-source-map) + - [With SourceNode (high level API)](#with-sourcenode-high-level-api) + - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api) +- [API](#api) + - [SourceMapConsumer](#sourcemapconsumer) + - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap) + - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans) + - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition) + - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition) + - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition) + - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources) + - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing) + - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order) + - [SourceMapGenerator](#sourcemapgenerator) + - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap) + - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer) + - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping) + - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath) + - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring) + - [SourceNode](#sourcenode) + - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name) + - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath) + - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk) + - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk) + - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn) + - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn) + - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep) + - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement) + - [SourceNode.prototype.toString()](#sourcenodeprototypetostring) + - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap) + + + +## Examples + +### Consuming a source map + +```js +var rawSourceMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: 'http://example.com/www/js/', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' +}; + +var smc = new SourceMapConsumer(rawSourceMap); + +console.log(smc.sources); +// [ 'http://example.com/www/js/one.js', +// 'http://example.com/www/js/two.js' ] + +console.log(smc.originalPositionFor({ + line: 2, + column: 28 +})); +// { source: 'http://example.com/www/js/two.js', +// line: 2, +// column: 10, +// name: 'n' } + +console.log(smc.generatedPositionFor({ + source: 'http://example.com/www/js/two.js', + line: 2, + column: 10 +})); +// { line: 2, column: 28 } + +smc.eachMapping(function (m) { + // ... +}); +``` + +### Generating a source map + +In depth guide: +[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) + +#### With SourceNode (high level API) + +```js +function compile(ast) { + switch (ast.type) { + case 'BinaryExpression': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + [compile(ast.left), " + ", compile(ast.right)] + ); + case 'Literal': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + String(ast.value) + ); + // ... + default: + throw new Error("Bad AST"); + } +} + +var ast = parse("40 + 2", "add.js"); +console.log(compile(ast).toStringWithSourceMap({ + file: 'add.js' +})); +// { code: '40 + 2', +// map: [object SourceMapGenerator] } +``` + +#### With SourceMapGenerator (low level API) + +```js +var map = new SourceMapGenerator({ + file: "source-mapped.js" +}); + +map.addMapping({ + generated: { + line: 10, + column: 35 + }, + source: "foo.js", + original: { + line: 33, + column: 2 + }, + name: "christopher" +}); + +console.log(map.toString()); +// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' +``` + +## API + +Get a reference to the module: + +```js +// Node.js +var sourceMap = require('source-map'); + +// Browser builds +var sourceMap = window.sourceMap; + +// Inside Firefox +const sourceMap = require("devtools/toolkit/sourcemap/source-map.js"); +``` + +### SourceMapConsumer + +A SourceMapConsumer instance represents a parsed source map which we can query +for information about the original file positions by giving it a file position +in the generated source. + +#### new SourceMapConsumer(rawSourceMap) + +The only parameter is the raw source map (either as a string which can be +`JSON.parse`'d, or an object). According to the spec, source maps have the +following attributes: + +* `version`: Which version of the source map spec this map is following. + +* `sources`: An array of URLs to the original source files. + +* `names`: An array of identifiers which can be referenced by individual + mappings. + +* `sourceRoot`: Optional. The URL root from which all sources are relative. + +* `sourcesContent`: Optional. An array of contents of the original source files. + +* `mappings`: A string of base64 VLQs which contain the actual mappings. + +* `file`: Optional. The generated filename this source map is associated with. + +```js +var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData); +``` + +#### SourceMapConsumer.prototype.computeColumnSpans() + +Compute the last column for each generated mapping. The last column is +inclusive. + +```js +// Before: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] + +consumer.computeColumnSpans(); + +// After: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1, +// lastColumn: 9 }, +// { line: 2, +// column: 10, +// lastColumn: 19 }, +// { line: 2, +// column: 20, +// lastColumn: Infinity } ] + +``` + +#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) + +Returns the original source, line, and column information for the generated +source's line and column positions provided. The only argument is an object with +the following properties: + +* `line`: The line number in the generated source. + +* `column`: The column number in the generated source. + +* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or + `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest + element that is smaller than or greater than the one we are searching for, + respectively, if the exact element cannot be found. Defaults to + `SourceMapConsumer.GREATEST_LOWER_BOUND`. + +and an object is returned with the following properties: + +* `source`: The original source file, or null if this information is not + available. + +* `line`: The line number in the original source, or null if this information is + not available. + +* `column`: The column number in the original source, or null if this + information is not available. + +* `name`: The original identifier, or null if this information is not available. + +```js +consumer.originalPositionFor({ line: 2, column: 10 }) +// { source: 'foo.coffee', +// line: 2, +// column: 2, +// name: null } + +consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 }) +// { source: null, +// line: null, +// column: null, +// name: null } +``` + +#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) + +Returns the generated line and column information for the original source, +line, and column positions provided. The only argument is an object with +the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: The column number in the original source. + +and an object is returned with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +```js +consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 }) +// { line: 1, +// column: 56 } +``` + +#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) + +Returns all generated line and column information for the original source, line, +and column provided. If no column is provided, returns all mappings +corresponding to a either the line we are searching for or the next closest line +that has any mappings. Otherwise, returns all mappings corresponding to the +given line and either the column we are searching for or the next closest column +that has any offsets. + +The only argument is an object with the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: Optional. The column number in the original source. + +and an array of objects is returned, each with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +```js +consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] +``` + +#### SourceMapConsumer.prototype.hasContentsOfAllSources() + +Return true if we have the embedded source content for every source listed in +the source map, false otherwise. + +In other words, if this method returns `true`, then +`consumer.sourceContentFor(s)` will succeed for every source `s` in +`consumer.sources`. + +```js +// ... +if (consumer.hasContentsOfAllSources()) { + consumerReadyCallback(consumer); +} else { + fetchSources(consumer, consumerReadyCallback); +} +// ... +``` + +#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing]) + +Returns the original source content for the source provided. The only +argument is the URL of the original source file. + +If the source content for the given source is not found, then an error is +thrown. Optionally, pass `true` as the second param to have `null` returned +instead. + +```js +consumer.sources +// [ "my-cool-lib.clj" ] + +consumer.sourceContentFor("my-cool-lib.clj") +// "..." + +consumer.sourceContentFor("this is not in the source map"); +// Error: "this is not in the source map" is not in the source map + +consumer.sourceContentFor("this is not in the source map", true); +// null +``` + +#### SourceMapConsumer.prototype.eachMapping(callback, context, order) + +Iterate over each mapping between an original source/line/column and a +generated line/column in this source map. + +* `callback`: The function that is called with each mapping. Mappings have the + form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, + name }` + +* `context`: Optional. If specified, this object will be the value of `this` + every time that `callback` is called. + +* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or + `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over + the mappings sorted by the generated file's line/column order or the + original's source/line/column order, respectively. Defaults to + `SourceMapConsumer.GENERATED_ORDER`. + +```js +consumer.eachMapping(function (m) { console.log(m); }) +// ... +// { source: 'illmatic.js', +// generatedLine: 1, +// generatedColumn: 0, +// originalLine: 1, +// originalColumn: 0, +// name: null } +// { source: 'illmatic.js', +// generatedLine: 2, +// generatedColumn: 0, +// originalLine: 2, +// originalColumn: 0, +// name: null } +// ... +``` +### SourceMapGenerator + +An instance of the SourceMapGenerator represents a source map which is being +built incrementally. + +#### new SourceMapGenerator([startOfSourceMap]) + +You may pass an object with the following properties: + +* `file`: The filename of the generated source that this source map is + associated with. + +* `sourceRoot`: A root for all relative URLs in this source map. + +* `skipValidation`: Optional. When `true`, disables validation of mappings as + they are added. This can improve performance but should be used with + discretion, as a last resort. Even then, one should avoid using this flag when + running tests, if possible. + +```js +var generator = new sourceMap.SourceMapGenerator({ + file: "my-generated-javascript-file.js", + sourceRoot: "http://example.com/app/js/" +}); +``` + +#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) + +Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance. + +* `sourceMapConsumer` The SourceMap. + +```js +var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer); +``` + +#### SourceMapGenerator.prototype.addMapping(mapping) + +Add a single mapping from original source line and column to the generated +source's line and column for this source map being created. The mapping object +should have the following properties: + +* `generated`: An object with the generated line and column positions. + +* `original`: An object with the original line and column positions. + +* `source`: The original source file (relative to the sourceRoot). + +* `name`: An optional original token name for this mapping. + +```js +generator.addMapping({ + source: "module-one.scm", + original: { line: 128, column: 0 }, + generated: { line: 3, column: 456 } +}) +``` + +#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for an original source file. + +* `sourceFile` the URL of the original source file. + +* `sourceContent` the content of the source file. + +```js +generator.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) + +Applies a SourceMap for a source file to the SourceMap. +Each mapping to the supplied source file is rewritten using the +supplied SourceMap. Note: The resolution for the resulting mappings +is the minimum of this map and the supplied map. + +* `sourceMapConsumer`: The SourceMap to be applied. + +* `sourceFile`: Optional. The filename of the source file. + If omitted, sourceMapConsumer.file will be used, if it exists. + Otherwise an error will be thrown. + +* `sourceMapPath`: Optional. The dirname of the path to the SourceMap + to be applied. If relative, it is relative to the SourceMap. + + This parameter is needed when the two SourceMaps aren't in the same + directory, and the SourceMap to be applied contains relative source + paths. If so, those relative source paths need to be rewritten + relative to the SourceMap. + + If omitted, it is assumed that both SourceMaps are in the same directory, + thus not needing any rewriting. (Supplying `'.'` has the same effect.) + +#### SourceMapGenerator.prototype.toString() + +Renders the source map being generated to a string. + +```js +generator.toString() +// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}' +``` + +### SourceNode + +SourceNodes provide a way to abstract over interpolating and/or concatenating +snippets of generated JavaScript source code, while maintaining the line and +column information associated between those snippets and the original source +code. This is useful as the final intermediate representation a compiler might +use before outputting the generated JS and source map. + +#### new SourceNode([line, column, source[, chunk[, name]]]) + +* `line`: The original line number associated with this source node, or null if + it isn't associated with an original line. + +* `column`: The original column number associated with this source node, or null + if it isn't associated with an original column. + +* `source`: The original source's filename; null if no filename is provided. + +* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see + below. + +* `name`: Optional. The original identifier. + +```js +var node = new SourceNode(1, 2, "a.cpp", [ + new SourceNode(3, 4, "b.cpp", "extern int status;\n"), + new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"), + new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"), +]); +``` + +#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) + +Creates a SourceNode from generated code and a SourceMapConsumer. + +* `code`: The generated code + +* `sourceMapConsumer` The SourceMap for the generated code + +* `relativePath` The optional path that relative sources in `sourceMapConsumer` + should be relative to. + +```js +var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8")); +var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"), + consumer); +``` + +#### SourceNode.prototype.add(chunk) + +Add a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.add(" + "); +node.add(otherNode); +node.add([leftHandOperandNode, " + ", rightHandOperandNode]); +``` + +#### SourceNode.prototype.prepend(chunk) + +Prepend a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.prepend("/** Build Id: f783haef86324gf **/\n\n"); +``` + +#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for a source file. This will be added to the +`SourceMap` in the `sourcesContent` field. + +* `sourceFile`: The filename of the source file + +* `sourceContent`: The content of the source file + +```js +node.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceNode.prototype.walk(fn) + +Walk over the tree of JS snippets in this node and its children. The walking +function is called once for each snippet of JS and is passed that snippet and +the its original associated source's line/column location. + +* `fn`: The traversal function. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.walk(function (code, loc) { console.log("WALK:", code, loc); }) +// WALK: uno { source: 'b.js', line: 3, column: 4, name: null } +// WALK: dos { source: 'a.js', line: 1, column: 2, name: null } +// WALK: tres { source: 'a.js', line: 1, column: 2, name: null } +// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null } +``` + +#### SourceNode.prototype.walkSourceContents(fn) + +Walk over the tree of SourceNodes. The walking function is called for each +source file content and is passed the filename and source content. + +* `fn`: The traversal function. + +```js +var a = new SourceNode(1, 2, "a.js", "generated from a"); +a.setSourceContent("a.js", "original a"); +var b = new SourceNode(1, 2, "b.js", "generated from b"); +b.setSourceContent("b.js", "original b"); +var c = new SourceNode(1, 2, "c.js", "generated from c"); +c.setSourceContent("c.js", "original c"); + +var node = new SourceNode(null, null, null, [a, b, c]); +node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); }) +// WALK: a.js : original a +// WALK: b.js : original b +// WALK: c.js : original c +``` + +#### SourceNode.prototype.join(sep) + +Like `Array.prototype.join` except for SourceNodes. Inserts the separator +between each of this source node's children. + +* `sep`: The separator. + +```js +var lhs = new SourceNode(1, 2, "a.rs", "my_copy"); +var operand = new SourceNode(3, 4, "a.rs", "="); +var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()"); + +var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]); +var joinedNode = node.join(" "); +``` + +#### SourceNode.prototype.replaceRight(pattern, replacement) + +Call `String.prototype.replace` on the very right-most source snippet. Useful +for trimming white space from the end of a source node, etc. + +* `pattern`: The pattern to replace. + +* `replacement`: The thing to replace the pattern with. + +```js +// Trim trailing white space. +node.replaceRight(/\s*$/, ""); +``` + +#### SourceNode.prototype.toString() + +Return the string representation of this source node. Walks over the tree and +concatenates all the various snippets together to one string. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toString() +// 'unodostresquatro' +``` + +#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) + +Returns the string representation of this tree of source nodes, plus a +SourceMapGenerator which contains all the mappings between the generated and +original sources. + +The arguments are the same as those to `new SourceMapGenerator`. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toStringWithSourceMap({ file: "my-output-file.js" }) +// { code: 'unodostresquatro', +// map: [object SourceMapGenerator] } +``` diff --git a/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.debug.js b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.debug.js new file mode 100644 index 00000000..b5ab6382 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.debug.js @@ -0,0 +1,3091 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["sourceMap"] = factory(); + else + root["sourceMap"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer; + exports.SourceNode = __webpack_require__(10).SourceNode; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var base64VLQ = __webpack_require__(2); + var util = __webpack_require__(4); + var ArraySet = __webpack_require__(5).ArraySet; + var MappingList = __webpack_require__(6).MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error( + 'original.line and original.column are not numbers -- you probably meant to omit ' + + 'the original mapping entirely and only map the generated position. If so, pass ' + + 'null for the original mapping instead of an object with empty or null values.' + ); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + var base64 = __webpack_require__(3); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); + }()); + + function identity (s) { + return s; + } + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; + } + exports.toSetString = supportsNullProto ? identity : toSetString; + + function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; + } + exports.fromSetString = supportsNullProto ? identity : fromSetString; + + function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var has = Object.prototype.hasOwnProperty; + var hasNativeMap = typeof Map !== "undefined"; + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var binarySearch = __webpack_require__(8); + var ArraySet = __webpack_require__(5).ArraySet; + var base64VLQ = __webpack_require__(2); + var quickSort = __webpack_require__(9).quickSort; + + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + var util = __webpack_require__(4); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? + remainingLines[remainingLinesIndex++] : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + + +/***/ }) +/******/ ]) +}); +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBlNDczOGZjNzJhN2IyMzAzOTg4OSIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTBDLFNBQVM7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRCQUEyQixRQUFRO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNoYUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXNDLFNBQVM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hIQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQzlFQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1REFBc0Q7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxvQkFBbUI7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7O0FBRVg7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBc0Q7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQStDLG1CQUFtQixFQUFFO0FBQ3BFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixvQkFBb0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE2QixNQUFNO0FBQ25DO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXNEO0FBQ3REOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBLElBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQiwyQkFBMkI7QUFDOUMsc0JBQXFCLCtDQUErQztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsMkJBQTJCO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBLHNCQUFxQiw0QkFBNEI7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDempDQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7OztBQzlHQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVcsTUFBTTtBQUNqQjtBQUNBLFlBQVcsT0FBTztBQUNsQjtBQUNBLFlBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE1BQU07QUFDakI7QUFDQSxZQUFXLFNBQVM7QUFDcEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE1BQU07QUFDakI7QUFDQSxZQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ2pIQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsU0FBUztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBb0I7QUFDcEI7QUFDQTtBQUNBLHVDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBK0MsU0FBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSw2Q0FBNEMsY0FBYztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBLFlBQVc7QUFDWDtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBLElBQUc7O0FBRUgsV0FBVTtBQUNWOztBQUVBIiwiZmlsZSI6InNvdXJjZS1tYXAuZGVidWcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJzb3VyY2VNYXBcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGU0NzM4ZmM3MmE3YjIzMDM5ODg5IiwiLypcbiAqIENvcHlyaWdodCAyMDA5LTIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLnR4dCBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvcicpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbmV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyJykuU291cmNlTWFwQ29uc3VtZXI7XG5leHBvcnRzLlNvdXJjZU5vZGUgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2Utbm9kZScpLlNvdXJjZU5vZGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NvdXJjZS1tYXAuanNcbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBNYXBwaW5nTGlzdCA9IHJlcXVpcmUoJy4vbWFwcGluZy1saXN0JykuTWFwcGluZ0xpc3Q7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhlIFNvdXJjZU1hcEdlbmVyYXRvciByZXByZXNlbnRzIGEgc291cmNlIG1hcCB3aGljaCBpc1xuICogYmVpbmcgYnVpbHQgaW5jcmVtZW50YWxseS4gWW91IG1heSBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqICAgLSBzb3VyY2VSb290OiBBIHJvb3QgZm9yIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoaXMgc291cmNlIG1hcC5cbiAqL1xuZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKSB7XG4gIGlmICghYUFyZ3MpIHtcbiAgICBhQXJncyA9IHt9O1xuICB9XG4gIHRoaXMuX2ZpbGUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2ZpbGUnLCBudWxsKTtcbiAgdGhpcy5fc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB0aGlzLl9za2lwVmFsaWRhdGlvbiA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc2tpcFZhbGlkYXRpb24nLCBmYWxzZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbWFwcGluZ3MgPSBuZXcgTWFwcGluZ0xpc3QoKTtcbiAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gbnVsbDtcbn1cblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IgYmFzZWQgb24gYSBTb3VyY2VNYXBDb25zdW1lclxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIpIHtcbiAgICB2YXIgc291cmNlUm9vdCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VSb290O1xuICAgIHZhciBnZW5lcmF0b3IgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKHtcbiAgICAgIGZpbGU6IGFTb3VyY2VNYXBDb25zdW1lci5maWxlLFxuICAgICAgc291cmNlUm9vdDogc291cmNlUm9vdFxuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIG5ld01hcHBpbmcgPSB7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbmV3TWFwcGluZy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3TWFwcGluZy5vcmlnaW5hbCA9IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLm5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdG9yLmFkZE1hcHBpbmcobmV3TWFwcGluZyk7XG4gICAgfSk7XG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgZ2VuZXJhdG9yLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfTtcblxuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbWFwcGluZyBmcm9tIG9yaWdpbmFsIHNvdXJjZSBsaW5lIGFuZCBjb2x1bW4gdG8gdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIGZvciB0aGlzIHNvdXJjZSBtYXAgYmVpbmcgY3JlYXRlZC4gVGhlIG1hcHBpbmdcbiAqIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGdlbmVyYXRlZDogQW4gb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICogICAtIG9yaWdpbmFsOiBBbiBvYmplY3Qgd2l0aCB0aGUgb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZVJvb3QpLlxuICogICAtIG5hbWU6IEFuIG9wdGlvbmFsIG9yaWdpbmFsIHRva2VuIG5hbWUgZm9yIHRoaXMgbWFwcGluZy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hZGRNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2FkZE1hcHBpbmcoYUFyZ3MpIHtcbiAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdnZW5lcmF0ZWQnKTtcbiAgICB2YXIgb3JpZ2luYWwgPSB1dGlsLmdldEFyZyhhQXJncywgJ29yaWdpbmFsJywgbnVsbCk7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJywgbnVsbCk7XG4gICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhhQXJncywgJ25hbWUnLCBudWxsKTtcblxuICAgIGlmICghdGhpcy5fc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRlTWFwcGluZyhnZW5lcmF0ZWQsIG9yaWdpbmFsLCBzb3VyY2UsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgc291cmNlID0gU3RyaW5nKHNvdXJjZSk7XG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICBuYW1lID0gU3RyaW5nKG5hbWUpO1xuICAgICAgaWYgKCF0aGlzLl9uYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgdGhpcy5fbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX21hcHBpbmdzLmFkZCh7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogZ2VuZXJhdGVkLmNvbHVtbixcbiAgICAgIG9yaWdpbmFsTGluZTogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5saW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwuY29sdW1uLFxuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgdmFyIHNvdXJjZSA9IGFTb3VyY2VGaWxlO1xuICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5fc291cmNlUm9vdCwgc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoYVNvdXJjZUNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgLy8gQWRkIHRoZSBzb3VyY2UgY29udGVudCB0byB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgX3NvdXJjZXNDb250ZW50cyBtYXAgaWYgdGhlIHByb3BlcnR5IGlzIG51bGwuXG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV0gPSBhU291cmNlQ29udGVudDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBzb3VyY2UgZmlsZSBmcm9tIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcC5cbiAgICAgIC8vIElmIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcCBpcyBlbXB0eSwgc2V0IHRoZSBwcm9wZXJ0eSB0byBudWxsLlxuICAgICAgZGVsZXRlIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3NvdXJjZXNDb250ZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG1hcHBpbmdzIG9mIGEgc3ViLXNvdXJjZS1tYXAgZm9yIGEgc3BlY2lmaWMgc291cmNlIGZpbGUgdG8gdGhlXG4gKiBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZC4gRWFjaCBtYXBwaW5nIHRvIHRoZSBzdXBwbGllZCBzb3VyY2UgZmlsZSBpc1xuICogcmV3cml0dGVuIHVzaW5nIHRoZSBzdXBwbGllZCBzb3VyY2UgbWFwLiBOb3RlOiBUaGUgcmVzb2x1dGlvbiBmb3IgdGhlXG4gKiByZXN1bHRpbmcgbWFwcGluZ3MgaXMgdGhlIG1pbmltaXVtIG9mIHRoaXMgbWFwIGFuZCB0aGUgc3VwcGxpZWQgbWFwLlxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBhU291cmNlRmlsZSBPcHRpb25hbC4gVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZS5cbiAqICAgICAgICBJZiBvbWl0dGVkLCBTb3VyY2VNYXBDb25zdW1lcidzIGZpbGUgcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICogQHBhcmFtIGFTb3VyY2VNYXBQYXRoIE9wdGlvbmFsLiBUaGUgZGlybmFtZSBvZiB0aGUgcGF0aCB0byB0aGUgc291cmNlIG1hcFxuICogICAgICAgIHRvIGJlIGFwcGxpZWQuIElmIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgU291cmNlTWFwQ29uc3VtZXIuXG4gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgbmVlZGVkIHdoZW4gdGhlIHR3byBzb3VyY2UgbWFwcyBhcmVuJ3QgaW4gdGhlIHNhbWVcbiAqICAgICAgICBkaXJlY3RvcnksIGFuZCB0aGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkIGNvbnRhaW5zIHJlbGF0aXZlIHNvdXJjZVxuICogICAgICAgIHBhdGhzLiBJZiBzbywgdGhvc2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIG5lZWQgdG8gYmUgcmV3cml0dGVuXG4gKiAgICAgICAgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvci5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hcHBseVNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hcHBseVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIsIGFTb3VyY2VGaWxlLCBhU291cmNlTWFwUGF0aCkge1xuICAgIHZhciBzb3VyY2VGaWxlID0gYVNvdXJjZUZpbGU7XG4gICAgLy8gSWYgYVNvdXJjZUZpbGUgaXMgb21pdHRlZCwgd2Ugd2lsbCB1c2UgdGhlIGZpbGUgcHJvcGVydHkgb2YgdGhlIFNvdXJjZU1hcFxuICAgIGlmIChhU291cmNlRmlsZSA9PSBudWxsKSB7XG4gICAgICBpZiAoYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1NvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgcmVxdWlyZXMgZWl0aGVyIGFuIGV4cGxpY2l0IHNvdXJjZSBmaWxlLCAnICtcbiAgICAgICAgICAnb3IgdGhlIHNvdXJjZSBtYXBcXCdzIFwiZmlsZVwiIHByb3BlcnR5LiBCb3RoIHdlcmUgb21pdHRlZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzb3VyY2VGaWxlID0gYVNvdXJjZU1hcENvbnN1bWVyLmZpbGU7XG4gICAgfVxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICAvLyBNYWtlIFwic291cmNlRmlsZVwiIHJlbGF0aXZlIGlmIGFuIGFic29sdXRlIFVybCBpcyBwYXNzZWQuXG4gICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgfVxuICAgIC8vIEFwcGx5aW5nIHRoZSBTb3VyY2VNYXAgY2FuIGFkZCBhbmQgcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIHNvdXJjZXMgYW5kXG4gICAgLy8gdGhlIG5hbWVzIGFycmF5LlxuICAgIHZhciBuZXdTb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgdmFyIG5ld05hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgICAvLyBGaW5kIG1hcHBpbmdzIGZvciB0aGUgXCJzb3VyY2VGaWxlXCJcbiAgICB0aGlzLl9tYXBwaW5ncy51bnNvcnRlZEZvckVhY2goZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gc291cmNlRmlsZSAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGNhbiBiZSBtYXBwZWQgYnkgdGhlIHNvdXJjZSBtYXAsIHRoZW4gdXBkYXRlIHRoZSBtYXBwaW5nLlxuICAgICAgICB2YXIgb3JpZ2luYWwgPSBhU291cmNlTWFwQ29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3JpZ2luYWwuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBDb3B5IG1hcHBpbmdcbiAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbWFwcGluZy5zb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgICAgICBpZiAob3JpZ2luYWwubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIW5ld1NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgbmV3U291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmICFuZXdOYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgbmV3TmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuXG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5fc291cmNlcyA9IG5ld1NvdXJjZXM7XG4gICAgdGhpcy5fbmFtZXMgPSBuZXdOYW1lcztcblxuICAgIC8vIENvcHkgc291cmNlc0NvbnRlbnRzIG9mIGFwcGxpZWQgbWFwLlxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBBIG1hcHBpbmcgY2FuIGhhdmUgb25lIG9mIHRoZSB0aHJlZSBsZXZlbHMgb2YgZGF0YTpcbiAqXG4gKiAgIDEuIEp1c3QgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqICAgMi4gVGhlIEdlbmVyYXRlZCBwb3NpdGlvbiwgb3JpZ2luYWwgcG9zaXRpb24sIGFuZCBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIDMuIEdlbmVyYXRlZCBhbmQgb3JpZ2luYWwgcG9zaXRpb24sIG9yaWdpbmFsIHNvdXJjZSwgYXMgd2VsbCBhcyBhIG5hbWVcbiAqICAgICAgdG9rZW4uXG4gKlxuICogVG8gbWFpbnRhaW4gY29uc2lzdGVuY3ksIHdlIHZhbGlkYXRlIHRoYXQgYW55IG5ldyBtYXBwaW5nIGJlaW5nIGFkZGVkIGZhbGxzXG4gKiBpbiB0byBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllcy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3ZhbGlkYXRlTWFwcGluZyhhR2VuZXJhdGVkLCBhT3JpZ2luYWwsIGFTb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYU5hbWUpIHtcbiAgICAvLyBXaGVuIGFPcmlnaW5hbCBpcyB0cnV0aHkgYnV0IGhhcyBlbXB0eSB2YWx1ZXMgZm9yIC5saW5lIGFuZCAuY29sdW1uLFxuICAgIC8vIGl0IGlzIG1vc3QgbGlrZWx5IGEgcHJvZ3JhbW1lciBlcnJvci4gSW4gdGhpcyBjYXNlIHdlIHRocm93IGEgdmVyeVxuICAgIC8vIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgdG8gdHJ5IHRvIGd1aWRlIHRoZW0gdGhlIHJpZ2h0IHdheS5cbiAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXIvcG9seW1lci1idW5kbGVyL3B1bGwvNTE5XG4gICAgaWYgKGFPcmlnaW5hbCAmJiB0eXBlb2YgYU9yaWdpbmFsLmxpbmUgIT09ICdudW1iZXInICYmIHR5cGVvZiBhT3JpZ2luYWwuY29sdW1uICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnb3JpZ2luYWwubGluZSBhbmQgb3JpZ2luYWwuY29sdW1uIGFyZSBub3QgbnVtYmVycyAtLSB5b3UgcHJvYmFibHkgbWVhbnQgdG8gb21pdCAnICtcbiAgICAgICAgICAgICd0aGUgb3JpZ2luYWwgbWFwcGluZyBlbnRpcmVseSBhbmQgb25seSBtYXAgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi4gSWYgc28sIHBhc3MgJyArXG4gICAgICAgICAgICAnbnVsbCBmb3IgdGhlIG9yaWdpbmFsIG1hcHBpbmcgaW5zdGVhZCBvZiBhbiBvYmplY3Qgd2l0aCBlbXB0eSBvciBudWxsIHZhbHVlcy4nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAmJiBhR2VuZXJhdGVkLmxpbmUgPiAwICYmIGFHZW5lcmF0ZWQuY29sdW1uID49IDBcbiAgICAgICAgJiYgIWFPcmlnaW5hbCAmJiAhYVNvdXJjZSAmJiAhYU5hbWUpIHtcbiAgICAgIC8vIENhc2UgMS5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsICYmICdsaW5lJyBpbiBhT3JpZ2luYWwgJiYgJ2NvbHVtbicgaW4gYU9yaWdpbmFsXG4gICAgICAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsLmxpbmUgPiAwICYmIGFPcmlnaW5hbC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFTb3VyY2UpIHtcbiAgICAgIC8vIENhc2VzIDIgYW5kIDMuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1hcHBpbmc6ICcgKyBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGdlbmVyYXRlZDogYUdlbmVyYXRlZCxcbiAgICAgICAgc291cmNlOiBhU291cmNlLFxuICAgICAgICBvcmlnaW5hbDogYU9yaWdpbmFsLFxuICAgICAgICBuYW1lOiBhTmFtZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBTZXJpYWxpemUgdGhlIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIHRvIHRoZSBzdHJlYW0gb2YgYmFzZSA2NCBWTFFzXG4gKiBzcGVjaWZpZWQgYnkgdGhlIHNvdXJjZSBtYXAgZm9ybWF0LlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9zZXJpYWxpemVNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXJpYWxpemVNYXBwaW5ncygpIHtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwO1xuICAgIHZhciBwcmV2aW91c05hbWUgPSAwO1xuICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgIHZhciBuZXh0O1xuICAgIHZhciBtYXBwaW5nO1xuICAgIHZhciBuYW1lSWR4O1xuICAgIHZhciBzb3VyY2VJZHg7XG5cbiAgICB2YXIgbWFwcGluZ3MgPSB0aGlzLl9tYXBwaW5ncy50b0FycmF5KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBtYXBwaW5nID0gbWFwcGluZ3NbaV07XG4gICAgICBuZXh0ID0gJydcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgd2hpbGUgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbmV4dCArPSAnOyc7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBpZiAoIXV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZywgbWFwcGluZ3NbaSAtIDFdKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHQgKz0gJywnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbik7XG4gICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VJZHggPSB0aGlzLl9zb3VyY2VzLmluZGV4T2YobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUoc291cmNlSWR4IC0gcHJldmlvdXNTb3VyY2UpO1xuICAgICAgICBwcmV2aW91c1NvdXJjZSA9IHNvdXJjZUlkeDtcblxuICAgICAgICAvLyBsaW5lcyBhcmUgc3RvcmVkIDAtYmFzZWQgaW4gU291cmNlTWFwIHNwZWMgdmVyc2lvbiAzXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsTGluZSAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c09yaWdpbmFsTGluZSk7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmUgLSAxO1xuXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbENvbHVtbik7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5hbWVJZHggPSB0aGlzLl9uYW1lcy5pbmRleE9mKG1hcHBpbmcubmFtZSk7XG4gICAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG5hbWVJZHggLSBwcmV2aW91c05hbWUpO1xuICAgICAgICAgIHByZXZpb3VzTmFtZSA9IG5hbWVJZHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ICs9IG5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KGFTb3VyY2VzLCBhU291cmNlUm9vdCkge1xuICAgIHJldHVybiBhU291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoYVNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKGFTb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgfVxuICAgICAgdmFyIGtleSA9IHV0aWwudG9TZXRTdHJpbmcoc291cmNlKTtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc291cmNlc0NvbnRlbnRzLCBrZXkpXG4gICAgICAgID8gdGhpcy5fc291cmNlc0NvbnRlbnRzW2tleV1cbiAgICAgICAgOiBudWxsO1xuICAgIH0sIHRoaXMpO1xuICB9O1xuXG4vKipcbiAqIEV4dGVybmFsaXplIHRoZSBzb3VyY2UgbWFwLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvSlNPTiA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b0pTT04oKSB7XG4gICAgdmFyIG1hcCA9IHtcbiAgICAgIHZlcnNpb246IHRoaXMuX3ZlcnNpb24sXG4gICAgICBzb3VyY2VzOiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKSxcbiAgICAgIG5hbWVzOiB0aGlzLl9uYW1lcy50b0FycmF5KCksXG4gICAgICBtYXBwaW5nczogdGhpcy5fc2VyaWFsaXplTWFwcGluZ3MoKVxuICAgIH07XG4gICAgaWYgKHRoaXMuX2ZpbGUgIT0gbnVsbCkge1xuICAgICAgbWFwLmZpbGUgPSB0aGlzLl9maWxlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBtYXAuc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIG1hcC5zb3VyY2VzQ29udGVudCA9IHRoaXMuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQobWFwLnNvdXJjZXMsIG1hcC5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9O1xuXG4vKipcbiAqIFJlbmRlciB0aGUgc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQgdG8gYSBzdHJpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IFNvdXJjZU1hcEdlbmVyYXRvcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKlxuICogQmFzZWQgb24gdGhlIEJhc2UgNjQgVkxRIGltcGxlbWVudGF0aW9uIGluIENsb3N1cmUgQ29tcGlsZXI6XG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nsb3N1cmUtY29tcGlsZXIvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvY29tL2dvb2dsZS9kZWJ1Z2dpbmcvc291cmNlbWFwL0Jhc2U2NFZMUS5qYXZhXG4gKlxuICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkXG4gKiAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG5cbi8vIEEgc2luZ2xlIGJhc2UgNjQgZGlnaXQgY2FuIGNvbnRhaW4gNiBiaXRzIG9mIGRhdGEuIEZvciB0aGUgYmFzZSA2NCB2YXJpYWJsZVxuLy8gbGVuZ3RoIHF1YW50aXRpZXMgd2UgdXNlIGluIHRoZSBzb3VyY2UgbWFwIHNwZWMsIHRoZSBmaXJzdCBiaXQgaXMgdGhlIHNpZ24sXG4vLyB0aGUgbmV4dCBmb3VyIGJpdHMgYXJlIHRoZSBhY3R1YWwgdmFsdWUsIGFuZCB0aGUgNnRoIGJpdCBpcyB0aGVcbi8vIGNvbnRpbnVhdGlvbiBiaXQuIFRoZSBjb250aW51YXRpb24gYml0IHRlbGxzIHVzIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmVcbi8vIGRpZ2l0cyBpbiB0aGlzIHZhbHVlIGZvbGxvd2luZyB0aGlzIGRpZ2l0LlxuLy9cbi8vICAgQ29udGludWF0aW9uXG4vLyAgIHwgICAgU2lnblxuLy8gICB8ICAgIHxcbi8vICAgViAgICBWXG4vLyAgIDEwMTAxMVxuXG52YXIgVkxRX0JBU0VfU0hJRlQgPSA1O1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9CQVNFID0gMSA8PCBWTFFfQkFTRV9TSElGVDtcblxuLy8gYmluYXJ5OiAwMTExMTFcbnZhciBWTFFfQkFTRV9NQVNLID0gVkxRX0JBU0UgLSAxO1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9DT05USU5VQVRJT05fQklUID0gVkxRX0JBU0U7XG5cbi8qKlxuICogQ29udmVydHMgZnJvbSBhIHR3by1jb21wbGVtZW50IHZhbHVlIHRvIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMSBiZWNvbWVzIDIgKDEwIGJpbmFyeSksIC0xIGJlY29tZXMgMyAoMTEgYmluYXJ5KVxuICogICAyIGJlY29tZXMgNCAoMTAwIGJpbmFyeSksIC0yIGJlY29tZXMgNSAoMTAxIGJpbmFyeSlcbiAqL1xuZnVuY3Rpb24gdG9WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHJldHVybiBhVmFsdWUgPCAwXG4gICAgPyAoKC1hVmFsdWUpIDw8IDEpICsgMVxuICAgIDogKGFWYWx1ZSA8PCAxKSArIDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgdG8gYSB0d28tY29tcGxlbWVudCB2YWx1ZSBmcm9tIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMiAoMTAgYmluYXJ5KSBiZWNvbWVzIDEsIDMgKDExIGJpbmFyeSkgYmVjb21lcyAtMVxuICogICA0ICgxMDAgYmluYXJ5KSBiZWNvbWVzIDIsIDUgKDEwMSBiaW5hcnkpIGJlY29tZXMgLTJcbiAqL1xuZnVuY3Rpb24gZnJvbVZMUVNpZ25lZChhVmFsdWUpIHtcbiAgdmFyIGlzTmVnYXRpdmUgPSAoYVZhbHVlICYgMSkgPT09IDE7XG4gIHZhciBzaGlmdGVkID0gYVZhbHVlID4+IDE7XG4gIHJldHVybiBpc05lZ2F0aXZlXG4gICAgPyAtc2hpZnRlZFxuICAgIDogc2hpZnRlZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiYXNlIDY0IFZMUSBlbmNvZGVkIHZhbHVlLlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9lbmNvZGUoYVZhbHVlKSB7XG4gIHZhciBlbmNvZGVkID0gXCJcIjtcbiAgdmFyIGRpZ2l0O1xuXG4gIHZhciB2bHEgPSB0b1ZMUVNpZ25lZChhVmFsdWUpO1xuXG4gIGRvIHtcbiAgICBkaWdpdCA9IHZscSAmIFZMUV9CQVNFX01BU0s7XG4gICAgdmxxID4+Pj0gVkxRX0JBU0VfU0hJRlQ7XG4gICAgaWYgKHZscSA+IDApIHtcbiAgICAgIC8vIFRoZXJlIGFyZSBzdGlsbCBtb3JlIGRpZ2l0cyBpbiB0aGlzIHZhbHVlLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBiaXQgaXMgbWFya2VkLlxuICAgICAgZGlnaXQgfD0gVkxRX0NPTlRJTlVBVElPTl9CSVQ7XG4gICAgfVxuICAgIGVuY29kZWQgKz0gYmFzZTY0LmVuY29kZShkaWdpdCk7XG4gIH0gd2hpbGUgKHZscSA+IDApO1xuXG4gIHJldHVybiBlbmNvZGVkO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBuZXh0IGJhc2UgNjQgVkxRIHZhbHVlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJucyB0aGVcbiAqIHZhbHVlIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHZpYSB0aGUgb3V0IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZGVjb2RlKGFTdHIsIGFJbmRleCwgYU91dFBhcmFtKSB7XG4gIHZhciBzdHJMZW4gPSBhU3RyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IDA7XG4gIHZhciBzaGlmdCA9IDA7XG4gIHZhciBjb250aW51YXRpb24sIGRpZ2l0O1xuXG4gIGRvIHtcbiAgICBpZiAoYUluZGV4ID49IHN0ckxlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbW9yZSBkaWdpdHMgaW4gYmFzZSA2NCBWTFEgdmFsdWUuXCIpO1xuICAgIH1cblxuICAgIGRpZ2l0ID0gYmFzZTY0LmRlY29kZShhU3RyLmNoYXJDb2RlQXQoYUluZGV4KyspKTtcbiAgICBpZiAoZGlnaXQgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhc2U2NCBkaWdpdDogXCIgKyBhU3RyLmNoYXJBdChhSW5kZXggLSAxKSk7XG4gICAgfVxuXG4gICAgY29udGludWF0aW9uID0gISEoZGlnaXQgJiBWTFFfQ09OVElOVUFUSU9OX0JJVCk7XG4gICAgZGlnaXQgJj0gVkxRX0JBU0VfTUFTSztcbiAgICByZXN1bHQgPSByZXN1bHQgKyAoZGlnaXQgPDwgc2hpZnQpO1xuICAgIHNoaWZ0ICs9IFZMUV9CQVNFX1NISUZUO1xuICB9IHdoaWxlIChjb250aW51YXRpb24pO1xuXG4gIGFPdXRQYXJhbS52YWx1ZSA9IGZyb21WTFFTaWduZWQocmVzdWx0KTtcbiAgYU91dFBhcmFtLnJlc3QgPSBhSW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmFzZTY0LXZscS5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBpbnRUb0NoYXJNYXAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycuc3BsaXQoJycpO1xuXG4vKipcbiAqIEVuY29kZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiAwIHRvIDYzIHRvIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQuXG4gKi9cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKG51bWJlcikge1xuICBpZiAoMCA8PSBudW1iZXIgJiYgbnVtYmVyIDwgaW50VG9DaGFyTWFwLmxlbmd0aCkge1xuICAgIHJldHVybiBpbnRUb0NoYXJNYXBbbnVtYmVyXTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYzOiBcIiArIG51bWJlcik7XG59O1xuXG4vKipcbiAqIERlY29kZSBhIHNpbmdsZSBiYXNlIDY0IGNoYXJhY3RlciBjb2RlIGRpZ2l0IHRvIGFuIGludGVnZXIuIFJldHVybnMgLTEgb25cbiAqIGZhaWx1cmUuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gKGNoYXJDb2RlKSB7XG4gIHZhciBiaWdBID0gNjU7ICAgICAvLyAnQSdcbiAgdmFyIGJpZ1ogPSA5MDsgICAgIC8vICdaJ1xuXG4gIHZhciBsaXR0bGVBID0gOTc7ICAvLyAnYSdcbiAgdmFyIGxpdHRsZVogPSAxMjI7IC8vICd6J1xuXG4gIHZhciB6ZXJvID0gNDg7ICAgICAvLyAnMCdcbiAgdmFyIG5pbmUgPSA1NzsgICAgIC8vICc5J1xuXG4gIHZhciBwbHVzID0gNDM7ICAgICAvLyAnKydcbiAgdmFyIHNsYXNoID0gNDc7ICAgIC8vICcvJ1xuXG4gIHZhciBsaXR0bGVPZmZzZXQgPSAyNjtcbiAgdmFyIG51bWJlck9mZnNldCA9IDUyO1xuXG4gIC8vIDAgLSAyNTogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcbiAgaWYgKGJpZ0EgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gYmlnWikge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSBiaWdBKTtcbiAgfVxuXG4gIC8vIDI2IC0gNTE6IGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XG4gIGlmIChsaXR0bGVBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGxpdHRsZVopIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gbGl0dGxlQSArIGxpdHRsZU9mZnNldCk7XG4gIH1cblxuICAvLyA1MiAtIDYxOiAwMTIzNDU2Nzg5XG4gIGlmICh6ZXJvIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IG5pbmUpIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gemVybyArIG51bWJlck9mZnNldCk7XG4gIH1cblxuICAvLyA2MjogK1xuICBpZiAoY2hhckNvZGUgPT0gcGx1cykge1xuICAgIHJldHVybiA2MjtcbiAgfVxuXG4gIC8vIDYzOiAvXG4gIGlmIChjaGFyQ29kZSA9PSBzbGFzaCkge1xuICAgIHJldHVybiA2MztcbiAgfVxuXG4gIC8vIEludmFsaWQgYmFzZTY0IGRpZ2l0LlxuICByZXR1cm4gLTE7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmFzZTY0LmpzXG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHZhbHVlcyBmcm9tIHBhcmFtZXRlci9vcHRpb25zXG4gKiBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSBhcmdzIFRoZSBvYmplY3Qgd2UgYXJlIGV4dHJhY3RpbmcgdmFsdWVzIGZyb21cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3ZSBhcmUgZ2V0dGluZy5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgQW4gb3B0aW9uYWwgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nXG4gKiBmcm9tIHRoZSBvYmplY3QuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmcsIGFuXG4gKiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAqL1xuZnVuY3Rpb24gZ2V0QXJnKGFBcmdzLCBhTmFtZSwgYURlZmF1bHRWYWx1ZSkge1xuICBpZiAoYU5hbWUgaW4gYUFyZ3MpIHtcbiAgICByZXR1cm4gYUFyZ3NbYU5hbWVdO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gYURlZmF1bHRWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFOYW1lICsgJ1wiIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuJyk7XG4gIH1cbn1cbmV4cG9ydHMuZ2V0QXJnID0gZ2V0QXJnO1xuXG52YXIgdXJsUmVnZXhwID0gL14oPzooW1xcdytcXC0uXSspOik/XFwvXFwvKD86KFxcdys6XFx3KylAKT8oW1xcdy5dKikoPzo6KFxcZCspKT8oXFxTKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgISFhUGF0aC5tYXRjaCh1cmxSZWdleHApO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBtYXBwaW5nQS5zb3VyY2UgLSBtYXBwaW5nQi5zb3VyY2U7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDAgfHwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIG1hcHBpbmdBLm5hbWUgLSBtYXBwaW5nQi5uYW1lO1xufVxuZXhwb3J0cy5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyA9IGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zO1xuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBkZWZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgaW5kaWNlcyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiwgYnV0IGRpZmZlcmVudFxuICogc291cmNlL25hbWUvb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGFcbiAqIG1hcHBpbmcgd2l0aCBhIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5zb3VyY2UgLSBtYXBwaW5nQi5zb3VyY2U7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIG1hcHBpbmdBLm5hbWUgLSBtYXBwaW5nQi5uYW1lO1xufVxuZXhwb3J0cy5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCA9IGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkO1xuXG5mdW5jdGlvbiBzdHJjbXAoYVN0cjEsIGFTdHIyKSB7XG4gIGlmIChhU3RyMSA9PT0gYVN0cjIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2FycmF5LXNldC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9tYXBwaW5nLWxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXApIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSBKU09OLnBhcnNlKGFTb3VyY2VNYXAucmVwbGFjZSgvXlxcKVxcXVxcfScvLCAnJykpO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZU1hcC5zZWN0aW9ucyAhPSBudWxsXG4gICAgPyBuZXcgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcClcbiAgICA6IG5ldyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCk7XG59XG5cblNvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPSBmdW5jdGlvbihhU291cmNlTWFwKSB7XG4gIHJldHVybiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCk7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vLyBgX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kIGBfX29yaWdpbmFsTWFwcGluZ3NgIGFyZSBhcnJheXMgdGhhdCBob2xkIHRoZVxuLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbi8vIGFyZSBsYXppbHkgaW5zdGFudGlhdGVkLCBhY2Nlc3NlZCB2aWEgdGhlIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBnZXR0ZXJzIHJlc3BlY3RpdmVseSwgYW5kIHdlIG9ubHkgcGFyc2UgdGhlIG1hcHBpbmdzXG4vLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbi8vIHRoZXNlIGhvb3BzIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1hbnkgdGhvdXNhbmRzIG9mIG1hcHBpbmdzLCBhbmQgcGFyc2luZ1xuLy8gdGhlbSBpcyBleHBlbnNpdmUsIHNvIHdlIG9ubHkgd2FudCB0byBkbyBpdCBpZiB3ZSBtdXN0LlxuLy9cbi8vIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheXMgaXMgb2YgdGhlIGZvcm06XG4vL1xuLy8gICAgIHtcbi8vICAgICAgIGdlbmVyYXRlZExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBnZW5lcmF0ZWRDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbi8vICAgICAgICAgICAgICAgY2h1bmsgb2YgY29kZSxcbi8vICAgICAgIG9yaWdpbmFsTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4vLyAgICAgICAgICAgICBjb2RlLlxuLy8gICAgIH1cbi8vXG4vLyBBbGwgcHJvcGVydGllcyBleGNlcHQgZm9yIGBnZW5lcmF0ZWRMaW5lYCBhbmQgYGdlbmVyYXRlZENvbHVtbmAgY2FuIGJlXG4vLyBgbnVsbGAuXG4vL1xuLy8gYF9nZW5lcmF0ZWRNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucy5cbi8vXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19nZW5lcmF0ZWRNYXBwaW5ncycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MpIHtcbiAgICAgIHRoaXMuX3BhcnNlTWFwcGluZ3ModGhpcy5fbWFwcGluZ3MsIHRoaXMuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fX29yaWdpbmFsTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19vcmlnaW5hbE1hcHBpbmdzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4oc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBPcHRpb25hbC4gdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IoYUFyZ3MpIHtcbiAgICB2YXIgbGluZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpO1xuXG4gICAgLy8gV2hlbiB0aGVyZSBpcyBubyBleGFjdCBtYXRjaCwgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nXG4gICAgLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgbWFwcGluZyBsZXNzIHRoYW4gdGhlIG5lZWRsZS4gQnlcbiAgICAvLyBzZXR0aW5nIG5lZWRsZS5vcmlnaW5hbENvbHVtbiB0byAwLCB3ZSB0aHVzIGZpbmQgdGhlIGxhc3QgbWFwcGluZyBmb3JcbiAgICAvLyB0aGUgZ2l2ZW4gbGluZSwgcHJvdmlkZWQgc3VjaCBhIG1hcHBpbmcgZXhpc3RzLlxuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBzb3VyY2U6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyksXG4gICAgICBvcmlnaW5hbExpbmU6IGxpbmUsXG4gICAgICBvcmlnaW5hbENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nLCAwKVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIG5lZWRsZS5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgbmVlZGxlLnNvdXJjZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc291cmNlcy5oYXMobmVlZGxlLnNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihuZWVkbGUuc291cmNlKTtcblxuICAgIHZhciBtYXBwaW5ncyA9IFtdO1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcobmVlZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsTWFwcGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAoYUFyZ3MuY29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgIC8vIGEgbWFwcGluZyBmb3IgYSBkaWZmZXJlbnQgbGluZSB0aGFuIHRoZSBvbmUgd2UgZm91bmQuIFNpbmNlXG4gICAgICAgIC8vIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBmaW5kIGFsbCBtYXBwaW5ncyBmb3JcbiAgICAgICAgLy8gdGhlIGxpbmUgd2UgZm91bmQuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBvcmlnaW5hbExpbmUpIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgIC8vIGEgbWFwcGluZyBmb3IgYSBkaWZmZXJlbnQgbGluZSB0aGFuIHRoZSBvbmUgd2Ugd2VyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICAvLyBTaW5jZSBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJlxuICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09IGxpbmUgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPT0gb3JpZ2luYWxDb2x1bW4pIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBpbmdzO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaCB3ZSBjYW5cbiAqIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZmlsZSBwb3NpdGlvbnMgYnkgZ2l2aW5nIGl0IGEgZmlsZVxuICogcG9zaXRpb24gaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKlxuICogVGhlIG9ubHkgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gKiBhbHJlYWR5IHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNvdXJjZSBtYXBzIGhhdmUgdGhlXG4gKiBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqXG4gKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAqICAgLSBzb3VyY2VzOiBBbiBhcnJheSBvZiBVUkxzIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICogICAtIHNvdXJjZVJvb3Q6IE9wdGlvbmFsLiBUaGUgVVJMIHJvb3QgZnJvbSB3aGljaCBhbGwgc291cmNlcyBhcmUgcmVsYXRpdmUuXG4gKiAgIC0gc291cmNlc0NvbnRlbnQ6IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICpcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gKlxuICogICAgIHtcbiAqICAgICAgIHZlcnNpb24gOiAzLFxuICogICAgICAgZmlsZTogXCJvdXQuanNcIixcbiAqICAgICAgIHNvdXJjZVJvb3QgOiBcIlwiLFxuICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICBtYXBwaW5nczogXCJBQSxBQjs7QUJDREU7XCJcbiAqICAgICB9XG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNvdXJjZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzJyk7XG4gIC8vIFNhc3MgMy4zIGxlYXZlcyBvdXQgdGhlICduYW1lcycgYXJyYXksIHNvIHdlIGRldmlhdGUgZnJvbSB0aGUgc3BlYyAod2hpY2hcbiAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgdmFyIG5hbWVzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbmFtZXMnLCBbXSk7XG4gIHZhciBzb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICB2YXIgbWFwcGluZ3MgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdtYXBwaW5ncycpO1xuICB2YXIgZmlsZSA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ2ZpbGUnLCBudWxsKTtcblxuICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgLy8gc3RyaW5nIHJhdGhlciB0aGFuIGEgbnVtYmVyLCBzbyB3ZSB1c2UgbG9vc2UgZXF1YWxpdHkgY2hlY2tpbmcgaGVyZS5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgc291cmNlcyA9IHNvdXJjZXNcbiAgICAubWFwKFN0cmluZylcbiAgICAvLyBTb21lIHNvdXJjZSBtYXBzIHByb2R1Y2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIGxpa2UgXCIuL2Zvby5qc1wiIGluc3RlYWQgb2ZcbiAgICAvLyBcImZvby5qc1wiLiAgTm9ybWFsaXplIHRoZXNlIGZpcnN0IHNvIHRoYXQgZnV0dXJlIGNvbXBhcmlzb25zIHdpbGwgc3VjY2VlZC5cbiAgICAvLyBTZWUgYnVnemlsLmxhLzEwOTA3NjguXG4gICAgLm1hcCh1dGlsLm5vcm1hbGl6ZSlcbiAgICAvLyBBbHdheXMgZW5zdXJlIHRoYXQgYWJzb2x1dGUgc291cmNlcyBhcmUgaW50ZXJuYWxseSBzdG9yZWQgcmVsYXRpdmUgdG9cbiAgICAvLyB0aGUgc291cmNlIHJvb3QsIGlmIHRoZSBzb3VyY2Ugcm9vdCBpcyBhYnNvbHV0ZS4gTm90IGRvaW5nIHRoaXMgd291bGRcbiAgICAvLyBiZSBwYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMgd2hlbiB0aGUgc291cmNlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlXG4gICAgLy8gc291cmNlICh2YWxpZCwgYnV0IHdoeT8/KS4gU2VlIGdpdGh1YiBpc3N1ZSAjMTk5IGFuZCBidWd6aWwubGEvMTE4ODk4Mi5cbiAgICAubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIHJldHVybiBzb3VyY2VSb290ICYmIHV0aWwuaXNBYnNvbHV0ZShzb3VyY2VSb290KSAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlKVxuICAgICAgICA/IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlKVxuICAgICAgICA6IHNvdXJjZTtcbiAgICB9KTtcblxuICAvLyBQYXNzIGB0cnVlYCBiZWxvdyB0byBhbGxvdyBkdXBsaWNhdGUgbmFtZXMgYW5kIHNvdXJjZXMuIFdoaWxlIHNvdXJjZSBtYXBzXG4gIC8vIGFyZSBpbnRlbmRlZCB0byBiZSBjb21wcmVzc2VkIGFuZCBkZWR1cGxpY2F0ZWQsIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyXG4gIC8vIHNvbWV0aW1lcyBnZW5lcmF0ZXMgc291cmNlIG1hcHMgd2l0aCBkdXBsaWNhdGVzIGluIHRoZW0uIFNlZSBHaXRodWIgaXNzdWVcbiAgLy8gIzcyIGFuZCBidWd6aWwubGEvODg5NDkyLlxuICB0aGlzLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShuYW1lcy5tYXAoU3RyaW5nKSwgdHJ1ZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoc291cmNlcywgdHJ1ZSk7XG5cbiAgdGhpcy5zb3VyY2VSb290ID0gc291cmNlUm9vdDtcbiAgdGhpcy5zb3VyY2VzQ29udGVudCA9IHNvdXJjZXNDb250ZW50O1xuICB0aGlzLl9tYXBwaW5ncyA9IG1hcHBpbmdzO1xuICB0aGlzLmZpbGUgPSBmaWxlO1xufVxuXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQ3JlYXRlIGEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBmcm9tIGEgU291cmNlTWFwR2VuZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBTb3VyY2VNYXBHZW5lcmF0b3IgYVNvdXJjZU1hcFxuICogICAgICAgIFRoZSBzb3VyY2UgbWFwIHRoYXQgd2lsbCBiZSBjb25zdW1lZC5cbiAqIEByZXR1cm5zIEJhc2ljU291cmNlTWFwQ29uc3VtZXJcbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwKSB7XG4gICAgdmFyIHNtYyA9IE9iamVjdC5jcmVhdGUoQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuXG4gICAgdmFyIG5hbWVzID0gc21jLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9uYW1lcy50b0FycmF5KCksIHRydWUpO1xuICAgIHZhciBzb3VyY2VzID0gc21jLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX3NvdXJjZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICBzbWMuc291cmNlUm9vdCA9IGFTb3VyY2VNYXAuX3NvdXJjZVJvb3Q7XG4gICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jLnNvdXJjZVJvb3QpO1xuICAgIHNtYy5maWxlID0gYVNvdXJjZU1hcC5fZmlsZTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlUm9vdCAhPSBudWxsID8gdXRpbC5qb2luKHRoaXMuc291cmNlUm9vdCwgcykgOiBzO1xuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gYmlhczogRWl0aGVyICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICogICAgIERlZmF1bHRzIHRvICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhcbiAgICAgIG5lZWRsZSxcbiAgICAgIHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLFxuICAgICAgXCJnZW5lcmF0ZWRMaW5lXCIsXG4gICAgICBcImdlbmVyYXRlZENvbHVtblwiLFxuICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCxcbiAgICAgIHV0aWwuZ2V0QXJnKGFBcmdzLCAnYmlhcycsIFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EKVxuICAgICk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnc291cmNlJywgbnVsbCk7XG4gICAgICAgIGlmIChzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHNvdXJjZSk7XG4gICAgICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4odGhpcy5zb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICduYW1lJywgbnVsbCk7XG4gICAgICAgIGlmIChuYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgbmFtZSA9IHRoaXMuX25hbWVzLmF0KG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbmFtZTogbnVsbFxuICAgIH07XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMgPVxuICBmdW5jdGlvbiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudC5sZW5ndGggPj0gdGhpcy5fc291cmNlcy5zaXplKCkgJiZcbiAgICAgICF0aGlzLnNvdXJjZXNDb250ZW50LnNvbWUoZnVuY3Rpb24gKHNjKSB7IHJldHVybiBzYyA9PSBudWxsOyB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBhU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIGFTb3VyY2UpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhhU291cmNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKGFTb3VyY2UpXTtcbiAgICB9XG5cbiAgICB2YXIgdXJsO1xuICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbFxuICAgICAgICAmJiAodXJsID0gdXRpbC51cmxQYXJzZSh0aGlzLnNvdXJjZVJvb3QpKSkge1xuICAgICAgLy8gWFhYOiBmaWxlOi8vIFVSSXMgYW5kIGFic29sdXRlIHBhdGhzIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciBmb3JcbiAgICAgIC8vIG1hbnkgdXNlcnMuIFdlIGNhbiBoZWxwIHRoZW0gb3V0IHdoZW4gdGhleSBleHBlY3QgZmlsZTovLyBVUklzIHRvXG4gICAgICAvLyBiZWhhdmUgbGlrZSBpdCB3b3VsZCBpZiB0aGV5IHdlcmUgcnVubmluZyBhIGxvY2FsIEhUVFAgc2VydmVyLiBTZWVcbiAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTg4NTU5Ny5cbiAgICAgIHZhciBmaWxlVXJpQWJzUGF0aCA9IGFTb3VyY2UucmVwbGFjZSgvXmZpbGU6XFwvXFwvLywgXCJcIik7XG4gICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKGZpbGVVcmlBYnNQYXRoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoZmlsZVVyaUFic1BhdGgpXVxuICAgICAgfVxuXG4gICAgICBpZiAoKCF1cmwucGF0aCB8fCB1cmwucGF0aCA9PSBcIi9cIilcbiAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhcIi9cIiArIGFTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIGFTb3VyY2UpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgcmVjdXJzaXZlbHkgZnJvbVxuICAgIC8vIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvci4gSW4gdGhhdCBjYXNlLCB3ZVxuICAgIC8vIGRvbid0IHdhbnQgdG8gdGhyb3cgaWYgd2UgY2FuJ3QgZmluZCB0aGUgc291cmNlIC0gd2UganVzdCB3YW50IHRvXG4gICAgLy8gcmV0dXJuIG51bGwsIHNvIHdlIHByb3ZpZGUgYSBmbGFnIHRvIGV4aXQgZ3JhY2VmdWxseS5cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgc291cmNlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IG5lZWRsZS5zb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG5leHBvcnRzLkJhc2ljU291cmNlTWFwQ29uc3VtZXIgPSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEFuIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2hcbiAqIHdlIGNhbiBxdWVyeSBmb3IgaW5mb3JtYXRpb24uIEl0IGRpZmZlcnMgZnJvbSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluXG4gKiB0aGF0IGl0IHRha2VzIFwiaW5kZXhlZFwiIHNvdXJjZSBtYXBzIChpLmUuIG9uZXMgd2l0aCBhIFwic2VjdGlvbnNcIiBmaWVsZCkgYXNcbiAqIGlucHV0LlxuICpcbiAqIFRoZSBvbmx5IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQjaGVhZGluZz1oLjUzNWVzM3hlcHJndFxuICovXG5mdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSlcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgLy8gRmluZCB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24gd2UncmUgdHJ5aW5nIHRvIG1hcFxuICAgIC8vIHRvIGFuIG9yaWdpbmFsIHBvc2l0aW9uLlxuICAgIHZhciBzZWN0aW9uSW5kZXggPSBiaW5hcnlTZWFyY2guc2VhcmNoKG5lZWRsZSwgdGhpcy5fc2VjdGlvbnMsXG4gICAgICBmdW5jdGlvbihuZWVkbGUsIHNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNtcCA9IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC0gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZTtcbiAgICAgICAgaWYgKGNtcCkge1xuICAgICAgICAgIHJldHVybiBjbXA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgIHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbik7XG4gICAgICB9KTtcbiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW3NlY3Rpb25JbmRleF07XG5cbiAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBuYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzZWN0aW9uLmNvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgbGluZTogbmVlZGxlLmdlbmVyYXRlZExpbmUgLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgY29sdW1uOiBuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgIDogMCksXG4gICAgICBiaWFzOiBhQXJncy5iaWFzXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBzLmNvbnN1bWVyLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCk7XG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICB2YXIgY29udGVudCA9IHNlY3Rpb24uY29uc3VtZXIuc291cmNlQ29udGVudEZvcihhU291cmNlLCB0cnVlKTtcbiAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmdlbmVyYXRlZFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcblxuICAgICAgLy8gT25seSBjb25zaWRlciB0aGlzIHNlY3Rpb24gaWYgdGhlIHJlcXVlc3RlZCBzb3VyY2UgaXMgaW4gdGhlIGxpc3Qgb2ZcbiAgICAgIC8vIHNvdXJjZXMgb2YgdGhlIGNvbnN1bWVyLlxuICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuc291cmNlcy5pbmRleE9mKHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJykpID09PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBnZW5lcmF0ZWRQb3NpdGlvbiA9IHNlY3Rpb24uY29uc3VtZXIuZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpO1xuICAgICAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uKSB7XG4gICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkUG9zaXRpb24ubGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkUG9zaXRpb24uY29sdW1uICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lXG4gICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICAgOiAwKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcbiAgICAgIHZhciBzZWN0aW9uTWFwcGluZ3MgPSBzZWN0aW9uLmNvbnN1bWVyLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VjdGlvbk1hcHBpbmdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gc2VjdGlvbk1hcHBpbmdzW2pdO1xuXG4gICAgICAgIHZhciBzb3VyY2UgPSBzZWN0aW9uLmNvbnN1bWVyLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHV0aWwuam9pbihzZWN0aW9uLmNvbnN1bWVyLnNvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgICAgc291cmNlID0gdGhpcy5fc291cmNlcy5pbmRleE9mKHNvdXJjZSk7XG5cbiAgICAgICAgdmFyIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvcXVpY2stc29ydC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF07XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW5vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.js b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.js new file mode 100644 index 00000000..4e630e29 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.js @@ -0,0 +1,3090 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["sourceMap"] = factory(); + else + root["sourceMap"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer; + exports.SourceNode = __webpack_require__(10).SourceNode; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var base64VLQ = __webpack_require__(2); + var util = __webpack_require__(4); + var ArraySet = __webpack_require__(5).ArraySet; + var MappingList = __webpack_require__(6).MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error( + 'original.line and original.column are not numbers -- you probably meant to omit ' + + 'the original mapping entirely and only map the generated position. If so, pass ' + + 'null for the original mapping instead of an object with empty or null values.' + ); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + var base64 = __webpack_require__(3); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); + }()); + + function identity (s) { + return s; + } + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; + } + exports.toSetString = supportsNullProto ? identity : toSetString; + + function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; + } + exports.fromSetString = supportsNullProto ? identity : fromSetString; + + function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var has = Object.prototype.hasOwnProperty; + var hasNativeMap = typeof Map !== "undefined"; + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var binarySearch = __webpack_require__(8); + var ArraySet = __webpack_require__(5).ArraySet; + var base64VLQ = __webpack_require__(2); + var quickSort = __webpack_require__(9).quickSort; + + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + var util = __webpack_require__(4); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? + remainingLines[remainingLinesIndex++] : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.min.js b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.min.js new file mode 100644 index 00000000..f2a46bd0 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/dist/source-map.min.js @@ -0,0 +1,2 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.sourceMap=n():e.sourceMap=n()}(this,function(){return function(e){function n(t){if(r[t])return r[t].exports;var o=r[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var r={};return n.m=e,n.c=r,n.p="",n(0)}([function(e,n,r){n.SourceMapGenerator=r(1).SourceMapGenerator,n.SourceMapConsumer=r(7).SourceMapConsumer,n.SourceNode=r(10).SourceNode},function(e,n,r){function t(e){e||(e={}),this._file=i.getArg(e,"file",null),this._sourceRoot=i.getArg(e,"sourceRoot",null),this._skipValidation=i.getArg(e,"skipValidation",!1),this._sources=new s,this._names=new s,this._mappings=new a,this._sourcesContents=null}var o=r(2),i=r(4),s=r(5).ArraySet,a=r(6).MappingList;t.prototype._version=3,t.fromSourceMap=function(e){var n=e.sourceRoot,r=new t({file:e.file,sourceRoot:n});return e.eachMapping(function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(t.source=e.source,null!=n&&(t.source=i.relative(n,t.source)),t.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(t.name=e.name)),r.addMapping(t)}),e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&r.setSourceContent(n,t)}),r},t.prototype.addMapping=function(e){var n=i.getArg(e,"generated"),r=i.getArg(e,"original",null),t=i.getArg(e,"source",null),o=i.getArg(e,"name",null);this._skipValidation||this._validateMapping(n,r,t,o),null!=t&&(t=String(t),this._sources.has(t)||this._sources.add(t)),null!=o&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:n.line,generatedColumn:n.column,originalLine:null!=r&&r.line,originalColumn:null!=r&&r.column,source:t,name:o})},t.prototype.setSourceContent=function(e,n){var r=e;null!=this._sourceRoot&&(r=i.relative(this._sourceRoot,r)),null!=n?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[i.toSetString(r)]=n):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(r)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},t.prototype.applySourceMap=function(e,n,r){var t=n;if(null==n){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');t=e.file}var o=this._sourceRoot;null!=o&&(t=i.relative(o,t));var a=new s,u=new s;this._mappings.unsortedForEach(function(n){if(n.source===t&&null!=n.originalLine){var s=e.originalPositionFor({line:n.originalLine,column:n.originalColumn});null!=s.source&&(n.source=s.source,null!=r&&(n.source=i.join(r,n.source)),null!=o&&(n.source=i.relative(o,n.source)),n.originalLine=s.line,n.originalColumn=s.column,null!=s.name&&(n.name=s.name))}var l=n.source;null==l||a.has(l)||a.add(l);var c=n.name;null==c||u.has(c)||u.add(c)},this),this._sources=a,this._names=u,e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&(null!=r&&(n=i.join(r,n)),null!=o&&(n=i.relative(o,n)),this.setSourceContent(n,t))},this)},t.prototype._validateMapping=function(e,n,r,t){if(n&&"number"!=typeof n.line&&"number"!=typeof n.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||n||r||t)&&!(e&&"line"in e&&"column"in e&&n&&"line"in n&&"column"in n&&e.line>0&&e.column>=0&&n.line>0&&n.column>=0&&r))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:r,original:n,name:t}))},t.prototype._serializeMappings=function(){for(var e,n,r,t,s=0,a=1,u=0,l=0,c=0,g=0,p="",h=this._mappings.toArray(),f=0,d=h.length;f0){if(!i.compareByGeneratedPositionsInflated(n,h[f-1]))continue;e+=","}e+=o.encode(n.generatedColumn-s),s=n.generatedColumn,null!=n.source&&(t=this._sources.indexOf(n.source),e+=o.encode(t-g),g=t,e+=o.encode(n.originalLine-1-l),l=n.originalLine-1,e+=o.encode(n.originalColumn-u),u=n.originalColumn,null!=n.name&&(r=this._names.indexOf(n.name),e+=o.encode(r-c),c=r)),p+=e}return p},t.prototype._generateSourcesContent=function(e,n){return e.map(function(e){if(!this._sourcesContents)return null;null!=n&&(e=i.relative(n,e));var r=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,r)?this._sourcesContents[r]:null},this)},t.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},t.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=t},function(e,n,r){function t(e){return e<0?(-e<<1)+1:(e<<1)+0}function o(e){var n=1===(1&e),r=e>>1;return n?-r:r}var i=r(3),s=5,a=1<>>=s,o>0&&(n|=l),r+=i.encode(n);while(o>0);return r},n.decode=function(e,n,r){var t,a,c=e.length,g=0,p=0;do{if(n>=c)throw new Error("Expected more digits in base 64 VLQ value.");if(a=i.decode(e.charCodeAt(n++)),a===-1)throw new Error("Invalid base64 digit: "+e.charAt(n-1));t=!!(a&l),a&=u,g+=a<=0;c--)s=u[c],"."===s?u.splice(c,1):".."===s?l++:l>0&&(""===s?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return r=u.join("/"),""===r&&(r=a?"/":"."),i?(i.path=r,o(i)):r}function s(e,n){""===e&&(e="."),""===n&&(n=".");var r=t(n),s=t(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||n.match(_))return n;if(s&&!s.host&&!s.path)return s.host=n,o(s);var a="/"===n.charAt(0)?n:i(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=a,o(s)):a}function a(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if(e=e.slice(0,t),e.match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)}function u(e){return e}function l(e){return g(e)?"$"+e:e}function c(e){return g(e)?e.slice(1):e}function g(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function p(e,n,r){var t=e.source-n.source;return 0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t||r?t:(t=e.generatedColumn-n.generatedColumn,0!==t?t:(t=e.generatedLine-n.generatedLine,0!==t?t:e.name-n.name))))}function h(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:(t=e.generatedColumn-n.generatedColumn,0!==t||r?t:(t=e.source-n.source,0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:e.name-n.name))))}function f(e,n){return e===n?0:e>n?1:-1}function d(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:(r=e.generatedColumn-n.generatedColumn,0!==r?r:(r=f(e.source,n.source),0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r?r:f(e.name,n.name)))))}n.getArg=r;var m=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/,_=/^data:.+\,.+$/;n.urlParse=t,n.urlGenerate=o,n.normalize=i,n.join=s,n.isAbsolute=function(e){return"/"===e.charAt(0)||!!e.match(m)},n.relative=a;var v=function(){var e=Object.create(null);return!("__proto__"in e)}();n.toSetString=v?u:l,n.fromSetString=v?u:c,n.compareByOriginalPositions=p,n.compareByGeneratedPositionsDeflated=h,n.compareByGeneratedPositionsInflated=d},function(e,n,r){function t(){this._array=[],this._set=s?new Map:Object.create(null)}var o=r(4),i=Object.prototype.hasOwnProperty,s="undefined"!=typeof Map;t.fromArray=function(e,n){for(var r=new t,o=0,i=e.length;o=0)return n}else{var r=o.toSetString(e);if(i.call(this._set,r))return this._set[r]}throw new Error('"'+e+'" is not in the set.')},t.prototype.at=function(e){if(e>=0&&er||t==r&&s>=o||i.compareByGeneratedPositionsInflated(e,n)<=0}function o(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}var i=r(4);o.prototype.unsortedForEach=function(e,n){this._array.forEach(e,n)},o.prototype.add=function(e){t(this._last,e)?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},o.prototype.toArray=function(){return this._sorted||(this._array.sort(i.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=o},function(e,n,r){function t(e){var n=e;return"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,""))),null!=n.sections?new s(n):new o(n)}function o(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=a.getArg(n,"version"),t=a.getArg(n,"sources"),o=a.getArg(n,"names",[]),i=a.getArg(n,"sourceRoot",null),s=a.getArg(n,"sourcesContent",null),u=a.getArg(n,"mappings"),c=a.getArg(n,"file",null);if(r!=this._version)throw new Error("Unsupported version: "+r);t=t.map(String).map(a.normalize).map(function(e){return i&&a.isAbsolute(i)&&a.isAbsolute(e)?a.relative(i,e):e}),this._names=l.fromArray(o.map(String),!0),this._sources=l.fromArray(t,!0),this.sourceRoot=i,this.sourcesContent=s,this._mappings=u,this.file=c}function i(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function s(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=a.getArg(n,"version"),o=a.getArg(n,"sections");if(r!=this._version)throw new Error("Unsupported version: "+r);this._sources=new l,this._names=new l;var i={line:-1,column:0};this._sections=o.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var n=a.getArg(e,"offset"),r=a.getArg(n,"line"),o=a.getArg(n,"column");if(r=0){var i=this._originalMappings[o];if(void 0===e.column)for(var s=i.originalLine;i&&i.originalLine===s;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o];else for(var l=i.originalColumn;i&&i.originalLine===n&&i.originalColumn==l;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o]}return t},n.SourceMapConsumer=t,o.prototype=Object.create(t.prototype),o.prototype.consumer=t,o.fromSourceMap=function(e){var n=Object.create(o.prototype),r=n._names=l.fromArray(e._names.toArray(),!0),t=n._sources=l.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var s=e._mappings.toArray().slice(),u=n.__generatedMappings=[],c=n.__originalMappings=[],p=0,h=s.length;p1&&(r.source=d+o[1],d+=o[1],r.originalLine=h+o[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+o[3],f=r.originalColumn,o.length>4&&(r.name=m+o[4],m+=o[4])),S.push(r),"number"==typeof r.originalLine&&A.push(r)}g(S,a.compareByGeneratedPositionsDeflated),this.__generatedMappings=S,g(A,a.compareByOriginalPositions),this.__originalMappings=A},o.prototype._findMapping=function(e,n,r,t,o,i){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return u.search(e,n,o,i)},o.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=a.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=a.join(this.sourceRoot,i)));var s=a.getArg(o,"name",null);return null!==s&&(s=this._names.at(s)),{source:i,line:a.getArg(o,"originalLine",null),column:a.getArg(o,"originalColumn",null),name:s}}}return{source:null,line:null,column:null,name:null}},o.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},o.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=a.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=a.urlParse(this.sourceRoot))){var t=e.replace(/^file:\/\//,"");if("file"==r.scheme&&this._sources.has(t))return this.sourcesContent[this._sources.indexOf(t)];if((!r.path||"/"==r.path)&&this._sources.has("/"+e))return this.sourcesContent[this._sources.indexOf("/"+e)]}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},o.prototype.generatedPositionFor=function(e){var n=a.getArg(e,"source");if(null!=this.sourceRoot&&(n=a.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};n=this._sources.indexOf(n);var r={source:n,originalLine:a.getArg(e,"line"),originalColumn:a.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=o,s.prototype=Object.create(t.prototype),s.prototype.constructor=t,s.prototype._version=3,Object.defineProperty(s.prototype,"sources",{get:function(){for(var e=[],n=0;n0?t-u>1?r(u,t,o,i,s,a):a==n.LEAST_UPPER_BOUND?t1?r(e,u,o,i,s,a):a==n.LEAST_UPPER_BOUND?u:e<0?-1:e}n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,t,o,i){if(0===t.length)return-1;var s=r(-1,t.length,e,t,o,i||n.GREATEST_LOWER_BOUND);if(s<0)return-1;for(;s-1>=0&&0===o(t[s],t[s-1],!0);)--s;return s}},function(e,n){function r(e,n,r){var t=e[n];e[n]=e[r],e[r]=t}function t(e,n){return Math.round(e+Math.random()*(n-e))}function o(e,n,i,s){if(i=0;n--)this.prepend(e[n]);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);this.children.unshift(e)}return this},t.prototype.walk=function(e){for(var n,r=0,t=this.children.length;r0){for(n=[],r=0;r 0 && aGenerated.column >= 0\n\t && !aOriginal && !aSource && !aName) {\n\t // Case 1.\n\t return;\n\t }\n\t else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n\t && aGenerated.line > 0 && aGenerated.column >= 0\n\t && aOriginal.line > 0 && aOriginal.column >= 0\n\t && aSource) {\n\t // Cases 2 and 3.\n\t return;\n\t }\n\t else {\n\t throw new Error('Invalid mapping: ' + JSON.stringify({\n\t generated: aGenerated,\n\t source: aSource,\n\t original: aOriginal,\n\t name: aName\n\t }));\n\t }\n\t };\n\t\n\t/**\n\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\n\t * specified by the source map format.\n\t */\n\tSourceMapGenerator.prototype._serializeMappings =\n\t function SourceMapGenerator_serializeMappings() {\n\t var previousGeneratedColumn = 0;\n\t var previousGeneratedLine = 1;\n\t var previousOriginalColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousName = 0;\n\t var previousSource = 0;\n\t var result = '';\n\t var next;\n\t var mapping;\n\t var nameIdx;\n\t var sourceIdx;\n\t\n\t var mappings = this._mappings.toArray();\n\t for (var i = 0, len = mappings.length; i < len; i++) {\n\t mapping = mappings[i];\n\t next = ''\n\t\n\t if (mapping.generatedLine !== previousGeneratedLine) {\n\t previousGeneratedColumn = 0;\n\t while (mapping.generatedLine !== previousGeneratedLine) {\n\t next += ';';\n\t previousGeneratedLine++;\n\t }\n\t }\n\t else {\n\t if (i > 0) {\n\t if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n\t continue;\n\t }\n\t next += ',';\n\t }\n\t }\n\t\n\t next += base64VLQ.encode(mapping.generatedColumn\n\t - previousGeneratedColumn);\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (mapping.source != null) {\n\t sourceIdx = this._sources.indexOf(mapping.source);\n\t next += base64VLQ.encode(sourceIdx - previousSource);\n\t previousSource = sourceIdx;\n\t\n\t // lines are stored 0-based in SourceMap spec version 3\n\t next += base64VLQ.encode(mapping.originalLine - 1\n\t - previousOriginalLine);\n\t previousOriginalLine = mapping.originalLine - 1;\n\t\n\t next += base64VLQ.encode(mapping.originalColumn\n\t - previousOriginalColumn);\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (mapping.name != null) {\n\t nameIdx = this._names.indexOf(mapping.name);\n\t next += base64VLQ.encode(nameIdx - previousName);\n\t previousName = nameIdx;\n\t }\n\t }\n\t\n\t result += next;\n\t }\n\t\n\t return result;\n\t };\n\t\n\tSourceMapGenerator.prototype._generateSourcesContent =\n\t function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n\t return aSources.map(function (source) {\n\t if (!this._sourcesContents) {\n\t return null;\n\t }\n\t if (aSourceRoot != null) {\n\t source = util.relative(aSourceRoot, source);\n\t }\n\t var key = util.toSetString(source);\n\t return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n\t ? this._sourcesContents[key]\n\t : null;\n\t }, this);\n\t };\n\t\n\t/**\n\t * Externalize the source map.\n\t */\n\tSourceMapGenerator.prototype.toJSON =\n\t function SourceMapGenerator_toJSON() {\n\t var map = {\n\t version: this._version,\n\t sources: this._sources.toArray(),\n\t names: this._names.toArray(),\n\t mappings: this._serializeMappings()\n\t };\n\t if (this._file != null) {\n\t map.file = this._file;\n\t }\n\t if (this._sourceRoot != null) {\n\t map.sourceRoot = this._sourceRoot;\n\t }\n\t if (this._sourcesContents) {\n\t map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n\t }\n\t\n\t return map;\n\t };\n\t\n\t/**\n\t * Render the source map being generated to a string.\n\t */\n\tSourceMapGenerator.prototype.toString =\n\t function SourceMapGenerator_toString() {\n\t return JSON.stringify(this.toJSON());\n\t };\n\t\n\texports.SourceMapGenerator = SourceMapGenerator;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t *\n\t * Based on the Base 64 VLQ implementation in Closure Compiler:\n\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n\t *\n\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are\n\t * met:\n\t *\n\t * * Redistributions of source code must retain the above copyright\n\t * notice, this list of conditions and the following disclaimer.\n\t * * Redistributions in binary form must reproduce the above\n\t * copyright notice, this list of conditions and the following\n\t * disclaimer in the documentation and/or other materials provided\n\t * with the distribution.\n\t * * Neither the name of Google Inc. nor the names of its\n\t * contributors may be used to endorse or promote products derived\n\t * from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t */\n\t\n\tvar base64 = __webpack_require__(3);\n\t\n\t// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n\t// length quantities we use in the source map spec, the first bit is the sign,\n\t// the next four bits are the actual value, and the 6th bit is the\n\t// continuation bit. The continuation bit tells us whether there are more\n\t// digits in this value following this digit.\n\t//\n\t// Continuation\n\t// | Sign\n\t// | |\n\t// V V\n\t// 101011\n\t\n\tvar VLQ_BASE_SHIFT = 5;\n\t\n\t// binary: 100000\n\tvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\t\n\t// binary: 011111\n\tvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\t\n\t// binary: 100000\n\tvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\t\n\t/**\n\t * Converts from a two-complement value to a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n\t * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n\t */\n\tfunction toVLQSigned(aValue) {\n\t return aValue < 0\n\t ? ((-aValue) << 1) + 1\n\t : (aValue << 1) + 0;\n\t}\n\t\n\t/**\n\t * Converts to a two-complement value from a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n\t * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n\t */\n\tfunction fromVLQSigned(aValue) {\n\t var isNegative = (aValue & 1) === 1;\n\t var shifted = aValue >> 1;\n\t return isNegative\n\t ? -shifted\n\t : shifted;\n\t}\n\t\n\t/**\n\t * Returns the base 64 VLQ encoded value.\n\t */\n\texports.encode = function base64VLQ_encode(aValue) {\n\t var encoded = \"\";\n\t var digit;\n\t\n\t var vlq = toVLQSigned(aValue);\n\t\n\t do {\n\t digit = vlq & VLQ_BASE_MASK;\n\t vlq >>>= VLQ_BASE_SHIFT;\n\t if (vlq > 0) {\n\t // There are still more digits in this value, so we must make sure the\n\t // continuation bit is marked.\n\t digit |= VLQ_CONTINUATION_BIT;\n\t }\n\t encoded += base64.encode(digit);\n\t } while (vlq > 0);\n\t\n\t return encoded;\n\t};\n\t\n\t/**\n\t * Decodes the next base 64 VLQ value from the given string and returns the\n\t * value and the rest of the string via the out parameter.\n\t */\n\texports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n\t var strLen = aStr.length;\n\t var result = 0;\n\t var shift = 0;\n\t var continuation, digit;\n\t\n\t do {\n\t if (aIndex >= strLen) {\n\t throw new Error(\"Expected more digits in base 64 VLQ value.\");\n\t }\n\t\n\t digit = base64.decode(aStr.charCodeAt(aIndex++));\n\t if (digit === -1) {\n\t throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n\t }\n\t\n\t continuation = !!(digit & VLQ_CONTINUATION_BIT);\n\t digit &= VLQ_BASE_MASK;\n\t result = result + (digit << shift);\n\t shift += VLQ_BASE_SHIFT;\n\t } while (continuation);\n\t\n\t aOutParam.value = fromVLQSigned(result);\n\t aOutParam.rest = aIndex;\n\t};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\t\n\t/**\n\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n\t */\n\texports.encode = function (number) {\n\t if (0 <= number && number < intToCharMap.length) {\n\t return intToCharMap[number];\n\t }\n\t throw new TypeError(\"Must be between 0 and 63: \" + number);\n\t};\n\t\n\t/**\n\t * Decode a single base 64 character code digit to an integer. Returns -1 on\n\t * failure.\n\t */\n\texports.decode = function (charCode) {\n\t var bigA = 65; // 'A'\n\t var bigZ = 90; // 'Z'\n\t\n\t var littleA = 97; // 'a'\n\t var littleZ = 122; // 'z'\n\t\n\t var zero = 48; // '0'\n\t var nine = 57; // '9'\n\t\n\t var plus = 43; // '+'\n\t var slash = 47; // '/'\n\t\n\t var littleOffset = 26;\n\t var numberOffset = 52;\n\t\n\t // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t if (bigA <= charCode && charCode <= bigZ) {\n\t return (charCode - bigA);\n\t }\n\t\n\t // 26 - 51: abcdefghijklmnopqrstuvwxyz\n\t if (littleA <= charCode && charCode <= littleZ) {\n\t return (charCode - littleA + littleOffset);\n\t }\n\t\n\t // 52 - 61: 0123456789\n\t if (zero <= charCode && charCode <= nine) {\n\t return (charCode - zero + numberOffset);\n\t }\n\t\n\t // 62: +\n\t if (charCode == plus) {\n\t return 62;\n\t }\n\t\n\t // 63: /\n\t if (charCode == slash) {\n\t return 63;\n\t }\n\t\n\t // Invalid base64 digit.\n\t return -1;\n\t};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t/**\n\t * This is a helper function for getting values from parameter/options\n\t * objects.\n\t *\n\t * @param args The object we are extracting values from\n\t * @param name The name of the property we are getting.\n\t * @param defaultValue An optional value to return if the property is missing\n\t * from the object. If this is not specified and the property is missing, an\n\t * error will be thrown.\n\t */\n\tfunction getArg(aArgs, aName, aDefaultValue) {\n\t if (aName in aArgs) {\n\t return aArgs[aName];\n\t } else if (arguments.length === 3) {\n\t return aDefaultValue;\n\t } else {\n\t throw new Error('\"' + aName + '\" is a required argument.');\n\t }\n\t}\n\texports.getArg = getArg;\n\t\n\tvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\n\tvar dataUrlRegexp = /^data:.+\\,.+$/;\n\t\n\tfunction urlParse(aUrl) {\n\t var match = aUrl.match(urlRegexp);\n\t if (!match) {\n\t return null;\n\t }\n\t return {\n\t scheme: match[1],\n\t auth: match[2],\n\t host: match[3],\n\t port: match[4],\n\t path: match[5]\n\t };\n\t}\n\texports.urlParse = urlParse;\n\t\n\tfunction urlGenerate(aParsedUrl) {\n\t var url = '';\n\t if (aParsedUrl.scheme) {\n\t url += aParsedUrl.scheme + ':';\n\t }\n\t url += '//';\n\t if (aParsedUrl.auth) {\n\t url += aParsedUrl.auth + '@';\n\t }\n\t if (aParsedUrl.host) {\n\t url += aParsedUrl.host;\n\t }\n\t if (aParsedUrl.port) {\n\t url += \":\" + aParsedUrl.port\n\t }\n\t if (aParsedUrl.path) {\n\t url += aParsedUrl.path;\n\t }\n\t return url;\n\t}\n\texports.urlGenerate = urlGenerate;\n\t\n\t/**\n\t * Normalizes a path, or the path portion of a URL:\n\t *\n\t * - Replaces consecutive slashes with one slash.\n\t * - Removes unnecessary '.' parts.\n\t * - Removes unnecessary '/..' parts.\n\t *\n\t * Based on code in the Node.js 'path' core module.\n\t *\n\t * @param aPath The path or url to normalize.\n\t */\n\tfunction normalize(aPath) {\n\t var path = aPath;\n\t var url = urlParse(aPath);\n\t if (url) {\n\t if (!url.path) {\n\t return aPath;\n\t }\n\t path = url.path;\n\t }\n\t var isAbsolute = exports.isAbsolute(path);\n\t\n\t var parts = path.split(/\\/+/);\n\t for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n\t part = parts[i];\n\t if (part === '.') {\n\t parts.splice(i, 1);\n\t } else if (part === '..') {\n\t up++;\n\t } else if (up > 0) {\n\t if (part === '') {\n\t // The first part is blank if the path is absolute. Trying to go\n\t // above the root is a no-op. Therefore we can remove all '..' parts\n\t // directly after the root.\n\t parts.splice(i + 1, up);\n\t up = 0;\n\t } else {\n\t parts.splice(i, 2);\n\t up--;\n\t }\n\t }\n\t }\n\t path = parts.join('/');\n\t\n\t if (path === '') {\n\t path = isAbsolute ? '/' : '.';\n\t }\n\t\n\t if (url) {\n\t url.path = path;\n\t return urlGenerate(url);\n\t }\n\t return path;\n\t}\n\texports.normalize = normalize;\n\t\n\t/**\n\t * Joins two paths/URLs.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be joined with the root.\n\t *\n\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n\t * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n\t * first.\n\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n\t * is updated with the result and aRoot is returned. Otherwise the result\n\t * is returned.\n\t * - If aPath is absolute, the result is aPath.\n\t * - Otherwise the two paths are joined with a slash.\n\t * - Joining for example 'http://' and 'www.example.com' is also supported.\n\t */\n\tfunction join(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t if (aPath === \"\") {\n\t aPath = \".\";\n\t }\n\t var aPathUrl = urlParse(aPath);\n\t var aRootUrl = urlParse(aRoot);\n\t if (aRootUrl) {\n\t aRoot = aRootUrl.path || '/';\n\t }\n\t\n\t // `join(foo, '//www.example.org')`\n\t if (aPathUrl && !aPathUrl.scheme) {\n\t if (aRootUrl) {\n\t aPathUrl.scheme = aRootUrl.scheme;\n\t }\n\t return urlGenerate(aPathUrl);\n\t }\n\t\n\t if (aPathUrl || aPath.match(dataUrlRegexp)) {\n\t return aPath;\n\t }\n\t\n\t // `join('http://', 'www.example.com')`\n\t if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n\t aRootUrl.host = aPath;\n\t return urlGenerate(aRootUrl);\n\t }\n\t\n\t var joined = aPath.charAt(0) === '/'\n\t ? aPath\n\t : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\t\n\t if (aRootUrl) {\n\t aRootUrl.path = joined;\n\t return urlGenerate(aRootUrl);\n\t }\n\t return joined;\n\t}\n\texports.join = join;\n\t\n\texports.isAbsolute = function (aPath) {\n\t return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n\t};\n\t\n\t/**\n\t * Make a path relative to a URL or another path.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be made relative to aRoot.\n\t */\n\tfunction relative(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t\n\t aRoot = aRoot.replace(/\\/$/, '');\n\t\n\t // It is possible for the path to be above the root. In this case, simply\n\t // checking whether the root is a prefix of the path won't work. Instead, we\n\t // need to remove components from the root one by one, until either we find\n\t // a prefix that fits, or we run out of components to remove.\n\t var level = 0;\n\t while (aPath.indexOf(aRoot + '/') !== 0) {\n\t var index = aRoot.lastIndexOf(\"/\");\n\t if (index < 0) {\n\t return aPath;\n\t }\n\t\n\t // If the only part of the root that is left is the scheme (i.e. http://,\n\t // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n\t // have exhausted all components, so the path is not relative to the root.\n\t aRoot = aRoot.slice(0, index);\n\t if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n\t return aPath;\n\t }\n\t\n\t ++level;\n\t }\n\t\n\t // Make sure we add a \"../\" for each component we removed from the root.\n\t return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n\t}\n\texports.relative = relative;\n\t\n\tvar supportsNullProto = (function () {\n\t var obj = Object.create(null);\n\t return !('__proto__' in obj);\n\t}());\n\t\n\tfunction identity (s) {\n\t return s;\n\t}\n\t\n\t/**\n\t * Because behavior goes wacky when you set `__proto__` on objects, we\n\t * have to prefix all the strings in our set with an arbitrary character.\n\t *\n\t * See https://github.com/mozilla/source-map/pull/31 and\n\t * https://github.com/mozilla/source-map/issues/30\n\t *\n\t * @param String aStr\n\t */\n\tfunction toSetString(aStr) {\n\t if (isProtoString(aStr)) {\n\t return '$' + aStr;\n\t }\n\t\n\t return aStr;\n\t}\n\texports.toSetString = supportsNullProto ? identity : toSetString;\n\t\n\tfunction fromSetString(aStr) {\n\t if (isProtoString(aStr)) {\n\t return aStr.slice(1);\n\t }\n\t\n\t return aStr;\n\t}\n\texports.fromSetString = supportsNullProto ? identity : fromSetString;\n\t\n\tfunction isProtoString(s) {\n\t if (!s) {\n\t return false;\n\t }\n\t\n\t var length = s.length;\n\t\n\t if (length < 9 /* \"__proto__\".length */) {\n\t return false;\n\t }\n\t\n\t if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n\t s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n\t s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n\t s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n\t s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n\t s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 9) !== 95 /* '_' */) {\n\t return false;\n\t }\n\t\n\t for (var i = length - 10; i >= 0; i--) {\n\t if (s.charCodeAt(i) !== 36 /* '$' */) {\n\t return false;\n\t }\n\t }\n\t\n\t return true;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings where the original positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same original source/line/column, but different generated\n\t * line and column the same. Useful when searching for a mapping with a\n\t * stubbed out mapping.\n\t */\n\tfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n\t var cmp = mappingA.source - mappingB.source;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0 || onlyCompareOriginal) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return mappingA.name - mappingB.name;\n\t}\n\texports.compareByOriginalPositions = compareByOriginalPositions;\n\t\n\t/**\n\t * Comparator between two mappings with deflated source and name indices where\n\t * the generated positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same generated line and column, but different\n\t * source/name/original line and column the same. Useful when searching for a\n\t * mapping with a stubbed out mapping.\n\t */\n\tfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0 || onlyCompareGenerated) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.source - mappingB.source;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return mappingA.name - mappingB.name;\n\t}\n\texports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\t\n\tfunction strcmp(aStr1, aStr2) {\n\t if (aStr1 === aStr2) {\n\t return 0;\n\t }\n\t\n\t if (aStr1 > aStr2) {\n\t return 1;\n\t }\n\t\n\t return -1;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings with inflated source and name strings where\n\t * the generated positions are compared.\n\t */\n\tfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = strcmp(mappingA.source, mappingB.source);\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar hasNativeMap = typeof Map !== \"undefined\";\n\t\n\t/**\n\t * A data structure which is a combination of an array and a set. Adding a new\n\t * member is O(1), testing for membership is O(1), and finding the index of an\n\t * element is O(1). Removing elements from the set is not supported. Only\n\t * strings are supported for membership.\n\t */\n\tfunction ArraySet() {\n\t this._array = [];\n\t this._set = hasNativeMap ? new Map() : Object.create(null);\n\t}\n\t\n\t/**\n\t * Static method for creating ArraySet instances from an existing array.\n\t */\n\tArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n\t var set = new ArraySet();\n\t for (var i = 0, len = aArray.length; i < len; i++) {\n\t set.add(aArray[i], aAllowDuplicates);\n\t }\n\t return set;\n\t};\n\t\n\t/**\n\t * Return how many unique items are in this ArraySet. If duplicates have been\n\t * added, than those do not count towards the size.\n\t *\n\t * @returns Number\n\t */\n\tArraySet.prototype.size = function ArraySet_size() {\n\t return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n\t};\n\t\n\t/**\n\t * Add the given string to this set.\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n\t var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n\t var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n\t var idx = this._array.length;\n\t if (!isDuplicate || aAllowDuplicates) {\n\t this._array.push(aStr);\n\t }\n\t if (!isDuplicate) {\n\t if (hasNativeMap) {\n\t this._set.set(aStr, idx);\n\t } else {\n\t this._set[sStr] = idx;\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Is the given string a member of this set?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.has = function ArraySet_has(aStr) {\n\t if (hasNativeMap) {\n\t return this._set.has(aStr);\n\t } else {\n\t var sStr = util.toSetString(aStr);\n\t return has.call(this._set, sStr);\n\t }\n\t};\n\t\n\t/**\n\t * What is the index of the given string in the array?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n\t if (hasNativeMap) {\n\t var idx = this._set.get(aStr);\n\t if (idx >= 0) {\n\t return idx;\n\t }\n\t } else {\n\t var sStr = util.toSetString(aStr);\n\t if (has.call(this._set, sStr)) {\n\t return this._set[sStr];\n\t }\n\t }\n\t\n\t throw new Error('\"' + aStr + '\" is not in the set.');\n\t};\n\t\n\t/**\n\t * What is the element at the given index?\n\t *\n\t * @param Number aIdx\n\t */\n\tArraySet.prototype.at = function ArraySet_at(aIdx) {\n\t if (aIdx >= 0 && aIdx < this._array.length) {\n\t return this._array[aIdx];\n\t }\n\t throw new Error('No element indexed by ' + aIdx);\n\t};\n\t\n\t/**\n\t * Returns the array representation of this set (which has the proper indices\n\t * indicated by indexOf). Note that this is a copy of the internal array used\n\t * for storing the members so that no one can mess with internal state.\n\t */\n\tArraySet.prototype.toArray = function ArraySet_toArray() {\n\t return this._array.slice();\n\t};\n\t\n\texports.ArraySet = ArraySet;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2014 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\t\n\t/**\n\t * Determine whether mappingB is after mappingA with respect to generated\n\t * position.\n\t */\n\tfunction generatedPositionAfter(mappingA, mappingB) {\n\t // Optimized for most common case\n\t var lineA = mappingA.generatedLine;\n\t var lineB = mappingB.generatedLine;\n\t var columnA = mappingA.generatedColumn;\n\t var columnB = mappingB.generatedColumn;\n\t return lineB > lineA || lineB == lineA && columnB >= columnA ||\n\t util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n\t}\n\t\n\t/**\n\t * A data structure to provide a sorted view of accumulated mappings in a\n\t * performance conscious manner. It trades a neglibable overhead in general\n\t * case for a large speedup in case of mappings being added in order.\n\t */\n\tfunction MappingList() {\n\t this._array = [];\n\t this._sorted = true;\n\t // Serves as infimum\n\t this._last = {generatedLine: -1, generatedColumn: 0};\n\t}\n\t\n\t/**\n\t * Iterate through internal items. This method takes the same arguments that\n\t * `Array.prototype.forEach` takes.\n\t *\n\t * NOTE: The order of the mappings is NOT guaranteed.\n\t */\n\tMappingList.prototype.unsortedForEach =\n\t function MappingList_forEach(aCallback, aThisArg) {\n\t this._array.forEach(aCallback, aThisArg);\n\t };\n\t\n\t/**\n\t * Add the given source mapping.\n\t *\n\t * @param Object aMapping\n\t */\n\tMappingList.prototype.add = function MappingList_add(aMapping) {\n\t if (generatedPositionAfter(this._last, aMapping)) {\n\t this._last = aMapping;\n\t this._array.push(aMapping);\n\t } else {\n\t this._sorted = false;\n\t this._array.push(aMapping);\n\t }\n\t};\n\t\n\t/**\n\t * Returns the flat, sorted array of mappings. The mappings are sorted by\n\t * generated position.\n\t *\n\t * WARNING: This method returns internal data without copying, for\n\t * performance. The return value must NOT be mutated, and should be treated as\n\t * an immutable borrow. If you want to take ownership, you must make your own\n\t * copy.\n\t */\n\tMappingList.prototype.toArray = function MappingList_toArray() {\n\t if (!this._sorted) {\n\t this._array.sort(util.compareByGeneratedPositionsInflated);\n\t this._sorted = true;\n\t }\n\t return this._array;\n\t};\n\t\n\texports.MappingList = MappingList;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar binarySearch = __webpack_require__(8);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar base64VLQ = __webpack_require__(2);\n\tvar quickSort = __webpack_require__(9).quickSort;\n\t\n\tfunction SourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t return sourceMap.sections != null\n\t ? new IndexedSourceMapConsumer(sourceMap)\n\t : new BasicSourceMapConsumer(sourceMap);\n\t}\n\t\n\tSourceMapConsumer.fromSourceMap = function(aSourceMap) {\n\t return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n\t}\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tSourceMapConsumer.prototype._version = 3;\n\t\n\t// `__generatedMappings` and `__originalMappings` are arrays that hold the\n\t// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n\t// are lazily instantiated, accessed via the `_generatedMappings` and\n\t// `_originalMappings` getters respectively, and we only parse the mappings\n\t// and create these arrays once queried for a source location. We jump through\n\t// these hoops because there can be many thousands of mappings, and parsing\n\t// them is expensive, so we only want to do it if we must.\n\t//\n\t// Each object in the arrays is of the form:\n\t//\n\t// {\n\t// generatedLine: The line number in the generated code,\n\t// generatedColumn: The column number in the generated code,\n\t// source: The path to the original source file that generated this\n\t// chunk of code,\n\t// originalLine: The line number in the original source that\n\t// corresponds to this chunk of generated code,\n\t// originalColumn: The column number in the original source that\n\t// corresponds to this chunk of generated code,\n\t// name: The name of the original symbol which generated this chunk of\n\t// code.\n\t// }\n\t//\n\t// All properties except for `generatedLine` and `generatedColumn` can be\n\t// `null`.\n\t//\n\t// `_generatedMappings` is ordered by the generated positions.\n\t//\n\t// `_originalMappings` is ordered by the original positions.\n\t\n\tSourceMapConsumer.prototype.__generatedMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n\t get: function () {\n\t if (!this.__generatedMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__generatedMappings;\n\t }\n\t});\n\t\n\tSourceMapConsumer.prototype.__originalMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n\t get: function () {\n\t if (!this.__originalMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__originalMappings;\n\t }\n\t});\n\t\n\tSourceMapConsumer.prototype._charIsMappingSeparator =\n\t function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n\t var c = aStr.charAt(index);\n\t return c === \";\" || c === \",\";\n\t };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t throw new Error(\"Subclasses must implement _parseMappings\");\n\t };\n\t\n\tSourceMapConsumer.GENERATED_ORDER = 1;\n\tSourceMapConsumer.ORIGINAL_ORDER = 2;\n\t\n\tSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n\tSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Iterate over each mapping between an original source/line/column and a\n\t * generated line/column in this source map.\n\t *\n\t * @param Function aCallback\n\t * The function that is called with each mapping.\n\t * @param Object aContext\n\t * Optional. If specified, this object will be the value of `this` every\n\t * time that `aCallback` is called.\n\t * @param aOrder\n\t * Either `SourceMapConsumer.GENERATED_ORDER` or\n\t * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n\t * iterate over the mappings sorted by the generated file's line/column\n\t * order or the original's source/line/column order, respectively. Defaults to\n\t * `SourceMapConsumer.GENERATED_ORDER`.\n\t */\n\tSourceMapConsumer.prototype.eachMapping =\n\t function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n\t var context = aContext || null;\n\t var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\t\n\t var mappings;\n\t switch (order) {\n\t case SourceMapConsumer.GENERATED_ORDER:\n\t mappings = this._generatedMappings;\n\t break;\n\t case SourceMapConsumer.ORIGINAL_ORDER:\n\t mappings = this._originalMappings;\n\t break;\n\t default:\n\t throw new Error(\"Unknown order of iteration.\");\n\t }\n\t\n\t var sourceRoot = this.sourceRoot;\n\t mappings.map(function (mapping) {\n\t var source = mapping.source === null ? null : this._sources.at(mapping.source);\n\t if (source != null && sourceRoot != null) {\n\t source = util.join(sourceRoot, source);\n\t }\n\t return {\n\t source: source,\n\t generatedLine: mapping.generatedLine,\n\t generatedColumn: mapping.generatedColumn,\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: mapping.name === null ? null : this._names.at(mapping.name)\n\t };\n\t }, this).forEach(aCallback, context);\n\t };\n\t\n\t/**\n\t * Returns all generated line and column information for the original source,\n\t * line, and column provided. If no column is provided, returns all mappings\n\t * corresponding to a either the line we are searching for or the next\n\t * closest line that has any mappings. Otherwise, returns all mappings\n\t * corresponding to the given line and either the column we are searching for\n\t * or the next closest column that has any offsets.\n\t *\n\t * The only argument is an object with the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: Optional. the column number in the original source.\n\t *\n\t * and an array of objects is returned, each with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\tSourceMapConsumer.prototype.allGeneratedPositionsFor =\n\t function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n\t var line = util.getArg(aArgs, 'line');\n\t\n\t // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n\t // returns the index of the closest mapping less than the needle. By\n\t // setting needle.originalColumn to 0, we thus find the last mapping for\n\t // the given line, provided such a mapping exists.\n\t var needle = {\n\t source: util.getArg(aArgs, 'source'),\n\t originalLine: line,\n\t originalColumn: util.getArg(aArgs, 'column', 0)\n\t };\n\t\n\t if (this.sourceRoot != null) {\n\t needle.source = util.relative(this.sourceRoot, needle.source);\n\t }\n\t if (!this._sources.has(needle.source)) {\n\t return [];\n\t }\n\t needle.source = this._sources.indexOf(needle.source);\n\t\n\t var mappings = [];\n\t\n\t var index = this._findMapping(needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t binarySearch.LEAST_UPPER_BOUND);\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (aArgs.column === undefined) {\n\t var originalLine = mapping.originalLine;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we found. Since\n\t // mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we found.\n\t while (mapping && mapping.originalLine === originalLine) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t } else {\n\t var originalColumn = mapping.originalColumn;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we were searching for.\n\t // Since mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we are searching for.\n\t while (mapping &&\n\t mapping.originalLine === line &&\n\t mapping.originalColumn == originalColumn) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t }\n\t }\n\t\n\t return mappings;\n\t };\n\t\n\texports.SourceMapConsumer = SourceMapConsumer;\n\t\n\t/**\n\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\n\t * query for information about the original file positions by giving it a file\n\t * position in the generated source.\n\t *\n\t * The only parameter is the raw source map (either as a JSON string, or\n\t * already parsed to an object). According to the spec, source maps have the\n\t * following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - sources: An array of URLs to the original source files.\n\t * - names: An array of identifiers which can be referrenced by individual mappings.\n\t * - sourceRoot: Optional. The URL root from which all sources are relative.\n\t * - sourcesContent: Optional. An array of contents of the original source files.\n\t * - mappings: A string of base64 VLQs which contain the actual mappings.\n\t * - file: Optional. The generated file this source map is associated with.\n\t *\n\t * Here is an example source map, taken from the source map spec[0]:\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"out.js\",\n\t * sourceRoot : \"\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AA,AB;;ABCDE;\"\n\t * }\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\tfunction BasicSourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sources = util.getArg(sourceMap, 'sources');\n\t // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n\t // requires the array) to play nice here.\n\t var names = util.getArg(sourceMap, 'names', []);\n\t var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n\t var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n\t var mappings = util.getArg(sourceMap, 'mappings');\n\t var file = util.getArg(sourceMap, 'file', null);\n\t\n\t // Once again, Sass deviates from the spec and supplies the version as a\n\t // string rather than a number, so we use loose equality checking here.\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t sources = sources\n\t .map(String)\n\t // Some source maps produce relative source paths like \"./foo.js\" instead of\n\t // \"foo.js\". Normalize these first so that future comparisons will succeed.\n\t // See bugzil.la/1090768.\n\t .map(util.normalize)\n\t // Always ensure that absolute sources are internally stored relative to\n\t // the source root, if the source root is absolute. Not doing this would\n\t // be particularly problematic when the source root is a prefix of the\n\t // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n\t .map(function (source) {\n\t return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n\t ? util.relative(sourceRoot, source)\n\t : source;\n\t });\n\t\n\t // Pass `true` below to allow duplicate names and sources. While source maps\n\t // are intended to be compressed and deduplicated, the TypeScript compiler\n\t // sometimes generates source maps with duplicates in them. See Github issue\n\t // #72 and bugzil.la/889492.\n\t this._names = ArraySet.fromArray(names.map(String), true);\n\t this._sources = ArraySet.fromArray(sources, true);\n\t\n\t this.sourceRoot = sourceRoot;\n\t this.sourcesContent = sourcesContent;\n\t this._mappings = mappings;\n\t this.file = file;\n\t}\n\t\n\tBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\t\n\t/**\n\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n\t *\n\t * @param SourceMapGenerator aSourceMap\n\t * The source map that will be consumed.\n\t * @returns BasicSourceMapConsumer\n\t */\n\tBasicSourceMapConsumer.fromSourceMap =\n\t function SourceMapConsumer_fromSourceMap(aSourceMap) {\n\t var smc = Object.create(BasicSourceMapConsumer.prototype);\n\t\n\t var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n\t var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n\t smc.sourceRoot = aSourceMap._sourceRoot;\n\t smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n\t smc.sourceRoot);\n\t smc.file = aSourceMap._file;\n\t\n\t // Because we are modifying the entries (by converting string sources and\n\t // names to indices into the sources and names ArraySets), we have to make\n\t // a copy of the entry or else bad things happen. Shared mutable state\n\t // strikes again! See github issue #191.\n\t\n\t var generatedMappings = aSourceMap._mappings.toArray().slice();\n\t var destGeneratedMappings = smc.__generatedMappings = [];\n\t var destOriginalMappings = smc.__originalMappings = [];\n\t\n\t for (var i = 0, length = generatedMappings.length; i < length; i++) {\n\t var srcMapping = generatedMappings[i];\n\t var destMapping = new Mapping;\n\t destMapping.generatedLine = srcMapping.generatedLine;\n\t destMapping.generatedColumn = srcMapping.generatedColumn;\n\t\n\t if (srcMapping.source) {\n\t destMapping.source = sources.indexOf(srcMapping.source);\n\t destMapping.originalLine = srcMapping.originalLine;\n\t destMapping.originalColumn = srcMapping.originalColumn;\n\t\n\t if (srcMapping.name) {\n\t destMapping.name = names.indexOf(srcMapping.name);\n\t }\n\t\n\t destOriginalMappings.push(destMapping);\n\t }\n\t\n\t destGeneratedMappings.push(destMapping);\n\t }\n\t\n\t quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\t\n\t return smc;\n\t };\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tBasicSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t return this._sources.toArray().map(function (s) {\n\t return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n\t }, this);\n\t }\n\t});\n\t\n\t/**\n\t * Provide the JIT with a nice shape / hidden class.\n\t */\n\tfunction Mapping() {\n\t this.generatedLine = 0;\n\t this.generatedColumn = 0;\n\t this.source = null;\n\t this.originalLine = null;\n\t this.originalColumn = null;\n\t this.name = null;\n\t}\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tBasicSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t var generatedLine = 1;\n\t var previousGeneratedColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousOriginalColumn = 0;\n\t var previousSource = 0;\n\t var previousName = 0;\n\t var length = aStr.length;\n\t var index = 0;\n\t var cachedSegments = {};\n\t var temp = {};\n\t var originalMappings = [];\n\t var generatedMappings = [];\n\t var mapping, str, segment, end, value;\n\t\n\t while (index < length) {\n\t if (aStr.charAt(index) === ';') {\n\t generatedLine++;\n\t index++;\n\t previousGeneratedColumn = 0;\n\t }\n\t else if (aStr.charAt(index) === ',') {\n\t index++;\n\t }\n\t else {\n\t mapping = new Mapping();\n\t mapping.generatedLine = generatedLine;\n\t\n\t // Because each offset is encoded relative to the previous one,\n\t // many segments often have the same encoding. We can exploit this\n\t // fact by caching the parsed variable length fields of each segment,\n\t // allowing us to avoid a second parse if we encounter the same\n\t // segment again.\n\t for (end = index; end < length; end++) {\n\t if (this._charIsMappingSeparator(aStr, end)) {\n\t break;\n\t }\n\t }\n\t str = aStr.slice(index, end);\n\t\n\t segment = cachedSegments[str];\n\t if (segment) {\n\t index += str.length;\n\t } else {\n\t segment = [];\n\t while (index < end) {\n\t base64VLQ.decode(aStr, index, temp);\n\t value = temp.value;\n\t index = temp.rest;\n\t segment.push(value);\n\t }\n\t\n\t if (segment.length === 2) {\n\t throw new Error('Found a source, but no line and column');\n\t }\n\t\n\t if (segment.length === 3) {\n\t throw new Error('Found a source and line, but no column');\n\t }\n\t\n\t cachedSegments[str] = segment;\n\t }\n\t\n\t // Generated column.\n\t mapping.generatedColumn = previousGeneratedColumn + segment[0];\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (segment.length > 1) {\n\t // Original source.\n\t mapping.source = previousSource + segment[1];\n\t previousSource += segment[1];\n\t\n\t // Original line.\n\t mapping.originalLine = previousOriginalLine + segment[2];\n\t previousOriginalLine = mapping.originalLine;\n\t // Lines are stored 0-based\n\t mapping.originalLine += 1;\n\t\n\t // Original column.\n\t mapping.originalColumn = previousOriginalColumn + segment[3];\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (segment.length > 4) {\n\t // Original name.\n\t mapping.name = previousName + segment[4];\n\t previousName += segment[4];\n\t }\n\t }\n\t\n\t generatedMappings.push(mapping);\n\t if (typeof mapping.originalLine === 'number') {\n\t originalMappings.push(mapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t this.__generatedMappings = generatedMappings;\n\t\n\t quickSort(originalMappings, util.compareByOriginalPositions);\n\t this.__originalMappings = originalMappings;\n\t };\n\t\n\t/**\n\t * Find the mapping that best matches the hypothetical \"needle\" mapping that\n\t * we are searching for in the given \"haystack\" of mappings.\n\t */\n\tBasicSourceMapConsumer.prototype._findMapping =\n\t function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n\t aColumnName, aComparator, aBias) {\n\t // To return the position we are searching for, we must first find the\n\t // mapping for the given position and then return the opposite position it\n\t // points to. Because the mappings are sorted, we can use binary search to\n\t // find the best mapping.\n\t\n\t if (aNeedle[aLineName] <= 0) {\n\t throw new TypeError('Line must be greater than or equal to 1, got '\n\t + aNeedle[aLineName]);\n\t }\n\t if (aNeedle[aColumnName] < 0) {\n\t throw new TypeError('Column must be greater than or equal to 0, got '\n\t + aNeedle[aColumnName]);\n\t }\n\t\n\t return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n\t };\n\t\n\t/**\n\t * Compute the last column for each generated mapping. The last column is\n\t * inclusive.\n\t */\n\tBasicSourceMapConsumer.prototype.computeColumnSpans =\n\t function SourceMapConsumer_computeColumnSpans() {\n\t for (var index = 0; index < this._generatedMappings.length; ++index) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t // Mappings do not contain a field for the last generated columnt. We\n\t // can come up with an optimistic estimate, however, by assuming that\n\t // mappings are contiguous (i.e. given two consecutive mappings, the\n\t // first mapping ends where the second one starts).\n\t if (index + 1 < this._generatedMappings.length) {\n\t var nextMapping = this._generatedMappings[index + 1];\n\t\n\t if (mapping.generatedLine === nextMapping.generatedLine) {\n\t mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n\t continue;\n\t }\n\t }\n\t\n\t // The last mapping for each line spans the entire line.\n\t mapping.lastGeneratedColumn = Infinity;\n\t }\n\t };\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source.\n\t * - column: The column number in the generated source.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null.\n\t * - column: The column number in the original source, or null.\n\t * - name: The original identifier, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.originalPositionFor =\n\t function SourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._generatedMappings,\n\t \"generatedLine\",\n\t \"generatedColumn\",\n\t util.compareByGeneratedPositionsDeflated,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t if (mapping.generatedLine === needle.generatedLine) {\n\t var source = util.getArg(mapping, 'source', null);\n\t if (source !== null) {\n\t source = this._sources.at(source);\n\t if (this.sourceRoot != null) {\n\t source = util.join(this.sourceRoot, source);\n\t }\n\t }\n\t var name = util.getArg(mapping, 'name', null);\n\t if (name !== null) {\n\t name = this._names.at(name);\n\t }\n\t return {\n\t source: source,\n\t line: util.getArg(mapping, 'originalLine', null),\n\t column: util.getArg(mapping, 'originalColumn', null),\n\t name: name\n\t };\n\t }\n\t }\n\t\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function BasicSourceMapConsumer_hasContentsOfAllSources() {\n\t if (!this.sourcesContent) {\n\t return false;\n\t }\n\t return this.sourcesContent.length >= this._sources.size() &&\n\t !this.sourcesContent.some(function (sc) { return sc == null; });\n\t };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tBasicSourceMapConsumer.prototype.sourceContentFor =\n\t function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t if (!this.sourcesContent) {\n\t return null;\n\t }\n\t\n\t if (this.sourceRoot != null) {\n\t aSource = util.relative(this.sourceRoot, aSource);\n\t }\n\t\n\t if (this._sources.has(aSource)) {\n\t return this.sourcesContent[this._sources.indexOf(aSource)];\n\t }\n\t\n\t var url;\n\t if (this.sourceRoot != null\n\t && (url = util.urlParse(this.sourceRoot))) {\n\t // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n\t // many users. We can help them out when they expect file:// URIs to\n\t // behave like it would if they were running a local HTTP server. See\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n\t var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n\t if (url.scheme == \"file\"\n\t && this._sources.has(fileUriAbsPath)) {\n\t return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n\t }\n\t\n\t if ((!url.path || url.path == \"/\")\n\t && this._sources.has(\"/\" + aSource)) {\n\t return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n\t }\n\t }\n\t\n\t // This function is used recursively from\n\t // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n\t // don't want to throw if we can't find the source - we just want to\n\t // return null, so we provide a flag to exit gracefully.\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: The column number in the original source.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.generatedPositionFor =\n\t function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t var source = util.getArg(aArgs, 'source');\n\t if (this.sourceRoot != null) {\n\t source = util.relative(this.sourceRoot, source);\n\t }\n\t if (!this._sources.has(source)) {\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t }\n\t source = this._sources.indexOf(source);\n\t\n\t var needle = {\n\t source: source,\n\t originalLine: util.getArg(aArgs, 'line'),\n\t originalColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (mapping.source === needle.source) {\n\t return {\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t };\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t };\n\t\n\texports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\t\n\t/**\n\t * An IndexedSourceMapConsumer instance represents a parsed source map which\n\t * we can query for information. It differs from BasicSourceMapConsumer in\n\t * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n\t * input.\n\t *\n\t * The only parameter is a raw source map (either as a JSON string, or already\n\t * parsed to an object). According to the spec for indexed source maps, they\n\t * have the following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - file: Optional. The generated file this source map is associated with.\n\t * - sections: A list of section definitions.\n\t *\n\t * Each value under the \"sections\" field has two fields:\n\t * - offset: The offset into the original specified at which this section\n\t * begins to apply, defined as an object with a \"line\" and \"column\"\n\t * field.\n\t * - map: A source map definition. This source map could also be indexed,\n\t * but doesn't have to be.\n\t *\n\t * Instead of the \"map\" field, it's also possible to have a \"url\" field\n\t * specifying a URL to retrieve a source map from, but that's currently\n\t * unsupported.\n\t *\n\t * Here's an example source map, taken from the source map spec[0], but\n\t * modified to omit a section which uses the \"url\" field.\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"app.js\",\n\t * sections: [{\n\t * offset: {line:100, column:10},\n\t * map: {\n\t * version : 3,\n\t * file: \"section.js\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AAAA,E;;ABCDE;\"\n\t * }\n\t * }],\n\t * }\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\tfunction IndexedSourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sections = util.getArg(sourceMap, 'sections');\n\t\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t this._sources = new ArraySet();\n\t this._names = new ArraySet();\n\t\n\t var lastOffset = {\n\t line: -1,\n\t column: 0\n\t };\n\t this._sections = sections.map(function (s) {\n\t if (s.url) {\n\t // The url field will require support for asynchronicity.\n\t // See https://github.com/mozilla/source-map/issues/16\n\t throw new Error('Support for url field in sections not implemented.');\n\t }\n\t var offset = util.getArg(s, 'offset');\n\t var offsetLine = util.getArg(offset, 'line');\n\t var offsetColumn = util.getArg(offset, 'column');\n\t\n\t if (offsetLine < lastOffset.line ||\n\t (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n\t throw new Error('Section offsets must be ordered and non-overlapping.');\n\t }\n\t lastOffset = offset;\n\t\n\t return {\n\t generatedOffset: {\n\t // The offset fields are 0-based, but we use 1-based indices when\n\t // encoding/decoding from VLQ.\n\t generatedLine: offsetLine + 1,\n\t generatedColumn: offsetColumn + 1\n\t },\n\t consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n\t }\n\t });\n\t}\n\t\n\tIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tIndexedSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t var sources = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n\t sources.push(this._sections[i].consumer.sources[j]);\n\t }\n\t }\n\t return sources;\n\t }\n\t});\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source.\n\t * - column: The column number in the generated source.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null.\n\t * - column: The column number in the original source, or null.\n\t * - name: The original identifier, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.originalPositionFor =\n\t function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t // Find the section containing the generated position we're trying to map\n\t // to an original position.\n\t var sectionIndex = binarySearch.search(needle, this._sections,\n\t function(needle, section) {\n\t var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n\t if (cmp) {\n\t return cmp;\n\t }\n\t\n\t return (needle.generatedColumn -\n\t section.generatedOffset.generatedColumn);\n\t });\n\t var section = this._sections[sectionIndex];\n\t\n\t if (!section) {\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t }\n\t\n\t return section.consumer.originalPositionFor({\n\t line: needle.generatedLine -\n\t (section.generatedOffset.generatedLine - 1),\n\t column: needle.generatedColumn -\n\t (section.generatedOffset.generatedLine === needle.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t bias: aArgs.bias\n\t });\n\t };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n\t return this._sections.every(function (s) {\n\t return s.consumer.hasContentsOfAllSources();\n\t });\n\t };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tIndexedSourceMapConsumer.prototype.sourceContentFor =\n\t function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t var content = section.consumer.sourceContentFor(aSource, true);\n\t if (content) {\n\t return content;\n\t }\n\t }\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: The column number in the original source.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.generatedPositionFor =\n\t function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t // Only consider this section if the requested source is in the list of\n\t // sources of the consumer.\n\t if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n\t continue;\n\t }\n\t var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n\t if (generatedPosition) {\n\t var ret = {\n\t line: generatedPosition.line +\n\t (section.generatedOffset.generatedLine - 1),\n\t column: generatedPosition.column +\n\t (section.generatedOffset.generatedLine === generatedPosition.line\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0)\n\t };\n\t return ret;\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null\n\t };\n\t };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tIndexedSourceMapConsumer.prototype._parseMappings =\n\t function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t this.__generatedMappings = [];\n\t this.__originalMappings = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t var sectionMappings = section.consumer._generatedMappings;\n\t for (var j = 0; j < sectionMappings.length; j++) {\n\t var mapping = sectionMappings[j];\n\t\n\t var source = section.consumer._sources.at(mapping.source);\n\t if (section.consumer.sourceRoot !== null) {\n\t source = util.join(section.consumer.sourceRoot, source);\n\t }\n\t this._sources.add(source);\n\t source = this._sources.indexOf(source);\n\t\n\t var name = section.consumer._names.at(mapping.name);\n\t this._names.add(name);\n\t name = this._names.indexOf(name);\n\t\n\t // The mappings coming from the consumer for the section have\n\t // generated positions relative to the start of the section, so we\n\t // need to offset them to be relative to the start of the concatenated\n\t // generated file.\n\t var adjustedMapping = {\n\t source: source,\n\t generatedLine: mapping.generatedLine +\n\t (section.generatedOffset.generatedLine - 1),\n\t generatedColumn: mapping.generatedColumn +\n\t (section.generatedOffset.generatedLine === mapping.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: name\n\t };\n\t\n\t this.__generatedMappings.push(adjustedMapping);\n\t if (typeof adjustedMapping.originalLine === 'number') {\n\t this.__originalMappings.push(adjustedMapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t quickSort(this.__originalMappings, util.compareByOriginalPositions);\n\t };\n\t\n\texports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\texports.GREATEST_LOWER_BOUND = 1;\n\texports.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Recursive implementation of binary search.\n\t *\n\t * @param aLow Indices here and lower do not contain the needle.\n\t * @param aHigh Indices here and higher do not contain the needle.\n\t * @param aNeedle The element being searched for.\n\t * @param aHaystack The non-empty array being searched.\n\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t */\n\tfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n\t // This function terminates when one of the following is true:\n\t //\n\t // 1. We find the exact element we are looking for.\n\t //\n\t // 2. We did not find the exact element, but we can return the index of\n\t // the next-closest element.\n\t //\n\t // 3. We did not find the exact element, and there is no next-closest\n\t // element than the one we are searching for, so we return -1.\n\t var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n\t var cmp = aCompare(aNeedle, aHaystack[mid], true);\n\t if (cmp === 0) {\n\t // Found the element we are looking for.\n\t return mid;\n\t }\n\t else if (cmp > 0) {\n\t // Our needle is greater than aHaystack[mid].\n\t if (aHigh - mid > 1) {\n\t // The element is in the upper half.\n\t return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // The exact needle element was not found in this haystack. Determine if\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return aHigh < aHaystack.length ? aHigh : -1;\n\t } else {\n\t return mid;\n\t }\n\t }\n\t else {\n\t // Our needle is less than aHaystack[mid].\n\t if (mid - aLow > 1) {\n\t // The element is in the lower half.\n\t return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return mid;\n\t } else {\n\t return aLow < 0 ? -1 : aLow;\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * This is an implementation of binary search which will always try and return\n\t * the index of the closest element if there is no exact hit. This is because\n\t * mappings between original and generated line/col pairs are single points,\n\t * and there is an implicit region between each of them, so a miss just means\n\t * that you aren't on the very start of a region.\n\t *\n\t * @param aNeedle The element you are looking for.\n\t * @param aHaystack The array that is being searched.\n\t * @param aCompare A function which takes the needle and an element in the\n\t * array and returns -1, 0, or 1 depending on whether the needle is less\n\t * than, equal to, or greater than the element, respectively.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n\t */\n\texports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n\t if (aHaystack.length === 0) {\n\t return -1;\n\t }\n\t\n\t var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n\t aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n\t if (index < 0) {\n\t return -1;\n\t }\n\t\n\t // We have found either the exact element, or the next-closest element than\n\t // the one we are searching for. However, there may be more than one such\n\t // element. Make sure we always return the smallest of these.\n\t while (index - 1 >= 0) {\n\t if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n\t break;\n\t }\n\t --index;\n\t }\n\t\n\t return index;\n\t};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t// It turns out that some (most?) JavaScript engines don't self-host\n\t// `Array.prototype.sort`. This makes sense because C++ will likely remain\n\t// faster than JS when doing raw CPU-intensive sorting. However, when using a\n\t// custom comparator function, calling back and forth between the VM's C++ and\n\t// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n\t// worse generated code for the comparator function than would be optimal. In\n\t// fact, when sorting with a comparator, these costs outweigh the benefits of\n\t// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n\t// a ~3500ms mean speed-up in `bench/bench.html`.\n\t\n\t/**\n\t * Swap the elements indexed by `x` and `y` in the array `ary`.\n\t *\n\t * @param {Array} ary\n\t * The array.\n\t * @param {Number} x\n\t * The index of the first item.\n\t * @param {Number} y\n\t * The index of the second item.\n\t */\n\tfunction swap(ary, x, y) {\n\t var temp = ary[x];\n\t ary[x] = ary[y];\n\t ary[y] = temp;\n\t}\n\t\n\t/**\n\t * Returns a random integer within the range `low .. high` inclusive.\n\t *\n\t * @param {Number} low\n\t * The lower bound on the range.\n\t * @param {Number} high\n\t * The upper bound on the range.\n\t */\n\tfunction randomIntInRange(low, high) {\n\t return Math.round(low + (Math.random() * (high - low)));\n\t}\n\t\n\t/**\n\t * The Quick Sort algorithm.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t * @param {Number} p\n\t * Start index of the array\n\t * @param {Number} r\n\t * End index of the array\n\t */\n\tfunction doQuickSort(ary, comparator, p, r) {\n\t // If our lower bound is less than our upper bound, we (1) partition the\n\t // array into two pieces and (2) recurse on each half. If it is not, this is\n\t // the empty array and our base case.\n\t\n\t if (p < r) {\n\t // (1) Partitioning.\n\t //\n\t // The partitioning chooses a pivot between `p` and `r` and moves all\n\t // elements that are less than or equal to the pivot to the before it, and\n\t // all the elements that are greater than it after it. The effect is that\n\t // once partition is done, the pivot is in the exact place it will be when\n\t // the array is put in sorted order, and it will not need to be moved\n\t // again. This runs in O(n) time.\n\t\n\t // Always choose a random pivot so that an input array which is reverse\n\t // sorted does not cause O(n^2) running time.\n\t var pivotIndex = randomIntInRange(p, r);\n\t var i = p - 1;\n\t\n\t swap(ary, pivotIndex, r);\n\t var pivot = ary[r];\n\t\n\t // Immediately after `j` is incremented in this loop, the following hold\n\t // true:\n\t //\n\t // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n\t //\n\t // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n\t for (var j = p; j < r; j++) {\n\t if (comparator(ary[j], pivot) <= 0) {\n\t i += 1;\n\t swap(ary, i, j);\n\t }\n\t }\n\t\n\t swap(ary, i + 1, j);\n\t var q = i + 1;\n\t\n\t // (2) Recurse on each half.\n\t\n\t doQuickSort(ary, comparator, p, q - 1);\n\t doQuickSort(ary, comparator, q + 1, r);\n\t }\n\t}\n\t\n\t/**\n\t * Sort the given array in-place with the given comparator function.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t */\n\texports.quickSort = function (ary, comparator) {\n\t doQuickSort(ary, comparator, 0, ary.length - 1);\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\tvar util = __webpack_require__(4);\n\t\n\t// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n\t// operating systems these days (capturing the result).\n\tvar REGEX_NEWLINE = /(\\r?\\n)/;\n\t\n\t// Newline character code for charCodeAt() comparisons\n\tvar NEWLINE_CODE = 10;\n\t\n\t// Private symbol for identifying `SourceNode`s when multiple versions of\n\t// the source-map library are loaded. This MUST NOT CHANGE across\n\t// versions!\n\tvar isSourceNode = \"$$$isSourceNode$$$\";\n\t\n\t/**\n\t * SourceNodes provide a way to abstract over interpolating/concatenating\n\t * snippets of generated JavaScript source code while maintaining the line and\n\t * column information associated with the original source code.\n\t *\n\t * @param aLine The original line number.\n\t * @param aColumn The original column number.\n\t * @param aSource The original source's filename.\n\t * @param aChunks Optional. An array of strings which are snippets of\n\t * generated JS, or other SourceNodes.\n\t * @param aName The original identifier.\n\t */\n\tfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n\t this.children = [];\n\t this.sourceContents = {};\n\t this.line = aLine == null ? null : aLine;\n\t this.column = aColumn == null ? null : aColumn;\n\t this.source = aSource == null ? null : aSource;\n\t this.name = aName == null ? null : aName;\n\t this[isSourceNode] = true;\n\t if (aChunks != null) this.add(aChunks);\n\t}\n\t\n\t/**\n\t * Creates a SourceNode from generated code and a SourceMapConsumer.\n\t *\n\t * @param aGeneratedCode The generated code\n\t * @param aSourceMapConsumer The SourceMap for the generated code\n\t * @param aRelativePath Optional. The path that relative sources in the\n\t * SourceMapConsumer should be relative to.\n\t */\n\tSourceNode.fromStringWithSourceMap =\n\t function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n\t // The SourceNode we want to fill with the generated code\n\t // and the SourceMap\n\t var node = new SourceNode();\n\t\n\t // All even indices of this array are one line of the generated code,\n\t // while all odd indices are the newlines between two adjacent lines\n\t // (since `REGEX_NEWLINE` captures its match).\n\t // Processed fragments are accessed by calling `shiftNextLine`.\n\t var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n\t var remainingLinesIndex = 0;\n\t var shiftNextLine = function() {\n\t var lineContents = getNextLine();\n\t // The last line of a file might not have a newline.\n\t var newLine = getNextLine() || \"\";\n\t return lineContents + newLine;\n\t\n\t function getNextLine() {\n\t return remainingLinesIndex < remainingLines.length ?\n\t remainingLines[remainingLinesIndex++] : undefined;\n\t }\n\t };\n\t\n\t // We need to remember the position of \"remainingLines\"\n\t var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\t\n\t // The generate SourceNodes we need a code range.\n\t // To extract it current and last mapping is used.\n\t // Here we store the last mapping.\n\t var lastMapping = null;\n\t\n\t aSourceMapConsumer.eachMapping(function (mapping) {\n\t if (lastMapping !== null) {\n\t // We add the code from \"lastMapping\" to \"mapping\":\n\t // First check if there is a new line in between.\n\t if (lastGeneratedLine < mapping.generatedLine) {\n\t // Associate first line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t lastGeneratedLine++;\n\t lastGeneratedColumn = 0;\n\t // The remaining code is added without mapping\n\t } else {\n\t // There is no new line in between.\n\t // Associate the code between \"lastGeneratedColumn\" and\n\t // \"mapping.generatedColumn\" with \"lastMapping\"\n\t var nextLine = remainingLines[remainingLinesIndex];\n\t var code = nextLine.substr(0, mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t addMappingWithCode(lastMapping, code);\n\t // No more remaining code, continue\n\t lastMapping = mapping;\n\t return;\n\t }\n\t }\n\t // We add the generated code until the first mapping\n\t // to the SourceNode without any mapping.\n\t // Each line is added as separate string.\n\t while (lastGeneratedLine < mapping.generatedLine) {\n\t node.add(shiftNextLine());\n\t lastGeneratedLine++;\n\t }\n\t if (lastGeneratedColumn < mapping.generatedColumn) {\n\t var nextLine = remainingLines[remainingLinesIndex];\n\t node.add(nextLine.substr(0, mapping.generatedColumn));\n\t remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t }\n\t lastMapping = mapping;\n\t }, this);\n\t // We have processed all mappings.\n\t if (remainingLinesIndex < remainingLines.length) {\n\t if (lastMapping) {\n\t // Associate the remaining code in the current line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t }\n\t // and add the remaining lines without any mapping\n\t node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n\t }\n\t\n\t // Copy sourcesContent into SourceNode\n\t aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t if (content != null) {\n\t if (aRelativePath != null) {\n\t sourceFile = util.join(aRelativePath, sourceFile);\n\t }\n\t node.setSourceContent(sourceFile, content);\n\t }\n\t });\n\t\n\t return node;\n\t\n\t function addMappingWithCode(mapping, code) {\n\t if (mapping === null || mapping.source === undefined) {\n\t node.add(code);\n\t } else {\n\t var source = aRelativePath\n\t ? util.join(aRelativePath, mapping.source)\n\t : mapping.source;\n\t node.add(new SourceNode(mapping.originalLine,\n\t mapping.originalColumn,\n\t source,\n\t code,\n\t mapping.name));\n\t }\n\t }\n\t };\n\t\n\t/**\n\t * Add a chunk of generated JS to this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.add = function SourceNode_add(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t aChunk.forEach(function (chunk) {\n\t this.add(chunk);\n\t }, this);\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t if (aChunk) {\n\t this.children.push(aChunk);\n\t }\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Add a chunk of generated JS to the beginning of this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t for (var i = aChunk.length-1; i >= 0; i--) {\n\t this.prepend(aChunk[i]);\n\t }\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t this.children.unshift(aChunk);\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Walk over the tree of JS snippets in this node and its children. The\n\t * walking function is called once for each snippet of JS and is passed that\n\t * snippet and the its original associated source's line/column location.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n\t var chunk;\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t chunk = this.children[i];\n\t if (chunk[isSourceNode]) {\n\t chunk.walk(aFn);\n\t }\n\t else {\n\t if (chunk !== '') {\n\t aFn(chunk, { source: this.source,\n\t line: this.line,\n\t column: this.column,\n\t name: this.name });\n\t }\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n\t * each of `this.children`.\n\t *\n\t * @param aSep The separator.\n\t */\n\tSourceNode.prototype.join = function SourceNode_join(aSep) {\n\t var newChildren;\n\t var i;\n\t var len = this.children.length;\n\t if (len > 0) {\n\t newChildren = [];\n\t for (i = 0; i < len-1; i++) {\n\t newChildren.push(this.children[i]);\n\t newChildren.push(aSep);\n\t }\n\t newChildren.push(this.children[i]);\n\t this.children = newChildren;\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Call String.prototype.replace on the very right-most source snippet. Useful\n\t * for trimming whitespace from the end of a source node, etc.\n\t *\n\t * @param aPattern The pattern to replace.\n\t * @param aReplacement The thing to replace the pattern with.\n\t */\n\tSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n\t var lastChild = this.children[this.children.length - 1];\n\t if (lastChild[isSourceNode]) {\n\t lastChild.replaceRight(aPattern, aReplacement);\n\t }\n\t else if (typeof lastChild === 'string') {\n\t this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n\t }\n\t else {\n\t this.children.push(''.replace(aPattern, aReplacement));\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Set the source content for a source file. This will be added to the SourceMapGenerator\n\t * in the sourcesContent field.\n\t *\n\t * @param aSourceFile The filename of the source file\n\t * @param aSourceContent The content of the source file\n\t */\n\tSourceNode.prototype.setSourceContent =\n\t function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n\t this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n\t };\n\t\n\t/**\n\t * Walk over the tree of SourceNodes. The walking function is called for each\n\t * source file content and is passed the filename and source content.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walkSourceContents =\n\t function SourceNode_walkSourceContents(aFn) {\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t if (this.children[i][isSourceNode]) {\n\t this.children[i].walkSourceContents(aFn);\n\t }\n\t }\n\t\n\t var sources = Object.keys(this.sourceContents);\n\t for (var i = 0, len = sources.length; i < len; i++) {\n\t aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n\t }\n\t };\n\t\n\t/**\n\t * Return the string representation of this source node. Walks over the tree\n\t * and concatenates all the various snippets together to one string.\n\t */\n\tSourceNode.prototype.toString = function SourceNode_toString() {\n\t var str = \"\";\n\t this.walk(function (chunk) {\n\t str += chunk;\n\t });\n\t return str;\n\t};\n\t\n\t/**\n\t * Returns the string representation of this source node along with a source\n\t * map.\n\t */\n\tSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n\t var generated = {\n\t code: \"\",\n\t line: 1,\n\t column: 0\n\t };\n\t var map = new SourceMapGenerator(aArgs);\n\t var sourceMappingActive = false;\n\t var lastOriginalSource = null;\n\t var lastOriginalLine = null;\n\t var lastOriginalColumn = null;\n\t var lastOriginalName = null;\n\t this.walk(function (chunk, original) {\n\t generated.code += chunk;\n\t if (original.source !== null\n\t && original.line !== null\n\t && original.column !== null) {\n\t if(lastOriginalSource !== original.source\n\t || lastOriginalLine !== original.line\n\t || lastOriginalColumn !== original.column\n\t || lastOriginalName !== original.name) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t lastOriginalSource = original.source;\n\t lastOriginalLine = original.line;\n\t lastOriginalColumn = original.column;\n\t lastOriginalName = original.name;\n\t sourceMappingActive = true;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t }\n\t });\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t }\n\t for (var idx = 0, length = chunk.length; idx < length; idx++) {\n\t if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n\t generated.line++;\n\t generated.column = 0;\n\t // Mappings end at eol\n\t if (idx + 1 === length) {\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t } else {\n\t generated.column++;\n\t }\n\t }\n\t });\n\t this.walkSourceContents(function (sourceFile, sourceContent) {\n\t map.setSourceContent(sourceFile, sourceContent);\n\t });\n\t\n\t return { code: generated.code, map: map };\n\t};\n\t\n\texports.SourceNode = SourceNode;\n\n\n/***/ })\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// source-map.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 42c329f865e32e011afb","/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./source-map.js\n// module id = 0\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null) {\n source = String(source);\n if (!this._sources.has(source)) {\n this._sources.add(source);\n }\n }\n\n if (name != null) {\n name = String(name);\n if (!this._names.has(name)) {\n this._names.add(name);\n }\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = Object.create(null);\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n // When aOriginal is truthy but has empty values for .line and .column,\n // it is most likely a programmer error. In this case we throw a very\n // specific error message to try to guide them the right way.\n // For example: https://github.com/Polymer/polymer-bundler/pull/519\n if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n throw new Error(\n 'original.line and original.column are not numbers -- you probably meant to omit ' +\n 'the original mapping entirely and only map the generated position. If so, pass ' +\n 'null for the original mapping instead of an object with empty or null values.'\n );\n }\n\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var next;\n var mapping;\n var nameIdx;\n var sourceIdx;\n\n var mappings = this._mappings.toArray();\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n next = ''\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n next += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n next += ',';\n }\n }\n\n next += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n next += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n next += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n next += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n next += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n\n result += next;\n }\n\n return result;\n };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this.toJSON());\n };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-generator.js\n// module id = 1\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n// Continuation\n// | Sign\n// | |\n// V V\n// 101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (aIndex >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n\n digit = base64.decode(aStr.charCodeAt(aIndex++));\n if (digit === -1) {\n throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n }\n\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aIndex;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64-vlq.js\n// module id = 2\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n var bigA = 65; // 'A'\n var bigZ = 90; // 'Z'\n\n var littleA = 97; // 'a'\n var littleZ = 122; // 'z'\n\n var zero = 48; // '0'\n var nine = 57; // '9'\n\n var plus = 43; // '+'\n var slash = 47; // '/'\n\n var littleOffset = 26;\n var numberOffset = 52;\n\n // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n if (bigA <= charCode && charCode <= bigZ) {\n return (charCode - bigA);\n }\n\n // 26 - 51: abcdefghijklmnopqrstuvwxyz\n if (littleA <= charCode && charCode <= littleZ) {\n return (charCode - littleA + littleOffset);\n }\n\n // 52 - 61: 0123456789\n if (zero <= charCode && charCode <= nine) {\n return (charCode - zero + numberOffset);\n }\n\n // 62: +\n if (charCode == plus) {\n return 62;\n }\n\n // 63: /\n if (charCode == slash) {\n return 63;\n }\n\n // Invalid base64 digit.\n return -1;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64.js\n// module id = 3\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = exports.isAbsolute(path);\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n var level = 0;\n while (aPath.indexOf(aRoot + '/') !== 0) {\n var index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n var obj = Object.create(null);\n return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n if (isProtoString(aStr)) {\n return '$' + aStr;\n }\n\n return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n if (isProtoString(aStr)) {\n return aStr.slice(1);\n }\n\n return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n if (!s) {\n return false;\n }\n\n var length = s.length;\n\n if (length < 9 /* \"__proto__\".length */) {\n return false;\n }\n\n if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n s.charCodeAt(length - 9) !== 95 /* '_' */) {\n return false;\n }\n\n for (var i = length - 10; i >= 0; i--) {\n if (s.charCodeAt(i) !== 36 /* '$' */) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/util.js\n// module id = 4\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n this._array = [];\n this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n if (hasNativeMap) {\n this._set.set(aStr, idx);\n } else {\n this._set[sStr] = idx;\n }\n }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n if (hasNativeMap) {\n return this._set.has(aStr);\n } else {\n var sStr = util.toSetString(aStr);\n return has.call(this._set, sStr);\n }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n if (hasNativeMap) {\n var idx = this._set.get(aStr);\n if (idx >= 0) {\n return idx;\n }\n } else {\n var sStr = util.toSetString(aStr);\n if (has.call(this._set, sStr)) {\n return this._set[sStr];\n }\n }\n\n throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/array-set.js\n// module id = 5\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n};\n\nexports.MappingList = MappingList;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/mapping-list.js\n// module id = 6\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap)\n : new BasicSourceMapConsumer(sourceMap);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n// {\n// generatedLine: The line number in the generated code,\n// generatedColumn: The column number in the generated code,\n// source: The path to the original source file that generated this\n// chunk of code,\n// originalLine: The line number in the original source that\n// corresponds to this chunk of generated code,\n// originalColumn: The column number in the original source that\n// corresponds to this chunk of generated code,\n// name: The name of the original symbol which generated this chunk of\n// code.\n// }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n get: function () {\n if (!this.__generatedMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n get: function () {\n if (!this.__originalMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n var c = aStr.charAt(index);\n return c === \";\" || c === \",\";\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source === null ? null : this._sources.at(mapping.source);\n if (source != null && sourceRoot != null) {\n source = util.join(sourceRoot, source);\n }\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : this._names.at(mapping.name)\n };\n }, this).forEach(aCallback, context);\n };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: Optional. the column number in the original source.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n var line = util.getArg(aArgs, 'line');\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: line,\n originalColumn: util.getArg(aArgs, 'column', 0)\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n if (!this._sources.has(needle.source)) {\n return [];\n }\n needle.source = this._sources.indexOf(needle.source);\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n var originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n var originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The only parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n sources = sources\n .map(String)\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function (source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names.map(String), true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap) {\n var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n\n // Because we are modifying the entries (by converting string sources and\n // names to indices into the sources and names ArraySets), we have to make\n // a copy of the entry or else bad things happen. Shared mutable state\n // strikes again! See github issue #191.\n\n var generatedMappings = aSourceMap._mappings.toArray().slice();\n var destGeneratedMappings = smc.__generatedMappings = [];\n var destOriginalMappings = smc.__originalMappings = [];\n\n for (var i = 0, length = generatedMappings.length; i < length; i++) {\n var srcMapping = generatedMappings[i];\n var destMapping = new Mapping;\n destMapping.generatedLine = srcMapping.generatedLine;\n destMapping.generatedColumn = srcMapping.generatedColumn;\n\n if (srcMapping.source) {\n destMapping.source = sources.indexOf(srcMapping.source);\n destMapping.originalLine = srcMapping.originalLine;\n destMapping.originalColumn = srcMapping.originalColumn;\n\n if (srcMapping.name) {\n destMapping.name = names.indexOf(srcMapping.name);\n }\n\n destOriginalMappings.push(destMapping);\n }\n\n destGeneratedMappings.push(destMapping);\n }\n\n quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n return smc;\n };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._sources.toArray().map(function (s) {\n return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n }, this);\n }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var length = aStr.length;\n var index = 0;\n var cachedSegments = {};\n var temp = {};\n var originalMappings = [];\n var generatedMappings = [];\n var mapping, str, segment, end, value;\n\n while (index < length) {\n if (aStr.charAt(index) === ';') {\n generatedLine++;\n index++;\n previousGeneratedColumn = 0;\n }\n else if (aStr.charAt(index) === ',') {\n index++;\n }\n else {\n mapping = new Mapping();\n mapping.generatedLine = generatedLine;\n\n // Because each offset is encoded relative to the previous one,\n // many segments often have the same encoding. We can exploit this\n // fact by caching the parsed variable length fields of each segment,\n // allowing us to avoid a second parse if we encounter the same\n // segment again.\n for (end = index; end < length; end++) {\n if (this._charIsMappingSeparator(aStr, end)) {\n break;\n }\n }\n str = aStr.slice(index, end);\n\n segment = cachedSegments[str];\n if (segment) {\n index += str.length;\n } else {\n segment = [];\n while (index < end) {\n base64VLQ.decode(aStr, index, temp);\n value = temp.value;\n index = temp.rest;\n segment.push(value);\n }\n\n if (segment.length === 2) {\n throw new Error('Found a source, but no line and column');\n }\n\n if (segment.length === 3) {\n throw new Error('Found a source and line, but no column');\n }\n\n cachedSegments[str] = segment;\n }\n\n // Generated column.\n mapping.generatedColumn = previousGeneratedColumn + segment[0];\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (segment.length > 1) {\n // Original source.\n mapping.source = previousSource + segment[1];\n previousSource += segment[1];\n\n // Original line.\n mapping.originalLine = previousOriginalLine + segment[2];\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n\n // Original column.\n mapping.originalColumn = previousOriginalColumn + segment[3];\n previousOriginalColumn = mapping.originalColumn;\n\n if (segment.length > 4) {\n // Original name.\n mapping.name = previousName + segment[4];\n previousName += segment[4];\n }\n }\n\n generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n originalMappings.push(mapping);\n }\n }\n }\n\n quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n this.__generatedMappings = generatedMappings;\n\n quickSort(originalMappings, util.compareByOriginalPositions);\n this.__originalMappings = originalMappings;\n };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositionsDeflated,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source !== null) {\n source = this._sources.at(source);\n if (this.sourceRoot != null) {\n source = util.join(this.sourceRoot, source);\n }\n }\n var name = util.getArg(mapping, 'name', null);\n if (name !== null) {\n name = this._names.at(name);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n function BasicSourceMapConsumer_hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function (sc) { return sc == null; });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n if (this.sourceRoot != null) {\n aSource = util.relative(this.sourceRoot, aSource);\n }\n\n if (this._sources.has(aSource)) {\n return this.sourcesContent[this._sources.indexOf(aSource)];\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + aSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n if (this.sourceRoot != null) {\n source = util.relative(this.sourceRoot, source);\n }\n if (!this._sources.has(source)) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n source = this._sources.indexOf(source);\n\n var needle = {\n source: source,\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (mapping.source === needle.source) {\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The only parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sections = util.getArg(sourceMap, 'sections');\n\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n this._sources = new ArraySet();\n this._names = new ArraySet();\n\n var lastOffset = {\n line: -1,\n column: 0\n };\n this._sections = sections.map(function (s) {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error('Support for url field in sections not implemented.');\n }\n var offset = util.getArg(s, 'offset');\n var offsetLine = util.getArg(offset, 'line');\n var offsetColumn = util.getArg(offset, 'column');\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error('Section offsets must be ordered and non-overlapping.');\n }\n lastOffset = offset;\n\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n }\n });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n get: function () {\n var sources = [];\n for (var i = 0; i < this._sections.length; i++) {\n for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n var sectionIndex = binarySearch.search(needle, this._sections,\n function(needle, section) {\n var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (needle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n var section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n return this._sections.every(function (s) {\n return s.consumer.hasContentsOfAllSources();\n });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n var content = section.consumer.sourceContentFor(aSource, true);\n if (content) {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n continue;\n }\n var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n var ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n var sectionMappings = section.consumer._generatedMappings;\n for (var j = 0; j < sectionMappings.length; j++) {\n var mapping = sectionMappings[j];\n\n var source = section.consumer._sources.at(mapping.source);\n if (section.consumer.sourceRoot !== null) {\n source = util.join(section.consumer.sourceRoot, source);\n }\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n var adjustedMapping = {\n source: source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: name\n };\n\n this.__generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === 'number') {\n this.__originalMappings.push(adjustedMapping);\n }\n }\n }\n\n quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n quickSort(this.__originalMappings, util.compareByOriginalPositions);\n };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-consumer.js\n// module id = 7\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n } else {\n return mid;\n }\n }\n else {\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n } else {\n return aLow < 0 ? -1 : aLow;\n }\n }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/binary-search.js\n// module id = 8\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n * The array.\n * @param {Number} x\n * The index of the first item.\n * @param {Number} y\n * The index of the second item.\n */\nfunction swap(ary, x, y) {\n var temp = ary[x];\n ary[x] = ary[y];\n ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n * The lower bound on the range.\n * @param {Number} high\n * The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n * @param {Number} p\n * Start index of the array\n * @param {Number} r\n * End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n // If our lower bound is less than our upper bound, we (1) partition the\n // array into two pieces and (2) recurse on each half. If it is not, this is\n // the empty array and our base case.\n\n if (p < r) {\n // (1) Partitioning.\n //\n // The partitioning chooses a pivot between `p` and `r` and moves all\n // elements that are less than or equal to the pivot to the before it, and\n // all the elements that are greater than it after it. The effect is that\n // once partition is done, the pivot is in the exact place it will be when\n // the array is put in sorted order, and it will not need to be moved\n // again. This runs in O(n) time.\n\n // Always choose a random pivot so that an input array which is reverse\n // sorted does not cause O(n^2) running time.\n var pivotIndex = randomIntInRange(p, r);\n var i = p - 1;\n\n swap(ary, pivotIndex, r);\n var pivot = ary[r];\n\n // Immediately after `j` is incremented in this loop, the following hold\n // true:\n //\n // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n //\n // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n for (var j = p; j < r; j++) {\n if (comparator(ary[j], pivot) <= 0) {\n i += 1;\n swap(ary, i, j);\n }\n }\n\n swap(ary, i + 1, j);\n var q = i + 1;\n\n // (2) Recurse on each half.\n\n doQuickSort(ary, comparator, p, q - 1);\n doQuickSort(ary, comparator, q + 1, r);\n }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/quick-sort.js\n// module id = 9\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are accessed by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var remainingLinesIndex = 0;\n var shiftNextLine = function() {\n var lineContents = getNextLine();\n // The last line of a file might not have a newline.\n var newLine = getNextLine() || \"\";\n return lineContents + newLine;\n\n function getNextLine() {\n return remainingLinesIndex < remainingLines.length ?\n remainingLines[remainingLinesIndex++] : undefined;\n }\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[remainingLinesIndex];\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[remainingLinesIndex];\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLinesIndex < remainingLines.length) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-node.js\n// module id = 10\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/package.json b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/package.json new file mode 100644 index 00000000..048e3ae8 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/package.json @@ -0,0 +1,72 @@ +{ + "name": "source-map", + "description": "Generates and consumes source maps", + "version": "0.5.7", + "homepage": "https://github.com/mozilla/source-map", + "author": "Nick Fitzgerald ", + "contributors": [ + "Tobias Koppers ", + "Duncan Beevers ", + "Stephen Crane ", + "Ryan Seddon ", + "Miles Elam ", + "Mihai Bazon ", + "Michael Ficarra ", + "Todd Wolfson ", + "Alexander Solovyov ", + "Felix Gnass ", + "Conrad Irwin ", + "usrbincc ", + "David Glasser ", + "Chase Douglas ", + "Evan Wallace ", + "Heather Arthur ", + "Hugh Kennedy ", + "David Glasser ", + "Simon Lydell ", + "Jmeas Smith ", + "Michael Z Goddard ", + "azu ", + "John Gozde ", + "Adam Kirkton ", + "Chris Montgomery ", + "J. Ryan Stinnett ", + "Jack Herrington ", + "Chris Truter ", + "Daniel Espeset ", + "Jamie Wong ", + "Eddy Bruël ", + "Hawken Rives ", + "Gilad Peleg ", + "djchie ", + "Gary Ye ", + "Nicolas Lalevée " + ], + "repository": { + "type": "git", + "url": "http://github.com/mozilla/source-map.git" + }, + "main": "./source-map.js", + "files": [ + "source-map.js", + "lib/", + "dist/source-map.debug.js", + "dist/source-map.js", + "dist/source-map.min.js", + "dist/source-map.min.js.map" + ], + "engines": { + "node": ">=0.10.0" + }, + "license": "BSD-3-Clause", + "scripts": { + "test": "npm run build && node test/run-tests.js", + "build": "webpack --color", + "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md" + }, + "devDependencies": { + "doctoc": "^0.15.0", + "webpack": "^1.12.0" + }, + "typings": "source-map" +} diff --git a/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/source-map.js b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/source-map.js new file mode 100644 index 00000000..bc88fe82 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/node_modules/source-map/source-map.js @@ -0,0 +1,8 @@ +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; +exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; +exports.SourceNode = require('./lib/source-node').SourceNode; diff --git a/node_modules/vinyl-sourcemaps-apply/package.json b/node_modules/vinyl-sourcemaps-apply/package.json new file mode 100644 index 00000000..8cba9a13 --- /dev/null +++ b/node_modules/vinyl-sourcemaps-apply/package.json @@ -0,0 +1,22 @@ +{ + "name": "vinyl-sourcemaps-apply", + "version": "0.2.1", + "description": "Apply a source map to a vinyl file, merging it with preexisting source maps", + "homepage": "http://github.com/floridoo/vinyl-sourcemaps-apply", + "repository": "git://github.com/floridoo/vinyl-sourcemaps-apply.git", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "vinyl", + "sourcemaps", + "source maps", + "gulp" + ], + "author": "Florian Reiterer ", + "license": "ISC", + "dependencies": { + "source-map": "^0.5.1" + } +} diff --git a/node_modules/vinyl/LICENSE b/node_modules/vinyl/LICENSE new file mode 100644 index 00000000..84b3420e --- /dev/null +++ b/node_modules/vinyl/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/vinyl/README.md b/node_modules/vinyl/README.md new file mode 100644 index 00000000..40492a35 --- /dev/null +++ b/node_modules/vinyl/README.md @@ -0,0 +1,452 @@ +

      + + + +

      + +# vinyl + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Virtual file format. + +## What is Vinyl? + +Vinyl is a very simple metadata object that describes a file. When you think of a file, two attributes come to mind: `path` and `contents`. These are the main attributes on a Vinyl object. A file does not necessarily represent something on your computer’s file system. You have files on S3, FTP, Dropbox, Box, CloudThingly.io and other services. Vinyl can be used to describe files from all of these sources. + +## What is a Vinyl Adapter? + +While Vinyl provides a clean way to describe a file, we also need a way to access these files. Each file source needs what I call a "Vinyl adapter". A Vinyl adapter simply exposes a `src(globs)` and a `dest(folder)` method. Each return a stream. The `src` stream produces Vinyl objects, and the `dest` stream consumes Vinyl objects. Vinyl adapters can expose extra methods that might be specific to their input/output medium, such as the `symlink` method [`vinyl-fs`][vinyl-fs] provides. + +## Usage + +```js +var Vinyl = require('vinyl'); + +var jsFile = new Vinyl({ + cwd: '/', + base: '/test/', + path: '/test/file.js', + contents: Buffer.from('var x = 123') +}); +``` + +## API + +### `new Vinyl([options])` + +The constructor is used to create a new instance of `Vinyl`. Each instance represents a separate file, directory or symlink. + +All internally managed paths (`cwd`, `base`, `path`, `history`) are normalized and have trailing separators removed. See [Normalization and concatenation][normalization] for more information. + +Options may be passed upon instantiation to create a file with specific properties. + +#### `options` + +Options are not mutated by the constructor. + +##### `options.cwd` + +The current working directory of the file. + +Type: `String` + +Default: `process.cwd()` + +##### `options.base` + +Used for calculating the `relative` property. This is typically where a glob starts. + +Type: `String` + +Default: `options.cwd` + +##### `options.path` + +The full path to the file. + +Type: `String` + +Default: `undefined` + +##### `options.history` + +Stores the path history. If `options.path` and `options.history` are both passed, `options.path` is appended to `options.history`. All `options.history` paths are normalized by the `file.path` setter. + +Type: `Array` + +Default: `[]` (or `[options.path]` if `options.path` is passed) + +##### `options.stat` + +The result of an `fs.stat` call. This is how you mark the file as a directory or symbolic link. See [isDirectory()][is-directory], [isSymbolic()][is-symbolic] and [fs.Stats][fs-stats] for more information. + +Type: [`fs.Stats`][fs-stats] + +Default: `undefined` + +##### `options.contents` + +The contents of the file. If `options.contents` is a [`ReadableStream`][readable-stream], it is wrapped in a [`cloneable-readable`][cloneable-readable] stream. + +Type: [`ReadableStream`][readable-stream], [`Buffer`][buffer], or `null` + +Default: `null` + +##### `options.{custom}` + +Any other option properties will be directly assigned to the new Vinyl object. + +```js +var Vinyl = require('vinyl'); + +var file = new Vinyl({ foo: 'bar' }); +file.foo === 'bar'; // true +``` + +### Instance methods + +Each Vinyl object will have instance methods. Every method will be available but may return differently based on what properties were set upon instantiation or modified since. + +#### `file.isBuffer()` + +Returns `true` if the file contents are a [`Buffer`][buffer], otherwise `false`. + +#### `file.isStream()` + +Returns `true` if the file contents are a [`Stream`][stream], otherwise `false`. + +#### `file.isNull()` + +Returns `true` if the file contents are `null`, otherwise `false`. + +#### `file.isDirectory()` + +Returns `true` if the file represents a directory, otherwise `false`. + +A file is considered a directory when: + +- `file.isNull()` is `true` +- `file.stat` is an object +- `file.stat.isDirectory()` returns `true` + +When constructing a Vinyl object, pass in a valid [`fs.Stats`][fs-stats] object via `options.stat`. If you are mocking the [`fs.Stats`][fs-stats] object, you may need to stub the `isDirectory()` method. + +#### `file.isSymbolic()` + +Returns `true` if the file represents a symbolic link, otherwise `false`. + +A file is considered symbolic when: + +- `file.isNull()` is `true` +- `file.stat` is an object +- `file.stat.isSymbolicLink()` returns `true` + +When constructing a Vinyl object, pass in a valid [`fs.Stats`][fs-stats] object via `options.stat`. If you are mocking the [`fs.Stats`][fs-stats] object, you may need to stub the `isSymbolicLink()` method. + +#### `file.clone([options])` + +Returns a new Vinyl object with all attributes cloned. + +__By default custom attributes are cloned deeply.__ + +If `options` or `options.deep` is `false`, custom attributes will not be cloned deeply. + +If `file.contents` is a [`Buffer`][buffer] and `options.contents` is `false`, the [`Buffer`][buffer] reference will be reused instead of copied. + +#### `file.inspect()` + +Returns a formatted-string interpretation of the Vinyl object. Automatically called by node's `console.log`. + +### Instance properties + +Each Vinyl object will have instance properties. Some may be unavailable based on what properties were set upon instantiation or modified since. + +#### `file.contents` + +Gets and sets the contents of the file. If set to a [`ReadableStream`][readable-stream], it is wrapped in a [`cloneable-readable`][cloneable-readable] stream. + +Throws when set to any value other than a [`ReadableStream`][readable-stream], a [`Buffer`][buffer] or `null`. + +Type: [`ReadableStream`][readable-stream], [`Buffer`][buffer], or `null` + +#### `file.cwd` + +Gets and sets current working directory. Will always be normalized and have trailing separators removed. + +Throws when set to any value other than non-empty strings. + +Type: `String` + +#### `file.base` + +Gets and sets base directory. Used for relative pathing (typically where a glob starts). +When `null` or `undefined`, it simply proxies the `file.cwd` property. Will always be normalized and have trailing separators removed. + +Throws when set to any value other than non-empty strings or `null`/`undefined`. + +Type: `String` + +#### `file.path` + +Gets and sets the absolute pathname string or `undefined`. Setting to a different value appends the new path to `file.history`. If set to the same value as the current path, it is ignored. All new values are normalized and have trailing separators removed. + +Throws when set to any value other than a string. + +Type: `String` + +#### `file.history` + +Array of `file.path` values the Vinyl object has had, from `file.history[0]` (original) through `file.history[file.history.length - 1]` (current). `file.history` and its elements should normally be treated as read-only and only altered indirectly by setting `file.path`. + +Type: `Array` + +#### `file.relative` + +Gets the result of `path.relative(file.base, file.path)`. + +Throws when set or when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.relative); // file.js +``` + +#### `file.dirname` + +Gets and sets the dirname of `file.path`. Will always be normalized and have trailing separators removed. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.dirname); // /test + +file.dirname = '/specs'; + +console.log(file.dirname); // /specs +console.log(file.path); // /specs/file.js +``` + +#### `file.basename` + +Gets and sets the basename of `file.path`. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.basename); // file.js + +file.basename = 'file.txt'; + +console.log(file.basename); // file.txt +console.log(file.path); // /test/file.txt +``` + +#### `file.stem` + +Gets and sets stem (filename without suffix) of `file.path`. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.stem); // file + +file.stem = 'foo'; + +console.log(file.stem); // foo +console.log(file.path); // /test/foo.js +``` + +#### `file.extname` + +Gets and sets extname of `file.path`. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.extname); // .js + +file.extname = '.txt'; + +console.log(file.extname); // .txt +console.log(file.path); // /test/file.txt +``` + +#### `file.symlink` + +Gets and sets the path where the file points to if it's a symbolic link. Will always be normalized and have trailing separators removed. + +Throws when set to any value other than a string. + +Type: `String` + +### `Vinyl.isVinyl(file)` + +Static method used for checking if an object is a Vinyl file. Use this method instead of `instanceof`. + +Takes an object and returns `true` if it is a Vinyl file, otherwise returns `false`. + +__Note: This method uses an internal flag that some older versions of Vinyl didn't expose.__ + +Example: + +```js +var Vinyl = require('vinyl'); + +var file = new Vinyl(); +var notAFile = {}; + +Vinyl.isVinyl(file); // true +Vinyl.isVinyl(notAFile); // false +``` + +### `Vinyl.isCustomProp(property)` + +Static method used by Vinyl when setting values inside the constructor or when copying properties in `file.clone()`. + +Takes a string `property` and returns `true` if the property is not used internally, otherwise returns `false`. + +This method is useful for inheritting from the Vinyl constructor. Read more in [Extending Vinyl][extending-vinyl]. + +Example: + +```js +var Vinyl = require('vinyl'); + +Vinyl.isCustomProp('sourceMap'); // true +Vinyl.isCustomProp('path'); // false -> internal getter/setter +``` + +## Normalization and concatenation + +Since all properties are normalized in their setters, you can just concatenate with `/`, and normalization takes care of it properly on all platforms. + +Example: + +```js +var file = new File(); +file.path = '/' + 'test' + '/' + 'foo.bar'; + +console.log(file.path); +// posix => /test/foo.bar +// win32 => \\test\\foo.bar +``` + +But never concatenate with `\`, since that is a valid filename character on posix system. + +## Extending Vinyl + +When extending Vinyl into your own class with extra features, you need to think about a few things. + +When you have your own properties that are managed internally, you need to extend the static `isCustomProp` method to return `false` when one of these properties is queried. + +```js +var Vinyl = require('vinyl'); + +var builtInProps = ['foo', '_foo']; + +class SuperFile extends Vinyl { + constructor(options) { + super(options); + this._foo = 'example internal read-only value'; + } + + get foo() { + return this._foo; + } + + static isCustomProp(name) { + return super.isCustomProp(name) && builtInProps.indexOf(name) === -1; + } +} + +// `foo` won't be assigned to the object below +new SuperFile({ foo: "something" }); +``` + +This makes properties `foo` and `_foo` skipped when passed in options to `constructor(options)` so they don't get assigned to the new object and override your custom implementation. They also won't be copied when cloning. __Note:__ The `_foo` and `foo` properties will still exist on the created/cloned object because you are assigning `_foo` in the constructor and `foo` is defined on the prototype. + +Same goes for `clone()`. If you have your own internal stuff that needs special handling during cloning, you should extend it to do so. + +## License + +MIT + +[is-symbolic]: #issymbolic +[is-directory]: #isdirectory +[normalization]: #normalization-and-concatenation +[extending-vinyl]: #extending-vinyl +[stream]: https://nodejs.org/api/stream.html#stream_stream +[readable-stream]: https://nodejs.org/api/stream.html#stream_readable_streams +[buffer]: https://nodejs.org/api/buffer.html#buffer_class_buffer +[fs-stats]: http://nodejs.org/api/fs.html#fs_class_fs_stats +[vinyl-fs]: https://github.com/gulpjs/vinyl-fs +[cloneable-readable]: https://github.com/mcollina/cloneable-readable + +[downloads-image]: https://img.shields.io/npm/dm/vinyl.svg +[npm-url]: https://www.npmjs.com/package/vinyl +[npm-image]: https://img.shields.io/npm/v/vinyl.svg + +[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=$PROJECT_ID&branchName=master +[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/vinyl?branchName=master + +[travis-url]: https://travis-ci.org/gulpjs/vinyl +[travis-image]: https://img.shields.io/travis/gulpjs/vinyl.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/vinyl +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/vinyl.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/vinyl +[coveralls-image]: https://img.shields.io/coveralls/gulpjs/vinyl/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/vinyl/index.js b/node_modules/vinyl/index.js new file mode 100644 index 00000000..3a16e91a --- /dev/null +++ b/node_modules/vinyl/index.js @@ -0,0 +1,338 @@ +'use strict'; + +var path = require('path'); +var util = require('util'); +var isBuffer = require('buffer').Buffer.isBuffer; + +var clone = require('clone'); +var cloneable = require('cloneable-readable'); +var replaceExt = require('replace-ext'); +var cloneStats = require('clone-stats'); +var cloneBuffer = require('clone-buffer'); +var removeTrailingSep = require('remove-trailing-separator'); + +var isStream = require('./lib/is-stream'); +var normalize = require('./lib/normalize'); +var inspectStream = require('./lib/inspect-stream'); + +var builtInFields = [ + '_contents', '_symlink', 'contents', 'stat', 'history', 'path', + '_base', 'base', '_cwd', 'cwd', +]; + +function File(file) { + var self = this; + + if (!file) { + file = {}; + } + + // Stat = files stats object + this.stat = file.stat || null; + + // Contents = stream, buffer, or null if not read + this.contents = file.contents || null; + + // Replay path history to ensure proper normalization and trailing sep + var history = Array.prototype.slice.call(file.history || []); + if (file.path) { + history.push(file.path); + } + this.history = []; + history.forEach(function(path) { + self.path = path; + }); + + this.cwd = file.cwd || process.cwd(); + this.base = file.base; + + this._isVinyl = true; + + this._symlink = null; + + // Set custom properties + Object.keys(file).forEach(function(key) { + if (self.constructor.isCustomProp(key)) { + self[key] = file[key]; + } + }); +} + +File.prototype.isBuffer = function() { + return isBuffer(this.contents); +}; + +File.prototype.isStream = function() { + return isStream(this.contents); +}; + +File.prototype.isNull = function() { + return (this.contents === null); +}; + +File.prototype.isDirectory = function() { + if (!this.isNull()) { + return false; + } + + if (this.stat && typeof this.stat.isDirectory === 'function') { + return this.stat.isDirectory(); + } + + return false; +}; + +File.prototype.isSymbolic = function() { + if (!this.isNull()) { + return false; + } + + if (this.stat && typeof this.stat.isSymbolicLink === 'function') { + return this.stat.isSymbolicLink(); + } + + return false; +}; + +File.prototype.clone = function(opt) { + var self = this; + + if (typeof opt === 'boolean') { + opt = { + deep: opt, + contents: true, + }; + } else if (!opt) { + opt = { + deep: true, + contents: true, + }; + } else { + opt.deep = opt.deep === true; + opt.contents = opt.contents !== false; + } + + // Clone our file contents + var contents; + if (this.isStream()) { + contents = this.contents.clone(); + } else if (this.isBuffer()) { + contents = opt.contents ? cloneBuffer(this.contents) : this.contents; + } + + var file = new this.constructor({ + cwd: this.cwd, + base: this.base, + stat: (this.stat ? cloneStats(this.stat) : null), + history: this.history.slice(), + contents: contents, + }); + + if (this.isSymbolic()) { + file.symlink = this.symlink; + } + + // Clone our custom properties + Object.keys(this).forEach(function(key) { + if (self.constructor.isCustomProp(key)) { + file[key] = opt.deep ? clone(self[key], true) : self[key]; + } + }); + return file; +}; + +File.prototype.inspect = function() { + var inspect = []; + + // Use relative path if possible + var filePath = this.path ? this.relative : null; + + if (filePath) { + inspect.push('"' + filePath + '"'); + } + + if (this.isBuffer()) { + inspect.push(this.contents.inspect()); + } + + if (this.isStream()) { + inspect.push(inspectStream(this.contents)); + } + + return ''; +}; + +// Newer Node.js versions use this symbol for custom inspection. +if (util.inspect.custom) { + File.prototype[util.inspect.custom] = File.prototype.inspect; +} + +File.isCustomProp = function(key) { + return builtInFields.indexOf(key) === -1; +}; + +File.isVinyl = function(file) { + return (file && file._isVinyl === true) || false; +}; + +// Virtual attributes +// Or stuff with extra logic +Object.defineProperty(File.prototype, 'contents', { + get: function() { + return this._contents; + }, + set: function(val) { + if (!isBuffer(val) && !isStream(val) && (val !== null)) { + throw new Error('File.contents can only be a Buffer, a Stream, or null.'); + } + + // Ask cloneable if the stream is a already a cloneable + // this avoid piping into many streams + // reducing the overhead of cloning + if (isStream(val) && !cloneable.isCloneable(val)) { + val = cloneable(val); + } + + this._contents = val; + }, +}); + +Object.defineProperty(File.prototype, 'cwd', { + get: function() { + return this._cwd; + }, + set: function(cwd) { + if (!cwd || typeof cwd !== 'string') { + throw new Error('cwd must be a non-empty string.'); + } + this._cwd = removeTrailingSep(normalize(cwd)); + }, +}); + +Object.defineProperty(File.prototype, 'base', { + get: function() { + return this._base || this._cwd; + }, + set: function(base) { + if (base == null) { + delete this._base; + return; + } + if (typeof base !== 'string' || !base) { + throw new Error('base must be a non-empty string, or null/undefined.'); + } + base = removeTrailingSep(normalize(base)); + if (base !== this._cwd) { + this._base = base; + } else { + delete this._base; + } + }, +}); + +// TODO: Should this be moved to vinyl-fs? +Object.defineProperty(File.prototype, 'relative', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get relative.'); + } + return path.relative(this.base, this.path); + }, + set: function() { + throw new Error('File.relative is generated from the base and path attributes. Do not modify it.'); + }, +}); + +Object.defineProperty(File.prototype, 'dirname', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get dirname.'); + } + return path.dirname(this.path); + }, + set: function(dirname) { + if (!this.path) { + throw new Error('No path specified! Can not set dirname.'); + } + this.path = path.join(dirname, this.basename); + }, +}); + +Object.defineProperty(File.prototype, 'basename', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get basename.'); + } + return path.basename(this.path); + }, + set: function(basename) { + if (!this.path) { + throw new Error('No path specified! Can not set basename.'); + } + this.path = path.join(this.dirname, basename); + }, +}); + +// Property for getting/setting stem of the filename. +Object.defineProperty(File.prototype, 'stem', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get stem.'); + } + return path.basename(this.path, this.extname); + }, + set: function(stem) { + if (!this.path) { + throw new Error('No path specified! Can not set stem.'); + } + this.path = path.join(this.dirname, stem + this.extname); + }, +}); + +Object.defineProperty(File.prototype, 'extname', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get extname.'); + } + return path.extname(this.path); + }, + set: function(extname) { + if (!this.path) { + throw new Error('No path specified! Can not set extname.'); + } + this.path = replaceExt(this.path, extname); + }, +}); + +Object.defineProperty(File.prototype, 'path', { + get: function() { + return this.history[this.history.length - 1]; + }, + set: function(path) { + if (typeof path !== 'string') { + throw new Error('path should be a string.'); + } + path = removeTrailingSep(normalize(path)); + + // Record history only when path changed + if (path && path !== this.path) { + this.history.push(path); + } + }, +}); + +Object.defineProperty(File.prototype, 'symlink', { + get: function() { + return this._symlink; + }, + set: function(symlink) { + // TODO: should this set the mode to symbolic if set? + if (typeof symlink !== 'string') { + throw new Error('symlink should be a string'); + } + + this._symlink = removeTrailingSep(normalize(symlink)); + }, +}); + +module.exports = File; diff --git a/node_modules/vinyl/package.json b/node_modules/vinyl/package.json new file mode 100644 index 00000000..3d1dc9f9 --- /dev/null +++ b/node_modules/vinyl/package.json @@ -0,0 +1,54 @@ +{ + "name": "vinyl", + "version": "2.2.1", + "description": "Virtual file format.", + "author": "Gulp Team (https://gulpjs.com/)", + "contributors": [ + "Eric Schoffstall ", + "Blaine Bublitz " + ], + "repository": "gulpjs/vinyl", + "license": "MIT", + "engines": { + "node": ">= 0.10" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js", + "lib" + ], + "scripts": { + "lint": "eslint .", + "pretest": "npm run lint", + "test": "nyc mocha --async-only", + "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", + "coveralls": "nyc report --reporter=text-lcov | coveralls" + }, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "devDependencies": { + "coveralls": "github:phated/node-coveralls#2.x", + "eslint": "^2.13.1", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "mississippi": "^1.2.0", + "mocha": "^3.0.0", + "nyc": "^10.3.2", + "safer-buffer": "^2.1.2" + }, + "keywords": [ + "virtual", + "filesystem", + "file", + "directory", + "stat", + "path" + ] +} diff --git a/node_modules/which-module/CHANGELOG.md b/node_modules/which-module/CHANGELOG.md new file mode 100644 index 00000000..6c8f5f29 --- /dev/null +++ b/node_modules/which-module/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +# 1.0.0 (2016-06-06) + + +### Features + +* initial code ([08074cd](https://github.com/nexdrew/which-module/commit/08074cd)) diff --git a/node_modules/which-module/LICENSE b/node_modules/which-module/LICENSE new file mode 100644 index 00000000..ab601b65 --- /dev/null +++ b/node_modules/which-module/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2016, Contributors + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/node_modules/which-module/README.md b/node_modules/which-module/README.md new file mode 100644 index 00000000..a8c4bf8d --- /dev/null +++ b/node_modules/which-module/README.md @@ -0,0 +1,55 @@ +# which-module + +> Find the module object for something that was require()d + +[![Build Status](https://travis-ci.org/nexdrew/which-module.svg?branch=master)](https://travis-ci.org/nexdrew/which-module) +[![Coverage Status](https://coveralls.io/repos/github/nexdrew/which-module/badge.svg?branch=master)](https://coveralls.io/github/nexdrew/which-module?branch=master) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + +Find the `module` object in `require.cache` for something that was `require()`d +or `import`ed - essentially a reverse `require()` lookup. + +Useful for libs that want to e.g. lookup a filename for a module or submodule +that it did not `require()` itself. + +## Install and Usage + +``` +npm install --save which-module +``` + +```js +const whichModule = require('which-module') + +console.log(whichModule(require('something'))) +// Module { +// id: '/path/to/project/node_modules/something/index.js', +// exports: [Function], +// parent: ..., +// filename: '/path/to/project/node_modules/something/index.js', +// loaded: true, +// children: [], +// paths: [ '/path/to/project/node_modules/something/node_modules', +// '/path/to/project/node_modules', +// '/path/to/node_modules', +// '/path/node_modules', +// '/node_modules' ] } +``` + +## API + +### `whichModule(exported)` + +Return the [`module` object](https://nodejs.org/api/modules.html#modules_the_module_object), +if any, that represents the given argument in the `require.cache`. + +`exported` can be anything that was previously `require()`d or `import`ed as a +module, submodule, or dependency - which means `exported` is identical to the +`module.exports` returned by this method. + +If `exported` did not come from the `exports` of a `module` in `require.cache`, +then this method returns `null`. + +## License + +ISC © Contributors diff --git a/node_modules/which-module/index.js b/node_modules/which-module/index.js new file mode 100644 index 00000000..45559b78 --- /dev/null +++ b/node_modules/which-module/index.js @@ -0,0 +1,9 @@ +'use strict' + +module.exports = function whichModule (exported) { + for (var i = 0, files = Object.keys(require.cache), mod; i < files.length; i++) { + mod = require.cache[files[i]] + if (mod.exports === exported) return mod + } + return null +} diff --git a/node_modules/which-module/package.json b/node_modules/which-module/package.json new file mode 100644 index 00000000..6646a2bd --- /dev/null +++ b/node_modules/which-module/package.json @@ -0,0 +1,41 @@ +{ + "name": "which-module", + "version": "1.0.0", + "description": "Find the module object for something that was require()d", + "main": "index.js", + "scripts": { + "pretest": "standard", + "test": "nyc ava", + "coverage": "nyc report --reporter=text-lcov | coveralls", + "release": "standard-version" + }, + "files": [ + "index.js" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/nexdrew/which-module.git" + }, + "keywords": [ + "which", + "module", + "exports", + "filename", + "require", + "reverse", + "lookup" + ], + "author": "nexdrew", + "license": "ISC", + "bugs": { + "url": "https://github.com/nexdrew/which-module/issues" + }, + "homepage": "https://github.com/nexdrew/which-module#readme", + "devDependencies": { + "ava": "^0.15.2", + "coveralls": "^2.11.9", + "nyc": "^6.4.4", + "standard": "^7.1.2", + "standard-version": "^2.3.0" + } +} diff --git a/node_modules/which/CHANGELOG.md b/node_modules/which/CHANGELOG.md new file mode 100644 index 00000000..3d83d269 --- /dev/null +++ b/node_modules/which/CHANGELOG.md @@ -0,0 +1,152 @@ +# Changes + + +## 1.3.1 + +* update deps +* update travis + +## v1.3.0 + +* Add nothrow option to which.sync +* update tap + +## v1.2.14 + +* appveyor: drop node 5 and 0.x +* travis-ci: add node 6, drop 0.x + +## v1.2.13 + +* test: Pass missing option to pass on windows +* update tap +* update isexe to 2.0.0 +* neveragain.tech pledge request + +## v1.2.12 + +* Removed unused require + +## v1.2.11 + +* Prevent changelog script from being included in package + +## v1.2.10 + +* Use env.PATH only, not env.Path + +## v1.2.9 + +* fix for paths starting with ../ +* Remove unused `is-absolute` module + +## v1.2.8 + +* bullet items in changelog that contain (but don't start with) # + +## v1.2.7 + +* strip 'update changelog' changelog entries out of changelog + +## v1.2.6 + +* make the changelog bulleted + +## v1.2.5 + +* make a changelog, and keep it up to date +* don't include tests in package +* Properly handle relative-path executables +* appveyor +* Attach error code to Not Found error +* Make tests pass on Windows + +## v1.2.4 + +* Fix typo + +## v1.2.3 + +* update isexe, fix regression in pathExt handling + +## v1.2.2 + +* update deps, use isexe module, test windows + +## v1.2.1 + +* Sometimes windows PATH entries are quoted +* Fixed a bug in the check for group and user mode bits. This bug was introduced during refactoring for supporting strict mode. +* doc cli + +## v1.2.0 + +* Add support for opt.all and -as cli flags +* test the bin +* update travis +* Allow checking for multiple programs in bin/which +* tap 2 + +## v1.1.2 + +* travis +* Refactored and fixed undefined error on Windows +* Support strict mode + +## v1.1.1 + +* test +g exes against secondary groups, if available +* Use windows exe semantics on cygwin & msys +* cwd should be first in path on win32, not last +* Handle lower-case 'env.Path' on Windows +* Update docs +* use single-quotes + +## v1.1.0 + +* Add tests, depend on is-absolute + +## v1.0.9 + +* which.js: root is allowed to execute files owned by anyone + +## v1.0.8 + +* don't use graceful-fs + +## v1.0.7 + +* add license to package.json + +## v1.0.6 + +* isc license + +## 1.0.5 + +* Awful typo + +## 1.0.4 + +* Test for path absoluteness properly +* win: Allow '' as a pathext if cmd has a . in it + +## 1.0.3 + +* Remove references to execPath +* Make `which.sync()` work on Windows by honoring the PATHEXT variable. +* Make `isExe()` always return true on Windows. +* MIT + +## 1.0.2 + +* Only files can be exes + +## 1.0.1 + +* Respect the PATHEXT env for win32 support +* should 0755 the bin +* binary +* guts +* package +* 1st diff --git a/node_modules/which/LICENSE b/node_modules/which/LICENSE new file mode 100644 index 00000000..19129e31 --- /dev/null +++ b/node_modules/which/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/which/README.md b/node_modules/which/README.md new file mode 100644 index 00000000..8c0b0cbf --- /dev/null +++ b/node_modules/which/README.md @@ -0,0 +1,51 @@ +# which + +Like the unix `which` utility. + +Finds the first instance of a specified executable in the PATH +environment variable. Does not cache the results, so `hash -r` is not +needed when the PATH changes. + +## USAGE + +```javascript +var which = require('which') + +// async usage +which('node', function (er, resolvedPath) { + // er is returned if no "node" is found on the PATH + // if it is found, then the absolute path to the exec is returned +}) + +// sync usage +// throws if not found +var resolved = which.sync('node') + +// if nothrow option is used, returns null if not found +resolved = which.sync('node', {nothrow: true}) + +// Pass options to override the PATH and PATHEXT environment vars. +which('node', { path: someOtherPath }, function (er, resolved) { + if (er) + throw er + console.log('found at %j', resolved) +}) +``` + +## CLI USAGE + +Same as the BSD `which(1)` binary. + +``` +usage: which [-as] program ... +``` + +## OPTIONS + +You may pass an options object as the second argument. + +- `path`: Use instead of the `PATH` environment variable. +- `pathExt`: Use instead of the `PATHEXT` environment variable. +- `all`: Return all matches, instead of just the first one. Note that + this means the function returns an array of strings instead of a + single string. diff --git a/node_modules/which/package.json b/node_modules/which/package.json new file mode 100644 index 00000000..51be376f --- /dev/null +++ b/node_modules/which/package.json @@ -0,0 +1,30 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me)", + "name": "which", + "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.", + "version": "1.3.1", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-which.git" + }, + "main": "which.js", + "bin": "./bin/which", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "devDependencies": { + "mkdirp": "^0.5.0", + "rimraf": "^2.6.2", + "tap": "^12.0.1" + }, + "scripts": { + "test": "tap test/*.js --cov", + "changelog": "bash gen-changelog.sh", + "postversion": "npm run changelog && git add CHANGELOG.md && git commit -m 'update changelog - '${npm_package_version}" + }, + "files": [ + "which.js", + "bin/which" + ] +} diff --git a/node_modules/which/which.js b/node_modules/which/which.js new file mode 100644 index 00000000..4347f91a --- /dev/null +++ b/node_modules/which/which.js @@ -0,0 +1,135 @@ +module.exports = which +which.sync = whichSync + +var isWindows = process.platform === 'win32' || + process.env.OSTYPE === 'cygwin' || + process.env.OSTYPE === 'msys' + +var path = require('path') +var COLON = isWindows ? ';' : ':' +var isexe = require('isexe') + +function getNotFoundError (cmd) { + var er = new Error('not found: ' + cmd) + er.code = 'ENOENT' + + return er +} + +function getPathInfo (cmd, opt) { + var colon = opt.colon || COLON + var pathEnv = opt.path || process.env.PATH || '' + var pathExt = [''] + + pathEnv = pathEnv.split(colon) + + var pathExtExe = '' + if (isWindows) { + pathEnv.unshift(process.cwd()) + pathExtExe = (opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM') + pathExt = pathExtExe.split(colon) + + + // Always test the cmd itself first. isexe will check to make sure + // it's found in the pathExt set. + if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') + pathExt.unshift('') + } + + // If it has a slash, then we don't bother searching the pathenv. + // just check the file itself, and that's it. + if (cmd.match(/\//) || isWindows && cmd.match(/\\/)) + pathEnv = [''] + + return { + env: pathEnv, + ext: pathExt, + extExe: pathExtExe + } +} + +function which (cmd, opt, cb) { + if (typeof opt === 'function') { + cb = opt + opt = {} + } + + var info = getPathInfo(cmd, opt) + var pathEnv = info.env + var pathExt = info.ext + var pathExtExe = info.extExe + var found = [] + + ;(function F (i, l) { + if (i === l) { + if (opt.all && found.length) + return cb(null, found) + else + return cb(getNotFoundError(cmd)) + } + + var pathPart = pathEnv[i] + if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"') + pathPart = pathPart.slice(1, -1) + + var p = path.join(pathPart, cmd) + if (!pathPart && (/^\.[\\\/]/).test(cmd)) { + p = cmd.slice(0, 2) + p + } + ;(function E (ii, ll) { + if (ii === ll) return F(i + 1, l) + var ext = pathExt[ii] + isexe(p + ext, { pathExt: pathExtExe }, function (er, is) { + if (!er && is) { + if (opt.all) + found.push(p + ext) + else + return cb(null, p + ext) + } + return E(ii + 1, ll) + }) + })(0, pathExt.length) + })(0, pathEnv.length) +} + +function whichSync (cmd, opt) { + opt = opt || {} + + var info = getPathInfo(cmd, opt) + var pathEnv = info.env + var pathExt = info.ext + var pathExtExe = info.extExe + var found = [] + + for (var i = 0, l = pathEnv.length; i < l; i ++) { + var pathPart = pathEnv[i] + if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"') + pathPart = pathPart.slice(1, -1) + + var p = path.join(pathPart, cmd) + if (!pathPart && /^\.[\\\/]/.test(cmd)) { + p = cmd.slice(0, 2) + p + } + for (var j = 0, ll = pathExt.length; j < ll; j ++) { + var cur = p + pathExt[j] + var is + try { + is = isexe.sync(cur, { pathExt: pathExtExe }) + if (is) { + if (opt.all) + found.push(cur) + else + return cur + } + } catch (ex) {} + } + } + + if (opt.all && found.length) + return found + + if (opt.nothrow) + return null + + throw getNotFoundError(cmd) +} diff --git a/node_modules/wide-align/LICENSE b/node_modules/wide-align/LICENSE new file mode 100644 index 00000000..f4be44d8 --- /dev/null +++ b/node_modules/wide-align/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015, Rebecca Turner + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + diff --git a/node_modules/wide-align/README.md b/node_modules/wide-align/README.md new file mode 100644 index 00000000..32f1be04 --- /dev/null +++ b/node_modules/wide-align/README.md @@ -0,0 +1,47 @@ +wide-align +---------- + +A wide-character aware text alignment function for use in terminals / on the +console. + +### Usage + +``` +var align = require('wide-align') + +// Note that if you view this on a unicode console, all of the slashes are +// aligned. This is because on a console, all narrow characters are +// an en wide and all wide characters are an em. In browsers, this isn't +// held to and wide characters like "古" can be less than two narrow +// characters even with a fixed width font. + +console.log(align.center('abc', 10)) // ' abc ' +console.log(align.center('古古古', 10)) // ' 古古古 ' +console.log(align.left('abc', 10)) // 'abc ' +console.log(align.left('古古古', 10)) // '古古古 ' +console.log(align.right('abc', 10)) // ' abc' +console.log(align.right('古古古', 10)) // ' 古古古' +``` + +### Functions + +#### `align.center(str, length)` → `str` + +Returns *str* with spaces added to both sides such that that it is *length* +chars long and centered in the spaces. + +#### `align.left(str, length)` → `str` + +Returns *str* with spaces to the right such that it is *length* chars long. + +### `align.right(str, length)` → `str` + +Returns *str* with spaces to the left such that it is *length* chars long. + +### Origins + +These functions were originally taken from +[cliui](https://npmjs.com/package/cliui). Changes include switching to the +MUCH faster pad generation function from +[lodash](https://npmjs.com/package/lodash), making center alignment pad +both sides and adding left alignment. diff --git a/node_modules/wide-align/align.js b/node_modules/wide-align/align.js new file mode 100644 index 00000000..4f94ca4c --- /dev/null +++ b/node_modules/wide-align/align.js @@ -0,0 +1,65 @@ +'use strict' +var stringWidth = require('string-width') + +exports.center = alignCenter +exports.left = alignLeft +exports.right = alignRight + +// lodash's way of generating pad characters. + +function createPadding (width) { + var result = '' + var string = ' ' + var n = width + do { + if (n % 2) { + result += string; + } + n = Math.floor(n / 2); + string += string; + } while (n); + + return result; +} + +function alignLeft (str, width) { + var trimmed = str.trimRight() + if (trimmed.length === 0 && str.length >= width) return str + var padding = '' + var strWidth = stringWidth(trimmed) + + if (strWidth < width) { + padding = createPadding(width - strWidth) + } + + return trimmed + padding +} + +function alignRight (str, width) { + var trimmed = str.trimLeft() + if (trimmed.length === 0 && str.length >= width) return str + var padding = '' + var strWidth = stringWidth(trimmed) + + if (strWidth < width) { + padding = createPadding(width - strWidth) + } + + return padding + trimmed +} + +function alignCenter (str, width) { + var trimmed = str.trim() + if (trimmed.length === 0 && str.length >= width) return str + var padLeft = '' + var padRight = '' + var strWidth = stringWidth(trimmed) + + if (strWidth < width) { + var padLeftBy = parseInt((width - strWidth) / 2, 10) + padLeft = createPadding(padLeftBy) + padRight = createPadding(width - (strWidth + padLeftBy)) + } + + return padLeft + trimmed + padRight +} diff --git a/node_modules/wide-align/node_modules/ansi-regex/index.js b/node_modules/wide-align/node_modules/ansi-regex/index.js new file mode 100644 index 00000000..c4aaecf5 --- /dev/null +++ b/node_modules/wide-align/node_modules/ansi-regex/index.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = () => { + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' + ].join('|'); + + return new RegExp(pattern, 'g'); +}; diff --git a/node_modules/wide-align/node_modules/ansi-regex/license b/node_modules/wide-align/node_modules/ansi-regex/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/wide-align/node_modules/ansi-regex/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/wide-align/node_modules/ansi-regex/package.json b/node_modules/wide-align/node_modules/ansi-regex/package.json new file mode 100644 index 00000000..e94852fd --- /dev/null +++ b/node_modules/wide-align/node_modules/ansi-regex/package.json @@ -0,0 +1,53 @@ +{ + "name": "ansi-regex", + "version": "3.0.0", + "description": "Regular expression for matching ANSI escape codes", + "license": "MIT", + "repository": "chalk/ansi-regex", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava", + "view-supported": "node fixtures/view-codes.js" + }, + "files": [ + "index.js" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "text", + "regex", + "regexp", + "re", + "match", + "test", + "find", + "pattern" + ], + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/wide-align/node_modules/ansi-regex/readme.md b/node_modules/wide-align/node_modules/ansi-regex/readme.md new file mode 100644 index 00000000..22db1c34 --- /dev/null +++ b/node_modules/wide-align/node_modules/ansi-regex/readme.md @@ -0,0 +1,46 @@ +# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex) + +> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install ansi-regex +``` + + +## Usage + +```js +const ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001B[4mcake\u001B[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001B[4mcake\u001B[0m'.match(ansiRegex()); +//=> ['\u001B[4m', '\u001B[0m'] +``` + + +## FAQ + +### Why do you test for codes not in the ECMA 48 standard? + +Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. + +On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/wide-align/node_modules/string-width/index.js b/node_modules/wide-align/node_modules/string-width/index.js new file mode 100644 index 00000000..bbc49d29 --- /dev/null +++ b/node_modules/wide-align/node_modules/string-width/index.js @@ -0,0 +1,36 @@ +'use strict'; +const stripAnsi = require('strip-ansi'); +const isFullwidthCodePoint = require('is-fullwidth-code-point'); + +module.exports = str => { + if (typeof str !== 'string' || str.length === 0) { + return 0; + } + + str = stripAnsi(str); + + let width = 0; + + for (let i = 0; i < str.length; i++) { + const code = str.codePointAt(i); + + // Ignore control characters + if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { + continue; + } + + // Ignore combining characters + if (code >= 0x300 && code <= 0x36F) { + continue; + } + + // Surrogates + if (code > 0xFFFF) { + i++; + } + + width += isFullwidthCodePoint(code) ? 2 : 1; + } + + return width; +}; diff --git a/node_modules/wide-align/node_modules/string-width/license b/node_modules/wide-align/node_modules/string-width/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/wide-align/node_modules/string-width/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/wide-align/node_modules/string-width/package.json b/node_modules/wide-align/node_modules/string-width/package.json new file mode 100644 index 00000000..89f0b6a6 --- /dev/null +++ b/node_modules/wide-align/node_modules/string-width/package.json @@ -0,0 +1,55 @@ +{ + "name": "string-width", + "version": "2.1.1", + "description": "Get the visual width of a string - the number of columns required to display it", + "license": "MIT", + "repository": "sindresorhus/string-width", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "string", + "str", + "character", + "char", + "unicode", + "width", + "visual", + "column", + "columns", + "fullwidth", + "full-width", + "full", + "ansi", + "escape", + "codes", + "cli", + "command-line", + "terminal", + "console", + "cjk", + "chinese", + "japanese", + "korean", + "fixed-width" + ], + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/wide-align/node_modules/string-width/readme.md b/node_modules/wide-align/node_modules/string-width/readme.md new file mode 100644 index 00000000..df5b7199 --- /dev/null +++ b/node_modules/wide-align/node_modules/string-width/readme.md @@ -0,0 +1,42 @@ +# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width) + +> Get the visual width of a string - the number of columns required to display it + +Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. + +Useful to be able to measure the actual width of command-line output. + + +## Install + +``` +$ npm install string-width +``` + + +## Usage + +```js +const stringWidth = require('string-width'); + +stringWidth('古'); +//=> 2 + +stringWidth('\u001b[1m古\u001b[22m'); +//=> 2 + +stringWidth('a'); +//=> 1 +``` + + +## Related + +- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module +- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string +- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/wide-align/node_modules/strip-ansi/index.js b/node_modules/wide-align/node_modules/strip-ansi/index.js new file mode 100644 index 00000000..96e0292c --- /dev/null +++ b/node_modules/wide-align/node_modules/strip-ansi/index.js @@ -0,0 +1,4 @@ +'use strict'; +const ansiRegex = require('ansi-regex'); + +module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; diff --git a/node_modules/wide-align/node_modules/strip-ansi/license b/node_modules/wide-align/node_modules/strip-ansi/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/wide-align/node_modules/strip-ansi/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/wide-align/node_modules/strip-ansi/package.json b/node_modules/wide-align/node_modules/strip-ansi/package.json new file mode 100644 index 00000000..555f1946 --- /dev/null +++ b/node_modules/wide-align/node_modules/strip-ansi/package.json @@ -0,0 +1,52 @@ +{ + "name": "strip-ansi", + "version": "4.0.0", + "description": "Strip ANSI escape codes", + "license": "MIT", + "repository": "chalk/strip-ansi", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/wide-align/node_modules/strip-ansi/readme.md b/node_modules/wide-align/node_modules/strip-ansi/readme.md new file mode 100644 index 00000000..dc76f0cb --- /dev/null +++ b/node_modules/wide-align/node_modules/strip-ansi/readme.md @@ -0,0 +1,39 @@ +# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) + +> Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install strip-ansi +``` + + +## Usage + +```js +const stripAnsi = require('strip-ansi'); + +stripAnsi('\u001B[4mUnicorn\u001B[0m'); +//=> 'Unicorn' +``` + + +## Related + +- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module +- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes +- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/wide-align/package.json b/node_modules/wide-align/package.json new file mode 100644 index 00000000..1c31f998 --- /dev/null +++ b/node_modules/wide-align/package.json @@ -0,0 +1,33 @@ +{ + "name": "wide-align", + "version": "1.1.3", + "description": "A wide-character aware text alignment function for use on the console or with fixed width fonts.", + "main": "align.js", + "scripts": { + "test": "tap --coverage test/*.js", + "version": "perl -pi -e 's/^( \"version\": $ENV{npm_config_node_version}\").*?\",/$1abc\",/' package-lock.json ; git add package-lock.json" + }, + "keywords": [ + "wide", + "double", + "unicode", + "cjkv", + "pad", + "align" + ], + "author": "Rebecca Turner (http://re-becca.org/)", + "license": "ISC", + "repository": { + "type": "git", + "url": "https://github.com/iarna/wide-align" + }, + "dependencies": { + "string-width": "^1.0.2 || 2" + }, + "devDependencies": { + "tap": "10 || 11 || 12" + }, + "files": [ + "align.js" + ] +} diff --git a/node_modules/wrap-ansi/index.js b/node_modules/wrap-ansi/index.js new file mode 100755 index 00000000..ff625435 --- /dev/null +++ b/node_modules/wrap-ansi/index.js @@ -0,0 +1,168 @@ +'use strict'; +var stringWidth = require('string-width'); +var stripAnsi = require('strip-ansi'); + +var ESCAPES = [ + '\u001b', + '\u009b' +]; + +var END_CODE = 39; + +var ESCAPE_CODES = { + 0: 0, + 1: 22, + 2: 22, + 3: 23, + 4: 24, + 7: 27, + 8: 28, + 9: 29, + 30: 39, + 31: 39, + 32: 39, + 33: 39, + 34: 39, + 35: 39, + 36: 39, + 37: 39, + 90: 39, + 40: 49, + 41: 49, + 42: 49, + 43: 49, + 44: 49, + 45: 49, + 46: 49, + 47: 49 +}; + +function wrapAnsi(code) { + return ESCAPES[0] + '[' + code + 'm'; +} + +// calculate the length of words split on ' ', ignoring +// the extra characters added by ansi escape codes. +function wordLengths(str) { + return str.split(' ').map(function (s) { + return stringWidth(s); + }); +} + +// wrap a long word across multiple rows. +// ansi escape codes do not count towards length. +function wrapWord(rows, word, cols) { + var insideEscape = false; + var visible = stripAnsi(rows[rows.length - 1]).length; + + for (var i = 0; i < word.length; i++) { + var x = word[i]; + + rows[rows.length - 1] += x; + + if (ESCAPES.indexOf(x) !== -1) { + insideEscape = true; + } else if (insideEscape && x === 'm') { + insideEscape = false; + continue; + } + + if (insideEscape) { + continue; + } + + visible++; + + if (visible >= cols && i < word.length - 1) { + rows.push(''); + visible = 0; + } + } + + // it's possible that the last row we copy over is only + // ansi escape characters, handle this edge-case. + if (!visible && rows[rows.length - 1].length > 0 && rows.length > 1) { + rows[rows.length - 2] += rows.pop(); + } +} + +// the wrap-ansi module can be invoked +// in either 'hard' or 'soft' wrap mode. +// +// 'hard' will never allow a string to take up more +// than cols characters. +// +// 'soft' allows long words to expand past the column length. +function exec(str, cols, opts) { + var options = opts || {}; + + var pre = ''; + var ret = ''; + var escapeCode; + + var lengths = wordLengths(str); + var words = str.split(' '); + var rows = ['']; + + for (var i = 0, word; (word = words[i]) !== undefined; i++) { + var rowLength = stringWidth(rows[rows.length - 1]); + + if (rowLength) { + rows[rows.length - 1] += ' '; + rowLength++; + } + + // in 'hard' wrap mode, the length of a line is + // never allowed to extend past 'cols'. + if (lengths[i] > cols && options.hard) { + if (rowLength) { + rows.push(''); + } + wrapWord(rows, word, cols); + continue; + } + + if (rowLength + lengths[i] > cols && rowLength > 0) { + if (options.wordWrap === false && rowLength < cols) { + wrapWord(rows, word, cols); + continue; + } + + rows.push(''); + } + + rows[rows.length - 1] += word; + } + + pre = rows.map(function (r) { + return r.trim(); + }).join('\n'); + + for (var j = 0; j < pre.length; j++) { + var y = pre[j]; + + ret += y; + + if (ESCAPES.indexOf(y) !== -1) { + var code = parseFloat(/[0-9][^m]*/.exec(pre.slice(j, j + 4))); + escapeCode = code === END_CODE ? null : code; + } + + if (escapeCode && ESCAPE_CODES[escapeCode]) { + if (pre[j + 1] === '\n') { + ret += wrapAnsi(ESCAPE_CODES[escapeCode]); + } else if (y === '\n') { + ret += wrapAnsi(escapeCode); + } + } + } + + return ret; +} + +// for each line break, invoke the method separately. +module.exports = function (str, cols, opts) { + return String(str).split('\n').map(function (substr) { + return exec(substr, cols, opts); + }).join('\n'); +}; diff --git a/node_modules/wrap-ansi/license b/node_modules/wrap-ansi/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/wrap-ansi/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/wrap-ansi/package.json b/node_modules/wrap-ansi/package.json new file mode 100644 index 00000000..35754d43 --- /dev/null +++ b/node_modules/wrap-ansi/package.json @@ -0,0 +1,68 @@ +{ + "name": "wrap-ansi", + "version": "2.1.0", + "description": "Wordwrap a string with ANSI escape codes", + "license": "MIT", + "repository": "chalk/wrap-ansi", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "maintainers": [ + "Sindre Sorhus (sindresorhus.com)", + "Joshua Appelman (jbnicolai.com)", + "JD Ballard (github.com/qix-)", + "Benjamin Coe (github.com/bcoe)" + ], + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && nyc ava", + "coveralls": "nyc report --reporter=text-lcov | coveralls" + }, + "files": [ + "index.js" + ], + "keywords": [ + "wrap", + "break", + "wordwrap", + "wordbreak", + "linewrap", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "devDependencies": { + "ava": "^0.16.0", + "chalk": "^1.1.0", + "coveralls": "^2.11.4", + "has-ansi": "^2.0.0", + "nyc": "^6.2.1", + "strip-ansi": "^3.0.0", + "xo": "*" + } +} diff --git a/node_modules/wrap-ansi/readme.md b/node_modules/wrap-ansi/readme.md new file mode 100644 index 00000000..59fc96bd --- /dev/null +++ b/node_modules/wrap-ansi/readme.md @@ -0,0 +1,73 @@ +# wrap-ansi [![Build Status](https://travis-ci.org/chalk/wrap-ansi.svg?branch=master)](https://travis-ci.org/chalk/wrap-ansi) [![Coverage Status](https://coveralls.io/repos/github/chalk/wrap-ansi/badge.svg?branch=master)](https://coveralls.io/github/chalk/wrap-ansi?branch=master) + +> Wordwrap a string with [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) + + +## Install + +``` +$ npm install --save wrap-ansi +``` + + +## Usage + +```js +const chalk = require('chalk'); +const wrapAnsi = require('wrap-ansi'); + +const input = 'The quick brown ' + chalk.red('fox jumped over ') + + 'the lazy ' + chalk.green('dog and then ran away with the unicorn.'); + +console.log(wrapAnsi(input, 20)); +``` + + + + +## API + +### wrapAnsi(input, columns, [options]) + +Wrap words to the specified column width. + +#### input + +Type: `string` + +String with ANSI escape codes. Like one styled by [`chalk`](https://github.com/chalk/chalk). + +#### columns + +Type: `number` + +Number of columns to wrap the text to. + +#### options + +##### hard + +Type: `boolean`
      +Default: `false` + +By default the wrap is soft, meaning long words may extend past the column width. Setting this to `true` will make it hard wrap at the column width. + +##### wordWrap + +Type: `boolean`
      +Default: `true` + +By default, an attempt is made to split words at spaces, ensuring that they don't extend past the configured columns. If wordWrap is `false`, each column will instead be completely filled splitting words as necessary. + + +## Related + +- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes +- [cli-truncate](https://github.com/sindresorhus/cli-truncate) - Truncate a string to a specific width in the terminal +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right +- [jsesc](https://github.com/mathiasbynens/jsesc) - Generate ASCII-only output from Unicode strings. Useful for creating test fixtures. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/wrappy/LICENSE b/node_modules/wrappy/LICENSE new file mode 100644 index 00000000..19129e31 --- /dev/null +++ b/node_modules/wrappy/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/wrappy/README.md b/node_modules/wrappy/README.md new file mode 100644 index 00000000..98eab252 --- /dev/null +++ b/node_modules/wrappy/README.md @@ -0,0 +1,36 @@ +# wrappy + +Callback wrapping utility + +## USAGE + +```javascript +var wrappy = require("wrappy") + +// var wrapper = wrappy(wrapperFunction) + +// make sure a cb is called only once +// See also: http://npm.im/once for this specific use case +var once = wrappy(function (cb) { + var called = false + return function () { + if (called) return + called = true + return cb.apply(this, arguments) + } +}) + +function printBoo () { + console.log('boo') +} +// has some rando property +printBoo.iAmBooPrinter = true + +var onlyPrintOnce = once(printBoo) + +onlyPrintOnce() // prints 'boo' +onlyPrintOnce() // does nothing + +// random property is retained! +assert.equal(onlyPrintOnce.iAmBooPrinter, true) +``` diff --git a/node_modules/wrappy/package.json b/node_modules/wrappy/package.json new file mode 100644 index 00000000..13075204 --- /dev/null +++ b/node_modules/wrappy/package.json @@ -0,0 +1,29 @@ +{ + "name": "wrappy", + "version": "1.0.2", + "description": "Callback wrapping utility", + "main": "wrappy.js", + "files": [ + "wrappy.js" + ], + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "tap": "^2.3.1" + }, + "scripts": { + "test": "tap --coverage test/*.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/npm/wrappy" + }, + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "ISC", + "bugs": { + "url": "https://github.com/npm/wrappy/issues" + }, + "homepage": "https://github.com/npm/wrappy" +} diff --git a/node_modules/wrappy/wrappy.js b/node_modules/wrappy/wrappy.js new file mode 100644 index 00000000..bb7e7d6f --- /dev/null +++ b/node_modules/wrappy/wrappy.js @@ -0,0 +1,33 @@ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} diff --git a/node_modules/xtend/.jshintrc b/node_modules/xtend/.jshintrc new file mode 100644 index 00000000..77887b5f --- /dev/null +++ b/node_modules/xtend/.jshintrc @@ -0,0 +1,30 @@ +{ + "maxdepth": 4, + "maxstatements": 200, + "maxcomplexity": 12, + "maxlen": 80, + "maxparams": 5, + + "curly": true, + "eqeqeq": true, + "immed": true, + "latedef": false, + "noarg": true, + "noempty": true, + "nonew": true, + "undef": true, + "unused": "vars", + "trailing": true, + + "quotmark": true, + "expr": true, + "asi": true, + + "browser": false, + "esnext": true, + "devel": false, + "node": false, + "nonstandard": false, + + "predef": ["require", "module", "__dirname", "__filename"] +} diff --git a/node_modules/xtend/LICENSE b/node_modules/xtend/LICENSE new file mode 100644 index 00000000..0099f4f6 --- /dev/null +++ b/node_modules/xtend/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) +Copyright (c) 2012-2014 Raynos. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/xtend/README.md b/node_modules/xtend/README.md new file mode 100644 index 00000000..4a2703cf --- /dev/null +++ b/node_modules/xtend/README.md @@ -0,0 +1,32 @@ +# xtend + +[![browser support][3]][4] + +[![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges) + +Extend like a boss + +xtend is a basic utility library which allows you to extend an object by appending all of the properties from each object in a list. When there are identical properties, the right-most property takes precedence. + +## Examples + +```js +var extend = require("xtend") + +// extend returns a new object. Does not mutate arguments +var combination = extend({ + a: "a", + b: "c" +}, { + b: "b" +}) +// { a: "a", b: "b" } +``` + +## Stability status: Locked + +## MIT Licensed + + + [3]: http://ci.testling.com/Raynos/xtend.png + [4]: http://ci.testling.com/Raynos/xtend diff --git a/node_modules/xtend/immutable.js b/node_modules/xtend/immutable.js new file mode 100644 index 00000000..94889c9d --- /dev/null +++ b/node_modules/xtend/immutable.js @@ -0,0 +1,19 @@ +module.exports = extend + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +function extend() { + var target = {} + + for (var i = 0; i < arguments.length; i++) { + var source = arguments[i] + + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + target[key] = source[key] + } + } + } + + return target +} diff --git a/node_modules/xtend/mutable.js b/node_modules/xtend/mutable.js new file mode 100644 index 00000000..72debede --- /dev/null +++ b/node_modules/xtend/mutable.js @@ -0,0 +1,17 @@ +module.exports = extend + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +function extend(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] + + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + target[key] = source[key] + } + } + } + + return target +} diff --git a/node_modules/xtend/package.json b/node_modules/xtend/package.json new file mode 100644 index 00000000..f7a39d10 --- /dev/null +++ b/node_modules/xtend/package.json @@ -0,0 +1,55 @@ +{ + "name": "xtend", + "version": "4.0.2", + "description": "extend like a boss", + "keywords": [ + "extend", + "merge", + "options", + "opts", + "object", + "array" + ], + "author": "Raynos ", + "repository": "git://github.com/Raynos/xtend.git", + "main": "immutable", + "scripts": { + "test": "node test" + }, + "dependencies": {}, + "devDependencies": { + "tape": "~1.1.0" + }, + "homepage": "https://github.com/Raynos/xtend", + "contributors": [ + { + "name": "Jake Verbaten" + }, + { + "name": "Matt Esch" + } + ], + "bugs": { + "url": "https://github.com/Raynos/xtend/issues", + "email": "raynos2@gmail.com" + }, + "license": "MIT", + "testling": { + "files": "test.js", + "browsers": [ + "ie/7..latest", + "firefox/16..latest", + "firefox/nightly", + "chrome/22..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest" + ] + }, + "engines": { + "node": ">=0.4" + } +} diff --git a/node_modules/xtend/test.js b/node_modules/xtend/test.js new file mode 100644 index 00000000..b895b42b --- /dev/null +++ b/node_modules/xtend/test.js @@ -0,0 +1,103 @@ +var test = require("tape") +var extend = require("./") +var mutableExtend = require("./mutable") + +test("merge", function(assert) { + var a = { a: "foo" } + var b = { b: "bar" } + + assert.deepEqual(extend(a, b), { a: "foo", b: "bar" }) + assert.end() +}) + +test("replace", function(assert) { + var a = { a: "foo" } + var b = { a: "bar" } + + assert.deepEqual(extend(a, b), { a: "bar" }) + assert.end() +}) + +test("undefined", function(assert) { + var a = { a: undefined } + var b = { b: "foo" } + + assert.deepEqual(extend(a, b), { a: undefined, b: "foo" }) + assert.deepEqual(extend(b, a), { a: undefined, b: "foo" }) + assert.end() +}) + +test("handle 0", function(assert) { + var a = { a: "default" } + var b = { a: 0 } + + assert.deepEqual(extend(a, b), { a: 0 }) + assert.deepEqual(extend(b, a), { a: "default" }) + assert.end() +}) + +test("is immutable", function (assert) { + var record = {} + + extend(record, { foo: "bar" }) + assert.equal(record.foo, undefined) + assert.end() +}) + +test("null as argument", function (assert) { + var a = { foo: "bar" } + var b = null + var c = void 0 + + assert.deepEqual(extend(b, a, c), { foo: "bar" }) + assert.end() +}) + +test("mutable", function (assert) { + var a = { foo: "bar" } + + mutableExtend(a, { bar: "baz" }) + + assert.equal(a.bar, "baz") + assert.end() +}) + +test("null prototype", function(assert) { + var a = { a: "foo" } + var b = Object.create(null) + b.b = "bar"; + + assert.deepEqual(extend(a, b), { a: "foo", b: "bar" }) + assert.end() +}) + +test("null prototype mutable", function (assert) { + var a = { foo: "bar" } + var b = Object.create(null) + b.bar = "baz"; + + mutableExtend(a, b) + + assert.equal(a.bar, "baz") + assert.end() +}) + +test("prototype pollution", function (assert) { + var a = {} + var maliciousPayload = '{"__proto__":{"oops":"It works!"}}' + + assert.strictEqual(a.oops, undefined) + extend({}, maliciousPayload) + assert.strictEqual(a.oops, undefined) + assert.end() +}) + +test("prototype pollution mutable", function (assert) { + var a = {} + var maliciousPayload = '{"__proto__":{"oops":"It works!"}}' + + assert.strictEqual(a.oops, undefined) + mutableExtend({}, maliciousPayload) + assert.strictEqual(a.oops, undefined) + assert.end() +}) diff --git a/node_modules/y18n/CHANGELOG.md b/node_modules/y18n/CHANGELOG.md new file mode 100644 index 00000000..bb784a42 --- /dev/null +++ b/node_modules/y18n/CHANGELOG.md @@ -0,0 +1,6 @@ +### 3.2.2 (2021-01-04) + + +### Bug Fixes + +* address prototype pollution issue ([#108](https://www.github.com/yargs/y18n/issues/108)) ([a9ac604](https://www.github.com/yargs/y18n/commit/a9ac604abf756dec9687be3843e2c93bfe581f25)) diff --git a/node_modules/y18n/LICENSE b/node_modules/y18n/LICENSE new file mode 100644 index 00000000..3c157f0b --- /dev/null +++ b/node_modules/y18n/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2015, Contributors + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/node_modules/y18n/README.md b/node_modules/y18n/README.md new file mode 100644 index 00000000..9859458f --- /dev/null +++ b/node_modules/y18n/README.md @@ -0,0 +1,91 @@ +# y18n + +[![Build Status][travis-image]][travis-url] +[![Coverage Status][coveralls-image]][coveralls-url] +[![NPM version][npm-image]][npm-url] +[![js-standard-style][standard-image]][standard-url] + +The bare-bones internationalization library used by yargs. + +Inspired by [i18n](https://www.npmjs.com/package/i18n). + +## Examples + +_simple string translation:_ + +```js +var __ = require('y18n').__ + +console.log(__('my awesome string %s', 'foo')) +``` + +output: + +`my awesome string foo` + +_pluralization support:_ + +```js +var __n = require('y18n').__n + +console.log(__n('one fish %s', '%d fishes %s', 2, 'foo')) +``` + +output: + +`2 fishes foo` + +## JSON Language Files + +The JSON language files should be stored in a `./locales` folder. +File names correspond to locales, e.g., `en.json`, `pirate.json`. + +When strings are observed for the first time they will be +added to the JSON file corresponding to the current locale. + +## Methods + +### require('y18n')(config) + +Create an instance of y18n with the config provided, options include: + +* `directory`: the locale directory, default `./locales`. +* `updateFiles`: should newly observed strings be updated in file, default `true`. +* `locale`: what locale should be used. +* `fallbackToLanguage`: should fallback to a language-only file (e.g. `en.json`) + be allowed if a file matching the locale does not exist (e.g. `en_US.json`), + default `true`. + +### y18n.\_\_(str, arg, arg, arg) + +Print a localized string, `%s` will be replaced with `arg`s. + +### y18n.\_\_n(singularString, pluralString, count, arg, arg, arg) + +Print a localized string with appropriate pluralization. If `%d` is provided +in the string, the `count` will replace this placeholder. + +### y18n.setLocale(str) + +Set the current locale being used. + +### y18n.getLocale() + +What locale is currently being used? + +### y18n.updateLocale(obj) + +Update the current locale with the key value pairs in `obj`. + +## License + +ISC + +[travis-url]: https://travis-ci.org/yargs/y18n +[travis-image]: https://img.shields.io/travis/yargs/y18n.svg +[coveralls-url]: https://coveralls.io/github/yargs/y18n +[coveralls-image]: https://img.shields.io/coveralls/yargs/y18n.svg +[npm-url]: https://npmjs.org/package/y18n +[npm-image]: https://img.shields.io/npm/v/y18n.svg +[standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg +[standard-url]: https://github.com/feross/standard diff --git a/node_modules/y18n/index.js b/node_modules/y18n/index.js new file mode 100644 index 00000000..7a2b9ab9 --- /dev/null +++ b/node_modules/y18n/index.js @@ -0,0 +1,172 @@ +var fs = require('fs') +var path = require('path') +var util = require('util') + +function Y18N (opts) { + // configurable options. + opts = opts || {} + this.directory = opts.directory || './locales' + this.updateFiles = typeof opts.updateFiles === 'boolean' ? opts.updateFiles : true + this.locale = opts.locale || 'en' + this.fallbackToLanguage = typeof opts.fallbackToLanguage === 'boolean' ? opts.fallbackToLanguage : true + + // internal stuff. + this.cache = Object.create(null) + this.writeQueue = [] +} + +Y18N.prototype.__ = function () { + var args = Array.prototype.slice.call(arguments) + var str = args.shift() + var cb = function () {} // start with noop. + + if (typeof args[args.length - 1] === 'function') cb = args.pop() + cb = cb || function () {} // noop. + + if (!this.cache[this.locale]) this._readLocaleFile() + + // we've observed a new string, update the language file. + if (!this.cache[this.locale][str] && this.updateFiles) { + this.cache[this.locale][str] = str + + // include the current directory and locale, + // since these values could change before the + // write is performed. + this._enqueueWrite([this.directory, this.locale, cb]) + } else { + cb() + } + + return util.format.apply(util, [this.cache[this.locale][str] || str].concat(args)) +} + +Y18N.prototype._enqueueWrite = function (work) { + this.writeQueue.push(work) + if (this.writeQueue.length === 1) this._processWriteQueue() +} + +Y18N.prototype._processWriteQueue = function () { + var _this = this + var work = this.writeQueue[0] + + // destructure the enqueued work. + var directory = work[0] + var locale = work[1] + var cb = work[2] + + var languageFile = this._resolveLocaleFile(directory, locale) + var serializedLocale = JSON.stringify(this.cache[locale], null, 2) + + fs.writeFile(languageFile, serializedLocale, 'utf-8', function (err) { + _this.writeQueue.shift() + if (_this.writeQueue.length > 0) _this._processWriteQueue() + cb(err) + }) +} + +Y18N.prototype._readLocaleFile = function () { + var localeLookup = {} + var languageFile = this._resolveLocaleFile(this.directory, this.locale) + + try { + localeLookup = JSON.parse(fs.readFileSync(languageFile, 'utf-8')) + } catch (err) { + if (err instanceof SyntaxError) { + err.message = 'syntax error in ' + languageFile + } + + if (err.code === 'ENOENT') localeLookup = {} + else throw err + } + + this.cache[this.locale] = localeLookup +} + +Y18N.prototype._resolveLocaleFile = function (directory, locale) { + var file = path.resolve(directory, './', locale + '.json') + if (this.fallbackToLanguage && !this._fileExistsSync(file) && ~locale.lastIndexOf('_')) { + // attempt fallback to language only + var languageFile = path.resolve(directory, './', locale.split('_')[0] + '.json') + if (this._fileExistsSync(languageFile)) file = languageFile + } + return file +} + +// this only exists because fs.existsSync() "will be deprecated" +// see https://nodejs.org/api/fs.html#fs_fs_existssync_path +Y18N.prototype._fileExistsSync = function (file) { + try { + return fs.statSync(file).isFile() + } catch (err) { + return false + } +} + +Y18N.prototype.__n = function () { + var args = Array.prototype.slice.call(arguments) + var singular = args.shift() + var plural = args.shift() + var quantity = args.shift() + + var cb = function () {} // start with noop. + if (typeof args[args.length - 1] === 'function') cb = args.pop() + + if (!this.cache[this.locale]) this._readLocaleFile() + + var str = quantity === 1 ? singular : plural + if (this.cache[this.locale][singular]) { + str = this.cache[this.locale][singular][quantity === 1 ? 'one' : 'other'] + } + + // we've observed a new string, update the language file. + if (!this.cache[this.locale][singular] && this.updateFiles) { + this.cache[this.locale][singular] = { + one: singular, + other: plural + } + + // include the current directory and locale, + // since these values could change before the + // write is performed. + this._enqueueWrite([this.directory, this.locale, cb]) + } else { + cb() + } + + // if a %d placeholder is provided, add quantity + // to the arguments expanded by util.format. + var values = [str] + if (~str.indexOf('%d')) values.push(quantity) + + return util.format.apply(util, values.concat(args)) +} + +Y18N.prototype.setLocale = function (locale) { + this.locale = locale +} + +Y18N.prototype.getLocale = function () { + return this.locale +} + +Y18N.prototype.updateLocale = function (obj) { + if (!this.cache[this.locale]) this._readLocaleFile() + + for (var key in obj) { + this.cache[this.locale][key] = obj[key] + } +} + +module.exports = function (opts) { + var y18n = new Y18N(opts) + + // bind all functions to y18n, so that + // they can be used in isolation. + for (var key in y18n) { + if (typeof y18n[key] === 'function') { + y18n[key] = y18n[key].bind(y18n) + } + } + + return y18n +} diff --git a/node_modules/y18n/package.json b/node_modules/y18n/package.json new file mode 100644 index 00000000..d106ca4b --- /dev/null +++ b/node_modules/y18n/package.json @@ -0,0 +1,37 @@ +{ + "name": "y18n", + "version": "3.2.2", + "description": "the bare-bones internationalization library used by yargs", + "main": "index.js", + "scripts": { + "pretest": "standard", + "test": "nyc mocha", + "coverage": "nyc report --reporter=text-lcov | coveralls" + }, + "repository": { + "type": "git", + "url": "git@github.com:yargs/y18n.git" + }, + "files": [ + "index.js" + ], + "keywords": [ + "i18n", + "internationalization", + "yargs" + ], + "author": "Ben Coe ", + "license": "ISC", + "bugs": { + "url": "https://github.com/yargs/y18n/issues" + }, + "homepage": "https://github.com/yargs/y18n", + "devDependencies": { + "chai": "^3.4.1", + "coveralls": "^2.11.6", + "mocha": "^3.0.0", + "nyc": "^10.0.0", + "rimraf": "^2.5.0", + "standard": "^10.0.0-beta.0" + } +} diff --git a/node_modules/yallist/LICENSE b/node_modules/yallist/LICENSE new file mode 100644 index 00000000..19129e31 --- /dev/null +++ b/node_modules/yallist/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/yallist/README.md b/node_modules/yallist/README.md new file mode 100644 index 00000000..f5861018 --- /dev/null +++ b/node_modules/yallist/README.md @@ -0,0 +1,204 @@ +# yallist + +Yet Another Linked List + +There are many doubly-linked list implementations like it, but this +one is mine. + +For when an array would be too big, and a Map can't be iterated in +reverse order. + + +[![Build Status](https://travis-ci.org/isaacs/yallist.svg?branch=master)](https://travis-ci.org/isaacs/yallist) [![Coverage Status](https://coveralls.io/repos/isaacs/yallist/badge.svg?service=github)](https://coveralls.io/github/isaacs/yallist) + +## basic usage + +```javascript +var yallist = require('yallist') +var myList = yallist.create([1, 2, 3]) +myList.push('foo') +myList.unshift('bar') +// of course pop() and shift() are there, too +console.log(myList.toArray()) // ['bar', 1, 2, 3, 'foo'] +myList.forEach(function (k) { + // walk the list head to tail +}) +myList.forEachReverse(function (k, index, list) { + // walk the list tail to head +}) +var myDoubledList = myList.map(function (k) { + return k + k +}) +// now myDoubledList contains ['barbar', 2, 4, 6, 'foofoo'] +// mapReverse is also a thing +var myDoubledListReverse = myList.mapReverse(function (k) { + return k + k +}) // ['foofoo', 6, 4, 2, 'barbar'] + +var reduced = myList.reduce(function (set, entry) { + set += entry + return set +}, 'start') +console.log(reduced) // 'startfoo123bar' +``` + +## api + +The whole API is considered "public". + +Functions with the same name as an Array method work more or less the +same way. + +There's reverse versions of most things because that's the point. + +### Yallist + +Default export, the class that holds and manages a list. + +Call it with either a forEach-able (like an array) or a set of +arguments, to initialize the list. + +The Array-ish methods all act like you'd expect. No magic length, +though, so if you change that it won't automatically prune or add +empty spots. + +### Yallist.create(..) + +Alias for Yallist function. Some people like factories. + +#### yallist.head + +The first node in the list + +#### yallist.tail + +The last node in the list + +#### yallist.length + +The number of nodes in the list. (Change this at your peril. It is +not magic like Array length.) + +#### yallist.toArray() + +Convert the list to an array. + +#### yallist.forEach(fn, [thisp]) + +Call a function on each item in the list. + +#### yallist.forEachReverse(fn, [thisp]) + +Call a function on each item in the list, in reverse order. + +#### yallist.get(n) + +Get the data at position `n` in the list. If you use this a lot, +probably better off just using an Array. + +#### yallist.getReverse(n) + +Get the data at position `n`, counting from the tail. + +#### yallist.map(fn, thisp) + +Create a new Yallist with the result of calling the function on each +item. + +#### yallist.mapReverse(fn, thisp) + +Same as `map`, but in reverse. + +#### yallist.pop() + +Get the data from the list tail, and remove the tail from the list. + +#### yallist.push(item, ...) + +Insert one or more items to the tail of the list. + +#### yallist.reduce(fn, initialValue) + +Like Array.reduce. + +#### yallist.reduceReverse + +Like Array.reduce, but in reverse. + +#### yallist.reverse + +Reverse the list in place. + +#### yallist.shift() + +Get the data from the list head, and remove the head from the list. + +#### yallist.slice([from], [to]) + +Just like Array.slice, but returns a new Yallist. + +#### yallist.sliceReverse([from], [to]) + +Just like yallist.slice, but the result is returned in reverse. + +#### yallist.toArray() + +Create an array representation of the list. + +#### yallist.toArrayReverse() + +Create a reversed array representation of the list. + +#### yallist.unshift(item, ...) + +Insert one or more items to the head of the list. + +#### yallist.unshiftNode(node) + +Move a Node object to the front of the list. (That is, pull it out of +wherever it lives, and make it the new head.) + +If the node belongs to a different list, then that list will remove it +first. + +#### yallist.pushNode(node) + +Move a Node object to the end of the list. (That is, pull it out of +wherever it lives, and make it the new tail.) + +If the node belongs to a list already, then that list will remove it +first. + +#### yallist.removeNode(node) + +Remove a node from the list, preserving referential integrity of head +and tail and other nodes. + +Will throw an error if you try to have a list remove a node that +doesn't belong to it. + +### Yallist.Node + +The class that holds the data and is actually the list. + +Call with `var n = new Node(value, previousNode, nextNode)` + +Note that if you do direct operations on Nodes themselves, it's very +easy to get into weird states where the list is broken. Be careful :) + +#### node.next + +The next node in the list. + +#### node.prev + +The previous node in the list. + +#### node.value + +The data the node contains. + +#### node.list + +The list to which this node belongs. (Null if it does not belong to +any list.) diff --git a/node_modules/yallist/iterator.js b/node_modules/yallist/iterator.js new file mode 100644 index 00000000..4a15bf22 --- /dev/null +++ b/node_modules/yallist/iterator.js @@ -0,0 +1,7 @@ +var Yallist = require('./yallist.js') + +Yallist.prototype[Symbol.iterator] = function* () { + for (let walker = this.head; walker; walker = walker.next) { + yield walker.value + } +} diff --git a/node_modules/yallist/package.json b/node_modules/yallist/package.json new file mode 100644 index 00000000..17a13d1c --- /dev/null +++ b/node_modules/yallist/package.json @@ -0,0 +1,29 @@ +{ + "name": "yallist", + "version": "2.1.2", + "description": "Yet Another Linked List", + "main": "yallist.js", + "directories": { + "test": "test" + }, + "files": [ + "yallist.js", + "iterator.js" + ], + "dependencies": {}, + "devDependencies": { + "tap": "^10.3.0" + }, + "scripts": { + "test": "tap test/*.js --100", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/yallist.git" + }, + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "ISC" +} diff --git a/node_modules/yallist/yallist.js b/node_modules/yallist/yallist.js new file mode 100644 index 00000000..518d2333 --- /dev/null +++ b/node_modules/yallist/yallist.js @@ -0,0 +1,370 @@ +module.exports = Yallist + +Yallist.Node = Node +Yallist.create = Yallist + +function Yallist (list) { + var self = this + if (!(self instanceof Yallist)) { + self = new Yallist() + } + + self.tail = null + self.head = null + self.length = 0 + + if (list && typeof list.forEach === 'function') { + list.forEach(function (item) { + self.push(item) + }) + } else if (arguments.length > 0) { + for (var i = 0, l = arguments.length; i < l; i++) { + self.push(arguments[i]) + } + } + + return self +} + +Yallist.prototype.removeNode = function (node) { + if (node.list !== this) { + throw new Error('removing node which does not belong to this list') + } + + var next = node.next + var prev = node.prev + + if (next) { + next.prev = prev + } + + if (prev) { + prev.next = next + } + + if (node === this.head) { + this.head = next + } + if (node === this.tail) { + this.tail = prev + } + + node.list.length-- + node.next = null + node.prev = null + node.list = null +} + +Yallist.prototype.unshiftNode = function (node) { + if (node === this.head) { + return + } + + if (node.list) { + node.list.removeNode(node) + } + + var head = this.head + node.list = this + node.next = head + if (head) { + head.prev = node + } + + this.head = node + if (!this.tail) { + this.tail = node + } + this.length++ +} + +Yallist.prototype.pushNode = function (node) { + if (node === this.tail) { + return + } + + if (node.list) { + node.list.removeNode(node) + } + + var tail = this.tail + node.list = this + node.prev = tail + if (tail) { + tail.next = node + } + + this.tail = node + if (!this.head) { + this.head = node + } + this.length++ +} + +Yallist.prototype.push = function () { + for (var i = 0, l = arguments.length; i < l; i++) { + push(this, arguments[i]) + } + return this.length +} + +Yallist.prototype.unshift = function () { + for (var i = 0, l = arguments.length; i < l; i++) { + unshift(this, arguments[i]) + } + return this.length +} + +Yallist.prototype.pop = function () { + if (!this.tail) { + return undefined + } + + var res = this.tail.value + this.tail = this.tail.prev + if (this.tail) { + this.tail.next = null + } else { + this.head = null + } + this.length-- + return res +} + +Yallist.prototype.shift = function () { + if (!this.head) { + return undefined + } + + var res = this.head.value + this.head = this.head.next + if (this.head) { + this.head.prev = null + } else { + this.tail = null + } + this.length-- + return res +} + +Yallist.prototype.forEach = function (fn, thisp) { + thisp = thisp || this + for (var walker = this.head, i = 0; walker !== null; i++) { + fn.call(thisp, walker.value, i, this) + walker = walker.next + } +} + +Yallist.prototype.forEachReverse = function (fn, thisp) { + thisp = thisp || this + for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { + fn.call(thisp, walker.value, i, this) + walker = walker.prev + } +} + +Yallist.prototype.get = function (n) { + for (var i = 0, walker = this.head; walker !== null && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.next + } + if (i === n && walker !== null) { + return walker.value + } +} + +Yallist.prototype.getReverse = function (n) { + for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.prev + } + if (i === n && walker !== null) { + return walker.value + } +} + +Yallist.prototype.map = function (fn, thisp) { + thisp = thisp || this + var res = new Yallist() + for (var walker = this.head; walker !== null;) { + res.push(fn.call(thisp, walker.value, this)) + walker = walker.next + } + return res +} + +Yallist.prototype.mapReverse = function (fn, thisp) { + thisp = thisp || this + var res = new Yallist() + for (var walker = this.tail; walker !== null;) { + res.push(fn.call(thisp, walker.value, this)) + walker = walker.prev + } + return res +} + +Yallist.prototype.reduce = function (fn, initial) { + var acc + var walker = this.head + if (arguments.length > 1) { + acc = initial + } else if (this.head) { + walker = this.head.next + acc = this.head.value + } else { + throw new TypeError('Reduce of empty list with no initial value') + } + + for (var i = 0; walker !== null; i++) { + acc = fn(acc, walker.value, i) + walker = walker.next + } + + return acc +} + +Yallist.prototype.reduceReverse = function (fn, initial) { + var acc + var walker = this.tail + if (arguments.length > 1) { + acc = initial + } else if (this.tail) { + walker = this.tail.prev + acc = this.tail.value + } else { + throw new TypeError('Reduce of empty list with no initial value') + } + + for (var i = this.length - 1; walker !== null; i--) { + acc = fn(acc, walker.value, i) + walker = walker.prev + } + + return acc +} + +Yallist.prototype.toArray = function () { + var arr = new Array(this.length) + for (var i = 0, walker = this.head; walker !== null; i++) { + arr[i] = walker.value + walker = walker.next + } + return arr +} + +Yallist.prototype.toArrayReverse = function () { + var arr = new Array(this.length) + for (var i = 0, walker = this.tail; walker !== null; i++) { + arr[i] = walker.value + walker = walker.prev + } + return arr +} + +Yallist.prototype.slice = function (from, to) { + to = to || this.length + if (to < 0) { + to += this.length + } + from = from || 0 + if (from < 0) { + from += this.length + } + var ret = new Yallist() + if (to < from || to < 0) { + return ret + } + if (from < 0) { + from = 0 + } + if (to > this.length) { + to = this.length + } + for (var i = 0, walker = this.head; walker !== null && i < from; i++) { + walker = walker.next + } + for (; walker !== null && i < to; i++, walker = walker.next) { + ret.push(walker.value) + } + return ret +} + +Yallist.prototype.sliceReverse = function (from, to) { + to = to || this.length + if (to < 0) { + to += this.length + } + from = from || 0 + if (from < 0) { + from += this.length + } + var ret = new Yallist() + if (to < from || to < 0) { + return ret + } + if (from < 0) { + from = 0 + } + if (to > this.length) { + to = this.length + } + for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { + walker = walker.prev + } + for (; walker !== null && i > from; i--, walker = walker.prev) { + ret.push(walker.value) + } + return ret +} + +Yallist.prototype.reverse = function () { + var head = this.head + var tail = this.tail + for (var walker = head; walker !== null; walker = walker.prev) { + var p = walker.prev + walker.prev = walker.next + walker.next = p + } + this.head = tail + this.tail = head + return this +} + +function push (self, item) { + self.tail = new Node(item, self.tail, null, self) + if (!self.head) { + self.head = self.tail + } + self.length++ +} + +function unshift (self, item) { + self.head = new Node(item, null, self.head, self) + if (!self.tail) { + self.tail = self.head + } + self.length++ +} + +function Node (value, prev, next, list) { + if (!(this instanceof Node)) { + return new Node(value, prev, next, list) + } + + this.list = list + this.value = value + + if (prev) { + prev.next = this + this.prev = prev + } else { + this.prev = null + } + + if (next) { + next.prev = this + this.next = next + } else { + this.next = null + } +} diff --git a/node_modules/yargs-parser/CHANGELOG.md b/node_modules/yargs-parser/CHANGELOG.md new file mode 100644 index 00000000..cd060f3c --- /dev/null +++ b/node_modules/yargs-parser/CHANGELOG.md @@ -0,0 +1,169 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +# [5.0.0](https://github.com/yargs/yargs-parser/compare/v4.2.1...v5.0.0) (2017-02-18) + + +### Bug Fixes + +* environment variables should take precedence over config file ([#81](https://github.com/yargs/yargs-parser/issues/81)) ([76cee1f](https://github.com/yargs/yargs-parser/commit/76cee1f)) + + +### BREAKING CHANGES + +* environment variables will now override config files (args, env, config-file, config-object) + + + + +## [4.2.1](https://github.com/yargs/yargs-parser/compare/v4.2.0...v4.2.1) (2017-01-02) + + +### Bug Fixes + +* flatten/duplicate regression ([#75](https://github.com/yargs/yargs-parser/issues/75)) ([68d68a0](https://github.com/yargs/yargs-parser/commit/68d68a0)) + + + + +# [4.2.0](https://github.com/yargs/yargs-parser/compare/v4.1.0...v4.2.0) (2016-12-01) + + +### Bug Fixes + +* inner objects in configs had their keys appended to top-level key when dot-notation was disabled ([#72](https://github.com/yargs/yargs-parser/issues/72)) ([0b1b5f9](https://github.com/yargs/yargs-parser/commit/0b1b5f9)) + + +### Features + +* allow multiple arrays to be provided, rather than always combining ([#71](https://github.com/yargs/yargs-parser/issues/71)) ([0f0fb2d](https://github.com/yargs/yargs-parser/commit/0f0fb2d)) + + + + +# [4.1.0](https://github.com/yargs/yargs-parser/compare/v4.0.2...v4.1.0) (2016-11-07) + + +### Features + +* apply coercions to default options ([#65](https://github.com/yargs/yargs-parser/issues/65)) ([c79052b](https://github.com/yargs/yargs-parser/commit/c79052b)) +* handle dot notation boolean options ([#63](https://github.com/yargs/yargs-parser/issues/63)) ([02c3545](https://github.com/yargs/yargs-parser/commit/02c3545)) + + + + +## [4.0.2](https://github.com/yargs/yargs-parser/compare/v4.0.1...v4.0.2) (2016-09-30) + + +### Bug Fixes + +* whoops, let's make the assign not change the Object key order ([29d069a](https://github.com/yargs/yargs-parser/commit/29d069a)) + + + + +## [4.0.1](https://github.com/yargs/yargs-parser/compare/v4.0.0...v4.0.1) (2016-09-30) + + +### Bug Fixes + +* lodash.assign was deprecated ([#59](https://github.com/yargs/yargs-parser/issues/59)) ([5e7eb11](https://github.com/yargs/yargs-parser/commit/5e7eb11)) + + + + +# [4.0.0](https://github.com/yargs/yargs-parser/compare/v3.2.0...v4.0.0) (2016-09-26) + + +### Bug Fixes + +* coerce should be applied to the final objects and arrays created ([#57](https://github.com/yargs/yargs-parser/issues/57)) ([4ca69da](https://github.com/yargs/yargs-parser/commit/4ca69da)) + + +### BREAKING CHANGES + +* coerce is no longer applied to individual arguments in an implicit array. + + + + +# [3.2.0](https://github.com/yargs/yargs-parser/compare/v3.1.0...v3.2.0) (2016-08-13) + + +### Features + +* coerce full array instead of each element ([#51](https://github.com/yargs/yargs-parser/issues/51)) ([cc4dc56](https://github.com/yargs/yargs-parser/commit/cc4dc56)) + + + + +# [3.1.0](https://github.com/yargs/yargs-parser/compare/v3.0.0...v3.1.0) (2016-08-09) + + +### Bug Fixes + +* address pkgConf parsing bug outlined in [#37](https://github.com/yargs/yargs-parser/issues/37) ([#45](https://github.com/yargs/yargs-parser/issues/45)) ([be76ee6](https://github.com/yargs/yargs-parser/commit/be76ee6)) +* better parsing of negative values ([#44](https://github.com/yargs/yargs-parser/issues/44)) ([2e43692](https://github.com/yargs/yargs-parser/commit/2e43692)) +* check aliases when guessing defaults for arguments fixes [#41](https://github.com/yargs/yargs-parser/issues/41) ([#43](https://github.com/yargs/yargs-parser/issues/43)) ([f3e4616](https://github.com/yargs/yargs-parser/commit/f3e4616)) + + +### Features + +* added coerce option, for providing specialized argument parsing ([#42](https://github.com/yargs/yargs-parser/issues/42)) ([7b49cd2](https://github.com/yargs/yargs-parser/commit/7b49cd2)) + + + + +# [3.0.0](https://github.com/yargs/yargs-parser/compare/v2.4.1...v3.0.0) (2016-08-07) + + +### Bug Fixes + +* parsing issue with numeric character in group of options ([#19](https://github.com/yargs/yargs-parser/issues/19)) ([f743236](https://github.com/yargs/yargs-parser/commit/f743236)) +* upgraded lodash.assign ([5d7fdf4](https://github.com/yargs/yargs-parser/commit/5d7fdf4)) + +### BREAKING CHANGES + +* subtle change to how values are parsed in a group of single-character arguments. +* _first released in 3.1.0, better handling of negative values should be considered a breaking change._ + + + + +## [2.4.1](https://github.com/yargs/yargs-parser/compare/v2.4.0...v2.4.1) (2016-07-16) + + +### Bug Fixes + +* **count:** do not increment a default value ([#39](https://github.com/yargs/yargs-parser/issues/39)) ([b04a189](https://github.com/yargs/yargs-parser/commit/b04a189)) + + + + +# [2.4.0](https://github.com/yargs/yargs-parser/compare/v2.3.0...v2.4.0) (2016-04-11) + + +### Features + +* **environment:** Support nested options in environment variables ([#26](https://github.com/yargs/yargs-parser/issues/26)) thanks [@elas7](https://github.com/elas7) \o/ ([020778b](https://github.com/yargs/yargs-parser/commit/020778b)) + + + + +# [2.3.0](https://github.com/yargs/yargs-parser/compare/v2.2.0...v2.3.0) (2016-04-09) + + +### Bug Fixes + +* **boolean:** fix for boolean options with non boolean defaults (#20) ([2dbe86b](https://github.com/yargs/yargs-parser/commit/2dbe86b)), closes [(#20](https://github.com/(/issues/20) +* **package:** remove tests from tarball ([0353c0d](https://github.com/yargs/yargs-parser/commit/0353c0d)) +* **parsing:** handle calling short option with an empty string as the next value. ([a867165](https://github.com/yargs/yargs-parser/commit/a867165)) +* boolean flag when next value contains the strings 'true' or 'false'. ([69941a6](https://github.com/yargs/yargs-parser/commit/69941a6)) +* update dependencies; add standard-version bin for next release (#24) ([822d9d5](https://github.com/yargs/yargs-parser/commit/822d9d5)) + +### Features + +* **configuration:** Allow to pass configuration objects to yargs-parser ([0780900](https://github.com/yargs/yargs-parser/commit/0780900)) +* **normalize:** allow normalize to work with arrays ([e0eaa1a](https://github.com/yargs/yargs-parser/commit/e0eaa1a)) diff --git a/node_modules/yargs-parser/LICENSE.txt b/node_modules/yargs-parser/LICENSE.txt new file mode 100644 index 00000000..836440be --- /dev/null +++ b/node_modules/yargs-parser/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (c) 2016, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/yargs-parser/README.md b/node_modules/yargs-parser/README.md new file mode 100644 index 00000000..6d5916c3 --- /dev/null +++ b/node_modules/yargs-parser/README.md @@ -0,0 +1,257 @@ +# yargs-parser + +[![Build Status](https://travis-ci.org/yargs/yargs-parser.png)](https://travis-ci.org/yargs/yargs-parser) +[![Coverage Status](https://coveralls.io/repos/yargs/yargs-parser/badge.svg?branch=)](https://coveralls.io/r/yargs/yargs-parser?branch=master) +[![NPM version](https://img.shields.io/npm/v/yargs-parser.svg)](https://www.npmjs.com/package/yargs-parser) +[![Windows Tests](https://img.shields.io/appveyor/ci/bcoe/yargs-parser/master.svg?label=Windows%20Tests)](https://ci.appveyor.com/project/bcoe/yargs-parser) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + + +The mighty option parser used by [yargs](https://github.com/yargs/yargs). + +visit the [yargs website](http://yargs.js.org/) for more examples, and thorough usage instructions. + + + +## Example + +```sh +npm i yargs-parser --save +``` + +```js +var argv = require('yargs-parser')(process.argv.slice(2)) +console.log(argv) +``` + +```sh +node example.js --foo=33 --bar hello +{ _: [], foo: 33, bar: 'hello' } +``` + +_or parse a string!_ + +```js +var argv = require('./')('--foo=99 --bar=33') +console.log(argv) +``` + +```sh +{ _: [], foo: 99, bar: 33 } +``` + +Convert an array of mixed types before passing to `yargs-parser`: + +```js +var parse = require('yargs-parser') +parse(['-f', 11, '--zoom', 55].join(' ')) // <-- array to string +parse(['-f', 11, '--zoom', 55].map(String)) // <-- array of strings +``` + +## API + +### require('yargs-parser')(args, opts={}) + +Parses command line arguments returning a simple mapping of keys and values. + +**expects:** + +* `args`: a string or array of strings representing the options to parse. +* `opts`: provide a set of hints indicating how `args` should be parsed: + * `opts.alias`: an object representing the set of aliases for a key: `{alias: {foo: ['f']}}`. + * `opts.array`: indicate that keys should be parsed as an array: `{array: ['foo', 'bar']}`. + * `opts.boolean`: arguments should be parsed as booleans: `{boolean: ['x', 'y']}`. + * `opts.config`: indicate a key that represents a path to a configuration file (this file will be loaded and parsed). + * `opts.coerce`: provide a custom synchronous function that returns a coerced value from the argument provided + (or throws an error), e.g. `{coerce: {foo: function (arg) {return modifiedArg}}}`. + * `opts.count`: indicate a key that should be used as a counter, e.g., `-vvv` = `{v: 3}`. + * `opts.default`: provide default values for keys: `{default: {x: 33, y: 'hello world!'}}`. + * `opts.envPrefix`: environment variables (`process.env`) with the prefix provided should be parsed. + * `opts.narg`: specify that a key requires `n` arguments: `{narg: {x: 2}}`. + * `opts.normalize`: `path.normalize()` will be applied to values set to this key. + * `opts.string`: keys should be treated as strings (even if they resemble a number `-x 33`). + * `opts.configuration`: provide configuration options to the yargs-parser (see: [configuration](#configuration)). + * `opts.number`: keys should be treated as numbers. + +**returns:** + +* `obj`: an object representing the parsed value of `args` + * `key/value`: key value pairs for each argument and their aliases. + * `_`: an array representing the positional arguments. + +### require('yargs-parser').detailed(args, opts={}) + +Parses a command line string, returning detailed information required by the +yargs engine. + +**expects:** + +* `args`: a string or array of strings representing options to parse. +* `opts`: provide a set of hints indicating how `args`, inputs are identical to `require('yargs-parser')(args, opts={})`. + +**returns:** + +* `argv`: an object representing the parsed value of `args` + * `key/value`: key value pairs for each argument and their aliases. + * `_`: an array representing the positional arguments. +* `error`: populated with an error object if an exception occurred during parsing. +* `aliases`: the inferred list of aliases built by combining lists in `opts.alias`. +* `newAliases`: any new aliases added via camel-case expansion. +* `configuration`: the configuration loaded from the `yargs` stanza in package.json. + + +### Configuration + +The yargs-parser applies several automated transformations on the keys provided +in `args`. These features can be turned on and off using the `configuration` field +of `opts`. + +```js +var parsed = parser(['--no-dice'], { + configuration: { + 'boolean-negation': false + } +}) +``` + +### short option groups + +* default: `true`. +* key: `short-option-groups`. + +Should a group of short-options be treated as boolean flags? + +```sh +node example.js -abc +{ _: [], a: true, b: true, c: true } +``` + +_if disabled:_ + +```sh +node example.js -abc +{ _: [], abc: true } +``` + +### camel-case expansion + +* default: `true`. +* key: `camel-case-expansion`. + +Should hyphenated arguments be expanded into camel-case aliases? + +```sh +node example.js --foo-bar +{ _: [], 'foo-bar': true, fooBar: true } +``` + +_if disabled:_ + +```sh +node example.js --foo-bar +{ _: [], 'foo-bar': true } +``` + +### dot-notation + +* default: `true` +* key: `dot-notation` + +Should keys that contain `.` be treated as objects? + +```sh +node example.js --foo.bar +{ _: [], foo: { bar: true } } +``` + +_if disabled:_ + +```sh +node example.js --foo.bar +{ _: [], "foo.bar": true } +``` + +### parse numbers + +* default: `true` +* key: `parse-numbers` + +Should keys that look like numbers be treated as such? + +```sh +node example.js --foo=99.3 +{ _: [], foo: 99.3 } +``` + +_if disabled:_ + +```sh +node example.js --foo=99.3 +{ _: [], foo: "99.3" } +``` + +### boolean negation + +* default: `true` +* key: `boolean-negation` + +Should variables prefixed with `--no` be treated as negations? + +```sh +node example.js --no-foo +{ _: [], foo: false } +``` + +_if disabled:_ + +```sh +node example.js --no-foo +{ _: [], "no-foo": true } +``` + +### duplicate arguments array + +* default: `true` +* key: `duplicate-arguments-array` + +Should arguments be coerced into an array when duplicated: + +```sh +node example.js -x 1 -x 2 +{ _: [], x: [1, 2] } +``` + +_if disabled:_ + +```sh +node example.js -x 1 -x 2 +{ _: [], x: 2 } +``` + +### flatten duplicate arrays + +* default: `true` +* key: `flatten-duplicate-arrays` + +Should array arguments be coerced into a single array when duplicated: + +```sh +node example.js -x 1 2 -x 3 4 +{ _: [], x: [1, 2, 3, 4] } +``` + +_if disabled:_ + +```sh +node example.js -x 1 2 -x 3 4 +{ _: [], x: [[1, 2], [3, 4]] } +``` + +## Special Thanks + +The yargs project evolves from optimist and minimist. It owes its +existence to a lot of James Halliday's hard work. Thanks [substack](https://github.com/substack) **beep** **boop** \o/ + +## License + +ISC diff --git a/node_modules/yargs-parser/index.js b/node_modules/yargs-parser/index.js new file mode 100644 index 00000000..25110c56 --- /dev/null +++ b/node_modules/yargs-parser/index.js @@ -0,0 +1,753 @@ +var camelCase = require('camelcase') +var path = require('path') +var tokenizeArgString = require('./lib/tokenize-arg-string') +var util = require('util') +var assign = require('object.assign') + +function parse (args, opts) { + if (!opts) opts = Object.create(null) + // allow a string argument to be passed in rather + // than an argv array. + args = tokenizeArgString(args) + // aliases might have transitive relationships, normalize this. + var aliases = combineAliases(opts.alias || Object.create(null)) + var configuration = assign({ + 'short-option-groups': true, + 'camel-case-expansion': true, + 'dot-notation': true, + 'parse-numbers': true, + 'boolean-negation': true, + 'duplicate-arguments-array': true, + 'flatten-duplicate-arrays': true + }, opts.configuration) + var defaults = opts.default || Object.create(null) + var configObjects = opts.configObjects || [] + var envPrefix = opts.envPrefix + var newAliases = Object.create(null) + // allow a i18n handler to be passed in, default to a fake one (util.format). + var __ = opts.__ || function (str) { + return util.format.apply(util, Array.prototype.slice.call(arguments)) + } + var error = null + var flags = { + aliases: Object.create(null), + arrays: Object.create(null), + bools: Object.create(null), + strings: Object.create(null), + numbers: Object.create(null), + counts: Object.create(null), + normalize: Object.create(null), + configs: Object.create(null), + defaulted: Object.create(null), + nargs: Object.create(null), + coercions: Object.create(null) + } + var negative = /^-[0-9]+(\.[0-9]+)?/ + + ;[].concat(opts.array).filter(Boolean).forEach(function (key) { + flags.arrays[key] = true + }) + + ;[].concat(opts.boolean).filter(Boolean).forEach(function (key) { + flags.bools[key] = true + }) + + ;[].concat(opts.string).filter(Boolean).forEach(function (key) { + flags.strings[key] = true + }) + + ;[].concat(opts.number).filter(Boolean).forEach(function (key) { + flags.numbers[key] = true + }) + + ;[].concat(opts.count).filter(Boolean).forEach(function (key) { + flags.counts[key] = true + }) + + ;[].concat(opts.normalize).filter(Boolean).forEach(function (key) { + flags.normalize[key] = true + }) + + Object.keys(opts.narg || Object.create(null)).forEach(function (k) { + flags.nargs[k] = opts.narg[k] + }) + + Object.keys(opts.coerce || Object.create(null)).forEach(function (k) { + flags.coercions[k] = opts.coerce[k] + }) + + if (Array.isArray(opts.config) || typeof opts.config === 'string') { + ;[].concat(opts.config).filter(Boolean).forEach(function (key) { + flags.configs[key] = true + }) + } else { + Object.keys(opts.config || Object.create(null)).forEach(function (k) { + flags.configs[k] = opts.config[k] + }) + } + + // create a lookup table that takes into account all + // combinations of aliases: {f: ['foo'], foo: ['f']} + extendAliases(opts.key, aliases, opts.default, flags.arrays) + + // apply default values to all aliases. + Object.keys(defaults).forEach(function (key) { + (flags.aliases[key] || []).forEach(function (alias) { + defaults[alias] = defaults[key] + }) + }) + + var argv = { _: [] } + + Object.keys(flags.bools).forEach(function (key) { + setArg(key, !(key in defaults) ? false : defaults[key]) + setDefaulted(key) + }) + + var notFlags = [] + if (args.indexOf('--') !== -1) { + notFlags = args.slice(args.indexOf('--') + 1) + args = args.slice(0, args.indexOf('--')) + } + + for (var i = 0; i < args.length; i++) { + var arg = args[i] + var broken + var key + var letters + var m + var next + var value + + // -- seperated by = + if (arg.match(/^--.+=/) || ( + !configuration['short-option-groups'] && arg.match(/^-.+=/) + )) { + // Using [\s\S] instead of . because js doesn't support the + // 'dotall' regex modifier. See: + // http://stackoverflow.com/a/1068308/13216 + m = arg.match(/^--?([^=]+)=([\s\S]*)$/) + + // nargs format = '--f=monkey washing cat' + if (checkAllAliases(m[1], flags.nargs)) { + args.splice(i + 1, 0, m[2]) + i = eatNargs(i, m[1], args) + // arrays format = '--f=a b c' + } else if (checkAllAliases(m[1], flags.arrays) && args.length > i + 1) { + args.splice(i + 1, 0, m[2]) + i = eatArray(i, m[1], args) + } else { + setArg(m[1], m[2]) + } + } else if (arg.match(/^--no-.+/) && configuration['boolean-negation']) { + key = arg.match(/^--no-(.+)/)[1] + setArg(key, false) + + // -- seperated by space. + } else if (arg.match(/^--.+/) || ( + !configuration['short-option-groups'] && arg.match(/^-.+/) + )) { + key = arg.match(/^--?(.+)/)[1] + + // nargs format = '--foo a b c' + if (checkAllAliases(key, flags.nargs)) { + i = eatNargs(i, key, args) + // array format = '--foo a b c' + } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) { + i = eatArray(i, key, args) + } else { + next = args[i + 1] + + if (next !== undefined && (!next.match(/^-/) || + next.match(negative)) && + !checkAllAliases(key, flags.bools) && + !checkAllAliases(key, flags.counts)) { + setArg(key, next) + i++ + } else if (/^(true|false)$/.test(next)) { + setArg(key, next) + i++ + } else { + setArg(key, defaultForType(guessType(key, flags))) + } + } + + // dot-notation flag seperated by '='. + } else if (arg.match(/^-.\..+=/)) { + m = arg.match(/^-([^=]+)=([\s\S]*)$/) + setArg(m[1], m[2]) + + // dot-notation flag seperated by space. + } else if (arg.match(/^-.\..+/)) { + next = args[i + 1] + key = arg.match(/^-(.\..+)/)[1] + + if (next !== undefined && !next.match(/^-/) && + !checkAllAliases(key, flags.bools) && + !checkAllAliases(key, flags.counts)) { + setArg(key, next) + i++ + } else { + setArg(key, defaultForType(guessType(key, flags))) + } + } else if (arg.match(/^-[^-]+/) && !arg.match(negative)) { + letters = arg.slice(1, -1).split('') + broken = false + + for (var j = 0; j < letters.length; j++) { + next = arg.slice(j + 2) + + if (letters[j + 1] && letters[j + 1] === '=') { + value = arg.slice(j + 3) + key = letters[j] + + // nargs format = '-f=monkey washing cat' + if (checkAllAliases(key, flags.nargs)) { + args.splice(i + 1, 0, value) + i = eatNargs(i, key, args) + // array format = '-f=a b c' + } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) { + args.splice(i + 1, 0, value) + i = eatArray(i, key, args) + } else { + setArg(key, value) + } + + broken = true + break + } + + if (next === '-') { + setArg(letters[j], next) + continue + } + + // current letter is an alphabetic character and next value is a number + if (/[A-Za-z]/.test(letters[j]) && + /^-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { + setArg(letters[j], next) + broken = true + break + } + + if (letters[j + 1] && letters[j + 1].match(/\W/)) { + setArg(letters[j], next) + broken = true + break + } else { + setArg(letters[j], defaultForType(guessType(letters[j], flags))) + } + } + + key = arg.slice(-1)[0] + + if (!broken && key !== '-') { + // nargs format = '-f a b c' + if (checkAllAliases(key, flags.nargs)) { + i = eatNargs(i, key, args) + // array format = '-f a b c' + } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) { + i = eatArray(i, key, args) + } else { + next = args[i + 1] + + if (next !== undefined && (!/^(-|--)[^-]/.test(next) || + next.match(negative)) && + !checkAllAliases(key, flags.bools) && + !checkAllAliases(key, flags.counts)) { + setArg(key, next) + i++ + } else if (/^(true|false)$/.test(next)) { + setArg(key, next) + i++ + } else { + setArg(key, defaultForType(guessType(key, flags))) + } + } + } + } else { + argv._.push( + flags.strings['_'] || !isNumber(arg) ? arg : Number(arg) + ) + } + } + + // order of precedence: + // 1. command line arg + // 2. value from env var + // 3. value from config file + // 4. value from config objects + // 5. configured default value + applyEnvVars(argv, true) // special case: check env vars that point to config file + applyEnvVars(argv, false) + setConfig(argv) + setConfigObjects() + applyDefaultsAndAliases(argv, flags.aliases, defaults) + applyCoercions(argv) + + // for any counts either not in args or without an explicit default, set to 0 + Object.keys(flags.counts).forEach(function (key) { + if (!hasKey(argv, key.split('.'))) setArg(key, 0) + }) + + notFlags.forEach(function (key) { + argv._.push(key) + }) + + // how many arguments should we consume, based + // on the nargs option? + function eatNargs (i, key, args) { + var toEat = checkAllAliases(key, flags.nargs) + + if (args.length - (i + 1) < toEat) error = Error(__('Not enough arguments following: %s', key)) + + for (var ii = i + 1; ii < (toEat + i + 1); ii++) { + setArg(key, args[ii]) + } + + return (i + toEat) + } + + // if an option is an array, eat all non-hyphenated arguments + // following it... YUM! + // e.g., --foo apple banana cat becomes ["apple", "banana", "cat"] + function eatArray (i, key, args) { + var start = i + 1 + var argsToSet = [] + var multipleArrayFlag = i > 0 + for (var ii = i + 1; ii < args.length; ii++) { + if (/^-/.test(args[ii]) && !negative.test(args[ii])) { + if (ii === start) { + setArg(key, defaultForType('array')) + } + multipleArrayFlag = true + break + } + i = ii + argsToSet.push(args[ii]) + } + if (multipleArrayFlag) { + setArg(key, argsToSet.map(function (arg) { + return processValue(key, arg) + })) + } else { + argsToSet.forEach(function (arg) { + setArg(key, arg) + }) + } + + return i + } + + function setArg (key, val) { + unsetDefaulted(key) + + if (/-/.test(key) && !(flags.aliases[key] && flags.aliases[key].length) && configuration['camel-case-expansion']) { + var c = camelCase(key) + flags.aliases[key] = [c] + newAliases[c] = true + } + + var value = processValue(key, val) + + var splitKey = key.split('.') + setKey(argv, splitKey, value) + + // handle populating aliases of the full key + if (flags.aliases[key]) { + flags.aliases[key].forEach(function (x) { + x = x.split('.') + setKey(argv, x, value) + }) + } + + // handle populating aliases of the first element of the dot-notation key + if (splitKey.length > 1 && configuration['dot-notation']) { + ;(flags.aliases[splitKey[0]] || []).forEach(function (x) { + x = x.split('.') + + // expand alias with nested objects in key + var a = [].concat(splitKey) + a.shift() // nuke the old key. + x = x.concat(a) + + setKey(argv, x, value) + }) + } + + // Set normalize getter and setter when key is in 'normalize' but isn't an array + if (checkAllAliases(key, flags.normalize) && !checkAllAliases(key, flags.arrays)) { + var keys = [key].concat(flags.aliases[key] || []) + keys.forEach(function (key) { + argv.__defineSetter__(key, function (v) { + val = path.normalize(v) + }) + + argv.__defineGetter__(key, function () { + return typeof val === 'string' ? path.normalize(val) : val + }) + }) + } + } + + function processValue (key, val) { + // handle parsing boolean arguments --foo=true --bar false. + if (checkAllAliases(key, flags.bools) || checkAllAliases(key, flags.counts)) { + if (typeof val === 'string') val = val === 'true' + } + + var value = val + if (!checkAllAliases(key, flags.strings) && !checkAllAliases(key, flags.coercions)) { + if (isNumber(val)) value = Number(val) + if (!isUndefined(val) && !isNumber(val) && checkAllAliases(key, flags.numbers)) value = NaN + } + + // increment a count given as arg (either no value or value parsed as boolean) + if (checkAllAliases(key, flags.counts) && (isUndefined(value) || typeof value === 'boolean')) { + value = increment + } + + // Set normalized value when key is in 'normalize' and in 'arrays' + if (checkAllAliases(key, flags.normalize) && checkAllAliases(key, flags.arrays)) { + if (Array.isArray(val)) value = val.map(path.normalize) + else value = path.normalize(val) + } + return value + } + + // set args from config.json file, this should be + // applied last so that defaults can be applied. + function setConfig (argv) { + var configLookup = Object.create(null) + + // expand defaults/aliases, in-case any happen to reference + // the config.json file. + applyDefaultsAndAliases(configLookup, flags.aliases, defaults) + + Object.keys(flags.configs).forEach(function (configKey) { + var configPath = argv[configKey] || configLookup[configKey] + if (configPath) { + try { + var config = null + var resolvedConfigPath = path.resolve(process.cwd(), configPath) + + if (typeof flags.configs[configKey] === 'function') { + try { + config = flags.configs[configKey](resolvedConfigPath) + } catch (e) { + config = e + } + if (config instanceof Error) { + error = config + return + } + } else { + config = require(resolvedConfigPath) + } + + setConfigObject(config) + } catch (ex) { + if (argv[configKey]) error = Error(__('Invalid JSON config file: %s', configPath)) + } + } + }) + } + + // set args from config object. + // it recursively checks nested objects. + function setConfigObject (config, prev) { + Object.keys(config).forEach(function (key) { + var value = config[key] + var fullKey = prev ? prev + '.' + key : key + + // if the value is an inner object and we have dot-notation + // enabled, treat inner objects in config the same as + // heavily nested dot notations (foo.bar.apple). + if (typeof value === 'object' && !Array.isArray(value) && configuration['dot-notation']) { + // if the value is an object but not an array, check nested object + setConfigObject(value, fullKey) + } else { + // setting arguments via CLI takes precedence over + // values within the config file. + if (!hasKey(argv, fullKey.split('.')) || (flags.defaulted[fullKey])) { + setArg(fullKey, value) + } + } + }) + } + + // set all config objects passed in opts + function setConfigObjects () { + if (typeof configObjects === 'undefined') return + configObjects.forEach(function (configObject) { + setConfigObject(configObject) + }) + } + + function applyEnvVars (argv, configOnly) { + if (typeof envPrefix === 'undefined') return + + var prefix = typeof envPrefix === 'string' ? envPrefix : '' + Object.keys(process.env).forEach(function (envVar) { + if (prefix === '' || envVar.lastIndexOf(prefix, 0) === 0) { + // get array of nested keys and convert them to camel case + var keys = envVar.split('__').map(function (key, i) { + if (i === 0) { + key = key.substring(prefix.length) + } + return camelCase(key) + }) + + if (((configOnly && flags.configs[keys.join('.')]) || !configOnly) && (!hasKey(argv, keys) || flags.defaulted[keys.join('.')])) { + setArg(keys.join('.'), process.env[envVar]) + } + } + }) + } + + function applyCoercions (argv) { + var coerce + Object.keys(argv).forEach(function (key) { + coerce = checkAllAliases(key, flags.coercions) + if (typeof coerce === 'function') { + try { + argv[key] = coerce(argv[key]) + } catch (err) { + error = err + } + } + }) + } + + function applyDefaultsAndAliases (obj, aliases, defaults) { + Object.keys(defaults).forEach(function (key) { + if (!hasKey(obj, key.split('.'))) { + setKey(obj, key.split('.'), defaults[key]) + + ;(aliases[key] || []).forEach(function (x) { + if (hasKey(obj, x.split('.'))) return + setKey(obj, x.split('.'), defaults[key]) + }) + } + }) + } + + function hasKey (obj, keys) { + var o = obj + + if (!configuration['dot-notation']) keys = [keys.join('.')] + + keys.slice(0, -1).forEach(function (key) { + o = (o[key] || Object.create(null)) + }) + + var key = keys[keys.length - 1] + + if (typeof o !== 'object') return false + else return key in o + } + + function setKey (obj, keys, value) { + var o = obj + + if (!configuration['dot-notation']) keys = [keys.join('.')] + + keys = keys.map(sanitizeKey) + + keys.slice(0, -1).forEach(function (key) { + if (o[key] === undefined) o[key] = Object.create(null) + o = o[key] + }) + + var key = keys[keys.length - 1] + + var isTypeArray = checkAllAliases(key, flags.arrays) + var isValueArray = Array.isArray(value) + var duplicate = configuration['duplicate-arguments-array'] + + if (value === increment) { + o[key] = increment(o[key]) + } else if (Array.isArray(o[key])) { + if (duplicate && isTypeArray && isValueArray) { + o[key] = configuration['flatten-duplicate-arrays'] ? o[key].concat(value) : [o[key]].concat([value]) + } else if (!duplicate && Boolean(isTypeArray) === Boolean(isValueArray)) { + o[key] = value + } else { + o[key] = o[key].concat([value]) + } + } else if (o[key] === undefined && isTypeArray) { + o[key] = isValueArray ? value : [value] + } else if (duplicate && !(o[key] === undefined || checkAllAliases(key, flags.bools) || checkAllAliases(keys.join('.'), flags.bools) || checkAllAliases(key, flags.counts))) { + o[key] = [ o[key], value ] + } else { + o[key] = value + } + } + + // extend the aliases list with inferred aliases. + function extendAliases () { + Array.prototype.slice.call(arguments).forEach(function (obj) { + Object.keys(obj || Object.create(null)).forEach(function (key) { + // short-circuit if we've already added a key + // to the aliases array, for example it might + // exist in both 'opts.default' and 'opts.key'. + if (flags.aliases[key]) return + + flags.aliases[key] = [].concat(aliases[key] || []) + // For "--option-name", also set argv.optionName + flags.aliases[key].concat(key).forEach(function (x) { + if (/-/.test(x) && configuration['camel-case-expansion']) { + var c = camelCase(x) + flags.aliases[key].push(c) + newAliases[c] = true + } + }) + flags.aliases[key].forEach(function (x) { + flags.aliases[x] = [key].concat(flags.aliases[key].filter(function (y) { + return x !== y + })) + }) + }) + }) + } + + // check if a flag is set for any of a key's aliases. + function checkAllAliases (key, flag) { + var isSet = false + var toCheck = [].concat(flags.aliases[key] || [], key) + + toCheck.forEach(function (key) { + if (flag[key]) isSet = flag[key] + }) + + return isSet + } + + function setDefaulted (key) { + [].concat(flags.aliases[key] || [], key).forEach(function (k) { + flags.defaulted[k] = true + }) + } + + function unsetDefaulted (key) { + [].concat(flags.aliases[key] || [], key).forEach(function (k) { + delete flags.defaulted[k] + }) + } + + // return a default value, given the type of a flag., + // e.g., key of type 'string' will default to '', rather than 'true'. + function defaultForType (type) { + var def = { + boolean: true, + string: '', + number: undefined, + array: [] + } + + return def[type] + } + + // given a flag, enforce a default type. + function guessType (key, flags) { + var type = 'boolean' + + if (checkAllAliases(key, flags.strings)) type = 'string' + else if (checkAllAliases(key, flags.numbers)) type = 'number' + else if (checkAllAliases(key, flags.arrays)) type = 'array' + + return type + } + + function isNumber (x) { + if (!configuration['parse-numbers']) return false + if (typeof x === 'number') return true + if (/^0x[0-9a-f]+$/i.test(x)) return true + return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x) + } + + function isUndefined (num) { + return num === undefined + } + + return { + argv: argv, + error: error, + aliases: flags.aliases, + newAliases: newAliases, + configuration: configuration + } +} + +// if any aliases reference each other, we should +// merge them together. +function combineAliases (aliases) { + var aliasArrays = [] + var change = true + var combined = Object.create(null) + + // turn alias lookup hash {key: ['alias1', 'alias2']} into + // a simple array ['key', 'alias1', 'alias2'] + Object.keys(aliases).forEach(function (key) { + aliasArrays.push( + [].concat(aliases[key], key) + ) + }) + + // combine arrays until zero changes are + // made in an iteration. + while (change) { + change = false + for (var i = 0; i < aliasArrays.length; i++) { + for (var ii = i + 1; ii < aliasArrays.length; ii++) { + var intersect = aliasArrays[i].filter(function (v) { + return aliasArrays[ii].indexOf(v) !== -1 + }) + + if (intersect.length) { + aliasArrays[i] = aliasArrays[i].concat(aliasArrays[ii]) + aliasArrays.splice(ii, 1) + change = true + break + } + } + } + } + + // map arrays back to the hash-lookup (de-dupe while + // we're at it). + aliasArrays.forEach(function (aliasArray) { + aliasArray = aliasArray.filter(function (v, i, self) { + return self.indexOf(v) === i + }) + combined[aliasArray.pop()] = aliasArray + }) + + return combined +} + +// this function should only be called when a count is given as an arg +// it is NOT called to set a default value +// thus we can start the count at 1 instead of 0 +function increment (orig) { + return orig !== undefined ? orig + 1 : 1 +} + +function sanitizeKey (key) { + if (key === '__proto__') return '___proto___' + return key +} + +function Parser (args, opts) { + var result = parse(args.slice(), opts) + + return result.argv +} + +// parse arguments and return detailed +// meta information, aliases, etc. +Parser.detailed = function (args, opts) { + return parse(args.slice(), opts) +} + +module.exports = Parser diff --git a/node_modules/yargs-parser/package.json b/node_modules/yargs-parser/package.json new file mode 100644 index 00000000..60a8df01 --- /dev/null +++ b/node_modules/yargs-parser/package.json @@ -0,0 +1,44 @@ +{ + "name": "yargs-parser", + "version": "5.0.0-security.0", + "description": "the mighty option parser used by yargs", + "main": "index.js", + "scripts": { + "pretest": "standard", + "test": "nyc mocha test/*.js", + "coverage": "nyc report --reporter=text-lcov | coveralls", + "release": "standard-version" + }, + "repository": { + "url": "git@github.com:yargs/yargs-parser.git" + }, + "keywords": [ + "argument", + "parser", + "yargs", + "command", + "cli", + "parsing", + "option", + "args", + "argument" + ], + "author": "Ben Coe ", + "license": "ISC", + "devDependencies": { + "chai": "^3.5.0", + "coveralls": "^2.11.12", + "mocha": "^3.0.1", + "nyc": "^10.0.0", + "standard": "^8.0.0", + "standard-version": "^4.0.0" + }, + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + }, + "files": [ + "lib", + "index.js" + ] +} diff --git a/node_modules/yargs/CHANGELOG.md b/node_modules/yargs/CHANGELOG.md new file mode 100644 index 00000000..eadcd6a5 --- /dev/null +++ b/node_modules/yargs/CHANGELOG.md @@ -0,0 +1,921 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +# [7.1.0](https://github.com/yargs/yargs/compare/v7.0.2...v7.1.0) (2017-04-13) + + +### Bug Fixes + +* fix demandOption no longer treats 'false' as truthy ([#829](https://github.com/yargs/yargs/issues/829)) ([c748dd2](https://github.com/yargs/yargs/commit/c748dd2)) +* get terminalWidth in non interactive mode no longer causes a validation exception ([#837](https://github.com/yargs/yargs/issues/837)) ([360e301](https://github.com/yargs/yargs/commit/360e301)) +* we shouldn't output help if we've printed a prior help-like message ([#847](https://github.com/yargs/yargs/issues/847)) ([17e89bd](https://github.com/yargs/yargs/commit/17e89bd)) + + +### Features + +* add support for numeric commands ([#825](https://github.com/yargs/yargs/issues/825)) ([fde0564](https://github.com/yargs/yargs/commit/fde0564)) + + + + +## [7.0.2](https://github.com/yargs/yargs/compare/v7.0.1...v7.0.2) (2017-03-10) + + +### Bug Fixes + +* populating placeholder arguments broke validation ([b3eb2fe](https://github.com/yargs/yargs/commit/b3eb2fe)) + + + + +## [7.0.1](https://github.com/yargs/yargs/compare/v7.0.0...v7.0.1) (2017-03-03) + + +### Bug Fixes + +* --help with default command should print top-level help ([#810](https://github.com/yargs/yargs/issues/810)) ([9c03fa4](https://github.com/yargs/yargs/commit/9c03fa4)) + + + + +# [7.0.0](https://github.com/yargs/yargs/compare/v6.6.0...v7.0.0) (2017-02-26) + + +### Bug Fixes + +* address min/max validation message regression ([#750](https://github.com/yargs/yargs/issues/750)) ([2e5ce0f](https://github.com/yargs/yargs/commit/2e5ce0f)) +* address positional argument strict() bug introduced in [#766](https://github.com/yargs/yargs/issues/766) ([#784](https://github.com/yargs/yargs/issues/784)) ([a8528e6](https://github.com/yargs/yargs/commit/a8528e6)) +* console.warn() rather than throwing errors when api signatures are incorrect ([#804](https://github.com/yargs/yargs/issues/804)) ([a607061](https://github.com/yargs/yargs/commit/a607061)) +* context should override parsed argv ([#786](https://github.com/yargs/yargs/issues/786)) ([0997288](https://github.com/yargs/yargs/commit/0997288)) +* context variables are now recognized in strict() mode ([#796](https://github.com/yargs/yargs/issues/796)) ([48575cd](https://github.com/yargs/yargs/commit/48575cd)) +* errors were not bubbling appropriately from sub-commands to top-level ([#802](https://github.com/yargs/yargs/issues/802)) ([8a992f5](https://github.com/yargs/yargs/commit/8a992f5)) +* positional arguments of sub-commands threw strict() exception ([#805](https://github.com/yargs/yargs/issues/805)) ([f3f074b](https://github.com/yargs/yargs/commit/f3f074b)) +* pull in yargs-parser with modified env precedence ([#787](https://github.com/yargs/yargs/issues/787)) ([e0fbbe5](https://github.com/yargs/yargs/commit/e0fbbe5)) +* running parse() multiple times on the same yargs instance caused exception if help() enabled ([#790](https://github.com/yargs/yargs/issues/790)) ([07e39b7](https://github.com/yargs/yargs/commit/07e39b7)) +* use path.resolve() to support node 0.10 ([#797](https://github.com/yargs/yargs/issues/797)) ([49a93fc](https://github.com/yargs/yargs/commit/49a93fc)) + + +### Features + +* add conflicts and implies shorthands. ([#753](https://github.com/yargs/yargs/issues/753)) ([bd1472b](https://github.com/yargs/yargs/commit/bd1472b)) +* add traditional Chinese translation ([#780](https://github.com/yargs/yargs/issues/780)) ([6ab6a95](https://github.com/yargs/yargs/commit/6ab6a95)) +* allow provided config object to extend other configs ([#779](https://github.com/yargs/yargs/issues/779)) ([3280dd0](https://github.com/yargs/yargs/commit/3280dd0)) +* function argument validation ([#773](https://github.com/yargs/yargs/issues/773)) ([22ed9bb](https://github.com/yargs/yargs/commit/22ed9bb)) +* if only one column is provided for examples, allow it to take up the entire line ([#749](https://github.com/yargs/yargs/issues/749)) ([7931652](https://github.com/yargs/yargs/commit/7931652)) +* introduce custom yargs error object ([#765](https://github.com/yargs/yargs/issues/765)) ([8308efa](https://github.com/yargs/yargs/commit/8308efa)) +* introduces support for default commands, using the '*' identifier ([#785](https://github.com/yargs/yargs/issues/785)) ([d78a0f5](https://github.com/yargs/yargs/commit/d78a0f5)) +* rethink how options are inherited by commands ([#766](https://github.com/yargs/yargs/issues/766)) ([ab1fa4b](https://github.com/yargs/yargs/commit/ab1fa4b)) + + +### BREAKING CHANGES + +* `extends` key in config file is now used for extending other config files +* environment variables now take precedence over config files. +* context now takes precedence over argv and defaults +* the arguments passed to functions are now validated, there's a good chance this will throw exceptions for a few folks who are using the API in an unexpected way. +* by default options, and many of yargs' parsing helpers will now default to being applied globally; such that they are no-longer reset before being passed into commands. +* yargs will no longer aggressively suppress errors, allowing errors that are not generated internally to bubble. + + + + +# [6.6.0](https://github.com/yargs/yargs/compare/v6.5.0...v6.6.0) (2016-12-29) + + +### Bug Fixes + +* [object Object] was accidentally being populated on options object ([#736](https://github.com/yargs/yargs/issues/736)) ([f755e27](https://github.com/yargs/yargs/commit/f755e27)) +* do not use cwd when resolving package.json for yargs parsing config ([#726](https://github.com/yargs/yargs/issues/726)) ([9bdaab7](https://github.com/yargs/yargs/commit/9bdaab7)) + + +### Features + +* implement conflicts() for defining mutually exclusive arguments; thanks [@madcampos](https://github.com/madcampos)! ([#741](https://github.com/yargs/yargs/issues/741)) ([5883779](https://github.com/yargs/yargs/commit/5883779)) +* split demand() into demandCommand()/demandOption() ([#740](https://github.com/yargs/yargs/issues/740)) ([66573c8](https://github.com/yargs/yargs/commit/66573c8)) +* support for positional argument aliases ([#727](https://github.com/yargs/yargs/issues/727)) ([27e1a57](https://github.com/yargs/yargs/commit/27e1a57)) + + + + +# [6.5.0](https://github.com/yargs/yargs/compare/v6.4.0...v6.5.0) (2016-12-01) + + +### Bug Fixes + +* still freeze/unfreeze if parse() is called in isolation ([#717](https://github.com/yargs/yargs/issues/717)) ([30a9492](https://github.com/yargs/yargs/commit/30a9492)) + + +### Features + +* pull in yargs-parser introducing additional settings ([#688](https://github.com/yargs/yargs/issues/688)), and fixing [#716](https://github.com/yargs/yargs/issues/716) ([#722](https://github.com/yargs/yargs/issues/722)) ([702995a](https://github.com/yargs/yargs/commit/702995a)) + + + + +# [6.4.0](https://github.com/yargs/yargs/compare/v6.3.0...v6.4.0) (2016-11-13) + + +### Bug Fixes + +* **locales:** correct some Russian translations ([#691](https://github.com/yargs/yargs/issues/691)) ([a980671](https://github.com/yargs/yargs/commit/a980671)) + + +### Features + +* **locales:** Added Belarusian translation ([#690](https://github.com/yargs/yargs/issues/690)) ([68dac1f](https://github.com/yargs/yargs/commit/68dac1f)) +* **locales:** Create nl.json ([#687](https://github.com/yargs/yargs/issues/687)) ([46ce1bb](https://github.com/yargs/yargs/commit/46ce1bb)) +* update to yargs-parser that addresses [#598](https://github.com/yargs/yargs/issues/598), [#617](https://github.com/yargs/yargs/issues/617) ([#700](https://github.com/yargs/yargs/issues/700)) ([54cb31d](https://github.com/yargs/yargs/commit/54cb31d)) +* yargs is now passed as the third-argument to fail handler ([#613](https://github.com/yargs/yargs/issues/613)) ([21b74f9](https://github.com/yargs/yargs/commit/21b74f9)) + + +### Performance Improvements + +* normalizing package data is an expensive operation ([#705](https://github.com/yargs/yargs/issues/705)) ([49cf533](https://github.com/yargs/yargs/commit/49cf533)) + + + + +# [6.3.0](https://github.com/yargs/yargs/compare/v6.2.0...v6.3.0) (2016-10-19) + + +### Bug Fixes + +* **command:** subcommands via commandDir() now supported for parse(msg, cb) ([#678](https://github.com/yargs/yargs/issues/678)) ([6b85cc6](https://github.com/yargs/yargs/commit/6b85cc6)) + + +### Features + +* **locales:** Add Thai locale file ([#679](https://github.com/yargs/yargs/issues/679)) ([c05e36b](https://github.com/yargs/yargs/commit/c05e36b)) + + + + +# [6.2.0](https://github.com/yargs/yargs/compare/v6.1.1...v6.2.0) (2016-10-16) + + +### Bug Fixes + +* stop applying parser to context object ([#675](https://github.com/yargs/yargs/issues/675)) ([3fe9b8f](https://github.com/yargs/yargs/commit/3fe9b8f)) + + +### Features + +* add new pt_BR translations ([#674](https://github.com/yargs/yargs/issues/674)) ([5615a82](https://github.com/yargs/yargs/commit/5615a82)) +* Italian translations for 'did you mean' and 'aliases' ([#673](https://github.com/yargs/yargs/issues/673)) ([81984e6](https://github.com/yargs/yargs/commit/81984e6)) + + + + +## [6.1.1](https://github.com/yargs/yargs/compare/v6.1.0...v6.1.1) (2016-10-15) + + +### Bug Fixes + +* freeze was not resetting configObjects to initial state; addressed performance issue raised by [@nexdrew](https://github.com/nexdrew). ([#670](https://github.com/yargs/yargs/issues/670)) ([ae4bcd4](https://github.com/yargs/yargs/commit/ae4bcd4)) + + + + +# [6.1.0](https://github.com/yargs/yargs/compare/v6.0.0...v6.1.0) (2016-10-15) + + +### Bug Fixes + +* **locales:** change some translations ([#667](https://github.com/yargs/yargs/issues/667)) ([aa966c5](https://github.com/yargs/yargs/commit/aa966c5)) +* **locales:** conform hi locale to y18n.__n expectations ([#666](https://github.com/yargs/yargs/issues/666)) ([22adb18](https://github.com/yargs/yargs/commit/22adb18)) + + +### Features + +* initial support for command aliases ([#647](https://github.com/yargs/yargs/issues/647)) ([127a040](https://github.com/yargs/yargs/commit/127a040)) +* **command:** add camelcase commands to argv ([#658](https://github.com/yargs/yargs/issues/658)) ([b1cabae](https://github.com/yargs/yargs/commit/b1cabae)) +* **locales:** add Hindi translations ([9290912](https://github.com/yargs/yargs/commit/9290912)) +* **locales:** add Hungarian translations ([be92327](https://github.com/yargs/yargs/commit/be92327)) +* **locales:** Japanese translations for 'did you mean' and 'aliases' ([#651](https://github.com/yargs/yargs/issues/651)) ([5eb78fc](https://github.com/yargs/yargs/commit/5eb78fc)) +* **locales:** Polish translations for 'did you mean' and 'aliases' ([#650](https://github.com/yargs/yargs/issues/650)) ([c951c0e](https://github.com/yargs/yargs/commit/c951c0e)) +* reworking yargs API to make it easier to run in headless environments, e.g., Slack ([#646](https://github.com/yargs/yargs/issues/646)) ([f284c29](https://github.com/yargs/yargs/commit/f284c29)) +* Turkish translations for 'did you mean' and 'aliases' ([#660](https://github.com/yargs/yargs/issues/660)) ([072fd45](https://github.com/yargs/yargs/commit/072fd45)) + + + + +# [6.0.0](https://github.com/yargs/yargs/compare/v5.0.0...v6.0.0) (2016-09-30) + + +### Bug Fixes + +* changed parsing of the command string to ignore extra spaces ([#600](https://github.com/yargs/yargs/issues/600)) ([e8e5a72](https://github.com/yargs/yargs/commit/e8e5a72)) +* drop lodash.assign ([#641](https://github.com/yargs/yargs/issues/641)) ([ad3146f](https://github.com/yargs/yargs/commit/ad3146f)) +* for args that have skipValidation set to `true`, check if the parsed arg is `true` ([#619](https://github.com/yargs/yargs/issues/619)) ([658a34c](https://github.com/yargs/yargs/commit/658a34c)) +* upgrade standard, and fix appveyor config so that it works with newest standard ([#607](https://github.com/yargs/yargs/issues/607)) ([c301f42](https://github.com/yargs/yargs/commit/c301f42)) + + +### Chores + +* upgrade yargs-parser ([#633](https://github.com/yargs/yargs/issues/633)) ([cc1224e](https://github.com/yargs/yargs/commit/cc1224e)) + + +### Features + +* make opts object optional for .option() ([#624](https://github.com/yargs/yargs/issues/624)) ([4f29de6](https://github.com/yargs/yargs/commit/4f29de6)) + + +### Performance Improvements + +* defer windowWidth() to improve perf for non-help usage ([#610](https://github.com/yargs/yargs/issues/610)) ([cbc3636](https://github.com/yargs/yargs/commit/cbc3636)) + + +### BREAKING CHANGES + +* coerce is now applied as a final step after other parsing is complete + + + + +# [5.0.0](https://github.com/yargs/yargs/compare/v4.8.1...v5.0.0) (2016-08-14) + + +### Bug Fixes + +* **default:** Remove undocumented alias of default() ([#469](https://github.com/yargs/yargs/issues/469)) ([b8591b2](https://github.com/yargs/yargs/commit/b8591b2)) +* remove deprecated zh.json ([#578](https://github.com/yargs/yargs/issues/578)) ([317c62c](https://github.com/yargs/yargs/commit/317c62c)) + + +### Features + +* .help() API can now enable implicit help command ([#574](https://github.com/yargs/yargs/issues/574)) ([7645019](https://github.com/yargs/yargs/commit/7645019)) +* **command:** builder function no longer needs to return the yargs instance ([#549](https://github.com/yargs/yargs/issues/549)) ([eaa2873](https://github.com/yargs/yargs/commit/eaa2873)) +* add coerce api ([#586](https://github.com/yargs/yargs/issues/586)) ([1d53ccb](https://github.com/yargs/yargs/commit/1d53ccb)) +* adds recommendCommands() for command suggestions ([#580](https://github.com/yargs/yargs/issues/580)) ([59474dc](https://github.com/yargs/yargs/commit/59474dc)) +* apply .env() globally ([#553](https://github.com/yargs/yargs/issues/553)) ([be65728](https://github.com/yargs/yargs/commit/be65728)) +* apply default builder to command() and apply fail() handlers globally ([#583](https://github.com/yargs/yargs/issues/583)) ([0aaa68b](https://github.com/yargs/yargs/commit/0aaa68b)) +* update yargs-parser to version 3.1.0 ([#581](https://github.com/yargs/yargs/issues/581)) ([882a127](https://github.com/yargs/yargs/commit/882a127)) + + +### Performance Improvements + +* defer requiring most external libs until needed ([#584](https://github.com/yargs/yargs/issues/584)) ([f9b0ed4](https://github.com/yargs/yargs/commit/f9b0ed4)) + + +### BREAKING CHANGES + +* fail is now applied globally. +* we now default to an empty builder function when command is executed with no builder. +* yargs-parser now better handles negative integer values, at the cost of handling numeric option names, e.g., -1 hello +* default: removed undocumented `defaults` alias for `default`. +* introduces a default `help` command which outputs help, as an alternative to a help flag. +* interpret demand() numbers as relative to executing command ([#582](https://github.com/yargs/yargs/issues/582)) ([927810c](https://github.com/yargs/yargs/commit/927810c)) + + + + +## [4.8.1](https://github.com/yargs/yargs/compare/v4.8.0...v4.8.1) (2016-07-16) + + +### Bug Fixes + +* **commandDir:** make dir relative to caller instead of require.main.filename ([#548](https://github.com/yargs/yargs/issues/548)) ([3c2e479](https://github.com/yargs/yargs/commit/3c2e479)) +* add config lookup for .implies() ([#556](https://github.com/yargs/yargs/issues/556)) ([8d7585c](https://github.com/yargs/yargs/commit/8d7585c)) +* cache pkg lookups by path to avoid returning the wrong one ([#552](https://github.com/yargs/yargs/issues/552)) ([fea7e0b](https://github.com/yargs/yargs/commit/fea7e0b)) +* positional arguments were not being handled appropriately by parse() ([#559](https://github.com/yargs/yargs/issues/559)) ([063a866](https://github.com/yargs/yargs/commit/063a866)) +* pull in [@nexdrew](https://github.com/nexdrew)'s fixes to yargs-parser ([#560](https://github.com/yargs/yargs/issues/560)) ([c77c080](https://github.com/yargs/yargs/commit/c77c080)), closes [#560](https://github.com/yargs/yargs/issues/560) + + + + +# [4.8.0](https://github.com/yargs/yargs/compare/v4.7.1...v4.8.0) (2016-07-09) + + +### Bug Fixes + +* drop unused camelcase dependency fixes [#516](https://github.com/yargs/yargs/issues/516) ([#525](https://github.com/yargs/yargs/issues/525)) ([365fb9a](https://github.com/yargs/yargs/commit/365fb9a)), closes [#516](https://github.com/yargs/yargs/issues/516) [#525](https://github.com/yargs/yargs/issues/525) +* fake a tty in tests, so that we can use the new set-blocking ([#512](https://github.com/yargs/yargs/issues/512)) ([a54c742](https://github.com/yargs/yargs/commit/a54c742)) +* ignore invalid package.json during read-pkg-up ([#546](https://github.com/yargs/yargs/issues/546)) ([e058c87](https://github.com/yargs/yargs/commit/e058c87)) +* keep both zh and zh_CN until yargs[@5](https://github.com/5).x ([0f8faa7](https://github.com/yargs/yargs/commit/0f8faa7)) +* lazy-load package.json and cache. get rid of pkg-conf dependency. ([#544](https://github.com/yargs/yargs/issues/544)) ([2609b2e](https://github.com/yargs/yargs/commit/2609b2e)) +* we now respect the order of _ when applying commands ([#537](https://github.com/yargs/yargs/issues/537)) ([ed86b78](https://github.com/yargs/yargs/commit/ed86b78)) + + +### Features + +* add .commandDir(dir) to API to apply all command modules from a relative directory ([#494](https://github.com/yargs/yargs/issues/494)) ([b299dff](https://github.com/yargs/yargs/commit/b299dff)) +* **command:** derive missing command string from module filename ([#527](https://github.com/yargs/yargs/issues/527)) ([20d4b8a](https://github.com/yargs/yargs/commit/20d4b8a)) +* builder is now optional for a command module ([#545](https://github.com/yargs/yargs/issues/545)) ([8d6ad6e](https://github.com/yargs/yargs/commit/8d6ad6e)) + + + + +## [4.7.1](https://github.com/yargs/yargs/compare/v4.7.0...v4.7.1) (2016-05-15) + + +### Bug Fixes + +* switch to using `const` rather than `var` ([#499](https://github.com/yargs/yargs/pull/499)) +* make stdout flush on newer versions of Node.js ([#501](https://github.com/yargs/yargs/issues/501)) ([9f8c6f4](https://github.com/yargs/yargs/commit/9f8c6f4)) + + + + +# [4.7.0](https://github.com/yargs/yargs/compare/v4.6.0...v4.7.0) (2016-05-02) + + +### Bug Fixes + +* **pkgConf:** fix aliases issues in .pkgConf() ([#478](https://github.com/yargs/yargs/issues/478))([b900502](https://github.com/yargs/yargs/commit/b900502)) + + +### Features + +* **completion:** allow to get completions for any string, not just process.argv ([#470](https://github.com/yargs/yargs/issues/470))([74fcfbc](https://github.com/yargs/yargs/commit/74fcfbc)) +* **configuration:** Allow to directly pass a configuration object to .config() ([#480](https://github.com/yargs/yargs/issues/480))([e0a7e05](https://github.com/yargs/yargs/commit/e0a7e05)) +* **validation:** Add .skipValidation() method ([#471](https://github.com/yargs/yargs/issues/471))([d72badb](https://github.com/yargs/yargs/commit/d72badb)) + + + + +# [4.6.0](https://github.com/yargs/yargs/compare/v4.5.0...v4.6.0) (2016-04-11) + + +### Bug Fixes + +* **my brand!:** I agree with [@osher](https://github.com/osher) lightweight isn't a huge selling point of ours any longer, see [#468](https://github.com/yargs/yargs/issues/468) ([c46d7e1](https://github.com/yargs/yargs/commit/c46d7e1)) + +### Features + +* switch to standard-version for release management ([f70f801](https://github.com/yargs/yargs/commit/f70f801)) +* upgrade to version of yargs-parser that introduces some slick new features, great work [@elas7](https://github.com/elas7). update cliui, replace win-spawn, replace badge. ([#475](https://github.com/yargs/yargs/issues/475)) ([f915dd4](https://github.com/yargs/yargs/commit/f915dd4)) + + + + +# [4.5.0](https://github.com/yargs/yargs/compare/v4.4.0...v4.5.0) (2016-04-05) + + +### Bug Fixes + +* **windows:** handle $0 better on Windows platforms ([eb6e03f](https://github.com/yargs/yargs/commit/eb6e03f)) + +### Features + +* **commands:** implemented variadic positional arguments ([51d926e](https://github.com/yargs/yargs/commit/51d926e)) +* **completion:** completion now better handles aliases, and avoids duplicating keys. ([86416c8](https://github.com/yargs/yargs/commit/86416c8)) +* **config:** If invoking .config() without parameters, set a default option ([0413dd1](https://github.com/yargs/yargs/commit/0413dd1)) +* **conventional-changelog:** switching to using conventional-changelog for generating the changelog ([a2b5a2a](https://github.com/yargs/yargs/commit/a2b5a2a)) + + + +### v4.4.0 (2016/04/03 21:10 +07:00) + +- [#454](https://github.com/yargs/yargs/pull/454) fix demand() when second argument is an array (@elas7) +- [#452](https://github.com/yargs/yargs/pull/452) fix code example for `.help()` docs (@maxrimue) +- [#450](https://github.com/yargs/yargs/pull/450) fix for bash completion trailing space edge-case (@elas7) +- [#448](https://github.com/yargs/yargs/pull/448) allow a method to be passed to `showHelp`, rather than a log-level (@osher) +- [#446](https://github.com/yargs/yargs/pull/446) update yargs-parser, y18n, nyc, cliui, pkg-conf (@bcoe) +- [#436](https://github.com/yargs/yargs/pull/436) the rebase method is only used by tests, do not export it in two places (@elas7) +- [#428](https://github.com/yargs/yargs/pull/428) initial support for subcommands (@nexdrew) + +### v4.3.2 (2016/3/20 15:07 +07:00) + +- [#445](https://github.com/yargs/yargs/pull/445) strict mode was failing if no commands were registered (@nexdrew) +- [#443](https://github.com/yargs/yargs/pull/443) adds Italian translation \o/ (@madrisan) +- [#441](https://github.com/yargs/yargs/pull/441) remove duplicate keys from array options configuration (@elas7) +- [#437](https://github.com/yargs/yargs/pull/437) standardize tests for .command() (@lrlna) + +### v4.3.0 (2016/3/12 14:19 +07:00) + +- [#432](https://github.com/yargs/yargs/pull/432) non-singleton version of yargs (@bcoe) +- [#422, #425, #420] translations for number (@zkat, @rilut, @maxrimue, @watilde) +- [#414](https://github.com/yargs/yargs/pull/414) all command options can be defined in module now (@nexdrew) + +### v4.2.0 (2016/2/22 11:02 +07:00) + +- [#395](https://github.com/yargs/yargs/pull/395) do not reset groups if they contain + global keys (@novemberborn) +- [#393](https://github.com/yargs/yargs/pull/393) use sane default for usage strings (@nexdrew) +- [#392](https://github.com/yargs/yargs/pull/392) resetting wrap() was causing layout issues + with commands (@nexdrew) +- [#391](https://github.com/yargs/yargs/pull/391) commands were being added multiple times (@nexdrew) + +### v4.0.0 (2016/2/14 1:27 +07:00) + +- [#384](https://github.com/bcoe/yargs/pull/384) add new number type to yargs (@lrlna, @maxrimue) +- [#382](https://github.com/bcoe/yargs/pull/382) pass error as extra parameter to fail (@gajus) +- [#378](https://github.com/bcoe/yargs/pull/378) introduces the pkgConf feature, which tells + yargs to load default argument values from a key on a project's package.json (@bcoe) +- [#376](https://github.com/bcoe/yargs/pull/376) **breaking change**, make help() method signature + more consistent with other commands (@maxrimue) +- [#368](https://github.com/bcoe/yargs/pull/368) **breaking change**, overhaul to command handling API: + introducing named positional arguments, commands as modules, introduces the concept of global options (options that don't reset). (@nexdrew, @bcoe). +- [#364](https://github.com/bcoe/yargs/pull/364) add the slick new yargs website to the package.json (@iarna). +- [#357](https://github.com/bcoe/yargs/pull/357) .strict() now requires that a valid command is provided (@lrlna) +- [#356](https://github.com/bcoe/yargs/pull/356) pull the parsing bits of yargs into the separate module yargs-parser. Various parsing options can now be turned on and off using configuration (@bcoe). +- [#330](https://github.com/bcoe/yargs/pull/330) **breaking change**, fix inconsistencies with `.version()` API. (@maxrimue). + +### v3.32.0 (2016/1/14 10:13 +07:00) + +- [#344](https://github.com/bcoe/yargs/pull/344) yargs now has a code of conduct and contributor guidelines (@bcoe) +- [#341](https://github.com/bcoe/yargs/issues/341) Fix edge-case with camel-case arguments (@davibe) +- [#331](https://github.com/bcoe/yargs/pull/331) Handle parsing a raw argument string (@kellyselden) +- [#325](https://github.com/bcoe/yargs/pull/325) Tweaks to make tests pass again on Windows (@isaacs) +- [#321](https://github.com/bcoe/yargs/pull/321) Custom config parsing function (@bcoe) + +### v3.31.0 (2015/12/03 10:15 +07:00) + +- [#239](https://github.com/bcoe/yargs/pull/239) Pass argv to commands (@bcoe) +- [#308](https://github.com/bcoe/yargs/pull/308) Yargs now handles environment variables (@nexdrew) +- [#302](https://github.com/bcoe/yargs/pull/302) Add Indonesian translation (@rilut) +- [#300](https://github.com/bcoe/yargs/pull/300) Add Turkish translation (@feyzo) +- [#298](https://github.com/bcoe/yargs/pull/298) Add Norwegian Bokmål translation (@sindresorhus) +- [#297](https://github.com/bcoe/yargs/pull/297) Fix for layout of cjk characters (@disjukr) +- [#296](https://github.com/bcoe/yargs/pull/296) Add Korean translation (@disjukr) + +### v3.30.0 (2015/11/13 16:29 +07:00) + +- [#293](https://github.com/bcoe/yargs/pull/293) Polish language support (@kamilogorek) +- [#291](https://github.com/bcoe/yargs/pull/291) fix edge-cases with `.alias()` (@bcoe) +- [#289](https://github.com/bcoe/yargs/pull/289) group options in custom groups (@bcoe) + +### v3.29.0 (2015/10/16 21:51 +07:00) + +- [#282](https://github.com/bcoe/yargs/pull/282) completions now accept promises (@LinusU) +- [#281](https://github.com/bcoe/yargs/pull/281) fix parsing issues with dot notation (@bcoe) + +### v3.28.0 (2015/10/16 1:55 +07:00) + +- [#277](https://github.com/bcoe/yargs/pull/277) adds support for ansi escape codes (@bcoe) + +### v3.27.0 (2015/10/08 1:55 +00:00) + +- [#271](https://github.com/bcoe/yargs/pull/273) skips validation for help or version flags with exitProcess(false) (@tepez) +- [#273](https://github.com/bcoe/yargs/pull/273) implements single output for errors with exitProcess(false) (@nexdrew) +- [#269](https://github.com/bcoe/yargs/pull/269) verifies single output for errors with exitProcess(false) (@tepez) +- [#268](https://github.com/bcoe/yargs/pull/268) adds Chinese translation (@qiu8310) +- [#266](https://github.com/bcoe/yargs/pull/266) adds case for -- after -- in parser test (@geophree) + +### v3.26.0 (2015/09/25 2:14 +00:00) + +- [#263](https://github.com/bcoe/yargs/pull/263) document count() and option() object keys (@nexdrew) +- [#259](https://github.com/bcoe/yargs/pull/259) remove util in readme (@38elements) +- [#258](https://github.com/bcoe/yargs/pull/258) node v4 builds, update deps (@nexdrew) +- [#257](https://github.com/bcoe/yargs/pull/257) fix spelling errors (@dkoleary88) + +### v3.25.0 (2015/09/13 7:38 -07:00) + +- [#254](https://github.com/bcoe/yargs/pull/254) adds Japanese translation (@oti) +- [#253](https://github.com/bcoe/yargs/pull/253) fixes for tests on Windows (@bcoe) + +### v3.24.0 (2015/09/04 12:02 +00:00) + +- [#248](https://github.com/bcoe/yargs/pull/248) reinstate os-locale, no spawning (@nexdrew) +- [#249](https://github.com/bcoe/yargs/pull/249) use travis container-based infrastructure (@nexdrew) +- [#247](https://github.com/bcoe/yargs/pull/247) upgrade standard (@nexdrew) + +### v3.23.0 (2015/08/30 23:00 +00:00) + +- [#246](https://github.com/bcoe/yargs/pull/246) detect locale based only on environment variables (@bcoe) +- [#244](https://github.com/bcoe/yargs/pull/244) adds Windows CI testing (@bcoe) +- [#245](https://github.com/bcoe/yargs/pull/245) adds OSX CI testing (@bcoe, @nexdrew) + +### v3.22.0 (2015/08/28 22:26 +00:00) +- [#242](https://github.com/bcoe/yargs/pull/242) adds detectLocale config option (@bcoe) + +### v3.21.1 (2015/08/28 20:58 +00:00) +- [#240](https://github.com/bcoe/yargs/pull/240) hot-fix for Atom on Windows (@bcoe) + +### v3.21.0 (2015/08/21 21:20 +00:00) +- [#238](https://github.com/bcoe/yargs/pull/238) upgrade camelcase, window-size, chai, mocha (@nexdrew) +- [#237](https://github.com/bcoe/yargs/pull/237) adds defaultDescription to option() (@nexdrew) + +### v3.20.0 (2015/08/20 01:29 +00:00) +- [#231](https://github.com/bcoe/yargs/pull/231) Merge pull request #231 from bcoe/detect-locale (@sindresorhus) +- [#235](https://github.com/bcoe/yargs/pull/235) adds german translation to yargs (@maxrimue) + +### v3.19.0 (2015/08/14 05:12 +00:00) +- [#224](https://github.com/bcoe/yargs/pull/224) added Portuguese translation (@codemonkey3045) + +### v3.18.1 (2015/08/12 05:53 +00:00) + +- [#228](https://github.com/bcoe/yargs/pull/228) notes about embedding yargs in Electron (@etiktin) +- [#223](https://github.com/bcoe/yargs/pull/223) make booleans work in config files (@sgentle) + +### v3.18.0 (2015/08/06 20:05 +00:00) +- [#222](https://github.com/bcoe/yargs/pull/222) updates fr locale (@nexdrew) +- [#221](https://github.com/bcoe/yargs/pull/221) adds missing locale strings (@nexdrew) +- [#220](https://github.com/bcoe/yargs/pull/220) adds es locale (@zkat) + +### v3.17.1 (2015/08/02 19:35 +00:00) +- [#218](https://github.com/bcoe/yargs/pull/218) upgrades nyc (@bcoe) + +### v3.17.0 (2015/08/02 18:39 +00:00) +- [#217](https://github.com/bcoe/yargs/pull/217) sort methods in README.md (@nexdrew) +- [#215](https://github.com/bcoe/yargs/pull/215) adds fr locale (@LoicMahieu) + +### v3.16.0 (2015/07/30 04:35 +00:00) +- [#210](https://github.com/bcoe/yargs/pull/210) adds i18n support to yargs (@bcoe) +- [#209](https://github.com/bcoe/yargs/pull/209) adds choices type to yargs (@nexdrew) +- [#207](https://github.com/bcoe/yargs/pull/207) pretty new shields from shields.io (@SimenB) +- [#208](https://github.com/bcoe/yargs/pull/208) improvements to README.md (@nexdrew) +- [#205](https://github.com/bcoe/yargs/pull/205) faster build times on Travis (@ChristianMurphy) + +### v3.15.0 (2015/07/06 06:01 +00:00) +- [#197](https://github.com/bcoe/yargs/pull/197) tweaks to how errors bubble up from parser.js (@bcoe) +- [#193](https://github.com/bcoe/yargs/pull/193) upgraded nyc, reporting now happens by default (@bcoe) + +### v3.14.0 (2015/06/28 02:12 +00:00) + +- [#192](https://github.com/bcoe/yargs/pull/192) standard style nits (@bcoe) +- [#190](https://github.com/bcoe/yargs/pull/190) allow for hidden commands, e.g., + .completion('completion', false) (@tschaub) + +### v3.13.0 (2015/06/24 04:12 +00:00) + +- [#187](https://github.com/bcoe/yargs/pull/187) completion now behaves differently + if it is being run in the context of a command (@tschaub) +- [#186](https://github.com/bcoe/yargs/pull/186) if no matches are found for a completion + default to filename completion (@tschaub) + +### v3.12.0 (2015/06/19 03:23 +00:00) +- [#183](https://github.com/bcoe/yargs/pull/183) don't complete commands if they've already been completed (@tschaub) +- [#181](https://github.com/bcoe/yargs/pull/181) various fixes for completion. (@bcoe, @tschaub) +- [#182](https://github.com/bcoe/yargs/pull/182) you can now set a maximum # of of required arguments (@bcoe) + +### v3.11.0 (2015/06/15 05:15 +00:00) + +- [#173](https://github.com/bcoe/yargs/pull/173) update standard, window-size, chai (@bcoe) +- [#171](https://github.com/bcoe/yargs/pull/171) a description can now be set + when providing a config option. (@5c077yP) + +### v3.10.0 (2015/05/29 04:25 +00:00) + +- [#165](https://github.com/bcoe/yargs/pull/165) expose yargs.terminalWidth() thanks @ensonic (@bcoe) +- [#164](https://github.com/bcoe/yargs/pull/164) better array handling thanks @getify (@bcoe) + +### v3.9.1 (2015/05/20 05:14 +00:00) +- [b6662b6](https://github.com/bcoe/yargs/commit/b6662b6774cfeab4876f41ec5e2f67b7698f4e2f) clarify .config() docs (@linclark) +- [0291360](https://github.com/bcoe/yargs/commit/02913606285ce31ce81d7f12c48d8a3029776ec7) fixed tests, switched to nyc for coverage, fixed security issue, added Lin as collaborator (@bcoe) + +### v3.9.0 (2015/05/10 18:32 +00:00) +- [#157](https://github.com/bcoe/yargs/pull/157) Merge pull request #157 from bcoe/command-yargs. allows handling of command specific arguments. Thanks for the suggestion @ohjames (@bcoe) +- [#158](https://github.com/bcoe/yargs/pull/158) Merge pull request #158 from kemitchell/spdx-license. Update license format (@kemitchell) + +### v3.8.0 (2015/04/24 23:10 +00:00) +- [#154](https://github.com/bcoe/yargs/pull/154) showHelp's method signature was misleading fixes #153 (@bcoe) +- [#151](https://github.com/bcoe/yargs/pull/151) refactor yargs' table layout logic to use new helper library (@bcoe) +- [#150](https://github.com/bcoe/yargs/pull/150) Fix README example in argument requirements (@annonymouse) + +### v3.7.2 (2015/04/13 11:52 -07:00) + +* [679fbbf](https://github.com/bcoe/yargs/commit/679fbbf55904030ccee8a2635e8e5f46551ab2f0) updated yargs to use the [standard](https://github.com/feross/standard) style guide (agokjr) +* [22382ee](https://github.com/bcoe/yargs/commit/22382ee9f5b495bc2586c1758cd1091cec3647f9 various bug fixes for $0 (@nylen) + +### v3.7.1 (2015/04/10 11:06 -07:00) + +* [89e1992](https://github.com/bcoe/yargs/commit/89e1992a004ba73609b5f9ee6890c4060857aba4) detect iojs bin along with node bin. (@bcoe) +* [755509e](https://github.com/bcoe/yargs/commit/755509ea90041e5f7833bba3b8c5deffe56f0aab) improvements to example documentation in README.md (@rstacruz) +* [0d2dfc8](https://github.com/bcoe/yargs/commit/0d2dfc822a43418242908ad97ddd5291a1b35dc6) showHelp() no longer requires that .argv has been called (@bcoe) + +### v3.7.0 (2015/04/04 02:29 -07:00) + +* [56cbe2d](https://github.com/bcoe/yargs/commit/56cbe2ddd33dc176dcbf97ba40559864a9f114e4) make .requiresArg() work with type hints. (@bcoe). +* [2f5d562](https://github.com/bcoe/yargs/commit/2f5d5624f736741deeedf6a664d57bc4d857bdd0) serialize arrays and objects in usage strings. (@bcoe). +* [5126304](https://github.com/bcoe/yargs/commit/5126304dd18351fc28f10530616fdd9361e0af98) be more lenient about alias/primary key ordering in chaining API. (@bcoe) + +### v3.6.0 (2015/03/21 01:00 +00:00) +- [4e24e22](https://github.com/bcoe/yargs/commit/4e24e22e6a195e55ab943ede704a0231ac33b99c) support for .js configuration files. (@pirxpilot) + +### v3.5.4 (2015/03/12 05:56 +00:00) +- [c16cc08](https://github.com/bcoe/yargs/commit/c16cc085501155cf7fd853ccdf8584b05ab92b78) message for non-option arguments is now optional, thanks to (@raine) + +### v3.5.3 (2015/03/09 06:14 +00:00) +- [870b428](https://github.com/bcoe/yargs/commit/870b428cf515d560926ca392555b7ad57dba9e3d) completion script was missing in package.json (@bcoe) + +### v3.5.2 (2015/03/09 06:11 +00:00) +- [58a4b24](https://github.com/bcoe/yargs/commit/58a4b2473ebbb326713d522be53e32d3aabb08d2) parse was being called multiple times, resulting in strange behavior (@bcoe) + +### v3.5.1 (2015/03/09 04:55 +00:00) +- [4e588e0](https://github.com/bcoe/yargs/commit/4e588e055afbeb9336533095f051496e3977f515) accidentally left testing logic in (@bcoe) + +### v3.5.0 (2015/03/09 04:49 +00:00) +- [718bacd](https://github.com/bcoe/yargs/commit/718bacd81b9b44f786af76b2afe491fe06274f19) added support for bash completions see #4 (@bcoe) +- [a192882](https://github.com/bcoe/yargs/commit/a19288270fc431396c42af01125eeb4443664528) downgrade to mocha 2.1.0 until https://github.com/mochajs/mocha/issues/1585 can be sorted out (@bcoe) + +### v3.4.7 (2015/03/09 04:09 +00:00) +- [9845e5c](https://github.com/bcoe/yargs/commit/9845e5c1a9c684ba0be3f0bfb40e7b62ab49d9c8) the Argv singleton was not being updated when manually parsing arguments, fixes #114 (@bcoe) + +### v3.4.6 (2015/03/09 04:01 +00:00) +- [45b4c80](https://github.com/bcoe/yargs/commit/45b4c80b890d02770b0a94f326695a8a566e8fe9) set placeholders for all keys fixes #115 (@bcoe) + +### v3.4.5 (2015/03/01 20:31 +00:00) +- [a758e0b](https://github.com/bcoe/yargs/commit/a758e0b2556184f067cf3d9c4ef886d39817ebd2) fix for count consuming too many arguments (@bcoe) + +### v3.4.4 (2015/02/28 04:52 +00:00) +- [0476af7](https://github.com/bcoe/yargs/commit/0476af757966acf980d998b45108221d4888cfcb) added nargs feature, allowing you to specify the number of arguments after an option (@bcoe) +- [092477d](https://github.com/bcoe/yargs/commit/092477d7ab3efbf0ba11cede57f7d8cfc70b024f) updated README with full example of v3.0 API (@bcoe) + +### v3.3.3 (2015/02/28 04:23 +00:00) +- [0c4b769](https://github.com/bcoe/yargs/commit/0c4b769516cd8d93a7c4e5e675628ae0049aa9a8) remove string dependency, which conflicted with other libraries see #106 (@bcoe) + +### v3.3.2 (2015/02/28 04:11 +00:00) +- [2a98906](https://github.com/bcoe/yargs/commit/2a9890675821c0e7a12f146ce008b0562cb8ec9a) add $0 to epilog (@schnittstabil) + +### v3.3.1 (2015/02/24 03:28 +00:00) +- [ad485ce](https://github.com/bcoe/yargs/commit/ad485ce748ebdfce25b88ef9d6e83d97a2f68987) fix for applying defaults to camel-case args (@bcoe) + +### v3.3.0 (2015/02/24 00:49 +00:00) +- [8bfe36d](https://github.com/bcoe/yargs/commit/8bfe36d7fb0f93a799ea3f4c756a7467c320f8c0) fix and document restart() command, as a tool for building nested CLIs (@bcoe) + +### v3.2.1 (2015/02/22 05:45 +00:00) +- [49a6d18](https://github.com/bcoe/yargs/commit/49a6d1822a4ef9b1ea6f90cc366be60912628885) you can now provide a function that generates a default value (@bcoe) + +### v3.2.0 (2015/02/22 05:24 +00:00) +- [7a55886](https://github.com/bcoe/yargs/commit/7a55886c9343cf71a20744ca5cdd56d2ea7412d5) improvements to yargs two-column text layout (@bcoe) +- [b6ab513](https://github.com/bcoe/yargs/commit/b6ab5136a4c3fa6aa496f6b6360382e403183989) Tweak NPM version badge (@nylen) + +### v3.1.0 (2015/02/19 19:37 +00:00) +- [9bd2379](https://github.com/bcoe/yargs/commit/9bd237921cf1b61fd9f32c0e6d23f572fc225861) version now accepts a function, making it easy to load version #s from a package.json (@bcoe) + +### v3.0.4 (2015/02/14 01:40 +00:00) +- [0b7c19b](https://github.com/bcoe/yargs/commit/0b7c19beaecb747267ca4cc10e5cb2a8550bc4b7) various fixes for dot-notation handling (@bcoe) + +### v3.0.3 (2015/02/14 00:59 +00:00) +- [c3f35e9](https://github.com/bcoe/yargs/commit/c3f35e99bd5a0d278073fcadd95e2d778616cc17) make sure dot-notation is applied to aliases (@bcoe) + +### 3.0.2 (2015/02/13 16:50 +00:00) +- [74c8967](https://github.com/bcoe/yargs/commit/74c8967c340c204a0a7edf8a702b6f46c2705435) document epilog shorthand of epilogue. (@bcoe) +- [670110f](https://github.com/bcoe/yargs/commit/670110fc01bedc4831b6fec6afac54517d5a71bc) any non-truthy value now causes check to fail see #76 (@bcoe) +- [0d8f791](https://github.com/bcoe/yargs/commit/0d8f791a33c11ced4cd431ea8d3d3a337d456b56) finished implementing my wish-list of fetures for yargs 3.0. see #88 (@bcoe) +- [5768447](https://github.com/bcoe/yargs/commit/5768447447c4c8e8304f178846206ce86540f063) fix coverage. (@bcoe) +- [82e793f](https://github.com/bcoe/yargs/commit/82e793f3f61c41259eaacb67f0796aea2cf2aaa0) detect console width and perform word-wrapping. (@bcoe) +- [67476b3](https://github.com/bcoe/yargs/commit/67476b37eea07fee55f23f35b9e0c7d76682b86d) refactor two-column table layout so that we can use it for examples and usage (@bcoe) +- [4724cdf](https://github.com/bcoe/yargs/commit/4724cdfcc8e37ae1ca3dcce9d762f476e9ef4bb4) major refactor of index.js, in prep for 3.x release. (@bcoe) + +### v2.3.0 (2015/02/08 20:41 +00:00) +- [d824620](https://github.com/bcoe/yargs/commit/d824620493df4e63664af1fe320764dd1a9244e6) allow for undefined boolean defaults (@ashi009) + +### v2.2.0 (2015/02/08 20:07 +00:00) +- [d6edd98](https://github.com/bcoe/yargs/commit/d6edd9848826e7389ed1393858c45d03961365fd) in-prep for further refactoring, and a 3.x release I've shuffled some things around and gotten test-coverage to 100%. (@bcoe) + +### v2.1.2 (2015/02/08 06:05 +00:00) +- [d640745](https://github.com/bcoe/yargs/commit/d640745a7b9f8d476e0223879d056d18d9c265c4) switch to path.relative (@bcoe) +- [3bfd41f](https://github.com/bcoe/yargs/commit/3bfd41ff262a041f29d828b88936a79c63cad594) remove mocha.opts. (@bcoe) +- [47a2f35](https://github.com/bcoe/yargs/commit/47a2f357091db70903a402d6765501c1d63f15fe) document using .string('_') for string ids. see #56 (@bcoe) +- [#57](https://github.com/bcoe/yargs/pull/57) Merge pull request #57 from eush77/option-readme (@eush77) + +### v2.1.1 (2015/02/06 08:08 +00:00) +- [01c6c61](https://github.com/bcoe/yargs/commit/01c6c61d67b4ebf88f41f0b32a345ec67f0ac17d) fix for #71, 'newAliases' of undefined (@bcoe) + +### v2.1.0 (2015/02/06 07:59 +00:00) +- [6a1a3fa](https://github.com/bcoe/yargs/commit/6a1a3fa731958e26ccd56885f183dd8985cc828f) try to guess argument types, and apply sensible defaults see #73 (@bcoe) + +### v2.0.1 (2015/02/06 07:54 +00:00) +- [96a06b2](https://github.com/bcoe/yargs/commit/96a06b2650ff1d085a52b7328d8bba614c20cc12) Fix for strange behavior with --sort option, see #51 (@bcoe) + +### v2.0.0 (2015/02/06 07:45 +00:00) +- [0250517](https://github.com/bcoe/yargs/commit/0250517c9643e53f431b824e8ccfa54937414011) - [108fb84](https://github.com/bcoe/yargs/commit/108fb8409a3a63dcaf99d917fe4dfcfaa1de236d) fixed bug with boolean parsing, when bools separated by = see #66 (@bcoe) +- [a465a59](https://github.com/bcoe/yargs/commit/a465a5915f912715738de890982e4f8395958b10) Add `files` field to the package.json (@shinnn) +- [31043de](https://github.com/bcoe/yargs/commit/31043de7a38a17c4c97711f1099f5fb164334db3) fix for yargs.argv having the same keys added multiple times see #63 (@bcoe) +- [2d68c5b](https://github.com/bcoe/yargs/commit/2d68c5b91c976431001c4863ce47c9297850f1ad) Disable process.exit calls using .exitProcess(false) (@cianclarke) +- [45da9ec](https://github.com/bcoe/yargs/commit/45da9ec4c55a7bd394721bc6a1db0dabad7bc52a) Mention .option in README (@eush77) + +### v1.3.2 (2014/10/06 21:56 +00:00) +- [b8d3472](https://github.com/bcoe/yargs/commit/b8d34725482e5821a3cc809c0df71378f282f526) 1.3.2 (@chevex) + +### list (2014/08/30 18:41 +00:00) +- [fbc777f](https://github.com/bcoe/yargs/commit/fbc777f416eeefd37c84e44d27d7dfc7c1925721) Now that yargs is the successor to optimist, I'm changing the README language to be more universal. Pirate speak isn't very accessible to non-native speakers. (@chevex) +- [a54d068](https://github.com/bcoe/yargs/commit/a54d0682ae2efc2394d407ab171cc8a8bbd135ea) version output will not print extra newline (@boneskull) +- [1cef5d6](https://github.com/bcoe/yargs/commit/1cef5d62a9d6d61a3948a49574892e01932cc6ae) Added contributors section to package.json (@chrisn) +- [cc295c0](https://github.com/bcoe/yargs/commit/cc295c0a80a2de267e0155b60d315fc4b6f7c709) Added 'require' and 'required' as synonyms for 'demand' (@chrisn) +- [d0bf951](https://github.com/bcoe/yargs/commit/d0bf951d949066b6280101ed606593d079ee15c8) Updating minimist. (@chevex) +- [c15f8e7](https://github.com/bcoe/yargs/commit/c15f8e7f245b261e542cf205ce4f4313630cbdb4) Fix #31 (bad interaction between camelCase options and strict mode) (@nylen) +- [d991b9b](https://github.com/bcoe/yargs/commit/d991b9be687a68812dee1e3b185ba64b7778b82d) Added .help() and .version() methods (@chrisn) +- [e8c8aa4](https://github.com/bcoe/yargs/commit/e8c8aa46268379357cb11e9fc34b8c403037724b) Added .showHelpOnFail() method (@chrisn) +- [e855af4](https://github.com/bcoe/yargs/commit/e855af4a933ea966b5bbdd3c4c6397a4bac1a053) Allow boolean flag with .demand() (@chrisn) +- [14dbec2](https://github.com/bcoe/yargs/commit/14dbec24fb7380683198e2b20c4deb8423e64bea) Fixes issue #22. Arguments are no longer printed to the console when using .config. (@chevex) +- [bef74fc](https://github.com/bcoe/yargs/commit/bef74fcddc1544598a804f80d0a3728459f196bf) Informing users that Yargs is the official optimist successor. (@chevex) +- [#24](https://github.com/bcoe/yargs/pull/24) Merge pull request #24 from chrisn/strict (@chrisn) +- [889a2b2](https://github.com/bcoe/yargs/commit/889a2b28eb9768801b05163360a470d0fd6c8b79) Added requiresArg option, for options that require values (@chrisn) +- [eb16369](https://github.com/bcoe/yargs/commit/eb163692262be1fe80b992fd8803d5923c5a9b18) Added .strict() method, to report error if unknown arguments are given (@chrisn) +- [0471c3f](https://github.com/bcoe/yargs/commit/0471c3fd999e1ad4e6cded88b8aa02013b66d14f) Changed optimist to yargs in usage-options.js example (@chrisn) +- [5c88f74](https://github.com/bcoe/yargs/commit/5c88f74e3cf031b17c54b4b6606c83e485ff520e) Change optimist to yargs in examples (@chrisn) +- [66f12c8](https://github.com/bcoe/yargs/commit/66f12c82ba3c943e4de8ca862980e835da8ecb3a) Fix a couple of bad interactions between aliases and defaults (@nylen) +- [8fa1d80](https://github.com/bcoe/yargs/commit/8fa1d80f14b03eb1f2898863a61f1d1615bceb50) Document second argument of usage(message, opts) (@Gobie) +- [56e6528](https://github.com/bcoe/yargs/commit/56e6528cf674ff70d63083fb044ff240f608448e) For "--some-option", also set argv.someOption (@nylen) +- [ed5f6d3](https://github.com/bcoe/yargs/commit/ed5f6d33f57ad1086b11c91b51100f7c6c7fa8ee) Finished porting unit tests to Mocha. (@chevex) + +### v1.0.15 (2014/02/05 23:18 +00:00) +- [e2b1fc0](https://github.com/bcoe/yargs/commit/e2b1fc0c4a59cf532ae9b01b275e1ef57eeb64d2) 1.0.15 update to badges (@chevex) + +### v1.0.14 (2014/02/05 23:17 +00:00) +- [f33bbb0](https://github.com/bcoe/yargs/commit/f33bbb0f00fe18960f849cc8e15a7428a4cd59b8) Revert "Fixed issue which caused .demand function not to work correctly." (@chevex) + +### v1.0.13 (2014/02/05 22:13 +00:00) +- [6509e5e](https://github.com/bcoe/yargs/commit/6509e5e7dee6ef1a1f60eea104be0faa1a045075) Fixed issue which caused .demand function not to work correctly. (@chevex) + +### v1.0.12 (2013/12/13 00:09 +00:00) +- [05eb267](https://github.com/bcoe/yargs/commit/05eb26741c9ce446b33ff006e5d33221f53eaceb) 1.0.12 (@chevex) + +### v1.0.11 (2013/12/13 00:07 +00:00) +- [c1bde46](https://github.com/bcoe/yargs/commit/c1bde46e37318a68b87d17a50c130c861d6ce4a9) 1.0.11 (@chevex) + +### v1.0.10 (2013/12/12 23:57 +00:00) +- [dfebf81](https://github.com/bcoe/yargs/commit/dfebf8164c25c650701528ee581ca483a99dc21c) Fixed formatting in README (@chevex) + +### v1.0.9 (2013/12/12 23:47 +00:00) +- [0b4e34a](https://github.com/bcoe/yargs/commit/0b4e34af5e6d84a9dbb3bb6d02cd87588031c182) Update README.md (@chevex) + +### v1.0.8 (2013/12/06 16:36 +00:00) +- [#1](https://github.com/bcoe/yargs/pull/1) fix error caused by check() see #1 (@martinheidegger) + +### v1.0.7 (2013/11/24 18:01 +00:00) +- [a247d88](https://github.com/bcoe/yargs/commit/a247d88d6e46644cbb7303c18b1bb678fc132d72) Modified Pirate Joe image. (@chevex) + +### v1.0.6 (2013/11/23 19:21 +00:00) +- [d7f69e1](https://github.com/bcoe/yargs/commit/d7f69e1d34bc929736a8bdccdc724583e21b7eab) Updated Pirate Joe image. (@chevex) + +### v1.0.5 (2013/11/23 19:09 +00:00) +- [ece809c](https://github.com/bcoe/yargs/commit/ece809cf317cc659175e1d66d87f3ca68c2760be) Updated readme notice again. (@chevex) + +### v1.0.4 (2013/11/23 19:05 +00:00) +- [9e81e81](https://github.com/bcoe/yargs/commit/9e81e81654028f83ba86ffc3ac772a0476084e5e) Updated README with a notice about yargs being a fork of optimist and what that implies. (@chevex) + +### v1.0.3 (2013/11/23 17:43 +00:00) +- [65e7a78](https://github.com/bcoe/yargs/commit/65e7a782c86764944d63d084416aba9ee6019c5f) Changed some small wording in README.md. (@chevex) +- [459e20e](https://github.com/bcoe/yargs/commit/459e20e539b366b85128dd281ccd42221e96c7da) Fix a bug in the options function, when string and boolean options weren't applied to aliases. (@shockone) + +### v1.0.2 (2013/11/23 09:46 +00:00) +- [3d80ebe](https://github.com/bcoe/yargs/commit/3d80ebed866d3799224b6f7d596247186a3898a9) 1.0.2 (@chevex) + +### v1.0.1 (2013/11/23 09:39 +00:00) +- [f80ff36](https://github.com/bcoe/yargs/commit/f80ff3642d580d4b68bf9f5a94277481bd027142) Updated image. (@chevex) + +### v1.0.0 (2013/11/23 09:33 +00:00) +- [54e31d5](https://github.com/bcoe/yargs/commit/54e31d505f820b80af13644e460894b320bf25a3) Rebranded from optimist to yargs in the spirit of the fork :D (@chevex) +- [4ebb6c5](https://github.com/bcoe/yargs/commit/4ebb6c59f44787db7c24c5b8fe2680f01a23f498) Added documentation for demandCount(). (@chevex) +- [4561ce6](https://github.com/bcoe/yargs/commit/4561ce66dcffa95f49e8b4449b25b94cd68acb25) Simplified the error messages returned by .check(). (@chevex) +- [661c678](https://github.com/bcoe/yargs/commit/661c67886f479b16254a830b7e1db3be29e6b7a6) Fixed an issue with demand not accepting a zero value. (@chevex) +- [731dd3c](https://github.com/bcoe/yargs/commit/731dd3c37624790490bd6df4d5f1da8f4348279e) Add .fail(fn) so death isn't the only option. Should fix issue #39. (@chevex) +- [fa15417](https://github.com/bcoe/yargs/commit/fa15417ff9e70dace0d726627a5818654824c1d8) Added a few missing 'return self' (@chevex) +- [e655e4d](https://github.com/bcoe/yargs/commit/e655e4d99d1ae1d3695ef755d51c2de08d669761) Fix showing help in certain JS environments. (@chevex) +- [a746a31](https://github.com/bcoe/yargs/commit/a746a31cd47c87327028e6ea33762d6187ec5c87) Better string representation of default values. (@chevex) +- [6134619](https://github.com/bcoe/yargs/commit/6134619a7e90b911d5443230b644c5d447c1a68c) Implies: conditional demands (@chevex) +- [046b93b](https://github.com/bcoe/yargs/commit/046b93b5d40a27367af4cb29726e4d781d934639) Added support for JSON config files. (@chevex) +- [a677ec0](https://github.com/bcoe/yargs/commit/a677ec0a0ecccd99c75e571d03323f950688da03) Add .example(cmd, desc) feature. (@chevex) +- [1bd4375](https://github.com/bcoe/yargs/commit/1bd4375e11327ba1687d4bb6e5e9f3c30c1be2af) Added 'defaults' as alias to 'default' so as to avoid usage of a reserved keyword. (@chevex) +- [6b753c1](https://github.com/bcoe/yargs/commit/6b753c16ca09e723060e70b773b430323b29c45c) add .normalize(args..) support for normalizing paths (@chevex) +- [33d7d59](https://github.com/bcoe/yargs/commit/33d7d59341d364f03d3a25f0a55cb99004dbbe4b) Customize error messages with demand(key, msg) (@chevex) +- [647d37f](https://github.com/bcoe/yargs/commit/647d37f164c20f4bafbf67dd9db6cd6e2cd3b49f) Merge branch 'rewrite-duplicate-test' of github.com:isbadawi/node-optimist (@chevex) +- [9059d1a](https://github.com/bcoe/yargs/commit/9059d1ad5e8aea686c2a01c89a23efdf929fff2e) Pass aliases object to check functions for greater versatility. (@chevex) +- [623dc26](https://github.com/bcoe/yargs/commit/623dc26c7331abff2465ef8532e3418996d42fe6) Added ability to count boolean options and rolled minimist library back into project. (@chevex) +- [49f0dce](https://github.com/bcoe/yargs/commit/49f0dcef35de4db544c3966350d36eb5838703f6) Fixed small typo. (@chevex) +- [79ec980](https://github.com/bcoe/yargs/commit/79ec9806d9ca6eb0014cfa4b6d1849f4f004baf2) Removed dependency on wordwrap module. (@chevex) +- [ea14630](https://github.com/bcoe/yargs/commit/ea14630feddd69d1de99dd8c0e08948f4c91f00a) Merge branch 'master' of github.com:chbrown/node-optimist (@chevex) +- [2b75da2](https://github.com/bcoe/yargs/commit/2b75da2624061e0f4f3107d20303c06ec9054906) Merge branch 'master' of github.com:seanzhou1023/node-optimist (@chevex) +- [d9bda11](https://github.com/bcoe/yargs/commit/d9bda1116e26f3b40e833ca9ca19263afea53565) Merge branch 'patch-1' of github.com:thefourtheye/node-optimist (@chevex) +- [d6cc606](https://github.com/bcoe/yargs/commit/d6cc6064a4f1bea38a16a4430b8a1334832fbeff) Renamed README. (@chevex) +- [9498d3f](https://github.com/bcoe/yargs/commit/9498d3f59acfb5e102826503e681623c3a64b178) Renamed readme and added .gitignore. (@chevex) +- [bbd1fe3](https://github.com/bcoe/yargs/commit/bbd1fe37fefa366dde0fb3dc44d91fe8b28f57f5) Included examples for ```help``` and ```showHelp``` functions and fixed few formatting issues (@thefourtheye) +- [37fea04](https://github.com/bcoe/yargs/commit/37fea0470a5796a0294c1dcfff68d8041650e622) .alias({}) behaves differently based on mapping direction when generating descriptions (@chbrown) +- [855b20d](https://github.com/bcoe/yargs/commit/855b20d0be567ca121d06b30bea64001b74f3d6d) Documented function signatures are useful for dynamically typed languages. (@chbrown) + +### 0.6.0 (2013/06/25 08:48 +00:00) +- [d37bfe0](https://github.com/bcoe/yargs/commit/d37bfe05ae6d295a0ab481efe4881222412791f4) all tests passing using minimist (@substack) +- [76f1352](https://github.com/bcoe/yargs/commit/76f135270399d01f2bbc621e524a5966e5c422fd) all parse tests now passing (@substack) +- [a7b6754](https://github.com/bcoe/yargs/commit/a7b6754276c38d1565479a5685c3781aeb947816) using minimist, some tests passing (@substack) +- [6655688](https://github.com/bcoe/yargs/commit/66556882aa731cbbbe16cc4d42c85740a2e98099) Give credit where its due (@DeadAlready) +- [602a2a9](https://github.com/bcoe/yargs/commit/602a2a92a459f93704794ad51b115bbb08b535ce) v0.5.3 - Remove wordwrap as dependency (@DeadAlready) + +### 0.5.2 (2013/05/31 03:46 +00:00) +- [4497ca5](https://github.com/bcoe/yargs/commit/4497ca55e332760a37b866ec119ded347ca27a87) fixed the whitespace bug without breaking anything else (@substack) +- [5a3dd1a](https://github.com/bcoe/yargs/commit/5a3dd1a4e0211a38613c6e02f61328e1031953fa) failing test for whitespace arg (@substack) + +### 0.5.1 (2013/05/30 07:17 +00:00) +- [a20228f](https://github.com/bcoe/yargs/commit/a20228f62a454755dd07f628a7c5759113918327) fix parse() to work with functions before it (@substack) +- [b13bd4c](https://github.com/bcoe/yargs/commit/b13bd4cac856a9821d42fa173bdb58f089365a7d) failing test for parse() with modifiers (@substack) + +### 0.5.0 (2013/05/18 21:59 +00:00) +- [c474a64](https://github.com/bcoe/yargs/commit/c474a649231527915c222156e3b40806d365a87c) fixes for dash (@substack) + +### 0.4.0 (2013/04/13 19:03 +00:00) +- [dafe3e1](https://github.com/bcoe/yargs/commit/dafe3e18d7c6e7c2d68e06559df0e5cbea3adb14) failing short test (@substack) + +### 0.3.7 (2013/04/04 04:07 +00:00) +- [6c7a0ec](https://github.com/bcoe/yargs/commit/6c7a0ec94ce4199a505f0518b4d6635d4e47cc81) Fix for windows. On windows there is no _ in environment. (@hdf) + +### 0.3.6 (2013/04/04 04:04 +00:00) +- [e72346a](https://github.com/bcoe/yargs/commit/e72346a727b7267af5aa008b418db89970873f05) Add support for newlines in -a="" arguments (@danielbeardsley) +- [71e1fb5](https://github.com/bcoe/yargs/commit/71e1fb55ea9987110a669ac6ec12338cfff3821c) drop 0.4, add 0.8 to travis (@substack) + +### 0.3.5 (2012/10/10 11:09 +00:00) +- [ee692b3](https://github.com/bcoe/yargs/commit/ee692b37554c70a0bb16389a50a26b66745cbbea) Fix parsing booleans (@vojtajina) +- [5045122](https://github.com/bcoe/yargs/commit/5045122664c3f5b4805addf1be2148d5856f7ce8) set $0 properly in the tests (@substack) + +### 0.3.4 (2012/04/30 06:54 +00:00) +- [f28c0e6](https://github.com/bcoe/yargs/commit/f28c0e62ca94f6e0bb2e6d82fc3d91a55e69b903) bump for string "true" params (@substack) +- [8f44aeb](https://github.com/bcoe/yargs/commit/8f44aeb74121ddd689580e2bf74ef86a605e9bf2) Fix failing test for aliased booleans. (@coderarity) +- [b9f7b61](https://github.com/bcoe/yargs/commit/b9f7b613b1e68e11e6c23fbda9e555a517dcc976) Add failing test for short aliased booleans. (@coderarity) + +### 0.3.3 (2012/04/30 06:45 +00:00) +- [541bac8](https://github.com/bcoe/yargs/commit/541bac8dd787a5f1a5d28f6d8deb1627871705e7) Fixes #37. + +### 0.3.2 (2012/04/12 20:28 +00:00) +- [3a0f014](https://github.com/bcoe/yargs/commit/3a0f014c1451280ac1c9caa1f639d31675586eec) travis badge (@substack) +- [4fb60bf](https://github.com/bcoe/yargs/commit/4fb60bf17845f4ce3293f8ca49c9a1a7c736cfce) Fix boolean aliases. (@coderarity) +- [f14dda5](https://github.com/bcoe/yargs/commit/f14dda546efc4fe06ace04d36919bfbb7634f79b) Adjusted package.json to use tap (@jfhbrook) +- [88e5d32](https://github.com/bcoe/yargs/commit/88e5d32295be6e544c8d355ff84e355af38a1c74) test/usage.js no longer hangs (@jfhbrook) +- [e1e740c](https://github.com/bcoe/yargs/commit/e1e740c27082f3ce84deca2093d9db2ef735d0e5) two tests for combined boolean/alias opts parsing (@jfhbrook) + +### 0.3.1 (2011/12/31 08:44 +00:00) +- [d09b719](https://github.com/bcoe/yargs/commit/d09b71980ef711b6cf3918cd19beec8257e40e82) If "default" is set to false it was not passed on, fixed. (@wolframkriesing) + +### 0.3.0 (2011/12/09 06:03 +00:00) +- [6e74aa7](https://github.com/bcoe/yargs/commit/6e74aa7b46a65773e20c0cb68d2d336d4a0d553d) bump and documented dot notation (@substack) + +### 0.2.7 (2011/10/20 02:25 +00:00) +- [94adee2](https://github.com/bcoe/yargs/commit/94adee20e17b58d0836f80e8b9cdbe9813800916) argv._ can be told 'Hey! argv._! Don't be messing with my args.', and it WILL obey (@colinta) +- [c46fdd5](https://github.com/bcoe/yargs/commit/c46fdd56a05410ae4a1e724a4820c82e77ff5469) optimistic critter image (@substack) +- [5c95c73](https://github.com/bcoe/yargs/commit/5c95c73aedf4c7482bd423e10c545e86d7c8a125) alias options() to option() (@substack) +- [f7692ea](https://github.com/bcoe/yargs/commit/f7692ea8da342850af819367833abb685fde41d8) [fix] Fix for parsing boolean edge case (@indexzero) +- [d1f92d1](https://github.com/bcoe/yargs/commit/d1f92d1425bd7f356055e78621b30cdf9741a3c2) +- [b01bda8](https://github.com/bcoe/yargs/commit/b01bda8d86e455bbf74ce497864cb8ab5b9fb847) [fix test] Update to ensure optimist is aware of default booleans. Associated tests included (@indexzero) +- [aa753e7](https://github.com/bcoe/yargs/commit/aa753e7c54fb3a12f513769a0ff6d54aa0f63943) [dist test] Update devDependencies in package.json. Update test pathing to be more npm and require.paths future-proof (@indexzero) +- [7bfce2f](https://github.com/bcoe/yargs/commit/7bfce2f3b3c98e6539e7549d35fbabced7e9341e) s/sys/util/ (@substack) +- [d420a7a](https://github.com/bcoe/yargs/commit/d420a7a9c890d2cdb11acfaf3ea3f43bc3e39f41) update usage output (@substack) +- [cf86eed](https://github.com/bcoe/yargs/commit/cf86eede2e5fc7495b6ec15e6d137d9ac814f075) some sage readme protips about parsing rules (@substack) +- [5da9f7a](https://github.com/bcoe/yargs/commit/5da9f7a5c0e1758ec7c5801fb3e94d3f6e970513) documented all the methods finally (@substack) +- [8ca6879](https://github.com/bcoe/yargs/commit/8ca6879311224b25933642987300f6a29de5c21b) fenced syntax highlighting (@substack) +- [b72bacf](https://github.com/bcoe/yargs/commit/b72bacf1d02594778c1935405bc8137eb61761dc) right-alignment of wrapped extra params (@substack) +- [2b980bf](https://github.com/bcoe/yargs/commit/2b980bf2656b4ee8fc5134dc5f56a48855c35198) now with .wrap() (@substack) +- [d614f63](https://github.com/bcoe/yargs/commit/d614f639654057d1b7e35e3f5a306e88ec2ad1e4) don't show 'Options:' when there aren't any (@substack) +- [691eda3](https://github.com/bcoe/yargs/commit/691eda354df97b5a86168317abcbcaabdc08a0fb) failing test for multi-aliasing (@substack) +- [0826c9f](https://github.com/bcoe/yargs/commit/0826c9f462109feab2bc7a99346d22e72bf774b7) "Options:" > "options:" (@substack) +- [72f7490](https://github.com/bcoe/yargs/commit/72f749025d01b7f295738ed370a669d885fbada0) [minor] Update formatting for `.showHelp()` (@indexzero) +- [75aecce](https://github.com/bcoe/yargs/commit/75aeccea74329094072f95800e02c275e7d999aa) options works again, too lazy to write a proper test right now (@substack) +- [f742e54](https://github.com/bcoe/yargs/commit/f742e5439817c662dc3bd8734ddd6467e6018cfd) line_count_options example, which breaks (@substack) +- [4ca06b8](https://github.com/bcoe/yargs/commit/4ca06b8b4ea99b5d5714b315a2a8576bee6e5537) line count example (@substack) +- [eeb8423](https://github.com/bcoe/yargs/commit/eeb8423e0a5ecc9dc3eb1e6df9f3f8c1c88f920b) remove self.argv setting in boolean (@substack) +- [6903412](https://github.com/bcoe/yargs/commit/69034126804660af9cc20ea7f4457b50338ee3d7) removed camel case for now (@substack) +- [5a0d88b](https://github.com/bcoe/yargs/commit/5a0d88bf23e9fa79635dd034e2a1aa992acc83cd) remove dead longest checking code (@substack) +- [d782170](https://github.com/bcoe/yargs/commit/d782170babf7284b1aa34f5350df0dd49c373fa8) .help() too (@substack) +- [622ec17](https://github.com/bcoe/yargs/commit/622ec17379bb5374fdbb190404c82bc600975791) rm old help generator (@substack) +- [7c8baac](https://github.com/bcoe/yargs/commit/7c8baac4d66195e9f5158503ea9ebfb61153dab7) nub keys (@substack) +- [8197785](https://github.com/bcoe/yargs/commit/8197785ad4762465084485b041abd722f69bf344) generate help message based on the previous calls, todo: nub (@substack) +- [3ffbdc3](https://github.com/bcoe/yargs/commit/3ffbdc33c8f5e83d4ea2ac60575ce119570c7ede) stub out new showHelp, better checks (@substack) +- [d4e21f5](https://github.com/bcoe/yargs/commit/d4e21f56a4830f7de841900d3c79756fb9886184) let .options() take single options too (@substack) +- [3c4cf29](https://github.com/bcoe/yargs/commit/3c4cf2901a29bac119cca8e983028d8669230ec6) .options() is now heaps simpler (@substack) +- [89f0d04](https://github.com/bcoe/yargs/commit/89f0d043cbccd302f10ab30c2069e05d2bf817c9) defaults work again, all tests pass (@substack) +- [dd87333](https://github.com/bcoe/yargs/commit/dd8733365423006a6e4156372ebb55f98323af58) update test error messages, down to 2 failing tests (@substack) +- [53f7bc6](https://github.com/bcoe/yargs/commit/53f7bc626b9875f2abdfc5dd7a80bde7f14143a3) fix for bools doubling up, passes the parse test again, others fail (@substack) +- [2213e2d](https://github.com/bcoe/yargs/commit/2213e2ddc7263226fba717fb041dc3fde9bc2ee4) refactored for an argv getter, failing several tests (@substack) +- [d1e7379](https://github.com/bcoe/yargs/commit/d1e737970f15c6c006bebdd8917706827ff2f0f2) just rescan for now, alias test passes (@substack) +- [b2f8c99](https://github.com/bcoe/yargs/commit/b2f8c99cc477a8eb0fdf4cf178e1785b63185cfd) failing alias test (@substack) +- [d0c0174](https://github.com/bcoe/yargs/commit/d0c0174daa144bfb6dc7290fdc448c393c475e15) .alias() (@substack) +- [d85f431](https://github.com/bcoe/yargs/commit/d85f431ad7d07b058af3f2a57daa51495576c164) [api] Remove `.describe()` in favor of building upon the existing `.usage()` API (@indexzero) +- [edbd527](https://github.com/bcoe/yargs/commit/edbd5272a8e213e71acd802782135c7f9699913a) [doc api] Add `.describe()`, `.options()`, and `.showHelp()` methods along with example. (@indexzero) +- [be4902f](https://github.com/bcoe/yargs/commit/be4902ff0961ae8feb9093f2c0a4066463ded2cf) updates for coffee since it now does argv the node way (@substack) +- [e24cb23](https://github.com/bcoe/yargs/commit/e24cb23798ee64e53b60815e7fda78b87f42390c) more general coffeescript detection (@substack) +- [78ac753](https://github.com/bcoe/yargs/commit/78ac753e5d0ec32a96d39d893272afe989e42a4d) Don't trigger the CoffeeScript hack when running under node_g. (@papandreou) +- [bcfe973](https://github.com/bcoe/yargs/commit/bcfe9731d7f90d4632281b8a52e8d76eb0195ae6) .string() but failing test (@substack) +- [1987aca](https://github.com/bcoe/yargs/commit/1987aca28c7ba4e8796c07bbc547cb984804c826) test hex strings (@substack) +- [ef36db3](https://github.com/bcoe/yargs/commit/ef36db32259b0b0d62448dc907c760e5554fb7e7) more keywords (@substack) +- [cc53c56](https://github.com/bcoe/yargs/commit/cc53c56329960bed6ab077a79798e991711ba01d) Added camelCase function that converts --multi-word-option to camel case (so it becomes argv.multiWordOption). (@papandreou) +- [60b57da](https://github.com/bcoe/yargs/commit/60b57da36797716e5783a633c6d5c79099016d45) fixed boolean bug by rescanning (@substack) +- [dff6d07](https://github.com/bcoe/yargs/commit/dff6d078d97f8ac503c7d18dcc7b7a8c364c2883) boolean examples (@substack) +- [0e380b9](https://github.com/bcoe/yargs/commit/0e380b92c4ef4e3c8dac1da18b5c31d85b1d02c9) boolean() with passing test (@substack) +- [62644d4](https://github.com/bcoe/yargs/commit/62644d4bffbb8d1bbf0c2baf58a1d14a6359ef07) coffee compatibility with node regex for versions too (@substack) +- [430fafc](https://github.com/bcoe/yargs/commit/430fafcf1683d23774772826581acff84b456827) argv._ fixed by fixing the coffee detection (@substack) +- [343b8af](https://github.com/bcoe/yargs/commit/343b8afefd98af274ebe21b5a16b3a949ec5429f) whichNodeArgs test fails too (@substack) +- [63df2f3](https://github.com/bcoe/yargs/commit/63df2f371f31e63d7f1dec2cbf0022a5f08da9d2) replicated mnot's bug in whichNodeEmpty test (@substack) +- [35473a4](https://github.com/bcoe/yargs/commit/35473a4d93a45e5e7e512af8bb54ebb532997ae1) test for ./bin usage (@substack) +- [13df151](https://github.com/bcoe/yargs/commit/13df151e44228eed10e5441c7cd163e086c458a4) don't coerce booleans to numbers (@substack) +- [85f8007](https://github.com/bcoe/yargs/commit/85f8007e93b8be7124feea64b1f1916d8ba1894a) package bump for automatic number conversion (@substack) +- [8f17014](https://github.com/bcoe/yargs/commit/8f170141cded4ccc0c6d67a849c5bf996aa29643) updated readme and examples with new auto-numberification goodness (@substack) +- [73dc901](https://github.com/bcoe/yargs/commit/73dc9011ac968e39b55e19e916084a839391b506) auto number conversion works yay (@substack) +- [bcec56b](https://github.com/bcoe/yargs/commit/bcec56b3d031e018064cbb691539ccc4f28c14ad) failing test for not-implemented auto numification (@substack) +- [ebd2844](https://github.com/bcoe/yargs/commit/ebd2844d683feeac583df79af0e5124a7a7db04e) odd that eql doesn't check types careflly (@substack) +- [fd854b0](https://github.com/bcoe/yargs/commit/fd854b02e512ce854b76386d395672a7969c1bc4) package author + keywords (@substack) +- [656a1d5](https://github.com/bcoe/yargs/commit/656a1d5a1b7c0e49d72e80cb13f20671d56f76c6) updated readme with .default() stuff (@substack) +- [cd7f8c5](https://github.com/bcoe/yargs/commit/cd7f8c55f0b82b79b690d14c5f806851236998a1) passing tests for new .default() behavior (@substack) +- [932725e](https://github.com/bcoe/yargs/commit/932725e39ce65bc91a0385a5fab659a5fa976ac2) new default() thing for setting default key/values (@substack) +- [4e6c7ab](https://github.com/bcoe/yargs/commit/4e6c7aba6374ac9ebc6259ecf91f13af7bce40e3) test for coffee usage (@substack) +- [d54ffcc](https://github.com/bcoe/yargs/commit/d54ffccf2a5a905f51ed5108f7c647f35d64ae23) new --key value style with passing tests. NOTE: changes existing behavior (@substack) +- [ed2a2d5](https://github.com/bcoe/yargs/commit/ed2a2d5d828100ebeef6385c0fb88d146a5cfe9b) package bump for summatix's coffee script fix (@substack) +- [75a975e](https://github.com/bcoe/yargs/commit/75a975eed8430d28e2a79dc9e6d819ad545f4587) Added support for CoffeeScript (@summatix) +- [56b2b1d](https://github.com/bcoe/yargs/commit/56b2b1de8d11f8a2b91979d8ae2d6db02d8fe64d) test coverage for the falsy check() usage (@substack) +- [a4843a9](https://github.com/bcoe/yargs/commit/a4843a9f0e69ffb4afdf6a671d89eb6f218be35d) check bug fixed plus a handy string (@substack) +- [857bd2d](https://github.com/bcoe/yargs/commit/857bd2db933a5aaa9cfecba0ced2dc9b415f8111) tests for demandCount, back up to 100% coverage (@substack) +- [073b776](https://github.com/bcoe/yargs/commit/073b7768ebd781668ef05c13f9003aceca2f5c35) call demandCount from demand (@substack) +- [4bd4b7a](https://github.com/bcoe/yargs/commit/4bd4b7a085c8b6ce1d885a0f486cc9865cee2db1) add demandCount to check for the number of arguments in the _ list (@marshall) +- [b8689ac](https://github.com/bcoe/yargs/commit/b8689ac68dacf248119d242bba39a41cb0adfa07) Rebase checks. That will be its own module eventually. (@substack) +- [e688370](https://github.com/bcoe/yargs/commit/e688370b576f0aa733c3f46183df69e1b561668e) a $0 like in perl (@substack) +- [2e5e196](https://github.com/bcoe/yargs/commit/2e5e1960fc19afb21fb3293752316eaa8bcd3609) usage test hacking around process and console (@substack) +- [fcc3521](https://github.com/bcoe/yargs/commit/fcc352163fbec6a1dfe8caf47a0df39de24fe016) description pun (@substack) +- [87a1fe2](https://github.com/bcoe/yargs/commit/87a1fe29037ca2ca5fefda85141aaeb13e8ce761) mit/x11 license (@substack) +- [8d089d2](https://github.com/bcoe/yargs/commit/8d089d24cd687c0bde3640a96c09b78f884900dd) bool example is more consistent and also shows off short option grouping (@substack) +- [448d747](https://github.com/bcoe/yargs/commit/448d7473ac68e8e03d8befc9457b0d9e21725be0) start of the readme and examples (@substack) +- [da74dea](https://github.com/bcoe/yargs/commit/da74dea799a9b59dbf022cbb8001bfdb0d52eec9) more tests for long and short captures (@substack) +- [ab6387e](https://github.com/bcoe/yargs/commit/ab6387e6769ca4af82ca94c4c67c7319f0d9fcfa) silly bug in the tests with s/not/no/, all tests pass now (@substack) +- [102496a](https://github.com/bcoe/yargs/commit/102496a319e8e06f6550d828fc2f72992c7d9ecc) hack an instance for process.argv onto Argv so the export can be called to create an instance or used for argv, which is the most common case (@substack) +- [a01caeb](https://github.com/bcoe/yargs/commit/a01caeb532546d19f68f2b2b87f7036cfe1aaedd) divide example (@substack) +- [443da55](https://github.com/bcoe/yargs/commit/443da55736acbaf8ff8b04d1b9ce19ab016ddda2) start of the lib with a package.json (@substack) diff --git a/node_modules/yargs/LICENSE b/node_modules/yargs/LICENSE new file mode 100644 index 00000000..747ab114 --- /dev/null +++ b/node_modules/yargs/LICENSE @@ -0,0 +1,22 @@ +Copyright 2010 James Halliday (mail@substack.net) +Modified work Copyright 2014 Contributors (ben@npmjs.com) + +This project is free software released under the MIT/X11 license: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/yargs/README.md b/node_modules/yargs/README.md new file mode 100644 index 00000000..48879155 --- /dev/null +++ b/node_modules/yargs/README.md @@ -0,0 +1,2017 @@ + yargs +======== + +Yargs be a node.js library fer hearties tryin' ter parse optstrings. + +With yargs, ye be havin' a map that leads straight to yer treasure! Treasure of course, being a simple option hash. + +[![Build Status][travis-image]][travis-url] +[![Coverage Status][coveralls-image]][coveralls-url] +[![NPM version][npm-image]][npm-url] +[![Windows Tests][windows-image]][windows-url] +[![js-standard-style][standard-image]][standard-url] +[![Conventional Commits][conventional-commits-image]][conventional-commits-url] +[![Gitter][gitter-image]][gitter-url] + +> Yargs is the official successor to optimist. Please feel free to submit issues and pull requests. If you'd like to contribute and don't know where to start, have a look at [the issue list](https://github.com/yargs/yargs/issues) :) + +examples +======== + +With yargs, the options be just a hash! +------------------------------------------------------------------- + +plunder.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs').argv; + +if (argv.ships > 3 && argv.distance < 53.5) { + console.log('Plunder more riffiwobbles!'); +} else { + console.log('Retreat from the xupptumblers!'); +} +```` + +*** + + $ ./plunder.js --ships=4 --distance=22 + Plunder more riffiwobbles! + + $ ./plunder.js --ships 12 --distance 98.7 + Retreat from the xupptumblers! + +![Joe was one optimistic pirate.](https://i.imgur.com/4WFGVJ9.png) + +But don't walk the plank just yet! There be more! You can do short options: +------------------------------------------------- + +short.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs').argv; +console.log('(%d,%d)', argv.x, argv.y); +```` + +*** + + $ ./short.js -x 10 -y 21 + (10,21) + +And booleans, both long, short, and even grouped: +---------------------------------- + +bool.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs').argv; + +if (argv.s) { + process.stdout.write(argv.fr ? 'Le perroquet dit: ' : 'The parrot says: '); +} +console.log( + (argv.fr ? 'couac' : 'squawk') + (argv.p ? '!' : '') +); +```` + +*** + + $ ./bool.js -s + The parrot says: squawk + + $ ./bool.js -sp + The parrot says: squawk! + + $ ./bool.js -sp --fr + Le perroquet dit: couac! + +And non-hyphenated options too! Just use `argv._`! +------------------------------------------------- + +nonopt.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs').argv; +console.log('(%d,%d)', argv.x, argv.y); +console.log(argv._); +```` + +*** + + $ ./nonopt.js -x 6.82 -y 3.35 rum + (6.82,3.35) + [ 'rum' ] + + $ ./nonopt.js "me hearties" -x 0.54 yo -y 1.12 ho + (0.54,1.12) + [ 'me hearties', 'yo', 'ho' ] + +Yargs even counts your booleans! +---------------------------------------------------------------------- + +count.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs') + .count('verbose') + .alias('v', 'verbose') + .argv; + +VERBOSE_LEVEL = argv.verbose; + +function WARN() { VERBOSE_LEVEL >= 0 && console.log.apply(console, arguments); } +function INFO() { VERBOSE_LEVEL >= 1 && console.log.apply(console, arguments); } +function DEBUG() { VERBOSE_LEVEL >= 2 && console.log.apply(console, arguments); } + +WARN("Showing only important stuff"); +INFO("Showing semi-important stuff too"); +DEBUG("Extra chatty mode"); +```` + +*** + $ node count.js + Showing only important stuff + + $ node count.js -v + Showing only important stuff + Showing semi-important stuff too + + $ node count.js -vv + Showing only important stuff + Showing semi-important stuff too + Extra chatty mode + + $ node count.js -v --verbose + Showing only important stuff + Showing semi-important stuff too + Extra chatty mode + +Tell users how to use yer options and make demands. +------------------------------------------------- + +area.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs') + .usage('Usage: $0 -w [num] -h [num]') + .demandOption(['w','h']) + .argv; + +console.log("The area is:", argv.w * argv.h); +```` + +*** + + $ ./area.js -w 55 -h 11 + The area is: 605 + + $ node ./area.js -w 4.91 -w 2.51 + Usage: area.js -w [num] -h [num] + + Options: + -w [required] + -h [required] + + Missing required arguments: h + +After yer demands have been met, demand more! Ask for non-hyphenated arguments! +----------------------------------------- + +demand_count.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs') + .demandCommand(2) + .argv; +console.dir(argv); +```` + +*** + + $ ./demand_count.js a + + Not enough non-option arguments: got 1, need at least 2 + + $ ./demand_count.js a b + { _: [ 'a', 'b' ], '$0': 'demand_count.js' } + + $ ./demand_count.js a b c + { _: [ 'a', 'b', 'c' ], '$0': 'demand_count.js' } + +EVEN MORE SHIVER ME TIMBERS! +------------------ + +default_singles.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs') + .default('x', 10) + .default('y', 10) + .argv +; +console.log(argv.x + argv.y); +```` + +*** + + $ ./default_singles.js -x 5 + 15 + +default_hash.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs') + .default({ x : 10, y : 10 }) + .argv +; +console.log(argv.x + argv.y); +```` + +*** + + $ ./default_hash.js -y 7 + 17 + +And if you really want to get all descriptive about it... +--------------------------------------------------------- + +boolean_single.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs') + .boolean('v') + .argv +; +console.dir(argv.v); +console.dir(argv._); +```` + +*** + + $ ./boolean_single.js -v "me hearties" yo ho + true + [ 'me hearties', 'yo', 'ho' ] + + +boolean_double.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs') + .boolean(['x','y','z']) + .argv +; +console.dir([ argv.x, argv.y, argv.z ]); +console.dir(argv._); +```` + +*** + + $ ./boolean_double.js -x -z one two three + [ true, false, true ] + [ 'one', 'two', 'three' ] + +Yargs is here to help you... +--------------------------- + +Ye can describe parameters fer help messages and set aliases. Yargs figures +out how ter format a handy help string automatically. + +line_count.js: + +````javascript +#!/usr/bin/env node +var argv = require('yargs') + .usage('Usage: $0 [options]') + .command('count', 'Count the lines in a file') + .example('$0 count -f foo.js', 'count the lines in the given file') + .alias('f', 'file') + .nargs('f', 1) + .describe('f', 'Load a file') + .demandOption(['f']) + .help('h') + .alias('h', 'help') + .epilog('copyright 2015') + .argv; + +var fs = require('fs'); +var s = fs.createReadStream(argv.file); + +var lines = 0; +s.on('data', function (buf) { + lines += buf.toString().match(/\n/g).length; +}); + +s.on('end', function () { + console.log(lines); +}); +```` + +*** + $ node line_count.js count + Usage: line_count.js [options] + + Commands: + count Count the lines in a file + + Options: + -f, --file Load a file [required] + -h, --help Show help [boolean] + + Examples: + line_count.js count -f foo.js count the lines in the given file + + copyright 2015 + + Missing required arguments: f + + $ node line_count.js count --file line_count.js + 26 + + $ node line_count.js count -f line_count.js + 26 + +methods +======= + +By itself, + +````javascript +require('yargs').argv +```` + +will use the `process.argv` array to construct the `argv` object. + +You can pass in the `process.argv` yourself: + +````javascript +require('yargs')([ '-x', '1', '-y', '2' ]).argv +```` + +or use `.parse()` to do the same thing: + +````javascript +require('yargs').parse([ '-x', '1', '-y', '2' ]) +```` + +The rest of these methods below come in just before the terminating `.argv`. + +.alias(key, alias) +------------------ + +Set key names as equivalent such that updates to a key will propagate to aliases +and vice-versa. + +Optionally `.alias()` can take an object that maps keys to aliases. +Each key of this object should be the canonical version of the option, and each +value should be a string or an array of strings. + +.argv +----- + +Get the arguments as a plain old object. + +Arguments without a corresponding flag show up in the `argv._` array. + +The script name or node command is available at `argv.$0` similarly to how `$0` +works in bash or perl. + +If `yargs` is executed in an environment that embeds node and there's no script name (e.g. +[Electron](http://electron.atom.io/) or [nw.js](http://nwjs.io/)), it will ignore the first parameter since it +expects it to be the script name. In order to override this behavior, use `.parse(process.argv.slice(1))` +instead of `.argv` and the first parameter won't be ignored. + +.array(key) +---------- + +Tell the parser to interpret `key` as an array. If `.array('foo')` is set, +`--foo foo bar` will be parsed as `['foo', 'bar']` rather than as `'foo'`. + +.boolean(key) +------------- + +Interpret `key` as a boolean. If a non-flag option follows `key` in +`process.argv`, that string won't get set as the value of `key`. + +`key` will default to `false`, unless a `default(key, undefined)` is +explicitly set. + +If `key` is an array, interpret all the elements as booleans. + +.check(fn, [global=true]) +---------- + +Check that certain conditions are met in the provided arguments. + +`fn` is called with two arguments, the parsed `argv` hash and an array of options and their aliases. + +If `fn` throws or returns a non-truthy value, show the thrown error, usage information, and +exit. + +`global` indicates whether `check()` should be enabled both +at the top-level and for each sub-command. + +.choices(key, choices) +---------------------- + +Limit valid values for `key` to a predefined set of `choices`, given as an array +or as an individual value. + +```js +var argv = require('yargs') + .alias('i', 'ingredient') + .describe('i', 'choose your sandwich ingredients') + .choices('i', ['peanut-butter', 'jelly', 'banana', 'pickles']) + .help('help') + .argv +``` + +If this method is called multiple times, all enumerated values will be merged +together. Choices are generally strings or numbers, and value matching is +case-sensitive. + +Optionally `.choices()` can take an object that maps multiple keys to their +choices. + +Choices can also be specified as `choices` in the object given to `option()`. + +```js +var argv = require('yargs') + .option('size', { + alias: 's', + describe: 'choose a size', + choices: ['xs', 's', 'm', 'l', 'xl'] + }) + .argv +``` + +.coerce(key, fn) +---------------- + +Provide a synchronous function to coerce or transform the value(s) given on the +command line for `key`. + +The coercion function should accept one argument, representing the parsed value +from the command line, and should return a new value or throw an error. The +returned value will be used as the value for `key` (or one of its aliases) in +`argv`. + +If the function throws, the error will be treated as a validation +failure, delegating to either a custom [`.fail()`](#fail) handler or printing +the error message in the console. + +Coercion will be applied to a value after +all other modifications, such as [`.normalize()`](#normalize). + +_Examples:_ + +```js +var argv = require('yargs') + .coerce('file', function (arg) { + return require('fs').readFileSync(arg, 'utf8') + }) + .argv +``` + +Optionally `.coerce()` can take an object that maps several keys to their +respective coercion function. + +```js +var argv = require('yargs') + .coerce({ + date: Date.parse, + json: JSON.parse + }) + .argv +``` + +You can also map the same function to several keys at one time. Just pass an +array of keys as the first argument to `.coerce()`: + +```js +var path = require('path') +var argv = require('yargs') + .coerce(['src', 'dest'], path.resolve) + .argv +``` + +If you are using dot-notion or arrays, .e.g., `user.email` and `user.password`, +coercion will be applied to the final object that has been parsed: + +```js +// --user.name Batman --user.password 123 +// gives us: {name: 'batman', password: '[SECRET]'} +var argv = require('yargs') + .option('user') + .coerce('user', opt => { + opt.name = opt.name.toLowerCase() + opt.password = '[SECRET]' + return opt + }) + .argv +``` + +.command(cmd, desc, [builder], [handler]) +----------------------------------------- +.command(cmd, desc, [module]) +----------------------------- +.command(module) +---------------- + +Define the commands exposed by your application. + +`cmd` should be a string representing the command or an array of strings +representing the command and its aliases. Read more about command aliases in the +subsection below. + +Use `desc` to provide a description for each command your application accepts (the +values stored in `argv._`). Set `desc` to `false` to create a hidden command. +Hidden commands don't show up in the help output and aren't available for +completion. + +Optionally, you can provide a `builder` object to give hints about the +options that your command accepts: + +```js +yargs + .command('get', 'make a get HTTP request', { + url: { + alias: 'u', + default: 'http://yargs.js.org/' + } + }) + .help() + .argv +``` + +`builder` can also be a function. This function is executed +with a `yargs` instance, and can be used to provide _advanced_ command specific help: + +```js +yargs + .command('get', 'make a get HTTP request', function (yargs) { + return yargs.option('url', { + alias: 'u', + default: 'http://yargs.js.org/' + }) + }) + .help() + .argv +``` + +You can also provide a handler function, which will be executed with the +parsed `argv` object: + +```js +yargs + .command( + 'get', + 'make a get HTTP request', + function (yargs) { + return yargs.option('u', { + alias: 'url', + describe: 'the URL to make an HTTP request to' + }) + }, + function (argv) { + console.log(argv.url) + } + ) + .help() + .argv +``` + +### Default Commands + +To specify a default command use the character `*`. A default command +will be run if the positional arguments provided match no known +commands: + +```js +const argv = require('yargs') + .command('*', 'the default command', () => {}, (argv) => { + console.log('this command will be run by default') + }) +``` + +The command defined above will be executed if the program +is run with `./my-cli.js --x=22`. + +Default commands can also be used as a command alias, like so: + +```js +const argv = require('yargs') + .command(['serve', '*'], 'the serve command', () => {}, (argv) => { + console.log('this command will be run by default') + }) +``` + +The command defined above will be executed if the program +is run with `./my-cli.js --x=22`, or with `./my-cli.js serve --x=22`. + +### Positional Arguments + +Commands can accept _optional_ and _required_ positional arguments. Required +positional arguments take the form ``, and optional arguments +take the form `[bar]`. The parsed positional arguments will be populated in +`argv`: + +```js +yargs.command('get [proxy]', 'make a get HTTP request') + .help() + .argv +``` + +#### Positional Argument Aliases + +Aliases can be provided for positional arguments using the `|` character. +As an example, suppose our application allows either a username _or_ +an email as the first argument: + +```js +yargs.command('get [password]', 'fetch a user by username or email.') + .help() + .argv +``` + +In this way, both `argv.username` and `argv.email` would be populated with the +same value when the command is executed. + +#### Variadic Positional Arguments + +The last positional argument can optionally accept an array of +values, by using the `..` operator: + +```js +yargs.command('download [files..]', 'download several files') + .help() + .argv +``` + +### Command Execution + +When a command is given on the command line, yargs will execute the following: + +1. push the command into the current context +2. reset non-global configuration +3. apply command configuration via the `builder`, if given +4. parse and validate args from the command line, including positional args +5. if validation succeeds, run the `handler` function, if given +6. pop the command from the current context + +### Command Aliases + +You can define aliases for a command by putting the command and all of its +aliases into an array. + +Alternatively, a command module may specify an `aliases` property, which may be +a string or an array of strings. All aliases defined via the `command` property +and the `aliases` property will be concatenated together. + +The first element in the array is considered the canonical command, which may +define positional arguments, and the remaining elements in the array are +considered aliases. Aliases inherit positional args from the canonical command, +and thus any positional args defined in the aliases themselves are ignored. + +If either the canonical command or any of its aliases are given on the command +line, the command will be executed. + +```js +#!/usr/bin/env node +require('yargs') + .command(['start [app]', 'run', 'up'], 'Start up an app', {}, (argv) => { + console.log('starting up the', argv.app || 'default', 'app') + }) + .command({ + command: 'configure [value]', + aliases: ['config', 'cfg'], + desc: 'Set a config variable', + builder: (yargs) => yargs.default('value', 'true'), + handler: (argv) => { + console.log(`setting ${argv.key} to ${argv.value}`) + } + }) + .demandCommand() + .help() + .wrap(72) + .argv +``` + +``` +$ ./svc.js help +Commands: + start [app] Start up an app [aliases: run, up] + configure [value] Set a config variable [aliases: config, cfg] + +Options: + --help Show help [boolean] + +$ ./svc.js cfg concurrency 4 +setting concurrency to 4 + +$ ./svc.js run web +starting up the web app +``` + +### Providing a Command Module + +For complicated commands you can pull the logic into a module. A module +simply needs to export: + +* `exports.command`: string (or array of strings) that executes this command when given on the command line, first string may contain positional args +* `exports.aliases`: array of strings (or a single string) representing aliases of `exports.command`, positional args defined in an alias are ignored +* `exports.describe`: string used as the description for the command in help text, use `false` for a hidden command +* `exports.builder`: object declaring the options the command accepts, or a function accepting and returning a yargs instance +* `exports.handler`: a function which will be passed the parsed argv. + +```js +// my-module.js +exports.command = 'get [proxy]' + +exports.describe = 'make a get HTTP request' + +exports.builder = { + banana: { + default: 'cool' + }, + batman: { + default: 'sad' + } +} + +exports.handler = function (argv) { + // do something with argv. +} +``` + +You then register the module like so: + +```js +yargs.command(require('my-module')) + .help() + .argv +``` + +Or if the module does not export `command` and `describe` (or if you just want to override them): + +```js +yargs.command('get [proxy]', 'make a get HTTP request', require('my-module')) + .help() + .argv +``` + +.commandDir(directory, [opts]) +------------------------------ + +Apply command modules from a directory relative to the module calling this method. + +This allows you to organize multiple commands into their own modules under a +single directory and apply all of them at once instead of calling +`.command(require('./dir/module'))` multiple times. + +By default, it ignores subdirectories. This is so you can use a directory +structure to represent your command hierarchy, where each command applies its +subcommands using this method in its builder function. See the example below. + +Note that yargs assumes all modules in the given directory are command modules +and will error if non-command modules are encountered. In this scenario, you +can either move your module to a different directory or use the `exclude` or +`visit` option to manually filter it out. More on that below. + +`directory` is a relative directory path as a string (required). + +`opts` is an options object (optional). The following options are valid: + +- `recurse`: boolean, default `false` + + Look for command modules in all subdirectories and apply them as a flattened + (non-hierarchical) list. + +- `extensions`: array of strings, default `['js']` + + The types of files to look for when requiring command modules. + +- `visit`: function + + A synchronous function called for each command module encountered. Accepts + `commandObject`, `pathToFile`, and `filename` as arguments. Returns + `commandObject` to include the command; any falsy value to exclude/skip it. + +- `include`: RegExp or function + + Whitelist certain modules. See [`require-directory` whitelisting](https://www.npmjs.com/package/require-directory#whitelisting) for details. + +- `exclude`: RegExp or function + + Blacklist certain modules. See [`require-directory` blacklisting](https://www.npmjs.com/package/require-directory#blacklisting) for details. + +### Example command hierarchy using `.commandDir()` + +Desired CLI: + +```sh +$ myapp --help +$ myapp init +$ myapp remote --help +$ myapp remote add base http://yargs.js.org +$ myapp remote prune base +$ myapp remote prune base fork whatever +``` + +Directory structure: + +``` +myapp/ +├─ cli.js +└─ cmds/ + ├─ init.js + ├─ remote.js + └─ remote_cmds/ + ├─ add.js + └─ prune.js +``` + +cli.js: + +```js +#!/usr/bin/env node +require('yargs') + .commandDir('cmds') + .demandCommand() + .help() + .argv +``` + +cmds/init.js: + +```js +exports.command = 'init [dir]' +exports.desc = 'Create an empty repo' +exports.builder = { + dir: { + default: '.' + } +} +exports.handler = function (argv) { + console.log('init called for dir', argv.dir) +} +``` + +cmds/remote.js: + +```js +exports.command = 'remote ' +exports.desc = 'Manage set of tracked repos' +exports.builder = function (yargs) { + return yargs.commandDir('remote_cmds') +} +exports.handler = function (argv) {} +``` + +cmds/remote_cmds/add.js: + +```js +exports.command = 'add ' +exports.desc = 'Add remote named for repo at url ' +exports.builder = {} +exports.handler = function (argv) { + console.log('adding remote %s at url %s', argv.name, argv.url) +} +``` + +cmds/remote_cmds/prune.js: + +```js +exports.command = 'prune [names..]' +exports.desc = 'Delete tracked branches gone stale for remotes' +exports.builder = {} +exports.handler = function (argv) { + console.log('pruning remotes %s', [].concat(argv.name).concat(argv.names).join(', ')) +} +``` + +.completion([cmd], [description], [fn]) +--------------------------------------- + +Enable bash-completion shortcuts for commands and options. + +`cmd`: When present in `argv._`, will result in the `.bashrc` completion script +being outputted. To enable bash completions, concat the generated script to your +`.bashrc` or `.bash_profile`. + +`description`: Provide a description in your usage instructions for the command +that generates bash completion scripts. + +`fn`: Rather than relying on yargs' default completion functionality, which +shiver me timbers is pretty awesome, you can provide your own completion +method. + +If invoked without parameters, `.completion()` will make `completion` the command to output +the completion script. + +```js +var argv = require('yargs') + .completion('completion', function(current, argv) { + // 'current' is the current command being completed. + // 'argv' is the parsed arguments so far. + // simply return an array of completions. + return [ + 'foo', + 'bar' + ]; + }) + .argv; +``` + +You can also provide asynchronous completions. + +```js +var argv = require('yargs') + .completion('completion', function(current, argv, done) { + setTimeout(function() { + done([ + 'apple', + 'banana' + ]); + }, 500); + }) + .argv; +``` + +But wait, there's more! You can return an asynchronous promise. + +```js +var argv = require('yargs') + .completion('completion', function(current, argv, done) { + return new Promise(function (resolve, reject) { + setTimeout(function () { + resolve(['apple', 'banana']) + }, 10) + }) + }) + .argv; +``` + +.config([key], [description], [parseFn]) +------------------------------------------------------------- +.config(object) +--------------- + +Tells the parser that if the option specified by `key` is passed in, it +should be interpreted as a path to a JSON config file. The file is loaded +and parsed, and its properties are set as arguments. Because the file is +loaded using Node's require(), the filename MUST end in `.json` to be +interpreted correctly. + +If invoked without parameters, `.config()` will make `--config` the option to pass the JSON config file. + +An optional `description` can be provided to customize the config (`key`) option +in the usage string. + +An optional `parseFn` can be used to provide a custom parser. The parsing +function must be synchronous, and should return an object containing +key value pairs or an error. + +```js +var argv = require('yargs') + .config('settings', function (configPath) { + return JSON.parse(fs.readFileSync(configPath, 'utf-8')) + }) + .argv +``` + +You can also pass an explicit configuration `object`, it will be parsed +and its properties will be set as arguments. + +```js +var argv = require('yargs') + .config({foo: 1, bar: 2}) + .argv +console.log(argv) +``` + +``` +$ node test.js +{ _: [], + foo: 1, + bar: 2, + '$0': 'test.js' } +``` + +Note that a configuration object may extend from a JSON file using the `"extends"` property. When doing so, the `"extends"` value should be a path (relative or absolute) to the extended JSON file. + +.conflicts(x, y) +---------------------------------------------- + +Given the key `x` is set, the key `y` must not be set. + +Optionally `.conflicts()` can accept an object specifying multiple conflicting keys. + +.count(key) +------------ + +Interpret `key` as a boolean flag, but set its parsed value to the number of +flag occurrences rather than `true` or `false`. Default value is thus `0`. + +.default(key, value, [description]) +--------------------------------------------------------- +.defaults(key, value, [description]) +------------------------------------ + +**Note:** The `.defaults()` alias is deprecated. It will be +removed in the next major version. + +Set `argv[key]` to `value` if no option was specified in `process.argv`. + +Optionally `.default()` can take an object that maps keys to default values. + +But wait, there's more! The default value can be a `function` which returns +a value. The name of the function will be used in the usage string: + +```js +var argv = require('yargs') + .default('random', function randomValue() { + return Math.random() * 256; + }).argv; +``` + +Optionally, `description` can also be provided and will take precedence over +displaying the value in the usage instructions: + +```js +.default('timeout', 60000, '(one-minute)') +``` + +.demand(count, [max], [msg]) [DEPRECATED] +-------------------- + +`demand()` has been deprecated, please instead see [`demandOption()`](#demandOption) and +[`demandCommand()`](#demandCommand). + +.demandOption(key, [msg | boolean]) +------------------------------ +.demandOption(key, msg) +------------------------------ + +If `key` is a string, show the usage information and exit if `key` wasn't +specified in `process.argv`. + +If `key` is an array, demand each element. + +If a `msg` string is given, it will be printed when the argument is missing, instead of the standard error message. + +```javascript +// demand an array of keys to be provided +require('yargs') + .option('run', { + alias: 'r', + describe: 'run your program' + }) + .option('path', { + alias: 'p', + describe: 'provide a path to file' + }) + .option('spec', { + alias: 's', + describe: 'program specifications' + }) + .demandOption(['run', 'path'], 'Please provide both run and path arguments to work with this tool') + .help() + .argv +``` +which will provide the following output: +```bash +Options: + --run, -r run your program [required] + --path, -p provide a path to file [required] + --spec, -s program specifications + --help Show help [boolean] + + Missing required arguments: run, path + Please provide both run and path arguments to work with this tool +``` + +If a `boolean` value is given, it controls whether the option is demanded; +this is useful when using `.options()` to specify command line parameters. + +```javascript +// demand individual options within the option constructor +require('yargs') + .options({ + 'run': { + alias: 'r', + describe: 'run your program', + demandOption: true + }, + 'path': { + alias: 'p', + describe: 'provide a path to file', + demandOption: true + }, + 'spec': { + alias: 's', + describe: 'program specifications' + } + }) + .help() + .argv +``` +which will provide the following output: +```bash +Options: + --run, -r run your program [required] + --path, -p provide a path to file [required] + --spec, -s program specifications + --help Show help [boolean] + +Missing required arguments: run, path +``` + +.demandCommand([min=1], [minMsg]) +------------------------------ +.demandCommand([min=1], [max], [minMsg], [maxMsg]) +------------------------------ + +Demand in context of commands. You can demand a minimum and a maximum number a user can have within your program, as well as provide corresponding error messages if either of the demands is not met. +```javascript +require('yargs') + .command({ + command: 'configure [value]', + aliases: ['config', 'cfg'], + desc: 'Set a config variable', + builder: (yargs) => yargs.default('value', 'true'), + handler: (argv) => { + console.log(`setting ${argv.key} to ${argv.value}`) + } + }) + // provide a minimum demand and a minimum demand message + .demandCommand(1, 'You need at least one command before moving on') + .help() + .argv +``` + +which will provide the following output: + +```bash +Commands: + configure [value] Set a config variable [aliases: config, cfg] + +Options: + --help Show help [boolean] + +You need at least one command before moving on +``` + +_Note: in `minMsg` and `maxMsg`, every occurrence of `$0` will be replaced +with the observed value, and every instance of `$1` will be replaced with the +expected value._ + +.describe(key, desc) +-------------------- + +Describe a `key` for the generated usage information. + +Optionally `.describe()` can take an object that maps keys to descriptions. + +.detectLocale(boolean) +----------- + +Should yargs attempt to detect the os' locale? Defaults to `true`. + +.env([prefix]) +-------------- + +Tell yargs to parse environment variables matching the given prefix and apply +them to argv as though they were command line arguments. + +Use the "__" separator in the environment variable to indicate nested options. +(e.g. prefix_nested__foo => nested.foo) + +If this method is called with no argument or with an empty string or with `true`, +then all env vars will be applied to argv. + +Program arguments are defined in this order of precedence: + +1. Command line args +2. Env vars +3. Config file/objects +4. Configured defaults + +```js +var argv = require('yargs') + .env('MY_PROGRAM') + .option('f', { + alias: 'fruit-thing', + default: 'apple' + }) + .argv +console.log(argv) +``` + +``` +$ node fruity.js +{ _: [], + f: 'apple', + 'fruit-thing': 'apple', + fruitThing: 'apple', + '$0': 'fruity.js' } +``` + +``` +$ MY_PROGRAM_FRUIT_THING=banana node fruity.js +{ _: [], + fruitThing: 'banana', + f: 'banana', + 'fruit-thing': 'banana', + '$0': 'fruity.js' } +``` + +``` +$ MY_PROGRAM_FRUIT_THING=banana node fruity.js -f cat +{ _: [], + f: 'cat', + 'fruit-thing': 'cat', + fruitThing: 'cat', + '$0': 'fruity.js' } +``` + +Env var parsing is disabled by default, but you can also explicitly disable it +by calling `.env(false)`, e.g. if you need to undo previous configuration. + +.epilog(str) +------------ +.epilogue(str) +-------------- + +A message to print at the end of the usage instructions, e.g. + +```js +var argv = require('yargs') + .epilogue('for more information, find our manual at http://example.com'); +``` + +.example(cmd, desc) +------------------- + +Give some example invocations of your program. Inside `cmd`, the string +`$0` will get interpolated to the current script name or node command for the +present script similar to how `$0` works in bash or perl. +Examples will be printed out as part of the help message. + +.exitProcess(enable) +---------------------------------- + +By default, yargs exits the process when the user passes a help flag, uses the +`.version` functionality, or when validation fails. Calling +`.exitProcess(false)` disables this behavior, enabling further actions after +yargs have been validated. + +.fail(fn) +--------- + +Method to execute when a failure occurs, rather than printing the failure message. + +`fn` is called with the failure message that would have been printed, the +`Error` instance originally thrown and yargs state when the failure +occured. + +```js +var argv = require('yargs') + .fail(function (msg, err, yargs) { + if (err) throw err // preserve stack + console.error('You broke it!') + console.error(msg) + console.error('You should be doing', yargs.help()) + process.exit(1) + }) + .argv +``` + +.getCompletion(args, done); +--------------------------- + +Allows to programmatically get completion choices for any line. + +`args`: An array of the words in the command line to complete. + +`done`: The callback to be called with the resulting completions. + +For example: + +```js +require('yargs') + .option('foobar') + .option('foobaz') + .completion() + .getCompletion(['./test.js', '--foo'], function (completions) { + console.log(completions) + }) +``` + +Outputs the same completion choices as `./test.js --foo`TAB: `--foobar` and `--foobaz` + +.global(globals, [global=true]) +------------ + +Indicate that an option (or group of options) should not be reset when a command +is executed, as an example: + +```js +var argv = require('yargs') + .option('a', { + alias: 'all', + default: true, + global: false + }) + .option('n', { + alias: 'none', + default: true, + global: false + }) + .command('foo', 'foo command', function (yargs) { + return yargs.option('b', { + alias: 'bar' + }) + }) + .help('help') + .global('a') + .argv +``` + +If the `foo` command is executed the `all` option will remain, but the `none` +option will have been eliminated. + +Options default to being global. + +.group(key(s), groupName) +-------------------- + +Given a key, or an array of keys, places options under an alternative heading +when displaying usage instructions, e.g., + +```js +var yargs = require('yargs')(['--help']) + .help() + .group('batman', 'Heroes:') + .describe('batman', "world's greatest detective") + .wrap(null) + .argv +``` +*** + Heroes: + --batman world's greatest detective + + Options: + --help Show help [boolean] + +.help() +----------------------------------------- +.help([option | boolean]) +----------------------------------------- +.help([option, [description | boolean]]) +----------------------------------------- +.help([option, [description, [boolean]]]) +----------------------------------------- + +Add an option (e.g. `--help`) and implicit command that displays the usage +string and exits the process. + +If present, the `description` parameter customizes the description of +the help option in the usage string. + +If a boolean argument is provided, it will enable or disable the use of an +implicit command. The implicit command is enabled by default, but it can be +disabled by passing `false`. + +Note that any multi-char aliases (e.g. `help`) used for the help option will +also be used for the implicit command. If there are no multi-char aliases (e.g. +`h`), then all single-char aliases will be used for the command. + +If invoked without parameters, `.help()` will use `--help` as the option and +`help` as the implicit command to trigger help output. + +Example: + +```js +var yargs = require("yargs")(['--help']) + .usage("$0 -operand1 number -operand2 number -operation [add|subtract]") + .help() + .argv +``` + +Later on, `argv` can be retrieved with `yargs.argv`. + +.implies(x, y) +-------------- + +Given the key `x` is set, it is required that the key `y` is set. + +Optionally `.implies()` can accept an object specifying multiple implications. + +.locale() +--------- + +Return the locale that yargs is currently using. + +By default, yargs will auto-detect the operating system's locale so that +yargs-generated help content will display in the user's language. + +To override this behavior with a static locale, pass the desired locale as a +string to this method (see below). + +.locale(locale) +--------------- + +Override the auto-detected locale from the user's operating system with a static +locale. Note that the OS locale can be modified by setting/exporting the `LC_ALL` +environment variable. + +```js +var argv = require('yargs') + .usage('./$0 - follow ye instructions true') + .option('option', { + alias: 'o', + describe: "'tis a mighty fine option", + demandOption: true + }) + .command('run', "Arrr, ya best be knowin' what yer doin'") + .example('$0 run foo', "shiver me timbers, here's an example for ye") + .help('help') + .wrap(70) + .locale('pirate') + .argv +``` + +*** + +```shell +./test.js - follow ye instructions true + +Choose yer command: + run Arrr, ya best be knowin' what yer doin' + +Options for me hearties! + --option, -o 'tis a mighty fine option [requi-yar-ed] + --help Parlay this here code of conduct [boolean] + +Ex. marks the spot: + test.js run foo shiver me timbers, here's an example for ye + +Ye be havin' to set the followin' argument land lubber: option +``` + +Locales currently supported: + +* **de:** German. +* **en:** American English. +* **es:** Spanish. +* **fr:** French. +* **hi:** Hindi. +* **hu:** Hungarian. +* **id:** Indonesian. +* **it:** Italian. +* **ja:** Japanese. +* **ko:** Korean. +* **nb:** Norwegian Bokmål. +* **pirate:** American Pirate. +* **pl:** Polish. +* **pt:** Portuguese. +* **pt_BR:** Brazilian Portuguese. +* **ru:** Russian. +* **th:** Thai. +* **tr:** Turkish. +* **zh_CN:** Chinese. + +To submit a new translation for yargs: + +1. use `./locales/en.json` as a starting point. +2. submit a pull request with the new locale file. + +*The [Microsoft Terminology Search](http://www.microsoft.com/Language/en-US/Search.aspx) can be useful for finding the correct terminology in your locale.* + +.nargs(key, count) +----------- + +The number of arguments that should be consumed after a key. This can be a +useful hint to prevent parsing ambiguity. For example: + +```js +var argv = require('yargs') + .nargs('token', 1) + .parse(['--token', '-my-token']); +``` + +parses as: + +`{ _: [], token: '-my-token', '$0': 'node test' }` + +Optionally `.nargs()` can take an object of `key`/`narg` pairs. + +.normalize(key) +--------------- + +The key provided represents a path and should have `path.normalize()` applied. + +.number(key) +------------ + +Tell the parser to always interpret `key` as a number. + +If `key` is an array, all elements will be parsed as numbers. + +If the option is given on the command line without a value, `argv` will be +populated with `undefined`. + +If the value given on the command line cannot be parsed as a number, `argv` will +be populated with `NaN`. + +Note that decimals, hexadecimals, and scientific notation are all accepted. + +```js +var argv = require('yargs') + .number('n') + .number(['width', 'height']) + .argv +``` + +.option(key, [opt]) +----------------- +.options(key, [opt]) +------------------ + +This method can be used to make yargs aware of options that _could_ +exist. You can also pass an `opt` object which can hold further +customization, like `.alias()`, `.demandOption()` etc. for that option. + +For example: + +````javascript +var argv = require('yargs') + .option('f', { + alias: 'file', + demandOption: true, + default: '/etc/passwd', + describe: 'x marks the spot', + type: 'string' + }) + .argv +; +```` + +is the same as + +````javascript +var argv = require('yargs') + .alias('f', 'file') + .demandOption('f') + .default('f', '/etc/passwd') + .describe('f', 'x marks the spot') + .string('f') + .argv +; +```` + +Optionally `.options()` can take an object that maps keys to `opt` parameters. + +````javascript +var argv = require('yargs') + .options({ + 'f': { + alias: 'file', + demandOption: true, + default: '/etc/passwd', + describe: 'x marks the spot', + type: 'string' + } + }) + .argv +; +```` + +Valid `opt` keys include: + +- `alias`: string or array of strings, alias(es) for the canonical option key, see [`alias()`](#alias) +- `array`: boolean, interpret option as an array, see [`array()`](#array) +- `boolean`: boolean, interpret option as a boolean flag, see [`boolean()`](#boolean) +- `choices`: value or array of values, limit valid option arguments to a predefined set, see [`choices()`](#choices) +- `coerce`: function, coerce or transform parsed command line values into another value, see [`coerce()`](#coerce) +- `config`: boolean, interpret option as a path to a JSON config file, see [`config()`](#config) +- `configParser`: function, provide a custom config parsing function, see [`config()`](#config) +- `conflicts`: string or object, require certain keys not to be set, see [`conflicts()`](#conflicts) +- `count`: boolean, interpret option as a count of boolean flags, see [`count()`](#count) +- `default`: value, set a default value for the option, see [`default()`](#default) +- `defaultDescription`: string, use this description for the default value in help content, see [`default()`](#default) +- `demandOption`: boolean or string, demand the option be given, with optional error message, see [`demandOption()`](#demandOption) +- `desc`/`describe`/`description`: string, the option description for help content, see [`describe()`](#describe) +- `global`: boolean, indicate that this key should not be [reset](#reset) when a command is invoked, see [`global()`](#global) +- `group`: string, when displaying usage instructions place the option under an alternative group heading, see [`group()`](#group) +- `implies`: string or object, require certain keys to be set, see [`implies()`](#implies) +- `nargs`: number, specify how many arguments should be consumed for the option, see [`nargs()`](#nargs) +- `normalize`: boolean, apply `path.normalize()` to the option, see [`normalize()`](#normalize) +- `number`: boolean, interpret option as a number, [`number()`](#number) +- `requiresArg`: boolean, require the option be specified with a value, see [`requiresArg()`](#requiresArg) +- `skipValidation`: boolean, skips validation if the option is present, see [`skipValidation()`](#skipValidation) +- `string`: boolean, interpret option as a string, see [`string()`](#string) +- `type`: one of the following strings + - `'array'`: synonymous for `array: true`, see [`array()`](#array) + - `'boolean'`: synonymous for `boolean: true`, see [`boolean()`](#boolean) + - `'count'`: synonymous for `count: true`, see [`count()`](#count) + - `'number'`: synonymous for `number: true`, see [`number()`](#number) + - `'string'`: synonymous for `string: true`, see [`string()`](#string) + +.parse(args, [context], [parseCallback]) +------------ + +Parse `args` instead of `process.argv`. Returns the `argv` object. +`args` may either be a pre-processed argv array, or a raw argument string. + +A `context` object can optionally be given as the second argument to `parse()`, providing a +useful mechanism for passing state information to commands: + +```js +const parser = yargs + .command('lunch-train ', 'start lunch train', function () {}, function (argv) { + console.log(argv.restaurant, argv.time) + }) + .parse("lunch-train rudy's", {time: '12:15'}) +``` + +A `parseCallback` can also be provided to `.parse()`. If a callback is given, it will be invoked with three arguments: + +1. `err`: populated if any validation errors raised while parsing. +2. `argv`: the parsed argv object. +3. `output`: any text that would have been output to the terminal, had a + callback not been provided. + +```js +// providing the `fn` argument to `parse()` runs yargs in headless mode, this +// makes it easy to use yargs in contexts other than the CLI, e.g., writing +// a chat-bot. +const parser = yargs + .command('lunch-train
      +
      +

      This is the way we + write the demo,

      +
      +​ +
      + write the demo, demo, +
      +​ +
      + This the way we write the demo so + in +
      +​ +

      + the morning. + Found 0 children in TAG. +

      +